Передёргиваешь! имхо, речь идёт о справочнике для выбора (Select-a). А в создаваемую запись будет вставляться уникальный код для уникальной записи "Иванов Иван Иванович" в справочнике.
Btrieve и clarion
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
- morkovin
- Ветеран
- Сообщения: 909
- Зарегистрирован: 20 Июль 2005, 14:53
- Откуда: Volgograd, Russia
- Благодарил (а): 2 раза
- Поблагодарили: 3 раза
- Контактная информация:
Btrieve и clarion
WBR, morkovin
-
- ✯ Ветеран ✯
- Сообщения: 4983
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 7 раз
- Поблагодарили: 20 раз
Btrieve и clarion
Я имел ввиду сам справочник. У меня многие справочники с уникальностью по наименованию. Единицы измерения, например. Плохой пример, нет смысла отводить под это дело 1000 символов. И всё же.
Ладно, согласен, может и не особо жизненно.
We are hard at work… for you.
Btrieve и clarion
вопрос стоял только в уникальности поля... я бы сделал поле с хэшем и по нему ключ, можно обработать в тригереfinsoftrz писал(а): ↑26 Сентябрь 2019, 12:201. Задача не из жизни.
2. Делаем второе поле для ключа по первым или последним символам (где предполагается уникальность), затем в процедурах модификации данных отбираем все записи с ними по ключу (их уже не должно быть много) и проверяем перебором на полное совпадение.
3. Делаем второе поле для ключа, сохраняем в него хэш.
Может еще какие варианты кому в голову придут.
- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 4615
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 6 раз
- Поблагодарили: 37 раз
Btrieve и clarion
Не знаю, не пробовал. По идее, не должно быть трудоемко. Для меня эта тема не актуальна, я вообще не вижу практического смысла делать уникальные текстовые поля, тем более на сотни байт. Ну, разве всякие guid, которые используют в системах с претензией на глобальность. Я там пошел по первому варианту с сохранением в ключе фрагмента и фильтрацией до полного значения. Максимальное значение, которое я встречал на практике - алкогольные марки длиной 150 символов.
C6/C11, ШВС, tps/btrieve.
- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 4615
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 6 раз
- Поблагодарили: 37 раз
Btrieve и clarion
Операции copy(File) и remove(File), у которых в качестве параметра задана файловая структура, не работают с таблицами, хранящимися в нескольких физических файлах. Хотя, судя по доке, должны.
C6/C11, ШВС, tps/btrieve.
- Игорь Столяров
- Ветеран движения
- Сообщения: 7373
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 13 раз
- Поблагодарили: 48 раз
Btrieve и clarion
Вроде бы это файловая функция.
COPY - Копирует файл.
файл - Метка оператора FILE, строковая константа или переменная, которые содержат спецификацию файла, который надлежит скопировать.
Никаких файлОВ, входящих в структуру таблицы и т.д.
COPY - Копирует файл.
файл - Метка оператора FILE, строковая константа или переменная, которые содержат спецификацию файла, который надлежит скопировать.
Никаких файлОВ, входящих в структуру таблицы и т.д.
За теми кто отстал - не возвращаться. (С) Кодекс
- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 4615
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 6 раз
- Поблагодарили: 37 раз
Btrieve и clarion
Если это FILE, то логично было бы копировать все физические файлы, имена которых однозначно определяются. Конечно, все это решается написанием своей функции.
C6/C11, ШВС, tps/btrieve.
- Admin
- Администратор
- Сообщения: 3959
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 25 раз
- Поблагодарили: 22 раза
- Контактная информация:
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
- ✯ Ветеран ✯
- Сообщения: 4615
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 6 раз
- Поблагодарили: 37 раз
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/C11, ШВС, tps/btrieve.
- Игорь Столяров
- Ветеран движения
- Сообщения: 7373
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 13 раз
- Поблагодарили: 48 раз
Btrieve и clarion
В общем случае, там ведь ещё могут быть файлы с MEMO полями …
За теми кто отстал - не возвращаться. (С) Кодекс
- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 4615
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 6 раз
- Поблагодарили: 37 раз
Btrieve и clarion
Мне просто это не надо, я опустил. Мемо поле - это 5 первых символов имени основного файла и замена остального на мем. А дальше по той же схеме.
C6/C11, ШВС, tps/btrieve.
- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 4615
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 6 раз
- Поблагодарили: 37 раз
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/C11, ШВС, tps/btrieve.
- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 4615
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 6 раз
- Поблагодарили: 37 раз
Btrieve и clarion
Ради статистики. Больше полугода крутится боевая база btrieve на терминальном сервере. Было 2 случая сбоя в индексах. Причем на маленьких, мало нагруженных таблицах. Оба раза восстановилось за пять секунд обычным кларионовским full build. На tps за много лет что-то даже не припомню, когда индексы сбивались.
C6/C11, ШВС, tps/btrieve.
- Игорь Столяров
- Ветеран движения
- Сообщения: 7373
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 13 раз
- Поблагодарили: 48 раз
Btrieve и clarion
Основные проблемы с TPS всё-таки возникают при традиционном сетевом доступе к БД (точнее при обрыве сети) или
выключении питания на компьютере с локальной БД в момент выполнения записи (добавления, удаления).
Если у Вас на терминальном сервере решены все аппаратные вопросы + все операции выполняются под транзакциями,
то действительно, там просто нечему сбиваться …
За теми кто отстал - не возвращаться. (С) Кодекс