Как В Ls Узнать Текущее Название Формы? Срочно Нужно...

afest

Well-known member
16.06.2009
78
0
#1
Мне в скрипте нужно узнать текущую обрабатываемую форму. Вьюха, с которой берутся доки с селектом по двум формам. Часть выборки работает зашибись, но два момента ну никак! Давненько делал это, но уже забыл. В хэлпе шось не совсем то, что нужно нашел... Да и проблемки семейные - жена на операции... В общем голова не шибко варит... помогите пожалуйста!!!

вот скрипт:
Код:
 Sub Click(Source As Button)
Dim xlFilename As String
xlFilename ="c:\f3.xls"
Dim session As New NotesSession
Dim db As NotesDatabase
Dim view As NotesView, transferview As NotesView
Dim doc As NotesDocument, transferdoc As NotesDocument
Dim i As Integer
Dim dc As NotesDocumentCollection
Dim CountDoc As Integer
Dim CountDoc1 As Integer
Dim CountDoc2 As Integer
Dim CountDoc3 As Integer
Dim CountDoc4 As Integer
Dim j As Integer
Dim aritem As NotesItem

Dim row As Integer
Dim Excel As Variant
Dim xlWorkbook As Variant
Dim xlSheet As Variant
Dim xlCells As Variant

Set db = session.CurrentDatabase

'// инициализация OLE-объекта
Set Excel = CreateObject("excel.application")
Excel.Visible = True
Print "Открыт файл " & xlFilename & "..."
Excel.Workbooks.Open xlFilename '// открытие файла Excel
Set xlWorkbook = Excel.ActiveWorkbook
Set xlSheet = xlWorkbook.ActiveSheet
Set xlCells = xlSheet.Cells

row = 2

Print "Starting export..."

Set view = db.GetView("dvig_workers")
Set doc = view.GetFirstDocument
CountDoc = 0		'принято работников всего
CountDoc1 = 	0	'выбыло работников всего
CountDoc2 = 0	'из них в связи с сокращением
CountDoc3 = 0	'по собственному желанию
CountDoc4 = 0	'численность работников на конец отчетного периода
formName = "kadry"

While Not doc Is Nothing

On Error Resume Next	
If doc.f1_69(0)<>"" Then
CountDoc1=CountDoc1+1
End If
'If formName = db.Forms Then

'End If
Set aritem=doc.f1_70_1(0)
If aritem.Contains("сокращению штата") Then
CountDoc2=CountDoc2+1
End If
If aritem.Contains("собственному желанию") Then
CountDoc3=CountDoc3+1
End If
Set doc = view.GetNextDocument(doc)
Wend

Set view = db.GetView("dvig_workers1")
CountDoc4 = view.EntryCount
Set view = db.GetView("dvig_workers2")
CountDoc = view.EntryCount


xlCells(row, 1).value= CountDoc
xlCells(row, 2).value=CountDoc1
xlCells(row, 3).value=CountDoc2
xlCells(row, 4).value=CountDoc3
xlCells(row, 5).value=CountDoc4

End Sub
на моменте происходит проблема с разницей форм (в дебагере смотрел)
Код:
If aritem.Contains("сокращению штата") Then
CountDoc2=CountDoc2+1
End If
If aritem.Contains("собственному желанию") Then
CountDoc3=CountDoc3+1
End If
и вот тут перед этим надо сделать проверку на форму...
 

nvyush

Lotus team
22.04.2009
2 317
0
#2
Что есть текущая обрабатываемая форма??? Если речь о форме текущего обрабатываемого документа, то получить можно так:
doc.Form(0)
или так
doc.GetItemValue("Form")(0)
 

afest

Well-known member
16.06.2009
78
0
#3
Что есть текущая обрабатываемая форма??? Если речь о форме текущего обрабатываемого документа, то получить можно так:
doc.Form(0)
Да, именно текущая обрабатываемая форма!
Другое дело, как поставить в условие, что это та форма? Например, при использовании doc.Form?
Понятно, что там IF должен быть... но в хэлпе все ссылается на метод For All...

ЗЫ: реально помощь нужна, с жинкой мучаюсь по поводу операции и т.п. почти неделю на работе по-сути не был... весь в нервах, сегодня вот только с реанимации ее выписали... и то, не известно на сколько (((

бЗЫ: использую дизайнер 7.0.2
на большие версии я пока совместимость не сделал, почти полгода работаю и переделываю БД
 

Мыш

Премиум
12.02.2008
1 097
10
#4
Эээээ... Form - это просто поле документа типа "текст", содержащее название формы. Соответственно:
Код:
if doc.Form(0) = "Форма1" Then...
Т.е., работаете как с любым другим текстовым полем. Contains - он для списков...
ЗЫ. Во избежание проблемы с регистрами букв можно использовать Instr c соотв. ключами.
 

afest

Well-known member
16.06.2009
78
0
#5
Эээээ... Form - это просто поле документа типа "текст", содержащее название формы. Соответственно:
Код:
if doc.Form(0) = "Форма1" Then...
Т.е., работаете как с любым другим текстовым полем. Contains - он для списков...
Т.е. я так понял, что нужно внести новое поле, которое будет содержать название формы по умолчанию(естетсвенно невидимое для юзверя)?
Других вариантов нет?
Менять дизайн на основной базе стремно... На данный момент на локальном серваке тестирую, обновлять дизайн основной базы буду при 100% ее работоспособности.
 

nvyush

Lotus team
22.04.2009
2 317
0
#6
Т.е. я так понял, что нужно внести новое поле, которое будет содержать название формы по умолчанию(естетсвенно невидимое для юзверя)?
Ничего не понял. Что Вам нужно? Что такое форма по умолчанию?
Документ состоит из полей, нужные отображаются пользователю на форме, ненужные не отображаются, но пользователь может просмотреть список ВСЕХ полей документа в окне свойств.
Поле Form хранит форму, по которой документ создан/должен отображаться, есть возможность изменить его значение для открытия документа по другой форме. Проверка значение поля Form:
Код:
If doc.Form(0) = "Form1" Then
' что-то делаем
ElseIf doc.Form(0) = "Form2" Then
' делаем что-то другое
Else
' рыбу заворачиваем
End
 

Мыш

Премиум
12.02.2008
1 097
10
#7
Эммм... А что, такого поля в док-тах на текущий момент нет? Вообще говоря, может быть и такое (скажем, док-т открывается из вида с Form Formula). Вот в этом случае не знаю...
 

afest

Well-known member
16.06.2009
78
0
#8
Эммм... А что, такого поля в док-тах на текущий момент нет? Вообще говоря, может быть и такое (скажем, док-т открывается из вида с Form Formula). Вот в этом случае не знаю...
Еще раз повторяюсь: БД не моя, была портирована из аксесса, полей дополнительных (бишь служебных) никто не поставил, дали мне эту ***утую БД на переделку...

БЗЫ: сегодня пробую обновить дизайн, завтра расскажу каков результат... жалко, кнеш, что не все еще работает, но с дополнительными полями все должно быть нормально
 

Anatoly

Lotus team
30.03.2007
222
0
#9
Кстати, @Command( [SwitchForm] ; formName ) - меняет при сохранении поле Form.
А как-бы указать, что я просто хочу поработать с документом через другую форму, без изменения поля Form.
И не только из View, а уже имея документ открытым...
На формулах что-то не вариант.
 

Мыш

Премиум
12.02.2008
1 097
10
#10
Понятно, я тоже повторюсь: форма - это не какое-то внутреннее свойство документов. Это обычное текстовое поле. Т.е., если его нет, его надо добавить во все документы.

Кстати, @Command( [SwitchForm] ; formName ) - меняет при сохранении поле Form.
А поменять взад на QuerySave?
 

Anatoly

Lotus team
30.03.2007
222
0
#11
Еще раз повторяюсь: БД не моя, была портирована из аксесса, полей дополнительных (бишь служебных) никто не поставил, дали мне эту ***утую БД на переделку...

БЗЫ: сегодня пробую обновить дизайн, завтра расскажу каков результат... жалко, кнеш, что не все еще работает, но с дополнительными полями все должно быть нормально
Поле Form должно быть, тот кто портировал, как-то же планировал работать с документами.
Или-же в дизайне базы должна быть форма "по умолчанию"
 

VladSh

начинающий
Lotus team
11.12.2009
1 262
6
#12
Поля Form в документах элементарно может не быть (RTFM). Но привычнее всё-таки когда оно там есть.
 

Anatoly

Lotus team
30.03.2007
222
0
#14
Даже если есть, в док-тах она не хранится...
Да, но позволяет открыть документ "на посмотреть".
К вопросу этоне относится, конечно, ...
Но в чем суть проблемы - непонятно.
Имя формы либо есть в свойствах документы - и тогда оно оттуда элементарно получается.
Либо его там нет - тогда решение об алгоритме обработки можно принимать на основании набора каких-либо реквизитов, наличие|отсутствие которых также легко проверяется.

Если, как я понял, документы есть результат импорта из Accessa, то автор импорта, скорее всего, не заморачивался прописыванием имени формы в документы.
Написать агента, который заполнит по всем нужным докам поле "Form" нужным значениеми и все.
 

afest

Well-known member
16.06.2009
78
0
#16
Кстати:

раз документ есть во вью, значит имя формы в нем присутствует.
где? как его достать? в дебагере, на указанном мной моменте, doc все так же, имея другую форму, считывает данные несуществующего поля и по тем двум параметрам прописывает по +1
 

divankin

Senjor developer
13.08.2009
182
0
#17
Вчитался в код. Что-то у вас там капитально неправильно.
1. Уберите нафиг On Error Resume Next. Это одна из конструкций, за которые нужно бить по рукам, за исключением некоторых редких случаев, когда разработчик может убедительно объяснить, зачем он так делает.

Сделаем нормальную обработку ошибок Вместо этого поставьте
On Error Goto TRAP
а в конец добавьте
Exit Sub
TRAP:
MsgBox "Ошибка " & Error & " (" & Err & ")" & "в строке " & Erl
If not Excel is nothing Then Delete Excel
Exit Sub

2. Вместо Set aritem=doc.f1_70_1(0)
Поставьте Set aritem=doc.getFirstItem("f1_70_1")
А дальнейший код обработки значения aritem оберните в
If not aritem is nothing then
.
.
End If
 

Anatoly

Lotus team
30.03.2007
222
0
#20
правильно говоришь
я для многих доков, которые ложу в отдельные базы вообще форму не прописываю - меньше суммари полей быстрее едем, и так знаю что у меня там
Да? Тогда объясните: как документы без указанной формы попадают во "Вьюха с селектом по двум формам"?