Сравнение Полей

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

  1. BEST

    BEST Гость

    Столкнулась с проблемой. Необходимо в базе с гербовыми бланками найти и изменить статус n-ому количеству бланков в статусе "не использован" на "использован". Определить какой бланк нужно исправлять можно только по ссылкам в документах другой базы.
    Во второй базе в документе отмечается номер бланка, который был использован (поле Doc_NumberBlank). SB_Number - поле с номером бланка в первой базе.
    Написала агентик маленький, а там сравнение не отрабатывает, не знаю где может быть ошибка. Может кто подскажет?
    Вот код:
    Код (LotusScript):
    Set db = ses.CurrentDatabase
    Dim db_out As New NotesDatabase(db.Server,"kancler/dp_stamp.nsf")

    Set Coll_Blank= db_out.Search({Form="StampBlank" & SB_StatusBlank ="Не использован" }, Nothing, 0)
    Messagebox "Количество найденных документов =" + Cstr(Coll_Blank.Count), 48,"Внимание!"             //Coll_Blank.Count=1660

    Set db = ses.CurrentDatabase
    Dim db_in As New NotesDatabase(db.Server,"kancler/dp_intern.nsf")
    Set Coll_Doc = db_in.Search({Form="RKK" & Doc_NumberBlank !="" }, Nothing, 0)
    Messagebox "Количество найденных документов =" + Cstr(Coll_Doc.Count), 48,"Внимание!"           //Coll_Doc.Count=106
    k=0
    For i = 0 To Coll_Doc.Count -1
    Set DocRkk = Coll_Doc.GetNthDocument(i+1)
    For j = 0 To Coll_Blank.Count -1
    Set DocBlank = Coll_Blank.GetNthDocument(j+1)                                        
    [b]If DocRkk.Doc_NumberBlank(0) = DocBlank.SB_Number(0) Then[/b]     //мне кажется что ошибка где-то здесь(
    k=k+1                                                                                //k=0, хотя там эти совпадения присутствуют (проверено)
    End If
    Next
    Next

    Messagebox "Количество найденных документов =" + Cstr(k), 48,"Внимание!"
     
  2. morpheus

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

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    1. Не использовать конструкцию GetNthDocument, юзайте GetNextDocument
    2. Типы полей совпадают?
    3. В дебаггере что видно?
     
  3. Мыш

    Мыш Lotus team
    Lotus team

    Регистрация:
    12 фев 2008
    Сообщения:
    1.020
    Симпатии:
    8
    Возможно наличие разного числа пробелов (визуально фиг заметишь) или вообще "левых" символов. И еще про регистр символов не забудьте. Ну и традиционно - совпадающие визуально символы англ. и рус. алфавитов...
    Предлагаю вывести значения полей в файл и затем посмотреть в HEX'ах.
     
  4. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.075
    Симпатии:
    300
    как я понял - стоит задача подсчета одинаковых значений, дык нафига такой код?
    бежим по коллекциям, собираем в
    Код (LotusScript):
    Dim values List As Long
    s=Cstr(val) 'можно бежать по энтрисам - где в колонках уже стринги
    if IsElement(values(s)) Then values(s)=values(s)+1:Else values(s)=1
    а тут... - цикл в цикле, да еще последовательный перебор (бр-р-р)
     
  5. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    GetNthDocument на данную проблему не влияет, а влияет на скорость перебора доков коллекции. Действительно лучше использовать GetNextDocument.

    BESTыжая
    Код (Text):
    For i = 0 To Coll_Doc.Count -1
    Set DocRkk = Coll_Doc.GetNthDocument(i+1)
    можно было бы заменить на
    Код (Text):
    For i = 1 To Coll_Doc.Count
    Set DocRkk = Coll_Doc.GetNthDocument(i)
    код немного бы упростился.

    Предположу, что проблема в логике - Вы сравниваете 1-й док из одной коллеции с 1-м из другой, и т.д., а такого соответствия никогда не будет.
    Надо взять одну коллекцию, проходя брать док, а по нему вытягивать коллекцию документов, - Вы говорите, что они по "ссылке" связаны, вот и ищите "по ней". Операция долгая... я бы для поиска связанных доков использовал поиск по виду.
    Т.е. получится:
    - поиск коллекции основных документов
    - цикл по ним; в цикле:
    --- поиск коллекции связанных (по виду) для основного документа;
    --- обработка коллекции связанных.
    Ну или что-то типа того. Можно делать обратный поиск, но это смотря какая задача.. Лучше делать так, чтобы в цикле по максимуму сократить количество поисков связанных документов.
     
  6. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.075
    Симпатии:
    300
    ну и то что коллеги перечислили выше
     
  7. BEST

    BEST Гость


    GetNextDocument не срабатывает - ошибку пишет
    Типы полей совпадают - text


    Добавлено:


    Код состоит из 7 цифр без пробелов и символов, я так думаю что все эти варианты отпадают

    Насчет подсчета - это просто упрощенный вариант, чтобы не захламлять код. В оригинале if выглядит так:
    If DocRkk.Doc_NumberBlank(0) = DocBlank.SB_Number(0) Then
    k=k+1
    Call DocBlank.PutInFolder("Настройка \ Анализ и корректировка док-тов")
    Call DocBlank.ReplaceItemValue("SB_StatusBlank", "Использован")
    Call DocBlank.ReplaceItemValue("status_key", "19")
    Call DocBlank.Save(True, False)
    End If
     
  8. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Направильно готовите. См. хэлп, там конструкция цикла другая.

    Добавлено: И, да, ещё раз, - ваша ошибка не в GetNthDocument.

    Добавлено (2):
    Эту строку убрал бы:
    Код (LotusScript):
    Call DocBlank.ReplaceItemValue("SB_StatusBlank", "Использован")
    лучше прописывать числовой код, а надпись выводить в интерфейсе, на форме.
     
  9. morpheus

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

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    подтверждаю, не в нём, привел как п1 потому что бросилось в глаза

    дополнительно, попробуйте (если регистр не важен)

    If Trim(lcase(DocRkk.Doc_NumberBlank(0))) = Trim(lcase(DocBlank.SB_Number(0) )) Then

    + что показывает дебагер???
     
  10. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    по 2 действия со стороками (а действия со строками гораздо тяжелее работают), не лучше ли:

    Код (LotusScript):
    If Val(DocRkk.GetItemValue("Doc_NumberBlank")(0)) = Val(DocBlank.GetItemValue("SB_Number")(0)) Then
     
  11. BEST

    BEST Гость


    Насчет логики немного не понятно, я ведь сравниваю поле 1-го документа из 1-й коллекции с полем 1-го док-та из 2-ой коллекции, а не сами документы.
    Ссылка заключается в том что в документе присутствует поле (Doc_NumberBlank) с номером бланка, который используется. Именно по этому полю я и пытаюсь их найти. Doc_NumberBlank !="" - здесь я и отбираю документы, которые связаны с гербовыми бланками. У меня получилось 2 коллекции документов с минимальным количеством док-тов в них. Это насколько я все понимаю, может где-то торможу, незнаю
     
  12. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.075
    Симпатии:
    300
    здесь зависит от логики
    итак:
    - кол-во итераций - в вашем случае N*K (причем медленных)
    - в случае последовательного перебора 2-х колекций - N+K + перебор листа (оптимизированный)

    как формировать лист - это уже от деталей зависит
    в лист должны попадать значения из меньшей коллекции (если они не одинаковые)

    почему так - перебор в листе будет более эффективный (там поиск д.б. оптимизирован) - там хэш
     
  13. turumbay

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    насколько гораздо? :)
    в указанном коде операции со строками занимают тысячные доли процента времени выполнения.
    а вот оптимизация lmike сократит время выполнения в сто(!) раз: 1660*106 / ( 1660 + 106 ) ~ 100
     
  14. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    на много, сравните
    Я предлагаю оптимизацию, которая сократит время выполнения в 1000 раз))) см. ниже.
    Решение перебора коллекции в коллекции кривое "архитектурно".

    На форме основного документа, в которой меняется поле, при/после сохранения сравнивайте старое и новое значение отслеживаемого вами поля, и если оно изменилось, ищите в другой базе связанные документы и меняйте их.
    При таком подходе вы каждый раз будете работать адресно (менять только нужные документы), и никакие дополнительные агенты с переборами не будут нужны.
     
  15. BEST

    BEST Гость

    Проблема в том, что так то оно и есть, просто в связи с обновлениями у нас где-то месяц не отрабатывала эта проверка в итоге смешались бланки которые действительно не использованы и те, которые использованы, но не изменили свой статус. Найти кривые бланки проблематично потому что обе базы очень большие, на счет оптимизации я не заморачивалась так как агент единоразовый - один раз отработает и под снос его можно.


    Еще нашла ошибку дебагером, предполагаю, что из-за нее:
    значение Val(DocBlank.GetItemValue("SB_Number")(0)) всегда равно 0.

    При выборе (проверочной) коллекции (Set Coll_Blank= db_out.Search({Form="StampBlank" & SB_StatusBlank ="Не использован" & SB_Number="0040162" ) отрабатывает. При сравнении нет. Пробовала всеми выше перечисленными методами.
     
  16. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    BESTыжая
    Проверьте внимательно названия полей. Если вместо DocBlank.GetItemValue("SB_Number")(0) будет DocBlank.GetItemValue("SB_Nunber")(0) или что ещё, Lotus не выдаст ошибки, а вернёт пустую строку.
     
  17. BEST

    BEST Гость



    и проверяла, и копировала и вставляла, чтобы идентично было, ничего не помогает, походу не в этом дело

    Добавлено:


    и проверяла, и копировала и вставляла, чтобы идентично было, ничего не помогает, походу не в этом дело
     
  18. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.075
    Симпатии:
    300
    а потом мы возмущаемся индусским кодом
    если нет желания сделать "нормально" - лучше вообще не делать
     
  19. BEST

    BEST Гость

    проблема не в том что нет желания, а в том что нет навыков, я то админ, а не программист lotus, поэтому для меня и этот агент не легко дается, да и возможностей
    у меня не много, весь исходный код закрыт, открыты только базы с агентами и отчетами, да и принципы построения я не знаю, вот и приходится лезть в свойства, искать поля и делать предположения, чтобы хоть что-то сделать
     
  20. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.075
    Симпатии:
    300
    тематический админ должен разбираться в программировании, и потратить время на это - тоже обязан
     
Загрузка...

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