Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.10;
Скачать: CL | DM;

Вниз

Работа с формулами   Найти похожие ветки 

 
yaric   (2004-09-13 18:26) [0]

Народ помогите пожалуйста советом.

У меня табличка 2 поля field1,field2

Значение поля field1 просто вводит пользователь.
А field2 нужно расчитывать по формулам field2=f(field1)
Причем пользователь должен сам вводить необходимы ему
формулы для разных записей(формулы простейшие +,-,*,/,(,)).
Причем там могут присутствовать еще и переменные.

Вообщем я тут подумал и выделил следующие проблемы:
1)Синтакситческий анализ формулы(можна избежать
 если использовать какой-нибуть построитель-конструктор формул)

2)Выполнение ее на сервере для того чтобы посмотреть
 все записи с посчитанными значениями в field2
 field1   f1(field1)
 field1   f2(field1)
 ..............
 field2   fn(field1)

Там я слышал что в Firebird 1.5 Макроподстановки
появились Execute statement, или через вычисляемые поля
ну вобщем с чего начинать?


 
сергей1   (2004-09-14 19:27) [1]

про IB c макроподстановками не знаю, но сталкивались мы уже с такой проблемой, осознали очень полезную вещь :

не надо давать пользователям самим забивать формулу, уверяю тебя, там обязательно будут появляться левые символы, знаки и черт знает что еще. И дело не ограничится только ошибками ввода, например, кто-нибудь обязательно попробует забить что-нибудь типа s^2, а потом спросит, почему вылетает ошибка, а в квадрат не возводится (ведь в екселе все работает !).

в данном случае лучше сделать именно конструктор. Т.е. поставить несколько пимп со значками +,-,* и т.д. (лучше в отдельной форме, если этих кнопок будет много), а получающеюся формулу выводить в label. И никакого синтаксического анализатора не потребуется.

>Причем там могут присутствовать еще и переменные.
а это вы, батенька, уже загнули

а сам резалт сет в dbgrid"e нужен ? типа этого :

form1.ADOQuery1.SQL.Text:="select field1, field1 "+ quotedstr(znak)+form1.edit1.text+ " as result from table1";
form1.ADOQuery1.Open;

здесь имеется ввиду, что оператор в формуле прочитан в переменную znak, а число, с которым будем работать находится в edit1 (только в сам еdit впихать проверку на правильность ввода).


 
yaric   (2004-09-15 10:24) [2]

>>сергей1
Спасибо.

Вопрос: может кто-то встречал такой компонент который бы реализовывал функции конструктора формул. Киньте плиз линк.
Заранее спасибо.


 
Sergey13 ©   (2004-09-15 10:33) [3]

Если количество формул конечно и они повторяются, то может стОит завести некую табличку формул и хранить ссылку на нее? Дальше в процедуре брать формулу и посчитав (например динамическим SQL) возвращать результат.


 
yaric   (2004-09-15 17:22) [4]

Да идея с таблицей мне нравиться. Обязательноей воспользуюсь.

А как пересчет формул реализовать на сервера, а не на клиенте.
По сути нужно придумать механизм Computed by но только в этом случае для  каждой записи теоретически может быть своя формула


 
Zacho ©   (2004-09-15 18:09) [5]

yaric   (15.09.04 17:22) [4]
Например, с помощью UDF. А в неё хоть парсер встраивай и передавай формулу строкой.
Хотя, imho, подобное всё-таки лучше делать на клиенте.


 
Deniz ©   (2004-09-16 07:30) [6]

Механизм Computed by придумывать не надо, просто в тригере before insert or update вызвать UDF и поставить в field2 полученное значение + можно воспользоваться компонентом FastScript
http://www.fastreport.ru/ru/products/products.php?BID=5
советую скачать демку и посмотреть что там и как.


 
yaric   (2004-09-16 11:41) [7]

>>Deniz

Спасибо за ссылку, я посмотрел очень класные компоненты
но они подразумевают расчет по формулам на клиенте. Я боюсь
что при большом количестве записей будет притормаживать.
Ведь нужно сначала забрать с сервера весь набор данных с полем в
которых будут записаны формулы, потом пройтись по этому набору и просчитать вызвать Evaluate для каждо записи и только потом показівать пользователю. Хотя у нас отпадает проблема парсинга формул Fast Script это делает сам.

Однако хочется все же на серваке.


 
yaric   (2004-09-16 11:54) [8]

Я тут еще почитал про макроподстановки в Firebird 1.5 вот что у меня получилось. Привожу текст хранимой процедуры:

create procedure new_procedure
returns (
   ret_value decimal(16,2),
   ret_value2 decimal(16,2))
as
declare variable table_name varchar(100);
declare variable fields_name varchar(100);
declare variable field2 decimal(16,2);
declare variable field1 decimal(16,2);
declare variable id varchar(100);
declare variable f varchar(100);
begin
for select test_table.f,
           test_table.id,
           test_table.field2,
           test_table.field1
      from test_table
      into :f,:id,:field2,:field1
        do
     begin
          table_name="test_table where id="||id;
          fields_name="field1,"||f;

              for execute statement
              " select "||fields_name||" from "|| table_name  into :ret_value,:ret_value2
              do suspend;

       end
end

Талица test_table имеет вид

id      field1             f  
   1       100               field1*3
   2       100               FIELD1/0.75)+15+(FIELD1/100)*11
   3       100               FIELD1/2

При в выполнении процедуры имеем:
id      field1             field2  
  1       100                300
  2       100                159.33
  3       100                50

Что скажете?



Страницы: 1 вся ветка

Текущий архив: 2004.10.10;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.087 c
1-1096008578
eagle2002
2004-09-24 10:49
2004.10.10
ActiveX


4-1094373920
CAMCOH
2004-09-05 12:45
2004.10.10
Как програмно выключить монитор в XP и 2000


6-1091186441
serg128
2004-07-30 15:20
2004.10.10
Как сделать рассылку одного сообщения нескольким машинам?


1-1096268077
Kniaz
2004-09-27 10:54
2004.10.10
Код приложения?????????????


8-1090038764
ИМХО
2004-07-17 08:32
2004.10.10
tWAVEFORMATEX (MMSystem)