Парсеровщик формул

DelphistDelphist Россия - Воронеж
отредактировано 09:13 Раздел: FastReport 3.0
Столкнулся я со следующей проблемой:
Мне необходимо средствами FastReport'a3.0 или FatsScript'a реализовать расчет по известной мне формуле, например:

V := 12*CP + 47*P - 0.143*Ca + Sqrt(CP) + Sqr(Ca)

Где Ca - определенное значение для кальция,
P - определенное значение для фосфора
CP - определенное значение для сырого протеина

Все эти значение берется из базы данных Interbase.
Формула хранится в текстовом виде в БД. FastReport должен с парсировать формулу хранимую в БД, получив при это реальную, ну а посчитать значения по реальной формуле не сложно.

Как всё это реализовать? Если можно приведите пример.

Комментарии

  • gpigpi
    отредактировано 09:13
    Парсер придётся писать самому. Функции Sqr в FS нет, поэтому нужно перемножать.
    А формулу в БД можно хранить в таком виде:
    V := 12*<CP> + 47*<P> - 0.143*<Ca> + Sqrt(<CP>) + <Ca>*<Ca>
  • DelphistDelphist Россия - Воронеж
    отредактировано 09:13
    gpi написал:
    Парсер придётся писать самому. Функции Sqr в FS нет, поэтому нужно перемножать.
    А формулу в БД можно хранить в таком виде:
    V := 12*<CP> + 47*<P> - 0.143*<Ca> + Sqrt(<CP>) + <Ca>*<Ca>
    Ну хранить я её буду так как ты написал, ну а кому и как её отдавать на анализ?
  • gpigpi
    отредактировано 09:13
    Вот пример:
    var A,B: Integer;
    begin
         A:=1;
         B:=2;
         Memo1.Memo.Text:='['+'<A>+<B>'+']';
    end.
    
  • DelphistDelphist Россия - Воронеж
    отредактировано 09:13
    gpi написал:
    Вот пример:
    var A,B: Integer;
    begin
         A:=1;
         B:=2;
         Memo1.Memo.Text:='['+'<A>+<B>'+']';
    end.
    
    Как всё это из под Delphi динамически реализовать.
  • gpigpi
    отредактировано 09:13
    А может попробовать вычислять через FastScript? С FastScript не работал, но думаю, что должно получиться. Посоветуйся с разработчиками
  • DelphistDelphist Россия - Воронеж
    отредактировано 09:13
    gpi написал:
    А может попробовать вычислять через FastScript? С FastScript не работал, но думаю, что должно получиться. Посоветуйся с разработчиками
    Как у них спросить.
  • gpigpi
    отредактировано 09:13
    support@fast-report.com
    Только они, наверное, сначала пошлют тебя читать доку. Здесь
    http://www.fast-report.com/pbc_download/fs_ru.pdf
    Вот цитата (стр. 72)
    написал:
    Вычисление выражений
    Если вы желаете вычислить некое выражение (к примеру, 'i+1'), вызовите метод
    TfsScript.Evaluate.
    ShowMessage(fsScript1.Evaluate('i+1'));
    Это полезно для использования в отладочных целях
  • DelphistDelphist Россия - Воронеж
    отредактировано 09:13
    gpi написал:
    support@fast-report.com
    Только они, наверное, сначала пошлют тебя читать доку. Здесь
    http://www.fast-report.com/pbc_download/fs_ru.pdf
    Т.е. я так понял необходимо написать письмо на support@fast-report.com
  • gpigpi
    отредактировано 09:13
    Да, support@fast-report.com - техподдержка пользователей FR
  • LexLex
    отредактировано February 2006
    Модератор удали соседние темы с такимже названием

    написал этот пост в соседней теме с таким же названием

    Берешь эту формулу и заменяешь все
    <Ca> на <frxDataSet."Ca">
    <Cp> на <frxDataSet."Cp">
    и т.д.

    слева и справа добовляешь квадратные скобки и эту строку кидаешь
    Memo.Text

    это можно делать в коде программы до
    формирования отчета
    или коде отчета в frxReportOnStartRepor

    так-же можно OnBeforePrint для всех мемо(один обработчик) написать
    begin
    TfrxMemoView(Sender).Text := MyParse(TfrxMemoView(Sender).Text)
    end;
    предварительно занеся формулы из базы в мемки как есть

    MyParse - производит замену части строки (см. выше).

    если некторых функций нет в фасте то добавляешь свои пользовательские функции.
  • DelphistDelphist Россия - Воронеж
    отредактировано 09:13
    Lex написал:
    Модератор удали соседние темы с такимже названием

    написал этот пост в соседней теме с таким же названием

    Берешь эту формулу и заменяешь все
    <Ca> на <frxDataSet."Ca">
    <Cp> на <frxDataSet."Cp">
    и т.д.

    слева
    Не мог бы дать рабочийт пример на Delphi, а то не очень понятно:
    например, Memo - это компонент TMemo или это сво-во FastScript'a
  • LexLex
    отредактировано February 2006
    procedure ReplaceStr(var str: string; const SubStr1, SubStr2: string);
    var
      i: Integer;
      myStr: String;
    begin
      myStr := '';
      while Pos(SubStr1, str) > 0 do
      begin
        if Pos(SubStr1, str) > 1 then
        begin
          myStr := myStr + Copy(str, 1, Pos(SubStr1, str) - 1);
          DeleteStr(str, 1, Pos(SubStr1, str) - 1);
        end;
        myStr := myStr + SubStr2;
        DeleteStr(str, 1, Length(SubStr1));
      end;
      myStr := myStr + str;
      str := myStr
    end;
    
    function MyParse(S: string): string;
    var
      DataSetName: string;
    begin
      DataSetName := MasterData1.DataSet.Name;
      ReplaceStr(S, '<Ca>', '<' + DataSetName +  '."Ca">');
      ReplaceStr(S, '<P>', '<' + DataSetName +  '."P">');
      Result := '[' + S + ']';
    end;
    
    procedure Memo1OnBeforePrint(Sender: TfrxComponent);
    begin
      TfrxMemoView(Sender).Text := MyParse(TfrxMemoView(Sender).Text);
    end;
    
    это код в самом Фасте (проверял работае);

    предварительно во все необходимые TfrxMemoView занеси формулы в виде
    12*<Ca> + 47*<P> и т.д.

    Например :
    var
       MyMemoView: TfrxMemoView;
    begin
      .....
       MyMemoView := frxReport.FindObject('Memo1') as   TfrxMemoView;
       MyMemoView.Text  :=  '12*<Ca> + 47*<P>';
       frxReport.ShowReport;
      ..... 
    end;
    
    
    


    если будешь использовать какие - то функции которых нет в Фасте
    (например Sqr) подключай внешнии функции (см. документацию и прикрепленную тему сдесь).


    У меня простая формула типа <Ca> + 3 * <P> для простенького набора
    данных из 2-х строк отработала.

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.