|
|
|
| Необходимо создать формочку с полями, в которые пользователь будет вписывать собственные функции - как в Excel - кручусь вокруг никак не могу сориентироваться.
Есть на этот счет что-нить уже отработаное или идеи какие.Может Eval ка-то приспособить.
Или посоветуете как то использовать лист Excel со считыванием ячеек - хотя данные всё-таки в Access лежать будут.
Как дать возможность пользователю самому менять формулу подсчёта значения поля - наглядно чтоба было. A=(B-C)*E .
Такая вот задачка. | |
|
| |
|
|
|
| да, через 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-е хранятся. очень удобно
) | |
|
| |
|
|
|
| задача не совсем простая, как кажется на первый взгляд
возможно есть какие-то ОСХ-ы, которые позволяют визуализировать такие формулы
я как-то цеплял "Microsoft Office Web Components" - что-то вроде встроенной эксель книги
как вариант решения - использование "чистого" VBA
ставим пакет разработчика "VISUAL BASIC FOR APPLICATIONS SDK"
а потом долго-долго тр....ся, чтобы что-то получить | |
|
| |
|
|
|
| не сложная, но и не простая
чуть выше среднего | |
|
| |
|
|
10 Кб. |
|
| Пока вот что имею. | |
|
| |
|
13 Кб. |
|
| Пока фигня получается. | |
|
| |
|
12 Кб. |
|
| Хотя вот так | |
|
| |
|
14 Кб. |
|
| чет никак | |
|
| |
|
16 Кб. |
|
| Нееееееее фигня | |
|
| |
|
|
|
| ничё ни катит....
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()") | |
|
| |
|
|
|
| Тема в общем звучит так:
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
|
ну это все в общем случае :) в целом - придется, конечно, потрудиться | |
|
| |
|
|
|
|
| КРУТО! | |
|
| |
|
|
|
| хм... у меня катит
?Eval("Date()")
28.01.2008
?Eval("Forms(0)(""AS_LEAB"")")
Assets
?Eval("Forms(0)(""CODE_AS_LEAB"")*2/15.34")
0.1303780964797913950456323338 | |
|
| |
|
|
|
| Да
?Eval("Date()")
28.01.2008
Это работает. | |
|
| |
|
|
|
| Да вот эта Ваша идея, Силыч - то, что надо:
Тема в общем звучит так:
1. Создать функцию RunEval
|
А ещё по теме вопроса (или вопрос по теме) -как запихивать выражения в свойство поля "Данные" - как это реализовать?
К примеру готовую инструкцию типа
| |
|
| |
|
|
|
| как запихивать выражения в свойство поля "Данные" - как это реализовать?
К примеру готовую инструкцию типа
| |
|
| |
|
|
|
| "Me", вроде не катит
нужно писать полный путь Forms!ИмяФормы!Поле1
ну и если программно присваивать, то в кавычках и по аглицки(объекты) :)
типа "=Forms![ИмяФормы]![Поле1]/2"
вродекак | |
|
| |
|
|
|
| Спасибо, Силыч - опробую | |
|
| |
|
17 Кб. |
|
| Чет не тот результат чтоб хотелось | |
|
| |
|
18 Кб. |
|
| А вот так нормально | |
|
| |
|
17 Кб. |
|
| Работает тока умножение | |
|
| |
|
20 Кб. |
|
| Кроме плюса всё вроде пашет....
А что же с плюсом? | |
|
| |
|
20 Кб. |
|
| Извиняюся все вроде заработало ...
Кроме плюса всё вроде пашет....
Особая благодарность Силычу - ткнул носом куда надо
заодно калькулятор вышел неплохой (по моему) | |
|
| |
|
21 Кб. |
|
| Чего-то не хватает.......... | |
|
| |
|