Перерасход памяти

отредактировано 04:59 Раздел: FastReport 2.xx VCL
есть query возвращающая 2 поля - name & cena
есть отчет (page1 - товарная накладная, много пустых ячеек; page2 - товарно-транспортна, тут только названия товара)
при ShowReport page1 тормозит систему, начинает мееедленно прорисовывать каждую ячейку в таблице, в то время как page2 с нормальной скоростью обрабатывается
Тормозит это все очень сильно, и это на моей машине (celeron 2400, 256), а ведь у пользователей машины слабее будут
В чем тут проблема может быть? Как ее решить?

Комментарии

  • отредактировано 04:59
    да, забыл сказать: если дождаться окончания прорисовки ивыйти из программы, то незапускаются многи программы, постоянно возникает ошибка что системе недостаточно ресурсов ну и т.п. самое интересное что кнопка пуск моргать начинает:)
  • BorisBoris Москва
    отредактировано 04:59
    Ну тут налицо утечка памяти.
    Кстати, посмотри в диспетчере задач (надеюсь, что у тебя не Windows 98), может быть процесс полностью не выгружается из памяти, а остается там висеть. Поэтому потом другие программы виснут.
    А вот где сама утечка происходит, это вопрос. Накладные большие? Кстати, ты отчет не динамически ли генеришь, то есть не создаешь ли объект TfrReport в run-time?
  • отредактировано 04:59
    Boris написал:
    надеюсь, что у тебя не Windows 98
    Накладные большие? Кстати, ты отчет не динамически ли генеришь, то есть не создаешь ли объект TfrReport в run-time?
    К сожалению это именно 98ая, и использоваться будет на 98ой
    Накладные не большие, наверное ;) итого при печати 23 стрницы генерится (общее число)
    происходит это так
    frReport1.LoadFromFile('Nakl.frf');
    NaklQuery1.Close; NaklQuery1.SQL.Clear;
    NaklQuery1.SQL.Add('select n.sclad_name, r.cena');
    NaklQuery1.SQL.Add('from names n, res1 r');
    NaklQuery1.SQL.Add('where r.sclad_id=n.sclad_id and r.sclad_id in (select number from "\\database\bases\talon.dbf" t where t.num_doc=:B3)');
    NaklQuery1.Params.ParamByName('B3').AsInteger:=fromtalon;
    frReport1.ShowReport;
    NaklQuery1.Close;
    
    ну и соответтвенно frDataset натравлен на эту query и поля вытащены в отчет
  • BorisBoris Москва
    отредактировано 04:59
    Сразу вопрос, а где запрос выполняется? То есть не вижу строк вроде
    NaklQuery1.Prepare;
    NaklQuery1.Open;
    
    Не знаю, насколько это поможет и поможет ли вообще, но давай попробуем разделить на этапы, то есть
    if frReport1.PrepareReport then
      frReport1.ShowPreparedReport;
    
    Смысл: если отчет не сгенерился, то и не показывать его, то есть не начинать прорисовку.
    Да, и еще, я обычно сначала выполняю запрос, а уже потом загружаю шаблон методом LoadFromFile.
  • bakhbakh Санкт-Петербург
    отредактировано 04:59
    frQuest написал:
    происходит это так
    frReport1.LoadFromFile('Nakl.frf');
    NaklQuery1.Close; NaklQuery1.SQL.Clear;
    NaklQuery1.SQL.Add('select n.sclad_name, r.cena');
    NaklQuery1.SQL.Add('from names n, res1 r');
    NaklQuery1.SQL.Add('where r.sclad_id=n.sclad_id and r.sclad_id in (select number from "\\database\bases\talon.dbf" t where t.num_doc=:B3)');
    NaklQuery1.Params.ParamByName('B3').AsInteger:=fromtalon;
    frReport1.ShowReport;
    NaklQuery1.Close;
    
    ну и соответтвенно frDataset натравлен на эту query и поля вытащены в отчет
    А ты в курсе, что
    select number from "\\database\bases\talon.dbf" t where t.num_doc=:B3
    
    выполняется не один раз, а столько, сколько r.sclad_id?..
    Это - самый главный тормоз запроса...
  • отредактировано 04:59
    Запрос выполняется после NaklQuery1.Params.ParamByName('B3').AsInteger:=fromtalon;
    просто что-то он не скопировался ;)
    2 bakh:
    я понимаю, однако 2я таблица гененрится намного быстрее. т.е. если из отчета выкинуть page1, то все будет работать как надо - все быстро и никаких глюков.

    Я думаю все-таки дело в количестве текста и ячеек на page1, т.к. оно даже в дизайнере притормаживает малость. Однако все эти ячейки нужны.

    ЗЫ: сейчас попробую создать 2 frf репорта, отдельно для каждой накладной
  • bakhbakh Санкт-Петербург
    отредактировано 04:59
    Вот ты говоришь - много пустых ячеек...
    А чем ты их делаешь?.. Memo или Shape?..
  • отредактировано 04:59
    memo + границы
  • bakhbakh Санкт-Петербург
    отредактировано 04:59
    frQuest написал:
    memo + границы
    М-да... Хотел осоветовать для пустых использовать фигуру... А оно не имеет свойства Stretched... ;)
  • отредактировано 04:59
    попробовал с разбитием отчета на 2 - такая же картина ;)
    сделал query и сохранил результат в локальный файл, потом "select * from tmp" - быстрее не стало абсолютно ;)
    Люди добрыйя, поможите, делал ли кто-нибудь товарную накладную? почему она тормозит всю систему при прорисовке на ShowReport??
    ;)
  • BorisBoris Москва
    отредактировано 04:59
    Товарную накладную делал, но такой проблемы не было. И пустые ячейки были, но это никак не влияло.
  • bakhbakh Санкт-Петербург
    отредактировано 04:59
    Даже не знаю, что тебе сказать... ;)
    Пришли файлик, посмотрю...
  • отредактировано 04:59
    Куды слать то?
  • bakhbakh Санкт-Петербург
    отредактировано 04:59
    frQuest написал:
    Куды слать то?
    Ну, ты на мой ник тыкни, там всё написано... ;)
  • отредактировано 04:59
    Спасибо bakh'у - помог решить проблему
    То что я принимал за memo оказалось rich'ем. Соответственно после замены все проблемы исчезли!
    Пойду посыплю голову пеплом ;)

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

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