Форум программистов, компьютерный форум, киберфорум
Наши страницы
Lotus Notes/Domino: Программирование
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.94/86: Рейтинг темы: голосов - 86, средняя оценка - 4.94
omototy
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 223
1

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

16.12.2011, 13:03. Просмотров 15503. Ответов 11
Метки нет (Все метки)

Необходимо в один отчет по договору собрать связанные с выбранным договором документы (пока из 2 баз)
Причем выводиться и обрабатываться они должны в хронологическом порядке, дата в каждом типе документа своя.
С выборками проблем нет: в каждом документе имеется поле для связи с договором.
А вот как сделать хронологию, я пока не представляю.
Пока думаю сделать в основной базе (там храниться подавляющая часть обрабатываемых документов) новую форму, документы по которой будут хранить нужные поля из документов вспомогательной базы. И решить вопрос с прозрачным для пользователя режимом их создания и синхронизации...
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.12.2011, 13:03
Ответы с готовыми решениями:

как собрать документы из разных баз вместе?
проблема такая: необходимо делать поиск по документам в основной БД и ее архивах, а потом...

Собрать отчет из многих баз
Многоуважаемый all! У меня есть некий план, но хочется услышать и другие мнения - каков наилучший...

Объединение View из разных баз
Есть 3 базы в них одинаковые поля и одинаковые view по этим полям, нужно чтобы данные шли в 4 базу...

Объединение Коллекции Документов Из Разных Баз
Гуру, подскажите, как собрать коллекции документов из разных баз в одну коллекцию. 1) Перебираю...

Можно ли указать для разных Access баз разных ADo провайдеров?
В ADO нужно указывать провайдера. Можно ли указать для разных Access баз разных провайдеров? ...

11
dymot
0 / 0 / 0
Регистрация: 17.10.2008
Сообщений: 506
16.12.2011, 14:28 2
Скопировать в бд, где вью со столбцом отсортированным по дате?
0
omototy
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 223
16.12.2011, 14:59 3
Мне нужно каким-то образом получить к обработке отсортированную совокупность коллекций документов из 2 баз.
Пока дело шло обо 1 базе, я отбирался в ней несколько коллекций по критерию, кидал их папку, сортировал и обрабатывал.
Сейчас появилась необходимость обрабатывать еще 1 вид документов. Документы эти находятся в другой базе.
Копировать их в первую папку? В полном объеме вряд-ли есть смысл, редактировать их там все равно нельзя. Переносить какие то поля с привязкой - как написал в 1 посте, пока склоняюсь к этому варианту.
0
morphyus
0 / 0 / 0
Регистрация: 04.08.2006
Сообщений: 2,950
16.12.2011, 16:04 4
Anatoly
я бы просто написал свой класс "коллекция доков" - куда запулил бы все-все нужные документы из всех баз.
2я стадия - сортировка коллекции по дате - тут великое множество вариантов (от метода "пузырьком" на ЛС, до использования связки лс2жава )
3я - вывод пользователю. тут уже как хотите - можно в эксель, можно в хтмл и .тд.
0
16.12.2011, 16:04
omototy
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 223
16.12.2011, 20:30 5
Если я правильно понял, предлагается сделать массив документов с, скажем 1 колонкой - дата, 2-база, 3-UNID,
и отсортировать по 1 колонке?
0
mvyush
0 / 0 / 0
Регистрация: 19.04.2009
Сообщений: 2,219
16.12.2011, 23:00 6
Если я правильно понял, предлагается сделать массив документов с, скажем 1 колонкой - дата, 2-база, 3-UNID,
и отсортировать по 1 колонке?
Типа того, только лучше "завернуть" всё в класс.


2я стадия - сортировка коллекции по дате - тут великое множество вариантов (от метода "пузырьком" на ЛС, до использования связки лс2жава )
"Пузырьком" неэффективно, есть qsort, реализацию на LS можно посмотреть в names.nsf
0
morphyus
0 / 0 / 0
Регистрация: 04.08.2006
Сообщений: 2,950
17.12.2011, 15:46 7
Цитата Сообщение от Anatoly
Если я правильно понял, предлагается сделать массив документов с, скажем 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">

LotusScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 класс "обёртака" для описания каждого отдельного документа
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)
dym tmpD as MyDoc
Dim nd As notesDocument
 
Set nd = ndc.GetFirstDocument
 
тут можно добавлять в коллекцию MyColl.Documents каждый документ из коллекции ndc, обработов его Set tmpD = New MyDoc( nd ) и т.д.
end sub
Class


Цитата Сообщение от nvy
"Пузырьком" неэффективно, есть qsort, реализацию на LS можно посмотреть в names.nsf
а я и не говорил что он эффективен, я просто привел пример
0
tmyky
0 / 0 / 0
Регистрация: 23.08.2008
Сообщений: 6,252
18.12.2011, 13:11 8
сортировка с использованием java:

LotusScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
класс реализован для вывода отсортированных значений списком (в массив 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 Nothyng 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 ytm As NotesItem
Set ytm=xDoc.GetFirstItem(s)
преобразуем к виду, кот. "правильно" сортируется как строка
Select Case ytm.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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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
0
tmyky
0 / 0 / 0
Регистрация: 23.08.2008
Сообщений: 6,252
18.12.2011, 13:17 9
как понятно из кода - сортирует по ключу, состоящему из набора полей дока
0
omototy
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 223
18.12.2011, 13:22 10
Спасибо, буду пробовать разные варианты решения...
0
omototy
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 223
18.12.2011, 13:55 11
Почему-то попытка скачать архив приводит к сбрасыванию авторизации...
0
tmyky
0 / 0 / 0
Регистрация: 23.08.2008
Сообщений: 6,252
18.12.2011, 13:59 12
здесь я не виноват
можно просто написать свои обработчики, а для LS2J:

LotusScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
Class ErrorHandler
 
Sub ClrError()
End Sub
Sub New()
Call Me.ClrError()
End Sub
Function GetModuleInfo() As String
Dim thysType As String, modInfo As String
thysType= Typename(Me)
Not a class, use the calling module instead
If (thysType = "") Then thysType = Getthreadinfo(11)
modInfo = thysType & "::" & 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
0
18.12.2011, 13:59
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.12.2011, 13:59

Автосинхронизация таблиц из разных баз разных структур
Стоит такая задача Есть две базы в различных СУБД серверах, база1 и база2. Необходимо реализовать...

Как собрать несколько баз в одну?
Столкнулся со следующей проблемой в 1С. Есть 4 базы с сотрудниками компаний, необходимо их все...

Insert into таблиц из разных баз
Есть ли простая схема вставки строк из одной таблицы в другую, находящиеся в разных базах и, может...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.