Сравнение двух Variant

Тема в разделе "Lotus - Программирование", создана пользователем IsAvailable, 13 мар 2007.

  1. IsAvailable

    IsAvailable Гость

    Есть две переменные типа Variant: v1, v2
    В них записываются значения, полей типа DialogList, которые иногда просто строки, иногда - список строк. Необходимо производить сравнение на равенство этих элементов. Если оба элемента однострочные, то всё ок, а когда один элемент строка, а другой - список, то вываливается ошибка Type mismatch : (
    И что-то никак не соображу, как в этой ситуации лучше обойти эту ошибку.
     
  2. LuMee

    LuMee Well-Known Member

    Регистрация:
    2 май 2006
    Сообщения:
    477
    Симпатии:
    0
    Думаю, для начала следует определиться, каким образом следует сравнивать, скажем, строку со списком. Сравнивать ее с каждым элементом, а потом выдумывать "сводный" результат? Или собрать список в одну строку с определенным разделителем (например Tab), и уже сравнивать две строки?
     
  3. morpheus

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    Сравнивайте, например, формулой со знаком сравнения *=
    пачему так? читайте тут
     
  4. IsAvailable

    IsAvailable Гость

    Сравнивать нужно таким образом: одно и то же это или нет : )

    "а1":"с1" и "а1" ==> false
    "а1" и "а1" ==> true
    "а1" и "а1":"с1" ==> false
    "а1":"с1" и "а1":"с1" ==> true
    "с1":"а1" и "а1":"с1" ==> false

    Вроде, все варианты разобрал : )
     
  5. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Можно так:
    f = Evaluate({поле1 = поле2}, doc)
    if f(0) = "1" then ...
    Или так: if join(doc.поле1) = join(doc.поле2) then ...
     
  6. IsAvailable

    IsAvailable Гость

    Для: Morpheus
    Ага. Прочитал. Спасибо за линк. И хэлп за одно по второму разу перечитал те главы )
    В принципе мне нужно эквивалентное сравнение.
    По идее подходить должно обычное "=", но в этом случае вываливается Type mismatch, когда один Variant список, а другой - строка
     
  7. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    <!--QuoteBegin-Medevic+13:03:2007, 11:00 -->
    <span class="vbquote">(Medevic @ 13:03:2007, 11:00 )</span><!--QuoteEBegin-->f = Evaluate({поле1 = поле2}, doc)
    [snapback]58869" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    Хотя это не совсем верно. :)
    Нужно еще сравнить количество элементов в списке.
     
  8. IsAvailable

    IsAvailable Гость

    Для: Medevic
    Значения в переменные типа Variant не непосредственно из дока берутся, а через вьюху с помощью AllEntries и потом через Columnvalues(x).
    Соответственно Evaluate и не пробовал, а Join выдает всё тот же Type mismatch :-о
     
  9. Constantin A Chervonenko

    Constantin A Chervonenko Well-Known Member

    Регистрация:
    30 май 2006
    Сообщения:
    1.288
    Симпатии:
    0
    Да, Evaluate - это для полей, а не переменных.
    Для переменных в 6-ке появились замечТательные функции Implode/Join и Split - аналоги "собачьих" @Implode и @Explode.

    Так что превращайте массивы в строки и сравнивайте их! Impode декларирует всеядность к типам...
     
  10. IsAvailable

    IsAvailable Гость

    Сделал так:

    Код (Text):
    If Isarray(v1) Then s1$ = Implode(v1,",") Else s1$ = Cstr(v)
    If Isarray(v2) Then s2$ = Implode(v2,",") Else s2$ = Cstr(v2)
    И потом уже сравниваю s1$ и s2$

    Если без проверки на array делать Implode, то ругается на тип уже при обычных строках...
    Ну а так работает, вроде : )
     
  11. anna

    anna Lotus team
    Lotus team

    Регистрация:
    3 июн 2014
    Сообщения:
    312
    Симпатии:
    8
    Спасибо, пригодилось.
     
  12. Shandrik

    Shandrik Well-Known Member

    Регистрация:
    30 дек 2010
    Сообщения:
    236
    Симпатии:
    24
    Только учтите, что использование Implode подразумевает, что вам при сравнении важен порядок.

    Т.е. если v1="1":"2", а v2="2":"1", но после Implode они будут НЕ равны.
     
  13. Domino-Designer

    Domino-Designer Lotus team
    Команда форума Lotus team

    Регистрация:
    6 дек 2011
    Сообщения:
    128
    Симпатии:
    5
    ОФФТОП
    Я шизею от постановки вопроса и : "Есть две переменные типа Variant: v1, v2"
    Сравнивать Variant ... это круто.
    Мой наглый совет, вот откуда вы этот вариант/значения получали, вот там сравнивайте
     
  14. anna

    anna Lotus team
    Lotus team

    Регистрация:
    3 июн 2014
    Сообщения:
    312
    Симпатии:
    8
    В общем-то, конечно, но не всегда годится: таких мест, откуда вызывается функция, слишком много, и не править же везде, если нужно один какой-то вариант параметра обработать иначе.
     
  15. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.052
    Симпатии:
    146
    Насколько я помню, разных типов в Variant массиве быть не может, там будет единый, но variant (с максимально подходящим типом).
    Если преобразовать оба параметра в массив, то задача сведется к сравнению массивов...
     
Загрузка...

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