Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.10.10;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.771 c
1-1096129696
AdmeraL
2004-09-25 20:28
2004.10.10
копирование файлов


14-1095429384
Sekr
2004-09-17 17:56
2004.10.10
Как устанавливать компоненты под Delphi7


4-1094730245
FGH
2004-09-09 15:44
2004.10.10
Debug API


4-1094224836
Burmistroff
2004-09-03 19:20
2004.10.10
Обнаружение утечек памяти


4-1094602456
jack128
2004-09-08 04:14
2004.10.10
Запуск программы из под IDE. Проблемы..





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский