Финансовые Функции.

  • Автор темы Автор темы Eugen
  • Дата начала Дата начала

Eugen

Green Team
22.03.2012
210
1
Добрый день.

Если кто в курсе, подскажите пожалуйста, есть ли в лотусе поддержка финансовых функций?
В частности необходим расчет с использованием функции аналога ЧИСТВНДОХ из экселя. В хэлпе ничего похожего не нашел.
 
вот что за функция хз...
описание нашел:
Но так таковой изначальной ее нет: самому писать.
Lotus - платформа для всего, далее только полет фантазии.
Можно попробовать поискать реализацию кодом на 1С и перевести в реалии Lotus.
Можно заполнять тот же Excel в фоне, делать вычисления. затем импортировать данные. О как завернул! =)
Вывод: писать самому, в описании есть все что нужно.
 
Можно заполнять тот же Excel в фоне, делать вычисления. затем импортировать данные.
Можно поподробнее? Как передавать данные в эксель я в курсе, а вот как получать, и как потом быть с экселем? "Глушить"процесс?
 
Да получить так же как и записать, через макросы VBA, поскольку это будет в фоне (то есть не отражаем пользователю), то главное заполнить и запомнить ячейки, откуда брать результат.
Если пойдете таким способом: ищите по запросу "Импорт данных из Excel"
И да, глушить процесс, без сохранения. Через Quit. мне обычно помогает такое:
Код:
If Not wApp Is Nothing Then
Call wApp.quit()
Set wApp = nothing
End If

Хотя я больше склоняюсь к созданию своего механизма расчета.
 
Минута в гугле и .
 
Полноценный агент для работы с эксель, внесение данных в эксель и соответственно дерганье данных из экселя и вставка в документ
Данный агент вызывает окно выбора дат, далее подключение к двум базам из одной базы дергаем значение из вида, коллекцию второй базы сравниваем с видом и заполняем эксель
Дергание данных из экселя производится путем назначения полям в экселе переменных
Агент написан лично мной, надеюсь я вам помог!
Если будут какие то вопросы, задавайте! помогу чем смогу =)

<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">
Код:
Use {OSInterface_Lib} 'Библиотека для работы с Temp
'Обьявим переменные для работы с Excel
Dim exApp As Variant, exAppWbk As Variant, wb As Variant
Dim i As Long, row As Long, row1 As Long, row2 As Long

'Обьявим переменные для работы с юзерским %Temp%
Dim tmpDir As String, tmplFileName As String, tmplName As String, FileName As String

'Обьявим массив для работы со значениями electro, Firm, eDT
Dim keyArr( 2 ) As String

'Обьявим переменные для работы с окном выбора дат
Dim eDT As NotesDateTime

'Обьявим переменные для работы с ServiceDesk.nsf
Dim docSD As NotesDocument, dbSD As NotesDatabase, ndcSD As NotesDocumentCollection, sbV As NotesView

'Обьявим переменные для работы с intfirm.nsf
Dim docIF As NotesDocument, dbIF As NotesDatabase, ndcIF As NotesDocumentCollection
Dim docIF1 As NotesDocument, ndcIF1 As NotesDocumentCollection
'Обьявим переменные для работы с template.nsf
Dim dbTE As NotesDatabase, ndcTE As NotesDocumentCollection, ritmTE As NotesRichTextItem

'Обьявим переменные для работы с RentPayments.nsf
Dim docRP As NotesDocument, dbRP As NotesDatabase

'Обьявим переменные для работы с массивом keyArr
Dim docByKey As NotesDocument, ndcByKey As NotesDocumentCollection
Sub Initialize
Dim wsC As New NotesUIWorkspace
Dim sesC As New NotesSession
Dim dbC As NotesDatabase
Set dbC = sesC.CurrentDatabase
Dim docC As New NotesDocument( dbC )

'Вызываем окно по форме ParamsForReport и берем значение из этой формы
If Not wsC.DialogBox( {ParamsForReport}, True, True, , , , False, {Параметры для отчета}, docC, True ) Then Goto endh
Set eDT = New NotesDateTime( {01.} & docC.GetItemValue( {selMonth} )( 0 ) & {.} & docC.GetItemValue( {selYear} )( 0 ) )
keyArr( 0 ) = {electro}
keyArr( 2 ) = CStr( Year( edt.DateOnly ) ) & {-} & Trim( CStr( Month( edt.DateOnly ) ) )

'Из базы template.nsf берем шаблон по полю RentElectroCalculation и кладем его в tmpDir = "C:\Users\user\AppData\Local\Temp"
tmpDir = OSI_GetUserTemp()
Set dbTE = sesC.GetDatabase( {domi/org}, {scat_escado\template.nsf} )
Set ndcTE = dbTE.Search( {(Form="TemplateOffice") & (Code="RentElectroCalculation")}, Nothing, 0 )
Set docC = ndcTE.GetFirstDocument
Set ritmTE = docC.GetFirstItem( {Body} )

'Цикл обрабатывает встроенные элементы, кладет в объект E то что нашел
ForAll e In ritmTE.EmbeddedObjects
tmplFileName = {tmpl_} & e.Name 'Получает имя из объекта е и добовляет к нему tmpl_
Call e.ExtractFile(tmpDir & tmplFileName ) 'Извлекаем полученный фаил в юзерский Temp
Exit ForAll
End ForAll
Set ritmTE = Nothing 'Разрушаем объект ritm

'Подключаемся к базе ServiceDesc
Set dbSD = sesC.GetDatabase( {domi/org}, {scat_escado\ServiceDesc.nsf} )
Set sbV = dbSD.GetView( {(ServiceByElectro)} )

'Подключаемся к базе intfirm.nsf и обрабатываем коллекцию всех документов в базе
Set dbIF = sesC.GetDatabase( {domi/org}, {scat_escado\intfirm.nsf} )
Set ndcIF = dbIF.AllDocuments
Set docIF = ndcIF.GetFirstDocument

'В базе intfirm.nsf перебираем все документы и берем поле Firm
While Not ( docIF Is Nothing )
Print docIF.GetItemValue( {Firm} )( 0 )
Call ProcessDoc( docIF )
Set docIF = ndcIF.GetNextDocument( docIF )
Wend

'Закрытие Excel и уничтожаем tmpDir & tmplFileName
Call exApp.Quit()
Kill tmpDir & tmplFileName

'IsObject проверяет, является значение выражения ссылкой на некоторый объект exApp и повторно закрываем Excel 
If Isobject( exApp ) Then Call exApp.Quit()
endh:
End Sub
Sub ProcessDoc( doc As NotesDocument )
Dim sesC As New NotesSession

'Берем поле Firm из базы intfirm и сравниваем с видом (ServiceByElectro) по первому столбцу
keyArr(1) = doc.GetItemValue({Firm})(0)
Set ndcByKey = sbV.GetAllDocumentsByKey( keyArr, True )
If ndcByKey.Count < 1 Then GoTo endh
Set docByKey = ndcByKey.GetFirstDocument
If docByKey.GetItemValue({Arendator})(0) = "" Then GoTo endh

'Создание документа в базе Оплата аренда
Set dbRP = sesC.GetDatabase( {domi/org}, {scat_escado\RentPayments.nsf} )
Set docRP = dbRP.CreateDocument
Call docRP.ReplaceItemValue({Form}, {PaymentElectro} )
Call docRP.ReplaceItemValue({ExtFirm}, keyArr( 1 ) )
Call docRP.ReplaceItemValue( {StopDate}, edt )
Call docRP.ReplaceItemValue( {Date}, edt )
'Берем внутреннюю фирму и номер договора
Set dbIF = sesC.GetDatabase( {domi/org}, {scat_escado\intfirm.nsf} )
Set ndcIF1 = dbIF.Search( {(Form="uslug") & @IsMember( "Электроэнергия";uslugpodog) & (Arendator = "} & Replace(doc.GetItemValue( {Firm} )( 0 ), {"}, {\"} ) & {")}, Nothing, 0 )
Set docIF1 = ndcIF1.GetFirstDocument
If Not ( docIF1 Is Nothing ) Then
Call docRP.ReplaceItemValue( {IntFirm}, docIF1.GetItemValue( {intfirm} )( 0 ) )
Call docRP.ReplaceItemValue( {numdog}, docIF1.GetItemValue( {datenumdog} )( 0 ) )
End If
Call docRP.ComputeWithForm( True, False )
Call docRP.Save( True, False )

'Создание Excel по шаблону RentElectroCalculation
tmplName = tmpDir & tmplFileName

Set exApp = CreateObject( {Excel.Application} )
exApp.Visible = False
Call exApp.Workbooks.Add( tmplName )
Set wb = exApp.ActiveWorkbook

row = 10
row1 = 6	

While Not ( docByKey Is Nothing )

i = 0

While i<=UBound(docByKey.Tariffs)

'Заполнение листа Арендатор и перенос значений из Excel в поля pdoc
exApp.Sheets("Показания Арендатор").Select

'Поиск по форме Elcount по полю коэффициент трансформации и проставление коэффициента в excel шаблоне
Set ndcSD = dbSD.Search({Form = "Elcount" & numsch = "}&docByKey.Tariffs(i)&{" }, Nothing,0)

'Один счетчик на 2 арендатора
If docByKey.Tariffs(i) = "03854324" Then
If ndcSD.Count > 0 Then
Set docSD = ndcSD.Getfirstdocument
wb.Application.Range( {E} & Trim(CStr( row1 ) ) ).Value = docSD.ktr(0)
wb.Application.Range( {K} & Trim(CStr( row1 ) ) ).Value = docSD.sitesinstall(0) + " " + docSD.sitesinstallNum(0)
End If
wb.Application.Range( {C} & Trim(CStr( row1 ) ) ).Value = docByKey.Arendator(0)
wb.Application.Range( {D} & Trim(CStr( row1 ) ) ).Value = docByKey.Tariffs(i)
wb.Application.Range( {F} & Trim(CStr( row1 ) ) ).Value = docByKey.PrevTsumm(i)
wb.Application.Range( {G} & Trim(CStr( row1 ) ) ).Value = docByKey.tSumm(i)
wb.Application.Range( {I} & Trim(CStr( row1 ) ) ).Value = 4

row1 = row1 + 1	

GoTo nt
End If

'Один счетчик на 1 аренадатора
If ndcSD.Count > 0 Then
Set docSD = ndcSD.Getfirstdocument
wb.Application.Range( {E} & Trim(CStr( row ) ) ).Value = docSD.ktr(0)
wb.Application.Range( {K} & Trim(CStr( row ) ) ).Value = docSD.sitesinstall(0) + " " + docSD.sitesinstallNum(0)
End If
wb.Application.Range( {C} & Trim(CStr( row ) ) ).Value = docByKey.Arendator(0)
wb.Application.Range( {D} & Trim(CStr( row ) ) ).Value = docByKey.Tariffs(i)
wb.Application.Range( {F} & Trim(CStr( row ) ) ).Value = docByKey.PrevTsumm(i)
wb.Application.Range( {G} & Trim(CStr( row ) ) ).Value = docByKey.tSumm(i)
wb.Application.Range( {I} & Trim(CStr( row ) ) ).Value = 4
Call docRP.ReplaceItemValue( {summ}, wb.Application.Range( {summ} ).Value )

row = row + 1	
nt:	
i = i + 1
Wend
Set docByKey = ndcByKey.GetNextDocument( docByKey )
Wend

'Присвоение Excel файлу дата + имя, сохранение Excel файла и закрытие Excel
FileName = tmpDir & Replace(CStr(Date), ".", "" ) & {_electro.xlsx}
Call wb.SaveAs( FileName )
Call wb.Close()
Call exApp.Quit()

'Прикрипление Excel документа в поле Comment в pdoc и сохранение pdoc
Dim rti As New NotesRichTextItem( docRP, {Comment} )
Call rti.EmbedObject( EMBED_ATTACHMENT, {}, FileName, {} )
Call docRP.ComputeWithForm( True, False )
Call docRP.Save( True, False )

'Уничтожаем FileName
Kill FileName

endh:
End Sub

В данном агенте используется библиотека для работы с юзерским темп
Код:
Option Public
Option Declare
Private Const LibName = {OSInterface_lib}
Function OSI_GetUserTemp As String
Dim funcName As String
funcName = {OSI_GetUserTemp}
On Error Goto errh

Dim objWshShell As Variant
Set objWshShell = CreateObject( {WScript.Shell} )

Dim objWshEnvironment As Variant
Set objWshEnvironment = objWshShell.Environment( {USER} )

Dim tmpPaths As Variant
tmpPaths =	objWshShell.ExpandEnvironmentStrings( objWshEnvironment( {TEMP} ) )
Set objWshEnvironment = Nothing
Set objWshShell = Nothing

If Isarray( tmpPaths ) Then
OSI_GetUserTemp = Cstr( tmpPaths( 0 ) )
Else
OSI_GetUserTemp = Cstr( tmpPaths )
End If

If Right( OSI_GetUserTemp, 1 ) <> {\} Then OSI_GetUserTemp = OSI_GetUserTemp & {\}

Goto endh
errh:
Error Err, LibName & {: } & funcName & {: строка } & Erl & {:} & Chr(13) & Error$
endh:
End Function
 
к чему есть претензии:
-инициализация объекта эхеля и его убиение - непозрачно
-использование эхеля как такового - есть POI
-нахаркодены имена полей (очень сложно менять/поддерживать)
-стринги в тексте ф-ций

этот код просто заносит/получает данные их эхеля?
 
к чему есть претензии:
-инициализация объекта эхеля и его убиение - непозрачно
-использование эхеля как такового - есть POI
-нахаркодены имена полей (очень сложно менять/поддерживать)
-стринги в тексте ф-ций

этот код просто заносит/получает данные их эхеля?

Ну притензии всегда будут)) На этом и учимся
Заносит, получает, в экселе производятся вычисления по данным из лотуса
 
значить шобы скотинкуLS не мучать, можно взять готовый код
да иваще их кучи в тырнетах
заметьте - не нужен хехель как класс :)

Добавлено: сам алгоритм
 
можно искать в этом направлении
 
Вот так можно:

Код:
	Function fullcost (doc As NotesDocument, Dates() , fullPay() As Double) As Double ' Dates() - массив из разницы дней, fullPay() - массив платежей
Dim p,i,j,n As Integer
Dim psk As Double
Dim pstep As Double ' шаг

n = doc.Months(0)
psk = CInt (doc.Percent(0))/100
p = 0
ReDim Preserve finDate (n) As Integer
j=0 
For i = 0 To n
finDate(i)= j+Dates(i)
j=finDate(i)
p = p + fullPay(i) / ((1 + psk) ^ Dates(i) / 365)
Next i

j=0
pstep = 0.01
While j <> 20
Do
psk=psk+pstep
p=0
For i = 0 To n
p = p + fullPay(i) / ((1 + psk) ^ (finDate(i) / 365))
Next i
Loop While p>0
j=j+1
pstep = pstep/(-2)
Do
psk=psk+pstep
p=0
For i = 0 To n
p = p + fullPay(i) / ((1 + psk) ^ (finDate(i) / 365))
Next i
Loop While p<0
j=j+1
pstep = pstep/(-2)
Wend

fullcost = psk*100

End Function
 
Олимпус только потом не расстраивайтесь ;) у чисел с плавающей запятой (точкой) есть коя в бухгалтерии может сыграть злую шутку

Добавлено:
а если коротко - в нотусне использовать Currency
 
да... "забыл" - 365 в году это не то что в жизни бывает ;)
вощем... тут набрасывал класс для дат, выложу позже
 
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab