1. Требуются разработчики и тестеры для проекта codebyOS. Требования для участия в проекте: Знание принципов работы ОС на базе Linux; Знание Bash; Крайне желательное знание CPP, Python, Lua; Навыки системного администрирования. Подробнее ...

    Скрыть объявление
Скрыть объявление

Уважаемый Гость, в 23:30 по мск форум будет закрыт на профилактику на 1,5 часа до 01:00 24.10.2017

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

Тема в разделе "Lotus - Программирование", создана пользователем anna, 4 мар 2015.

  1. anna

    anna Well-Known Member
    Lotus team

    Репутация:
    0
    Регистрация:
    3 июн 2014
    Сообщения:
    354
    Симпатии:
    9
    Добрый день, многоуважаемые коллеги!
    Вот такая вот непонятная штука произошла. У документов есть некое текстовое поле, в котором содержится специфический код, состоящий из спецсимволов. Оно иногда используется как ключ при некой обработке.
    Сегодня наблюдала такую вещь:

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

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

    lmike нет, пердело совершенство
    Lotus team

    Репутация:
    1
    Регистрация:
    27 авг 2008
    Сообщения:
    6.361
    Симпатии:
    336
    не знаю - проблема ли с спецсимволах, но проверить индексы не помешает
     
  3. anna

    anna Well-Known Member
    Lotus team

    Репутация:
    0
    Регистрация:
    3 июн 2014
    Сообщения:
    354
    Симпатии:
    9
    Грохнуть и пересоздать? А где гарантия, что потом не вылезет? Вообще нигде и никак не пользоваться GetDocumentByKey?
     
  4. savl

    savl Well-Known Member
    Lotus team

    Репутация:
    0
    Регистрация:
    28 окт 2011
    Сообщения:
    2.114
    Симпатии:
    157
    @anna, символы проверте.
    Что-то мне подсказывает кто-то скопировал или в другой кодировке сделал.
     
  5. alexas1

    alexas1 Well-Known Member
    Lotus team

    Репутация:
    0
    Регистрация:
    10 апр 2014
    Сообщения:
    645
    Симпатии:
    225
    А причём тут это :bored:. В конечном счёте ВСЕ поиски на разных индексах строятся. Не пользоваться нотусом? ;)
     
  6. anna

    anna Well-Known Member
    Lotus team

    Репутация:
    0
    Регистрация:
    3 июн 2014
    Сообщения:
    354
    Симпатии:
    9
    В поле хранится то, что отдала сторонняя база, какая разница, в какой кодировке искать, лишь бы совпадали ключи, n'est pas?
    --- Добавлено 4 мар 2015. Первое сообщение размещено 4 мар 2015 ---
    Если дело в состоянии индексов, то я буду перманентно боятся, что у меня где-то что-то не сработает как нужно и будут отдаваться любые документы по ключам. А это, получается, вообще вопрос об использовании данной системы. Так что да, именно так как вы сказали - отказываться от сэд на лотус. Но это же бред!
    База, к слову, мелкая, но очень нужная. Как бы печалька
     
  7. savl

    savl Well-Known Member
    Lotus team

    Репутация:
    0
    Регистрация:
    28 окт 2011
    Сообщения:
    2.114
    Симпатии:
    157
    @anna, из серии win-1251 vs KOI-8 Какая разница какая кодировка, символы то есть...
    ASCII коды проверте, тем более что данные идут из другой системы.
    мало ли как их обработал Lotus или внешняя система. Может косяк при передаче был или заполнили там неверно.
    У нас был случай: французские буквы напрочь не принимались (копировали текст внутрь copy/paste) - крокозябры и все тут.
    Заменили на английский текст, тупо перевели - все ок.

    По другому никак не могли? обязательно такой хитрый ключ?
     
    2 пользователям это понравилось.
  8. oshmianski

    oshmianski Достойный программист
    Lotus team

    Репутация:
    0
    Регистрация:
    25 апр 2012
    Сообщения:
    543
    Симпатии:
    13
    я бы в первую очередь отказался от таких ключей (преобразовать в "нормальный вид").
    может попробовать поиграться со свойством бд Multilingual Options?
     
    2 пользователям это понравилось.
  9. anna

    anna Well-Known Member
    Lotus team

    Репутация:
    0
    Регистрация:
    3 июн 2014
    Сообщения:
    354
    Симпатии:
    9
    Это же вопросы интеграции. С другой стороны, а почему нет? Разве где-то написано, что нельзя? уточнила кодировку исходного источника - говорят, CP-866
    Однако буквы Ќ не вижу в списке https://ru.wikipedia.org/wiki/Альтернативная_кодировка#CP866
    PS: Включение Multilingual option не помогло
     
    #9 anna, 4 мар 2015
    Последнее редактирование модератором: 4 мар 2015
  10. anna

    anna Well-Known Member
    Lotus team

    Репутация:
    0
    Регистрация:
    3 июн 2014
    Сообщения:
    354
    Симпатии:
    9
    Проверила, не помогает
     
  11. oshmianski

    oshmianski Достойный программист
    Lotus team

    Репутация:
    0
    Регистрация:
    25 апр 2012
    Сообщения:
    543
    Симпатии:
    13
    просто поднятие галки может не помочь. нужно пересоздать индекс.
     
  12. anna

    anna Well-Known Member
    Lotus team

    Репутация:
    0
    Регистрация:
    3 июн 2014
    Сообщения:
    354
    Симпатии:
    9
    Галку поставила, индексы удалила, заново создала. База-то вся 256 мб.
     
  13. alexas1

    alexas1 Well-Known Member
    Lotus team

    Репутация:
    0
    Регистрация:
    10 апр 2014
    Сообщения:
    645
    Симпатии:
    225
    Не знаю, как там у вас устроено но может тупо преобразовать ключ, при приёме дока, password - ом, например. В другое поле. По нему и искать? В одну сторону взаимооднозначность будет и с кодировкой не будет проблем, вроде.
     
  14. anna

    anna Well-Known Member
    Lotus team

    Репутация:
    0
    Регистрация:
    3 июн 2014
    Сообщения:
    354
    Симпатии:
    9
    "Вроде" не пойдет.
     
  15. savl

    savl Well-Known Member
    Lotus team

    Репутация:
    0
    Регистрация:
    28 окт 2011
    Сообщения:
    2.114
    Симпатии:
    157
    @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
     
  16. alexas1

    alexas1 Well-Known Member
    Lotus team

    Репутация:
    0
    Регистрация:
    10 апр 2014
    Сообщения:
    645
    Симпатии:
    225
    Эт я к тому, что проверить надо (алгоритм посмотреть), да и savl прав - было такое. Но пассворд работает быстрее, чем мухой.
     
  17. anna

    anna Well-Known Member
    Lotus team

    Репутация:
    0
    Регистрация:
    3 июн 2014
    Сообщения:
    354
    Симпатии:
    9
    Мне кажется, что нет гарантии, что значение останется уникальным, может случится так, что пассворд для двух разных символьных последовательностей одинаковое значение сгенерит, пропустив невнятные символы чужой кодировки.
    Сейчас вот проверила, одинаковое ли значение отдает функция Asc для символов, которые были признаны в GetDocumentByKey одинаковыми - Ќ и [ - оказалось, нет, разные.
    ЗЫ: или еще хлеще - пассворд по двум одинаковым последовательностям сгенерит мне разные значения..... и будет совсем красота
     
    #17 anna, 4 мар 2015
    Последнее редактирование модератором: 4 мар 2015
  18. savl

    savl Well-Known Member
    Lotus team

    Репутация:
    0
    Регистрация:
    28 окт 2011
    Сообщения:
    2.114
    Симпатии:
    157
    @anna, а если использовать @Password( string ) ?
    Код:
    @Password("chocolate") = (0449960361D30391DDA7747D537C32F8)
    --- Добавлено 4 мар 2015. Первое сообщение размещено 4 мар 2015 ---
    И еще , прогоните перед поиском ключ через функцию Морфиуса.
     
  19. lmike

    lmike нет, пердело совершенство
    Lotus team

    Репутация:
    1
    Регистрация:
    27 авг 2008
    Сообщения:
    6.361
    Симпатии:
    336
    к бениной маме - кодировать все в base64
    --- Добавлено 4 мар 2015. Первое сообщение размещено 4 мар 2015 ---
    засада будет с пробелами - они равны +
    --- Добавлено 4 мар 2015 ---
    можно еще sha2 ;)
    --- Добавлено 4 мар 2015 ---
    еще есть такая тема
     
  20. anna

    anna Well-Known Member
    Lotus team

    Репутация:
    0
    Регистрация:
    3 июн 2014
    Сообщения:
    354
    Симпатии:
    9
    Set DivisionDoc=DivisionByCode.GetDocumentByKey(toDOS("!$!Ќ!#"),True)
    If Not DivisionDoc Is Nothing Then
    Print "Вижу" + DivisionDoc.Division(0) + DivisionDoc.Code(0)
    End If

    увы, отдает по-прежнему другое: !$![!#
    --- Добавлено 4 мар 2015. Первое сообщение размещено 4 мар 2015 ---
    это в @urlencode? мммм, ну щас
     
Загрузка...

Поделиться этой страницей