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

Anatoly

Lotus team
30.03.2007
222
0
#1
Необходимо в один отчет по договору собрать связанные с выбранным договором документы (пока из 2 баз)
Причем выводиться и обрабатываться они должны в хронологическом порядке, дата в каждом типе документа своя.
С выборками проблем нет: в каждом документе имеется поле для связи с договором.
А вот как сделать хронологию, я пока не представляю.
Пока думаю сделать в основной базе (там храниться подавляющая часть обрабатываемых документов) новую форму, документы по которой будут хранить нужные поля из документов вспомогательной базы. И решить вопрос с прозрачным для пользователя режимом их создания и синхронизации...
 

dimat

Lotus team
31.07.2008
516
0
#2
Скопировать в бд, где вью со столбцом отсортированным по дате?
 

Anatoly

Lotus team
30.03.2007
222
0
#3
Мне нужно каким-то образом получить к обработке отсортированную совокупность коллекций документов из 2 баз.
Пока дело шло обо 1 базе, я отбирался в ней несколько коллекций по критерию, кидал их папку, сортировал и обрабатывал.
Сейчас появилась необходимость обрабатывать еще 1 вид документов. Документы эти находятся в другой базе.
Копировать их в первую папку? В полном объеме вряд-ли есть смысл, редактировать их там все равно нельзя. Переносить какие то поля с привязкой - как написал в 1 посте, пока склоняюсь к этому варианту.
 

morpheus

скриптописец
07.08.2006
3 915
1
#4
Anatoly
я бы просто написал свой класс "коллекция доков" - куда запулил бы все-все нужные документы из всех баз.
2я стадия - сортировка коллекции по дате - тут великое множество вариантов (от метода "пузырьком" на ЛС, до использования связки лс2жава )
3я - вывод пользователю. тут уже как хотите - можно в эксель, можно в хтмл и .тд.
 

Anatoly

Lotus team
30.03.2007
222
0
#5
Если я правильно понял, предлагается сделать массив документов с, скажем 1 колонкой - дата, 2-база, 3-UNID,
и отсортировать по 1 колонке?
 

nvyush

Lotus team
22.04.2009
2 317
0
#6
Если я правильно понял, предлагается сделать массив документов с, скажем 1 колонкой - дата, 2-база, 3-UNID,
и отсортировать по 1 колонке?
Типа того, только лучше "завернуть" всё в класс.
2я стадия - сортировка коллекции по дате - тут великое множество вариантов (от метода "пузырьком" на ЛС, до использования связки лс2жава )
"Пузырьком" неэффективно, есть qsort, реализацию на LS можно посмотреть в names.nsf
 

morpheus

скриптописец
07.08.2006
3 915
1
#7
Если я правильно понял, предлагается сделать массив документов с, скажем 1 колонкой - дата, 2-база, 3-UNID,
и отсортировать по 1 колонке?
класс, при чем класс содержащий массив документов(а лучше даже зделать отдельный класс для описания каждого документа. только с нужной инфой).
одним из методов которого будет сортировка.

<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">
Код:
' класс "обёртака" для описания каждого отдельного документа
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
"Пузырьком" неэффективно, есть qsort, реализацию на LS можно посмотреть в names.nsf
а я и не говорил что он эффективен, я просто привел пример
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 586
272
#8
сортировка с использованием java:
Код:
'класс реализован для вывода отсортированных значений списком (в массив 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

Добавлено: константы
Код:
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
 

Вложения

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 586
272
#9
как понятно из кода - сортирует по ключу, состоящему из набора полей дока
 

Anatoly

Lotus team
30.03.2007
222
0
#11
Почему-то попытка скачать архив приводит к сбрасыванию авторизации...
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 586
272
#12
здесь я не виноват :rolleyes:
можно просто написать свои обработчики, а для LS2J:
Код:
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