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

Тема в разделе "Lotus - Программирование", создана пользователем Eugen, 3 апр 2013.

  1. Eugen

    Eugen Well-Known Member

    Регистрация:
    22 мар 2012
    Сообщения:
    172
    Симпатии:
    0
    Добрый день.

    Если кто в курсе, подскажите пожалуйста, есть ли в лотусе поддержка финансовых функций?
    В частности необходим расчет с использованием функции аналога ЧИСТВНДОХ из экселя. В хэлпе ничего похожего не нашел.
     
  2. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
    вот что за функция хз...
    описание нашел: Описание
    Но так таковой изначальной ее нет: самому писать.
    Lotus - платформа для всего, далее только полет фантазии.
    Можно попробовать поискать реализацию кодом на 1С и перевести в реалии Lotus.
    Можно заполнять тот же Excel в фоне, делать вычисления. затем импортировать данные. О как завернул! =)
    Вывод: писать самому, в описании есть все что нужно.
     
  3. Eugen

    Eugen Well-Known Member

    Регистрация:
    22 мар 2012
    Сообщения:
    172
    Симпатии:
    0
    Можно поподробнее? Как передавать данные в эксель я в курсе, а вот как получать, и как потом быть с экселем? "Глушить"процесс?
     
  4. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
    Да получить так же как и записать, через макросы VBA, поскольку это будет в фоне (то есть не отражаем пользователю), то главное заполнить и запомнить ячейки, откуда брать результат.
    Если пойдете таким способом: ищите по запросу "Импорт данных из Excel"
    И да, глушить процесс, без сохранения. Через Quit. мне обычно помогает такое:
    Код (LotusScript):
    If Not wApp Is Nothing Then
    Call wApp.quit()
    Set wApp = nothing
    End If
    Хотя я больше склоняюсь к созданию своего механизма расчета.
     
  5. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Минута в гугле и вот.
     
  6. Eugen

    Eugen Well-Known Member

    Регистрация:
    22 мар 2012
    Сообщения:
    172
    Симпатии:
    0
    Спасибо большое. Буду думать...
     
  7. dzheyzhi

    dzheyzhi Active Member

    Регистрация:
    8 дек 2011
    Сообщения:
    30
    Симпатии:
    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">
    Код (Text):
    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
    В данном агенте используется библиотека для работы с юзерским темп
    Код (Text):
    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
     
  8. lmike

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

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

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

    dzheyzhi Active Member

    Регистрация:
    8 дек 2011
    Сообщения:
    30
    Симпатии:
    0
    Ну притензии всегда будут)) На этом и учимся
    Заносит, получает, в экселе производятся вычисления по данным из лотуса
     
  10. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
  11. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
  12. Олимпус

    Регистрация:
    30 дек 2013
    Сообщения:
    5
    Симпатии:
    0
    Вот так можно:

    Код (Text):
        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
     
  13. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    Олимпус только потом не расстраивайтесь ;) у чисел с плавающей запятой (точкой) есть относительная погрешность коя в бухгалтерии может сыграть злую шутку

    Добавлено: http://habrahabr.ru/post/112953/
    а если коротко - в нотусне использовать Currency
     
  14. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    да... "забыл" - 365 в году это не то что в жизни бывает ;)
    вощем... тут набрасывал класс для дат, выложу позже
     
Загрузка...

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