Решено Ls: getdocumentbykey ищет неправильно

anna

Lotus team
03.06.2014
400
7
#1
Добрый день, многоуважаемые коллеги!
Вот такая вот непонятная штука произошла. У документов есть некое текстовое поле, в котором содержится специфический код, состоящий из спецсимволов. Оно иногда используется как ключ при некой обработке.
Сегодня наблюдала такую вещь:

Set DivisionByCode=db.GetView("DivisionByCode")
Set DivisionDoc=DivisionByCode.GetDocumentByKey("!$!Ќ!#",True)
MessageBox "Найдено" + DivisionDoc.Division(0) + "= "+ DivisionDoc.Code(0)

Выдает совсем другой док, в котором код !$![!#
Что это такое? Почему так сработало?
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 567
263
#2
не знаю - проблема ли с спецсимволах, но проверить индексы не помешает
 

anna

Lotus team
03.06.2014
400
7
#3
Грохнуть и пересоздать? А где гарантия, что потом не вылезет? Вообще нигде и никак не пользоваться GetDocumentByKey?
 

savl

Lotus team
28.10.2011
2 131
102
#4
@anna, символы проверте.
Что-то мне подсказывает кто-то скопировал или в другой кодировке сделал.
 

alexas1

Lotus team
10.04.2014
723
144
#5
Грохнуть и пересоздать? А где гарантия, что потом не вылезет? Вообще нигде и никак не пользоваться GetDocumentByKey?
А причём тут это :bored:. В конечном счёте ВСЕ поиски на разных индексах строятся. Не пользоваться нотусом? ;)
 

anna

Lotus team
03.06.2014
400
7
#6
@anna, символы проверте.
Что-то мне подсказывает кто-то скопировал или в другой кодировке сделал.
В поле хранится то, что отдала сторонняя база, какая разница, в какой кодировке искать, лишь бы совпадали ключи, n'est pas?
[DOUBLEPOST=1425473876,1425473611][/DOUBLEPOST]
А причём тут это :bored:. В конечном счёте ВСЕ поиски на разных индексах строятся. Не пользоваться нотусом? ;)
Если дело в состоянии индексов, то я буду перманентно боятся, что у меня где-то что-то не сработает как нужно и будут отдаваться любые документы по ключам. А это, получается, вообще вопрос об использовании данной системы. Так что да, именно так как вы сказали - отказываться от сэд на лотус. Но это же бред!
База, к слову, мелкая, но очень нужная. Как бы печалька
 

savl

Lotus team
28.10.2011
2 131
102
#7
@anna, из серии win-1251 vs KOI-8 Какая разница какая кодировка, символы то есть...
ASCII коды проверте, тем более что данные идут из другой системы.
мало ли как их обработал Lotus или внешняя система. Может косяк при передаче был или заполнили там неверно.
У нас был случай: французские буквы напрочь не принимались (копировали текст внутрь copy/paste) - крокозябры и все тут.
Заменили на английский текст, тупо перевели - все ок.

База, к слову, мелкая, но ключевая, хранит структуру организации.
По другому никак не могли? обязательно такой хитрый ключ?
 
Симпатии: Понравилось alexas1

oshmianski

Достойный программист
Lotus team
25.04.2012
552
8
#8
я бы в первую очередь отказался от таких ключей (преобразовать в "нормальный вид").
может попробовать поиграться со свойством бд Multilingual Options?
 
Симпатии: Понравилось anna

anna

Lotus team
03.06.2014
400
7
#9
По другому никак не могли? обязательно такой хитрый ключ?
Это же вопросы интеграции. С другой стороны, а почему нет? Разве где-то написано, что нельзя? уточнила кодировку исходного источника - говорят, CP-866
Однако буквы Ќ не вижу в списке
Для просмотра контента необходимо: Войти или зарегистрироваться

PS: Включение Multilingual option не помогло
 
Последнее редактирование модератором:

alexas1

Lotus team
10.04.2014
723
144
#13
Это же вопросы интеграции.
Не знаю, как там у вас устроено но может тупо преобразовать ключ, при приёме дока, password - ом, например. В другое поле. По нему и искать? В одну сторону взаимооднозначность будет и с кодировкой не будет проблем, вроде.
 

anna

Lotus team
03.06.2014
400
7
#14
Не знаю, как там у вас устроено но может тупо преобразовать ключ, при приёме дока, password - ом, например. В другое поле. По нему и искать? В одну сторону взаимооднозначность будет и с кодировкой не будет проблем, вроде.
"Вроде" не пойдет.
 

savl

Lotus team
28.10.2011
2 131
102
#15
@anna, тут Морфиус выкладывал код преобразования в DOS, прикладываю.
Попробуйте ключ поиска перед поиском преобразовать через функцию, может быть поможет, если нет - меняйте формирование ключа, это лучшее решение.

Код:
Function toDOS(ByVal s_str$) As String
On Error GoTo handler
Const FuncName = {Function "toDOS" }
Dim ErrStr As String

Dim k%, n_asc%, s_chr$, FR$
For k = Len(s_str) To 1 Step - 1
s_chr = Mid(s_str, k, 1)
n_asc = Asc(s_chr)
If n_asc = 168 Then
s_chr = Chr(240)
ElseIf n_asc = 184 Then
s_chr = Chr(241)
ElseIf n_asc >= 192 And n_asc <= 239 Then
s_chr = Chr(n_asc - 64)
ElseIf n_asc >= 240 And n_asc <= 255 Then
s_chr = Chr(n_asc - 16)
End If
FR = s_chr + FR
Next k
toDOS = FR

GoTo endh
handler:
ErrStr = FuncName & ": " & Err &", в стр " & Erl & nLine & Error$
Error Err,ErrStr
endh:
End Function
 

anna

Lotus team
03.06.2014
400
7
#17
Эт я к тому, что проверить надо (алгоритм посмотреть), да и savl прав - было такое. Но пассворд работает быстрее, чем мухой.
Мне кажется, что нет гарантии, что значение останется уникальным, может случится так, что пассворд для двух разных символьных последовательностей одинаковое значение сгенерит, пропустив невнятные символы чужой кодировки.
Сейчас вот проверила, одинаковое ли значение отдает функция Asc для символов, которые были признаны в GetDocumentByKey одинаковыми - Ќ и [ - оказалось, нет, разные.
ЗЫ: или еще хлеще - пассворд по двум одинаковым последовательностям сгенерит мне разные значения..... и будет совсем красота
 
Последнее редактирование модератором:

savl

Lotus team
28.10.2011
2 131
102
#18
@anna, а если использовать @Password( string ) ?
Код:
@Password("chocolate") = (0449960361D30391DDA7747D537C32F8)
[DOUBLEPOST=1425480856,1425480793][/DOUBLEPOST]И еще , прогоните перед поиском ключ через функцию Морфиуса.
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 567
263
#19
к бениной маме - кодировать все в base64
[DOUBLEPOST=1425481216,1425481183][/DOUBLEPOST]засада будет с пробелами - они равны +
[DOUBLEPOST=1425481259][/DOUBLEPOST]можно еще sha2 ;)
[DOUBLEPOST=1425481558][/DOUBLEPOST]еще есть такая тема
 

anna

Lotus team
03.06.2014
400
7
#20
@anna, тут Морфиус выкладывал код преобразования в DOS, прикладываю.
Попробуйте ключ поиска перед поиском преобразовать через функцию, может быть поможет, если нет - меняйте формирование ключа, это лучшее решение.
Set DivisionDoc=DivisionByCode.GetDocumentByKey(toDOS("!$!Ќ!#"),True)
If Not DivisionDoc Is Nothing Then
Print "Вижу" + DivisionDoc.Division(0) + DivisionDoc.Code(0)
End If

увы, отдает по-прежнему другое: !$![!#
[DOUBLEPOST=1425481850,1425481774][/DOUBLEPOST]
к бениной маме - кодировать все в base64
это в @urlencode? мммм, ну щас