Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Может Eval
 
 автор: час   (28.01.2008 в 14:46)   личное сообщение
 
 

Необходимо создать формочку с полями, в которые пользователь будет вписывать собственные функции - как в Excel - кручусь вокруг никак не могу сориентироваться.
Есть на этот счет что-нить уже отработаное или идеи какие.Может Eval ка-то приспособить.
Или посоветуете как то использовать лист Excel со считыванием ячеек - хотя данные всё-таки в Access лежать будут.
Как дать возможность пользователю самому менять формулу подсчёта значения поля - наглядно чтоба было. A=(B-C)*E .

Такая вот задачка.

  Ответить  
 
 автор: Силыч   (28.01.2008 в 15:05)   личное сообщение
 
 

да, через Eval (была такая реализация в одном совместном проекте на Accesse 2.0, потом на 97м
http://silasoft.mall.su/view.php?cls=soft&lang=&guid=178 )
в частности вот
http://silasoft.mall.su/dwnload/soft/1998smpro_03.gif

или через лист Эксель (я использовал OWC SpreadSheet
http://silasoft.mall.su/view.php?cls=soft&lang=&guid=194
формулы в XML-е хранятся. очень удобно
)

  Ответить  
 
 автор: ДрЮня   (28.01.2008 в 15:08)   личное сообщение
 
 

задача не совсем простая, как кажется на первый взгляд
возможно есть какие-то ОСХ-ы, которые позволяют визуализировать такие формулы
я как-то цеплял "Microsoft Office Web Components" - что-то вроде встроенной эксель книги

как вариант решения - использование "чистого" VBA
ставим пакет разработчика "VISUAL BASIC FOR APPLICATIONS SDK"
а потом долго-долго тр....ся, чтобы что-то получить

  Ответить  
 
 автор: Силыч   (28.01.2008 в 16:55)   личное сообщение
 
 

не сложная, но и не простая
чуть выше среднего

  Ответить  
 
 автор: час   (28.01.2008 в 20:42)   личное сообщение
 
 

Спасибо за советы.
А может можно как-то запихивать формулы в свойство поля "данные"
Controlsourse вроде бы.
Как Вы считаете.
то есть как-то
Me!поле3.Controlsourse = Me!поле1+Me!поле2

ПИШЕМ В ПОЛЕ ФОРМУЛ - A=B+C, А в Controlsourse запихиваем --->>

Me!A.Controlsourse = Me!B+Me!C

  Ответить  
 
 автор: час   (28.01.2008 в 20:57)   личное сообщение
10 Кб.
 
 

Пока вот что имею.

  Ответить  
 
 автор: час   (28.01.2008 в 21:04)   личное сообщение
13 Кб.
 
 

Пока фигня получается.

  Ответить  
 
 автор: час   (28.01.2008 в 21:19)   личное сообщение
12 Кб.
 
 

Хотя вот так

  Ответить  
 
 автор: час   (28.01.2008 в 21:25)   личное сообщение
14 Кб.
 
 

чет никак

  Ответить  
 
 автор: час   (28.01.2008 в 21:32)   личное сообщение
16 Кб.
 
 

Нееееееее фигня

  Ответить  
 
 автор: час   (28.01.2008 в 21:43)   личное сообщение
 
 

ничё ни катит....
Dim D As String
D = Forms![FORMULKA_FRM]![B]
Me!B1 = Eval(D)
'Me!B1 = Val(Me!B)
'Me!B1 = Eval("""me!B""")
'Me!B1 = Eval("'" & B & "'")
'Me!B1 = Eval("me!b")
'Me!B1 = Eval("Date()")

  Ответить  
 
 автор: Силыч   (28.01.2008 в 23:10)   личное сообщение
 
 

Тема в общем звучит так:
1. Создать функцию RunEval

Function RunEval(fx)
    On Error GoTo re2389457
    RunEval = Eval(fx)
    Exit Function
re2389457:
    MsgError "Calculate"
    Exit Function
End Function


2. в кач-ве параметров передавать ей строку формул/значений
3. формулы предоставлять пользователю на псевдоязыке, например функция П("<ИМЯПОЛЯ>")
должна возвращать значение поля текущей строки текущего рекордсета/даташита
4. затем, например, пробегая по рекордсету с описанными расчитываемыми полями для него, запускать формулы/значения на расчет через RunEval...


формулы из XMLя, если использовать компоненту типа листа Excel, я грузил так примерно:


    '-- строки
    SetStatus "Строки..."
    For i = 1 To cntRows
        Set elmRow = nlRows.item(i - 1)
        For j = 1 To elmRow.childNodes.length
            Set elm = elmRow.childNodes.item(j - 1)
            If Not elm Is Nothing Then
                c1 = elm.getAttribute("cell1") & (i + cntStartRow)
                c2 = Nz(elm.getAttribute("cell2"), "")
                fl = Nz(elm.getAttribute("formula"), "")
                If Len(fl) <> 0 Then
                    fl = StrReplace(1, fl, "#", CStr(i + cntStartRow))
                End If
                CT.range(c1).Locked = Nz(elm.getAttribute("locked"), False)
                CT.range(c1).HAlignment = Nz(elm.getAttribute("halign"), ssHAlignRight)
                CT.range(c1).VAlignment = Nz(elm.getAttribute("valign"), ssVAlignCenter)
                CT.range(c1).NumberFormat = Nz(elm.getAttribute("format"), "Text")
                If Len(fl) = 0 Then
                    If CT.range(c1).NumberFormat = "Text" Then
                        CT.range(c1) = "'" & elm.getAttribute("value")
                    Else
                        CT.range(c1) = elm.getAttribute("value")
                    End If
                Else
                    CT.range(c1).formula = "=" + fl
                End If
                CT.range(c1).Font.Size = 8
                CT.range(c1).Font.name = "Tahoma"
            End If
        Next j
    Next i
..........................................................
    '-- total
    SetStatus "Суммы..."
    For i = 1 To cntTotal
        CT.rows(i + cntStartRow).Font.Bold = False
        CT.rows(i + cntStartRow).Interior.Color = "silver"
        CT.rows(i + cntStartRow).NumberFormat = "Text"
        CT.rows(i + cntStartRow).formula = ""
        Set elmRow = nlTotal.item(i - 1)
        For j = 1 To elmRow.childNodes.length
            Set elm = elmRow.childNodes.item(j - 1)
            If Not elm Is Nothing Then
                c1 = elm.getAttribute("cell1") & (i + cntStartRow)
                c2 = Nz(elm.getAttribute("cell2"), "")
                fl = Nz(elm.getAttribute("formula"), "")
                If Len(fl) <> 0 Then
                    '-- переписать в дальнейшем - на автоопределение номера между ##
                    fl = StrReplace(1, fl, "#0#", CStr(i + cntStartRow))
                    fl = StrReplace(1, fl, "#-1#", CStr(i + cntStartRow - 1))
                    fl = StrReplace(1, fl, "#-2#", CStr(i + cntStartRow - 2))
                    fl = StrReplace(1, fl, "#-3#", CStr(i + cntStartRow - 3))
                End If
                br = Int(Nz(elm.getAttribute("brweight"), 0))
                CT.range(c1).Locked = Nz(elm.getAttribute("locked"), False)
                CT.range(c1).HAlignment = Nz(elm.getAttribute("halign"), ssHAlignRight)
                CT.range(c1).VAlignment = Nz(elm.getAttribute("valign"), ssVAlignCenter)
                CT.range(c1).Interior.Color = Nz(elm.getAttribute("bgcolor"), "silver")
                CT.range(c1).Font.Color = Nz(elm.getAttribute("color"), "black")
                CT.range(c1).NumberFormat = Nz(elm.getAttribute("format"), "Text")
                If Len(c2) = 0 Then
                    If br <> 0 Then
                        CT.range(c1).Borders.Weight = br
                    End If
                    CT.range(c1).Borders.Color = Int(Nz(elm.getAttribute("brcolor"), 0))
                Else
                    c2 = elm.getAttribute("cell2") & (i + cntStartRow)
                    CT.range(c1, c2).Borders.LineStyle = 2
                    If Left(c1, 1) = Left(c2, 1) Then
                        CT.range(c1, c2).Borders(xlDiagonalDown).LineStyle = 0
                    Else
                        CT.range(c1, c2).Borders(xlDiagonalUp).LineStyle = 0
                    End If
                    If br <> 0 Then
                        CT.range(c1, c2).Borders.Weight = br
                    End If
                    CT.range(c1, c2).Borders.Color = Int(Nz(elm.getAttribute("brcolor"), 0))
                    CT.range(c1, c2).Merge
                End If
                If Len(fl) = 0 Then
                    CT.range(c1) = Nz(elm.getAttribute("caption"), "")
                Else
                    CT.range(c1).formula = "=" + fl
                End If
            End If
        Next j
    Next i


ну это все в общем случае :) в целом - придется, конечно, потрудиться

  Ответить  
 
 автор: час   (29.01.2008 в 06:47)   личное сообщение
 
 

  Ответить  
 
 автор: час   (29.01.2008 в 06:51)   личное сообщение
 
 

КРУТО!

  Ответить  
 
 автор: Силыч   (28.01.2008 в 23:15)   личное сообщение
 
 

хм... у меня катит

?Eval("Date()")
28.01.2008

?Eval("Forms(0)(""AS_LEAB"")")
Assets

?Eval("Forms(0)(""CODE_AS_LEAB"")*2/15.34")
0.1303780964797913950456323338

  Ответить  
 
 автор: час   (29.01.2008 в 11:25)   личное сообщение
 
 

Да
?Eval("Date()")
28.01.2008

Это работает.

  Ответить  
 
 автор: час   (29.01.2008 в 11:30)   личное сообщение
 
 

Да вот эта Ваша идея, Силыч - то, что надо:

Тема в общем звучит так:
1. Создать функцию RunEval


А ещё по теме вопроса (или вопрос по теме) -как запихивать выражения в свойство поля "Данные" - как это реализовать?
К примеру готовую инструкцию типа

= Me!Поле1/2

  Ответить  
 
 автор: час   (29.01.2008 в 21:45)   личное сообщение
 
 

как запихивать выражения в свойство поля "Данные" - как это реализовать?
К примеру готовую инструкцию типа


= Me!Поле1/2 

  Ответить  
 
 автор: Силыч   (29.01.2008 в 23:04)   личное сообщение
 
 

"Me", вроде не катит
нужно писать полный путь Forms!ИмяФормы!Поле1
ну и если программно присваивать, то в кавычках и по аглицки(объекты) :)
типа "=Forms![ИмяФормы]![Поле1]/2"
вродекак

  Ответить  
 
 автор: час   (30.01.2008 в 08:19)   личное сообщение
 
 

Спасибо, Силыч - опробую

  Ответить  
 
 автор: час   (30.01.2008 в 11:19)   личное сообщение
17 Кб.
 
 

Чет не тот результат чтоб хотелось

  Ответить  
 
 автор: час   (30.01.2008 в 11:27)   личное сообщение
18 Кб.
 
 

А вот так нормально

  Ответить  
 
 автор: час   (30.01.2008 в 11:48)   личное сообщение
17 Кб.
 
 

Работает тока умножение

  Ответить  
 
 автор: час   (30.01.2008 в 12:03)   личное сообщение
20 Кб.
 
 

Кроме плюса всё вроде пашет....
А что же с плюсом?

  Ответить  
 
 автор: час   (30.01.2008 в 12:08)   личное сообщение
20 Кб.
 
 

Извиняюся все вроде заработало ...
Кроме плюса всё вроде пашет....
Особая благодарность Силычу - ткнул носом куда надо
заодно калькулятор вышел неплохой (по моему)

  Ответить  
 
 автор: час   (30.01.2008 в 14:34)   личное сообщение
21 Кб.
 
 

Чего-то не хватает..........

  Ответить  
 
 автор: час   (31.01.2008 в 16:04)   личное сообщение
22 Кб.
 
 

Видимо вот так это должно работать.
............получилося
Спасбо Силычу - работает........ .

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList