Работа с функциями

Тема в разделе "Lotus - Программирование", создана пользователем NickProstoNick, 9 сен 2008.

  1. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    Доброго времени суток!
    Ребята, вопрос вот какого плана... есть глобальная переменная типа НотесДокумент... есть функция, которая должна возвращать НотесДокумент в переменную... но вот почему-то не возвращает :blink: хотя под отладчиком видно, что функции присваивается нужное значенме, но в переменную не передается :D
    что это за глюк и как с ним бороться?
     
  2. morpheus

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

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    NickProstoNick
    глюк с тем что у вас скорее всего нету глобальной переменной базы данных. и как только фун-ция заканчивает работы, то экземпляр класса база "обнуляеться" и соответственно "обнуляеться" сама привязка к документу
     
  3. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    Глобальная переменная базы есть
     
  4. morpheus

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

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    а мона код ф-ции ?
     
  5. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Передвавай базу в функцию как параметер.
     
  6. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    ради интереса :)
    попробуй свою базу в функции объявить как static

    правда, возможно, если функция будет вызываться несколько раз подряд для получения дока из разных баз, то, наверное, это не сработает :)
     
  7. morpheus

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

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    неа, Omh прав:базу надо передавать как параметр
     
  8. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Вообще, NickProstoNick говорит что, дескать, есть глобальная переменная базы.
    Но я в глобальные переменные не верю, поэтому лучше полирнуть параметром.
     
  9. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    Morpheus ты просто так споришь? :)
    про параметр и так понятно, я в какой-то теме описывал даже этот момент...
    просто интересно, сработает ли такой способ, а самому некогда проверить :)

    зы: глобальные переменные - хорошо, если их правильно юзать, а так, небось типичное имя использовано, а в функции оно переопределено локальной переменной...
     
  10. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    Akupaka
    :)
    Ребята, прошу прощения.... разобрался сам... просто был не внимательный... на автомате спутал буквы в названии функции местами... и не заметил :(


    Но теперь новый вопрос!
    Есть рекурсивная функция (не та что обсуждалась выше)... входящий параметр типа Вариант... в этот параметр передается массив записей из Сиквела... так вот в чем проблема... при возвращении из рекурсии теряются данный из входящего параметра

    Код (Text):
    Function CreateOU( OUInfo As Variant ) As Integer
    Dim OUView As NotesView
    Dim OUDocCollection As NotesDocumentCollection
    Dim OUDoc As NotesDocument
    Dim RefOUDoc As NotesDocument
    Dim Ref As String


    Set OUView = DB.GetView("OrgUnit:ProPeopleOrgUnitID")

    If OUInfo( "OrgUnitREFID" ).Value ="-1" Then ' проверяем находится оргюнит на первом уровне

    Set OUDocCollection = OUView.GetAllDocumentsByKey( "OUID_" + Trim( OUInfo( "OrgUnitREFID" ).Value ), True ) '!!!!!!!!!!!!!!!!!!!!!!!!!!!           
    Set OUDoc = DB.CreateDocument      

    OUDoc.Name = OUInfo( "CityName" ).Value + " №" + Cstr( OUInfo( "BranchNumber" ).Value ) + " (" + OUInfo( "BranchAdress" ).Value + ")"    
    OUDoc.City = OUInfo( "CityName" ).Value  '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    OUDoc.CityEng = OUInfo( "OUCityEng" ).Value  '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    If OUInfo( "BranchNumber" ).Value <> "н/д" Then
    OUDoc.BranchNumber = Cint( OUInfo( "BranchNumber" ).Value )
    End If

    Else

    ' если да - то создаем респонс у родителя

    Set RefOUDoc = OUView.GetDocumentByKey( "ID_" + Trim( OUInfo( "OrgUnitREFID" ).Value ), True ) '!!!!!!!!!!!!!!!!!!!!!!!!!!!    

    '   если родитель отсутствует - то создаем
    If RefOUDoc Is Nothing Then

    Dim TmpRec As Variant
    Set TmpRec = OUInfo

    TmpRec.Find "OrgUnitID = '" + Trim( OUInfo( "OrgUnitREFID" ).Value ) + "' "

    CreateOU = CreateOU( TmpRec )

    Set OUInfo = OURecordSet '  [color="#FF0000"]ТУТ УЖЕ НЕ ПРАВИЛЬНОЕ ЗНАЧЕНИЕ ПРИ ВОЗВРАЩЕНИИ ИЗ РЕКУРСИИ
    OURecordSet - глобальная переменная. причем в этом месте OURecordSet = TmpRec [/color]

    Set RefOUDoc = OUView.GetDocumentByKey( "ID_" + Trim( OUInfo( "OrgUnitREFID" ).Value ), True ) '!!!!!!!!!!!!!!!!!!!!!!!!!!!
    End If

    OUView.Refresh

    Set OUDocCollection = OUView.GetAllDocumentsByKey( "OUREFID_" + Trim( OUInfo( "OrgUnitREFID" ).Value ), True )  '!!!!!!!!!!!!!!!!!!!!!!!!!!!

    Set OUDoc = DB.CreateDocument  

    Call OUDoc.MakeResponse(RefOUDoc)

    OUDoc.Name = OUInfo( "OrgUnitName" ).Value

    End If

    OUDoc.Type = OUInfo( "OrgUnitType" ).Value '!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    OUDoc.SubNumber = OUDocCollection.Count + 1

    OUDoc.ProPeopleOrgUnitID = OUInfo( "OrgUnitID" ).Value 
    OUDoc.ProPeopleOrgUnitRefID = OUInfo( "OrgUnitREFID" ).Value

    OUDoc.Form = "subdivision"

    Call OUDoc.ComputeWithForm( False,False )
    Call OUDoc.Save( True, False, True )   

    End Function
    в чем ошибка?
     
  11. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    А что означает коммент
    Код (Text):
    '!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    ?
     
  12. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    Код (Text):
                Dim TmpRec As Variant
    Set TmpRec = OUInfo

    TmpRec.Find "OrgUnitID = '" + Trim( OUInfo( "OrgUnitREFID" ).Value ) + "' "

    CreateOU = CreateOU( TmpRec )

    Set OUInfo = OURecordSet '  [color="#FF0000"]ТУТ УЖЕ НЕ ПРАВИЛЬНОЕ ЗНАЧЕНИЕ ПРИ ВОЗВРАЩЕНИИ ИЗ РЕКУРСИИ
    OURecordSet - глобальная переменная. причем в этом месте OURecordSet = TmpRec [/color]
    возможно, я и не прав, но ты сначала присваиваешь ссылке TmpRec значение ссылки OUInfo, т.е. фактически, они ссылаются на один объект в памяти, на одни и те же данные, потом вызываешь рекурсивно себя, потом присваиваешь ссылке OUInfo ссылку на какой-то глобальный объект OURecordSet, т.е. если у тебя вызов на втором уровне рекурсии проходит в эту же ветку, т.е. есть вход в третий уровень рекурсии, то ты получишь во всех ссылках одну и ту же, т.е.
    TmpRec is OURecordSet, OUInfo is OURecordSet ну и TmpRec is OUInfo...

    ты прослеживал рекурсию глубже первого уровня?.. посмотри, что у тебя происходит на нижних уровнях рекурсии...
     
  13. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    пока только один уровень... есть вариант до 4-х уровней... но до него я еще не дошел... точнее такой вариант еще не встретился
     
  14. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    ну, не знаю, но у меня подозрение, что у тя в ссылках на объекты проблема...
     
  15. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    Кстати... я говорил что работаю с АДО?
    пробовал сделать вот так

    Set objRecordsetClone=objRecordset.Clone(locktype)

    ругается... почему - не понятно :)
     
  16. dobozy

    dobozy Гость

    Передавача параметра идёт по ссылке. Так как по значению тут сюдя по всему не передашь параметр, то нужно создать свой класс wrapper и менять участок кода так

    Set TmpRec = New WrappedOUInfo(OUInfo)

    CreateOU = CreateOU( TmpRec )

    Правда это только предположения. Идяе в том, чтобы создать новый объект в памяти ну и т.д.
     
  17. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    dobozy, идея-то понятна, да вот так, скорее всего, не поступишь...
    но, можно создать свой класс, который будет хранителем результата из сиквела, и работать с ним...
    а что за АДО? как объект создается? и как ругается при вызове .Clone(locktype)?
     
  18. SkinGreek

    SkinGreek Гость

    ADO - Access Data Object это фича мелкомягкого для работы с источниками данных.
    Как я понял с помощью Find тебе надо найти только 1 запись. То есть структура древовидная, и ты проходишь по нему снизу вверх, от одного листа.
    Решение dobozy я думаю не поможет.
    Вам необходимо перед продолжении рекурсии скинуть все необходимые данные из RS текущей записи.
    Клонировать конечно можно но оно по моему работает только когда открываешь курсор на клиенте, то что вы используете find значит что тип курсора KeySet. Хотя возможно клонирование не работает из-за режима Lock'a. Но я всегда использовал оптимистичный и все было ок(правда это было не в лотусе)
    В данной задачи клонирование излишне. Так как вы используете лишь Find и вам нужна лишь одна запись, вот если бы был Filter и вы бы дальше пробегались по коллекции, тогда бы без клонирования не обойтись.

    Тут передавать в качестве параметра надо лишь OrgUnitID, толк от передачи RS никакого нет - он глобален и Find лишь переносит текущий курсор на первую найденную запись.
     
  19. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    SkinGreek, я знаю, что такое ADO, в какой-то мере, к стати, это ActiveX Data Objects ;)
    я имел в виду, каким образом этот объект получается, чтобы посмотреть его методы и свойства :)
     
  20. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    Это создание соединения
    ADOConnection = CreateObject("ADODB.Connection")

    Это создание RecordSet
    Set TmpRec = CreateObject("ADODB.RecordSet")

    на .Clone(locktype) просто ругается... код ошибки 213.... но в чем именно ошибка - не известно.
    Ну я вобщкм решил проблему... но пришлось делать лишний запрос в Сиквел... :) пока будет так... до лучших времен
     
Загрузка...
Похожие Темы - Работа функциями
  1. Andrey Kha
    Ответов:
    0
    Просмотров:
    33
  2. Hoasker
    Ответов:
    0
    Просмотров:
    65
  3. garri671
    Ответов:
    0
    Просмотров:
    74
  4. lelik200969
    Ответов:
    0
    Просмотров:
    55
  5. Kozolick
    Ответов:
    0
    Просмотров:
    146

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