Собрать Доки Из Разных Баз

Тема в разделе "Lotus - Программирование", создана пользователем Anatoly, 17 дек 2011.

  1. Anatoly

    Anatoly Well-Known Member

    Регистрация:
    30 мар 2007
    Сообщения:
    204
    Симпатии:
    0
    Необходимо в один отчет по договору собрать связанные с выбранным договором документы (пока из 2 баз)
    Причем выводиться и обрабатываться они должны в хронологическом порядке, дата в каждом типе документа своя.
    С выборками проблем нет: в каждом документе имеется поле для связи с договором.
    А вот как сделать хронологию, я пока не представляю.
    Пока думаю сделать в основной базе (там храниться подавляющая часть обрабатываемых документов) новую форму, документы по которой будут хранить нужные поля из документов вспомогательной базы. И решить вопрос с прозрачным для пользователя режимом их создания и синхронизации...
     
  2. dimat

    dimat Lotus team
    Lotus team

    Регистрация:
    31 июл 2008
    Сообщения:
    518
    Симпатии:
    0
    Скопировать в бд, где вью со столбцом отсортированным по дате?
     
  3. Anatoly

    Anatoly Well-Known Member

    Регистрация:
    30 мар 2007
    Сообщения:
    204
    Симпатии:
    0
    Мне нужно каким-то образом получить к обработке отсортированную совокупность коллекций документов из 2 баз.
    Пока дело шло обо 1 базе, я отбирался в ней несколько коллекций по критерию, кидал их папку, сортировал и обрабатывал.
    Сейчас появилась необходимость обрабатывать еще 1 вид документов. Документы эти находятся в другой базе.
    Копировать их в первую папку? В полном объеме вряд-ли есть смысл, редактировать их там все равно нельзя. Переносить какие то поля с привязкой - как написал в 1 посте, пока склоняюсь к этому варианту.
     
  4. morpheus

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

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    Anatoly
    я бы просто написал свой класс "коллекция доков" - куда запулил бы все-все нужные документы из всех баз.
    2я стадия - сортировка коллекции по дате - тут великое множество вариантов (от метода "пузырьком" на ЛС, до использования связки лс2жава )
    3я - вывод пользователю. тут уже как хотите - можно в эксель, можно в хтмл и .тд.
     
  5. Anatoly

    Anatoly Well-Known Member

    Регистрация:
    30 мар 2007
    Сообщения:
    204
    Симпатии:
    0
    Если я правильно понял, предлагается сделать массив документов с, скажем 1 колонкой - дата, 2-база, 3-UNID,
    и отсортировать по 1 колонке?
     
  6. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Типа того, только лучше "завернуть" всё в класс.
    "Пузырьком" неэффективно, есть qsort, реализацию на LS можно посмотреть в names.nsf
     
  7. morpheus

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

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    класс, при чем класс содержащий массив документов(а лучше даже зделать отдельный класс для описания каждого документа. только с нужной инфой).
    одним из методов которого будет сортировка.

    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Например (могут синт. ошибки):</div></div><div class="sp-body"><div class="sp-content">
    Код (LotusScript):
    ' класс "обёртака" для описания каждого отдельного документа
    Class MyDoc
    public Title as string
    public Date as notesdatetime

    sub new ( d as NotesDocument )
    ' тут обработка и Вытягивание инфы для класса из каждого отдельного документа
    End sub
    Class


    ' Класс для консолидации всех данных
    Class MyColl
    Public Documents() as MyDoc

    Sub Sort
    End Sub

    sub addCollTomeDocs( ndc as NotesDocumentCollection)
    dim tmpD as MyDoc
    Dim nd As notesDocument

    Set nd = ndc.GetFirstDocument

    ' тут можно добавлять в коллекцию MyColl.Documents каждый документ из коллекции ndc, обработов его Set tmpD = New MyDoc( nd ) и т.д.
    end sub
    Class
    а я и не говорил что он эффективен, я просто привел пример
     
  8. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.081
    Симпатии:
    300
    сортировка с использованием java:
    Код (LotusScript):
    'класс реализован для вывода отсортированных значений списком (в массив LS)
    Class SortObj As ErrorHandlerWJ
    Private SortListObj As JavaObject
    Private SortListClass As JavaClass
    Private fCount As Long
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Sub New()
    Dim fail As Boolean
    On Error Goto errorhandler
    Set SortListClass = jSession.GetClass("SortList")
    Set SortListObj = SortListClass.CreateObject
    ExitFunction:
    If fail Then
    On Error Goto 0
    Error ERRLS2JINIT, CS_ERRLS2JINIT
    End If
    Exit Sub
    errorhandler:
    Call Me.RaiseError()
    fail=True
    Resume ExitFunction
    End Sub
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Sub Delete()
    If Not SortListObj Is Nothing Then
    Delete SortListObj
    End If
    End Sub
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Sub Add(s As String)
    SortListObj.add(s)
    End Sub
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Function Remove(s As String) As Boolean
    Me.Remove=SortListObj.remove(s)
    End Function
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Function GetIndex(s As String)
    GetIndex=SortListObj.getindex(s)
    End Function
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Function Sort() As Variant
    Sort=SortListObj.sort()
    End Function
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Property Get Count As Long
    Count=SortListObj.count()
    End Property
    End Class
    '************************************
    Class SorterObj As ErrorHandler
    Private keyList List As String 'ключём явл. UNID, значением - ключ сортировки (для доступа по UNID)
    Private docsHash List As NotesDocument 'для доступа к документу по индексу, из отсорт. массива
    Private sortArr As Variant 'сюда попадают отсортированные ключи
    Private Sorter As SortObj
    Private keys As Variant
    Private isChanged As Boolean
    Private isDoctype As Boolean
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    'docArr - массив NotesDocument, для сортировки
    'xKeys - список имен полей, по кот. будет сортироваться, поля не д.б. многозначными (использует 1-е значение)
    Sub New(docArr List As NotesDocument, xKeys As Variant)
    On Error Goto ErrH
    Set Sorter=New SortObj
    keys=xKeys
    If Not Isarray(keys) Then Dim tmp:tmp=Split({},{}):tmp(0)=keys:keys=tmp
    Forall x In docArr
    Call Add(x)
    End Forall
    isDoctype=True
    Quit:
    Exit Sub
    ErrH:
    Error Err, RaiseError
    End Sub
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Function Add(doc As NotesDocument) As NotesDocument
    On Error Goto ErrH
    Dim s As String
    s=doc.UniversalID
    Set docsHash(s)=doc
    Dim key As String
    key=JoinKeys(doc)
    keyList(s)=key
    Sorter.Add(key &EL_SEP &s)
    Set Me.Add=doc
    isChanged=True
    Quit:
    Exit Function
    ErrH:
    Error Err, RaiseError
    End Function
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Function JoinKeys(xDoc As NotesDocument) As String
    On Error Goto ErrH
    Dim sKey
    sKey=Split("","")
    '       DbgMsg({fields:} &Join(keys,{;}))
    Forall k In keys
    Dim s As String
    'явное приведение к типу
    s=Cstr(k)
    If xDoc.HasItem(s) Then
    Dim v
    v=xDoc.GetItemValue(s)
    Dim itm As NotesItem
    Set itm=xDoc.GetFirstItem(s)
    'преобразуем к виду, кот. "правильно" сортируется как строка
    Select Case itm.Type
    Case NUMBERS:
    s=Format(v(0), {000000.00})
    Case DATETIMES:
    s=Format(v(0), {YYYYMMDD})
    Case TEXT:
    s=v(0)
    Case Else
    'генерим ошибку
    Error ERRINCOMARTIBLE, CS_ERRINCOMARTIBLE & CS_INCOMPFIELD
    End Select
    sKey=Arrayappend(sKey, Ucase(s))
    End If
    End Forall
    sKey=Join(sKey, SORT_SEP)
    JoinKeys=sKey
    Quit:
    Exit Function
    ErrH:
    Error Err, RaiseError
    End Function
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Property Get NthDocument(i As Long) As NotesDocument
    On Error Goto ErrH
    GetAll
    Dim s As String
    s=sortArr(i)
    DbgMsg Cstr(i) &{;Sorted key:} &s
    'вылетит по ошибке если индекс больше Count
    Set NthDocument=docsHash(Strrightback(s, EL_SEP))
    Quit:
    Exit Property
    ErrH:
    Error Err, RaiseError
    End Property
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Property Get Count As Long
    Count=Sorter.Count
    End Property
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Private Function GetAll As Variant
    If isChanged Then
    sortArr=Sorter.Sort()
    isChanged=False
    End If
    GetAll=sortArr
    End Function
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Function GetIndex(doc As NotesDocument) As Long
    On Error Goto ErrH
    GetAll 'сортировка если нужно
    GetIndex=Sorter.GetIndex(keyList(doc.UniversalID) &EL_SEP &doc.UniversalID)
    Quit:
    Exit Function
    ErrH:
    Error Err, RaiseError
    End Function
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Function Remove(doc As NotesDocument) As Boolean
    On Error Goto ErrH
    If Sorter.Remove(keyList(doc.UniversalID) &EL_SEP &doc.UniversalID) Then
    Erase docsHash(doc.UniversalID)
    Erase keyList(doc.UniversalID)
    isChanged=True
    Me.Remove=True
    End If
    Quit:
    Exit Function
    ErrH:
    Error Err, RaiseError
    End Function
    End Class
    java класс:<!--shcode--><pre><code class='java'>import java.util.*;
    public class SortList {
    private ArrayList arrList=new ArrayList();
    public void add(String s){
    arrList.add(s);
    }
    public boolean remove(String s){
    return arrList.remove(s);
    }
    public String[] sort(){
    Collections.sort(arrList);
    String[] sorted=new String[arrList.size()];
    arrList.toArray(sorted);
    return sorted;
    }
    public int count(){
    return arrList.size();
    }
    public int getIndex(String s){
    return arrList.indexOf(s);
    }
    }[/CODE]встречающийся обработчик ошибок Посмотреть вложение ErrorHandling.lss.zip

    Добавлено: константы
    Код (LotusScript):
    Const ERRBASE_LOCALLIB=1130
    Private Const ERRLS2JINIT=ERRBASE_LOCALLIB+1, CS_ERRLS2JINIT={ошибка инициализации класса Java}
    Private Const ERRINCOMARTIBLE=ERRBASE_LOCALLIB+2, CS_ERRINCOMARTIBLE={несовместимый тип}
    Private Const ERRSORTED=ERRBASE_LOCALLIB+3, CS_ERRSORTED={массив отсортирован}
    Private Const ERRABSTRACT=ERRBASE_LOCALLIB+4, CS_ERRABSTRACT={необходимо рализовать ф-цию:}

    Private Const CS_INCOMPFIELD={ поля}
    Private Const CS_INCOMPVAR={ переменной}
    Private Const CS_ERRTRDB={отсутствует база по шаблону:}

    Const UNID_LEN=32

    Private Const SORT_SEP={$$} 'разделитель составного ключа, для сортировки
    Private Const UID_SEP={:} 'разделитель DBRID:UNID
    Private Const EL_SEP={_} 'раделитель ключа и UNID
    Private Const LIST_SEP={;}

    Private ses As NotesSession
    Private db As NotesDatabase
    Private jSession As JavaSession
    Private IntegerJ As JavaClass
     
  9. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.081
    Симпатии:
    300
    как понятно из кода - сортирует по ключу, состоящему из набора полей дока
     
  10. Anatoly

    Anatoly Well-Known Member

    Регистрация:
    30 мар 2007
    Сообщения:
    204
    Симпатии:
    0
    Спасибо, буду пробовать разные варианты решения...
     
  11. Anatoly

    Anatoly Well-Known Member

    Регистрация:
    30 мар 2007
    Сообщения:
    204
    Симпатии:
    0
    Почему-то попытка скачать архив приводит к сбрасыванию авторизации...
     
  12. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.081
    Симпатии:
    300
    здесь я не виноват :rolleyes:
    можно просто написать свои обработчики, а для LS2J:
    Код (LotusScript):
    Class ErrorHandler

    Sub ClrError()
    End Sub
    Sub New()
    Call Me.ClrError()
    End Sub
    Function GetModuleInfo() As String
    Dim thisType As String, modInfo As String  
    thisType= Typename(Me)
    ' Not a class, use the calling module instead
    If (thisType = "") Then thisType = Getthreadinfo(11)
    modInfo = thisType & "::" & Getthreadinfo(10) & ": "
    GetModuleInfo=modInfo
    End Function
    Function RaiseError() As String
    Dim es As String
    es=GetModuleInfo()
    If (Err = 0) Then
    es = es + "Manually raised an error"
    Else
    es = es + "err. (" + Trim(Str(Err)) + ") " + Error$ + " l. "+ Trim(Str(Erl))
    End If
    Print es
    Me.RaiseError=es & Chr(10)
    Call Me.ClrError()
    End Function
    End Class

    Class ErrorHandlerWJ As ErrorHandler
    Private jSession As JavaSession
    Private jError As JavaError
    Sub New()
    On Error Goto errorhandler
    Set jSession= New JAVASESSION
    ExitFunction:
    Exit Sub
    errorhandler:
    Call ErrorHandler..RaiseError()
    Resume ExitFunction
    End Sub
    Function RaiseError() As String
    Set jError = jSession.getLastJavaError()
    Dim es As String
    If (jError.errorMsg = "") Then     
    es=ErrorHandler..RaiseError()
    Else
    es=GetModuleInfo()+"Error at line " & Erl & ": " & jError.errorMsg
    Print es
    jSession.ClearJavaError        
    End If
    RaiseError=es
    End Function
     
Загрузка...

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