Помогите новичку, пожалуйста

отредактировано 11:28 Раздел: FastReport 4.0
Добрый день. Есть форма в виде таблицы с несколькими столбцами. Столбцы заполняются из БД. В следующем после MasterData1 бенде вывожу сумму по столбцам. Все работает. В самом же бэнде masterdata1 дабавляю еще один столбец, который должен считаться как знач.в стрке столбец1/сумму столбца 1+столбец 4/сумму столбца 4 - знач в строке 6/сумму столбца 1

Как мне взять эту сумму из memo в бенде ниже. Сумма высчитывается же уже после того, как считается нужное значение формулы выше. Идея в переменную передавать значение memo с суммой, а потом в выражении делить на эту переменную. Как сделать? просьба не пинать сильно....

Комментарии

  • отредактировано 11:28
    GroupHeader1

    значение

    GroupHeader2

    значение

    MasterData1

    Memo1 Memo2 Memo3 Memo4

    GroupFooter1

    Memo5 Memo6

    ________________________________________________

    Mem1-3 берутся из базы, Memo5 = сумма по столбцу Memo1, Memo6 = сумма по столбцу Memo2.

    Нужно высчитать Поле Memo4 = знач из строки Memo1/значение из Memo5 + знач из строки Memo2/значение из memo6 - знач из Memo3/знач из Memo5

    Получается, что значение из поля memo5 и memo 6 нужно вроде загнать в переменные например sum1 и sum2, а потом в формулу выше уже можно вставить деление на эту sum1 и sum2, где это нужно. Как взять это все и подставить куда надо, загнать в переменные.
  • gpigpi
    отредактировано 11:28
    Приложите шаблон отчёта
  • отредактировано June 2012
    это файл fr3 ?

  • отредактировано 11:28
    Даже как рассчитывать приложу :)

  • отредактировано June 2012
    Кстати, если опустить ту ячейку, которую я хочу рассчитать ниже в поле бэнда GroupFooter1, то расчет идет, так как сумма расчитана, он может ею оперировать и формула работает, дается результат, но только по последней строке бэнда masterdata1, а мне нужно напротив каждой строки вывести результат
  • отредактировано 11:28
    Получил так, работает :)

    CODE:

    var
    s1 : integer;
    s2 : integer;

    procedure SumCalc;
    begin
    QDetail.Open;
    QDetail.First;
    s1 := 0;
    s2 := 0;
    while (not QDetail.eof) do
    begin
    s1 := s1 + QDetail.FieldByName('QTYTASK').AsInteger;
    s2 := s2 + QDetail.FieldByName('QTYGOODS').AsInteger;
    QDetail.next;
    end;
    Set('sum1', s1);
    Set('sum2', s2);

    end;

    begin
    SumCalc;
    end.

    В шаблоне в нужной ячейке уже подставил нужную формулу и применял полученные переменные


    Вопрос снят, спасибо
  • отредактировано July 2012
    Возник вопрос. Считаю значение суммы по столбцу по условию. Вставляю полученное значение в переменную sum1 и sum2, затем следующее условие и снова записываем данные в sum1 и sum2 и так далее. Естесственно, что на этапе построения значений в таблице значения sum1 и sum2 будут равны результатам расчета по последнему условию. А можно ли сделать так, чтобы рассчитывалось условие. затем в дизайнере в нужной ячейке высчитывалось значение по формуле при данном значении, затем в коде считалось sum1 и sum2 при уже следующем условии. в дизайнере рисовалось уже по этому условие по формуле уже с этими значениями и т.д. ?

    Т.е. получается не сначала все рассчитывается, а потом вставляется в ячейки таблицы, а рассчиталось значения - подставились в формулу в ячейке и посчиталось, записалось, затем снова посчитались значения в переменных, подставились в формулу, отобразились в отчете.
  • отредактировано 11:28
    Конструкция присвоения по условию значения переменным следующая:

    if QDetail.FieldByName('sNameRole').AsString = 'Сбор заказа' then
    begin
    Set('sum1', s1);
    Set('sum2', s2);
    end;

    if QDetail.FieldByName('sNameRole').AsString = 'Стол контроля' then
    begin
    Set('sum1', s3);
    Set('sum2', s4);
    end;
  • отредактировано July 2012
    Код полностью:

    var
    s1, s2, s3, s4, s5, s6 : integer;

    procedure SumCalc; // Считаем суммы по нужным нам столбцам и закидываем результат в переменные,
    // которые потом можно будет использовать в формалах

    begin
    QDetail.Open;
    QDetail.First;

    s1 := 0;
    s2 := 0;
    s3 := 0;
    s4 := 0;
    s5 := 0;
    s6 := 0;

    while (not QDetail.eof) do
    begin
    if QDetail.FieldByName('SNAMEROLE').AsString = 'Сбор заказа' then
    begin
    s1 := s1 + QDetail.FieldByName('QTYTASK').AsInteger;
    s2 := s2 + QDetail.FieldByName('QTYGOODS').AsInteger;
    end;


    if QDetail.FieldByName('SNAMEROLE').AsString = 'Стол контроля' then
    begin
    s3 := s3 + QDetail.FieldByName('QTYTASK').AsInteger;
    s4 := s4 + QDetail.FieldByName('QTYGOODS').AsInteger;
    end;


    if QDetail.FieldByName('SNAMEROLE').AsString = 'Ручной добор' then
    begin
    s5 := s5 + QDetail.FieldByName('QTYTASK').AsInteger;
    s6 := s6 + QDetail.FieldByName('QTYGOODS').AsInteger;
    end;



    QDetail.next;

    end;
    if QDetail.FieldByName('sNameRole').AsString = 'Сбор заказа' then
    begin
    Set('sum1', s1);
    Set('sum2', s2);
    end;

    if QDetail.FieldByName('sNameRole').AsString = 'Стол контроля' then
    begin
    Set('sum1', s3);
    Set('sum2', s4);
    end;
    end;



    begin
    SumCalc;
    end.
  • gpigpi
    отредактировано 11:28
    А зачем Вы используете sum1, sum2, ведь уже есть s1, s2, s3, s4, s5, s6? Эти переменные можно использовать в скрипте при построении отчёта
  • отредактировано July 2012
    Есть один бэнд. В нем есть ячейка, значение которой есть формула:

    [(<IBXQuery1."QTYTASK">/<sum1> + <IBXQuery1."QTYGOODS">/<sum2> - <IBXQuery1."QTYGOODSPROBLEM">/<sum1>)*100]%

    Но есть еще области склада, такие как сбор заказов, столы проверки и т.д. и все они вставляются в этот единственный бэнд. Соответственно пока значение sum1 и sum2 считается для области склада "сбор заказа", то цифры получаются верные, но когда начинается область "стол проверки", по нем уже должна браться другая сумма проверенных, собранных и т.д. заказов. т.е. sum3 и sum4 соответвенно, ну и так далее для следующих областей. Всего 4 области на складе. Т.е. переменных с суммой будет 8. Вот в одну формулу в той ячейке не могу вставить по условию эти суммы по достижению новой области склада в отчете. Расчет продолжается с суммами, хранящимися в sum1 и sum2, хотя мне уже нужно, чтобы в формуле подставлялись значения sum3 и sum4
  • отредактировано July 2012
    Для наглядности:

    Выше. там не видно, идет область склада Сбор заказов. Там данные считаются в последней колонке верно. А вот уже с того момента, как идет Стол контроля, там неправильно. Нужно уже брать другую сумму.
  • gpigpi
    отредактировано 11:28
    Используйте обработчик OnBeforePrint бэнда или TfrxMemoView.
    Или цепочку IIF. Но это будет громоздко
  • отредактировано July 2012
    Если не затруднит, можно код? условия if испльзовал

    if QDetail.FieldByName('SNAMEROLE').AsString = 'Сбор заказа' then

    begin
    Set ('sum1', s1);
    Set ('sum2', s2);
    end;

    if QDetail.FieldByName('SNAMEROLE').AsString = 'Стол контроля' then

    begin

    Set ('sum1', s3);
    Set ('sum2', s4);


    ну и так далее....

    что я делаю неправильно?

    Кстати тут и ответ, почему использую еще и sum1 и sum2, если можно использовать s1, s2 и т.д. В формуле в memo пишу одну формулу с sum1 и sum2, а в коде хочу, чтобы по достижению записей определенных значение в них менялось на уже s1 s2 s3 s4 и т.д.
  • gpigpi
    отредактировано 11:28
    procedure MasterData1OnBeforePrint(Sender: TfrxComponent);
    begin
         if <IBXQuery1."SNAMEROLE"> = 'Сбор заказа' then Memo27.Text := '[s1]'
         else if <IBXQuery1."SNAMEROLE"> = 'Сбор контроля' then Memo27.Text := '[s3]';                         
    end;
    
  • отредактировано 11:28
    Большое спасибо! Под себя переделал, но главное, чо понял принцип.

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

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