Topic: Не очищается память после выполнения отчета

Приветствую.

Подскажите, в чём может быть проблема?
На одной форме кнопка типа "Отчет SQL". На событие OnAfterClick "повешена" процедура очистки памяти.

procedure ClearMemoryReport (Sender: TObject);
begin
    Main1.frxReport.Clear;
    Main1.frxReport.DataSets.Clear;
    Main1.frxReport.Variables.Clear;
end;

Здесь нет ошибок.
Когда я перехожу на другую форму, там есть кнопка с выполнением отчета через скрипт:

procedure vedom_view_Button1_OnClick (Sender: TObject; var Cancel: boolean);
var
ReportMM: TfrxDBDataset;
ResultMM: TDataSet;
S1,S2,S3,SQitog: string;
predPr,pr1,pr2,pr3,predEn,en1,en2,en3,predFr,fr1,fr2,fr3,predNe,ne1,ne2,ne3: string;
begin
if ((vedom_view.CheckBox1.Checked = False) AND (vedom_view.CheckBox2.Checked = False) AND (vedom_view.CheckBox3.Checked = False) AND (vedom_view.CheckBox4.Checked = False)) OR (vedom_view.ComboBox1.dbItemID = -1) then
    begin
    MessageBox('Не выбран один из критериев отбора','',MB_ICONINFORMATION);
    Cancel:=True;
    end
    else begin
    predPr:=SQLEXecute('SELECT predPr FROM ekz_komiss');
    pr1:=SQLEXecute('SELECT pr1 FROM ekz_komiss');
    pr2:=SQLEXecute('SELECT pr2 FROM ekz_komiss');
    pr3:=SQLEXecute('SELECT pr3 FROM ekz_komiss');

    predEn:=SQLEXecute('SELECT predEn FROM ekz_komiss');
    en1:=SQLEXecute('SELECT en1 FROM ekz_komiss');
    en2:=SQLEXecute('SELECT en2 FROM ekz_komiss');
    en3:=SQLEXecute('SELECT en3 FROM ekz_komiss');

    predFr:=SQLEXecute('SELECT predFr FROM ekz_komiss');
    fr1:=SQLEXecute('SELECT fr1 FROM ekz_komiss');
    fr2:=SQLEXecute('SELECT fr2 FROM ekz_komiss');
    fr3:=SQLEXecute('SELECT fr3 FROM ekz_komiss');

    predNe:=SQLEXecute('SELECT predNe FROM ekz_komiss');
    ne1:=SQLEXecute('SELECT ne1 FROM ekz_komiss');
    ne2:=SQLEXecute('SELECT ne2 FROM ekz_komiss');
    ne3:=SQLEXecute('SELECT ne3 FROM ekz_komiss');


 S1:='SELECT ekzamens.n_abit, ekzamens.fullname, ekzamens.name, ekzamens.fath, ekzamens.id_type_ekzamen, ekzamens.gia, language.name_lang, ekzamens.inostr_ball,spec.short, sprspec.nSpec, ekzamens.id_language FROM ((pk_adi.spec spec INNER JOIN pk_adi.sprspec sprspec ON (spec.id_sprSpec = sprspec.id)) ';
 S2:='LEFT OUTER JOIN pk_adi.ekzamens ekzamens ON (ekzamens.id_spec = spec.id)) LEFT OUTER JOIN pk_adi.language language ON (ekzamens.id_language = language.id) ';
 S3:='WHERE '+vedom_view.Memo1.Text+' AND (ekzamens.gia=0 OR ekzamens.inostr_ball=0)';
      SQitog:=S1+S2+S3;
      SQLQuery(SQitog,ResultMM);
    ReportMM:= TfrxDBDataset.Create(Main1);
    ReportMM.UserName        := 'Report';
    ReportMM.CloseDataSource := True;
    ReportMM.OpenDataSource  := True;
    ReportMM.DataSet         := ResultMM;
    Main1.frxReport.Clear;
    Main1.frxReport.DataSets.Clear;
    Main1.frxReport.DataSets.Add(ReportMM);
    ReportMM.DataSet.Close;
    Main1.frxReport.Variables.Clear;
    Main1.frxReport.Variables['Components']:=Null;
    Main1.frxReport.Variables['predPr']:=''''+predPr+'''';
    Main1.frxReport.Variables['pr1']:=''''+pr1+'''';
    Main1.frxReport.Variables['pr2']:=''''+pr2+'''';
    Main1.frxReport.Variables['pr3']:=''''+pr3+'''';
    Main1.frxReport.Variables['predEn']:=''''+predEn+'''';
    Main1.frxReport.Variables['en1']:=''''+en1+'''';
    Main1.frxReport.Variables['en2']:=''''+en2+'''';
    Main1.frxReport.Variables['en3']:=''''+en3+'''';
    Main1.frxReport.Variables['predFr']:=''''+predFr+'''';
    Main1.frxReport.Variables['fr1']:=''''+fr1+'''';
    Main1.frxReport.Variables['fr2']:=''''+fr2+'''';
    Main1.frxReport.Variables['fr3']:=''''+fr3+'''';
    Main1.frxReport.Variables['predNe']:=''''+predNe+'''';
    Main1.frxReport.Variables['ne1']:=''''+ne1+'''';
    Main1.frxReport.Variables['ne2']:=''''+ne2+'''';
    Main1.frxReport.Variables['ne3']:=''''+ne3+'''';
    showmessage(SQitog);
    Main1.frxReport.LoadFromFile(ExtractFilePath(Application.ExeName)+'\Report\magVedEkz.fr3');
//    Main1.frxReport.PrepareReport();
//    Main1.frxReport.ShowReport;
//    Main1.frxReport.DesignReport;  //дизайнер открыть
    ExportFilter(Main1.frxRTFExport1, ExtractFilePath(Application.ExeName)+'\Report\magVedEkz.fr3');              //перенаправление вывода отчета в
    ResultMM.Free;
    ReportMM.Free;
 end;
end;

Вот эта процедура выполняется без ошибки только в первый раз. Когда зашёл в программу. Как я понимаю - память чиста. А после выполнения другого отчёта (на другой форме) идут ошибки.
Где-то нарушена последовательность команд?

Заранее спасибо за ответ.

Yana

Re: Не очищается память после выполнения отчета

adiziktdy wrote:

var
ReportMM: TfrxDBDataset;
ResultMM: TDataSet;
S1,S2,S3,SQitog: string;
predPr,pr1,pr2,pr3,predEn,en1,en2,en3,predFr,fr1,fr2,fr3,predNe,ne1,ne2,ne3: string;
begin

Попробуйте присвоить им пустые значения

3 (edited by adiziktdy 2022-12-08 07:52:14)

Re: Не очищается память после выполнения отчета

pavlenko.vladimir.v wrote:

Попробуйте присвоить им пустые значения

Не помогло.
Скрин 1 - выборка по SQL

Скрин 2 - Data Fastreport остались из предыдущего запроса

Скрин 3 - ошибки (нет соответствующих полей)


https://a.radikal.host/2022/12/08/Image3.md.jpg
https://a.radikal.host/2022/12/08/Image2.jpg
https://a.radikal.host/2022/12/08/Image1.md.jpg

Yana

4 (edited by adiziktdy 2022-12-08 08:30:09)

Re: Не очищается память после выполнения отчета

У меня в памяти оба отчета почему-то sad

Когда ручками выбираю второй, то всё ОК

https://a.radikal.host/2022/12/08/Image4_.jpg
https://a.radikal.host/2022/12/08/Image5_.jpg

Дать ему другое имя пользователя? Странно... У меня все отчёты идут под именем Report и всё работает. Да ещё шаблон придётся править ((((

Yana

Re: Не очищается память после выполнения отчета

adiziktdy wrote:

Дать ему другое имя пользователя?

Изменила

   ReportMM.UserName        := 'Report';

на

    ReportMM.UserName        := 'Report1';

Откорректировала шаблон. И вуаля - ошибок нет yikes

Yana

Re: Не очищается память после выполнения отчета

Посмотрите на этот алгоритм

// процедура построения данных отчета
procedure reportNewEditPrint (var Action, adres:string);
var
TfrxDBDdevice,TfrxDBDmodel,TfrxDBDserialNumber,TfrxDBDtheBrand,TfrxDBDfirstNameClient,TfrxDBDlastNameClient,TfrxDBDotherNameClient:TfrxDBDataset;
TfrxDBDcompletedWorks,TfrxDBDequipment,TfrxDBDphoneClient,TfrxDBDadressClient,TfrxDBDusers,TfrxDBDrepairStatus,TfrxDBDpriceList:TfrxDBDataset;
TfrxDBDcomponents,TfrxDBDCompany,TfrxDBDusedComponents,TfrxDBDequipmentFull:TfrxDBDataset;
device,model,serialNumber,theBrand,firstNameClient,lastNameClient,otherNameClient,completedWorks,equipment,phoneClient,adressClient:TDataSet;
users,repairStatus,priceList,components,Company,usedComponents,equipmentFull:TDataSet;
AObject:string;
begin
  if (frmReception.cbTypeSearch.ItemIndex=0) then AObject:=frmReception.tgPeople.sqlValue else AObject:=frmReception.tgCompany.sqlValue;
  //сбор данных отчета отдельных данных - начало -----------------
  SQLQuery('SELECT id AS "'+iniLanguage.ReadString('reportmess','dr1', 'Идентификатор записи')+'", id_firstNameClient AS "'+iniLanguage.ReadString('reportmess','dr2', 'Идентификатор имени клиента')+'",'+
           'id_lastNameClient AS "'+iniLanguage.ReadString('reportmess','dr3', 'Идентификатор фамилии клиента')+'",id_otherNameClient AS "'+iniLanguage.ReadString('reportmess','dr4', 'Идентификатор отчества клиента')+'",'+
           'id_phoneClient AS "'+iniLanguage.ReadString('reportmess','dr5', 'Идентификатор номера телефона')+'",id_adressClient AS "'+iniLanguage.ReadString('reportmess','dr6', 'Идентификатор адреса клиента')+'",'+
           'id_device AS "'+iniLanguage.ReadString('reportmess','dr7', 'Идентификатор оборудования ')+'", id_model AS "'+iniLanguage.ReadString('reportmess','dr8', 'Идентификатор модели')+'", id_theBrand AS "'+iniLanguage.ReadString('reportmess','dr9', 'Идентификатор бренда')+'" ,'+
           'id_serialNumber AS "'+iniLanguage.ReadString('reportmess','dr43', 'Идентификатор серийного номера')+'",id_users AS "'+iniLanguage.ReadString('reportmess','dr10', 'Идентификатор принявшего оборудование')+'", id_repairStatus AS "'+iniLanguage.ReadString('reportmess','dr11', 'Идентификатор статуса оборудования ')+'", id_Company AS "'+iniLanguage.ReadString('reportmess','dr12', 'Идентификатор компании')+'",'+
           'dateIn AS "'+iniLanguage.ReadString('reportmess','dr13', 'Дата принятия оборудования ')+'" ,dateOut AS "'+iniLanguage.ReadString('reportmess','dr14', 'Дата выдачи оборудования ')+'",kit AS "'+iniLanguage.ReadString('reportmess','dr15', 'Список комплектации')+'",'+
           'warranty AS "'+iniLanguage.ReadString('reportmess','dr16', 'Гарантийный ремонт (Boolean)')+'",description AS "'+iniLanguage.ReadString('reportmess','dr17', 'Описание неисправности')+'",Company AS "'+iniLanguage.ReadString('reportmess','dr18', 'Тип клинта Ч/Ю (Boolean)')+'",'+
           'descriptionVisual AS "'+iniLanguage.ReadString('reportmess','dr19', 'Описание внешнего вида')+'",requestNumberCounter AS "'+iniLanguage.ReadString('reportmess','dr20', 'Номер заявки')+'",typeOfService AS "'+iniLanguage.ReadString('reportmess','dr21', 'Только диагностика (Boolean)')+'",'+
           'phoneType AS "'+iniLanguage.ReadString('reportmess','dr22', 'Стационарный телефон (Boolean)')+'",resultDiagnostic AS "'+iniLanguage.ReadString('reportmess','dr23', 'Результат диагностики')+'",priceOff AS "'+iniLanguage.ReadString('reportmess','dr24', 'Стоимость ремонта погашена (Boolean)')+'",'+
           'personid AS "'+iniLanguage.ReadString('reportmess','bm039', 'Номер заявки')+'" FROM equipment', equipment);
  SQLQuery('SELECT id AS "'+iniLanguage.ReadString('reportmess','dr1', 'Идентификатор записи')+'", name AS "'+iniLanguage.ReadString('reportmess','dr25', 'Тип оборудования ')+'" FROM device', device);
  SQLQuery('SELECT id AS "'+iniLanguage.ReadString('reportmess','dr1', 'Идентификатор записи')+'", name AS "'+iniLanguage.ReadString('reportmess','dr26', 'Модель оборудования ')+'" FROM model', model);
  SQLQuery('SELECT id AS "'+iniLanguage.ReadString('reportmess','dr1', 'Идентификатор записи')+'", name AS "'+iniLanguage.ReadString('reportmess','dr27', 'Серийный номер')+'" FROM serialNumber', serialNumber);
  SQLQuery('SELECT id AS "'+iniLanguage.ReadString('reportmess','dr1', 'Идентификатор записи')+'", name AS "'+iniLanguage.ReadString('reportmess','dr28', 'Бренд оборудования ')+'" FROM theBrand', theBrand);
  SQLQuery('SELECT id AS "'+iniLanguage.ReadString('reportmess','dr1', 'Идентификатор записи')+'", name AS "'+iniLanguage.ReadString('reportmess','dr29', 'Имя клинта')+'" FROM firstNameClient', firstNameClient);
  SQLQuery('SELECT id AS "'+iniLanguage.ReadString('reportmess','dr1', 'Идентификатор записи')+'", name AS "'+iniLanguage.ReadString('reportmess','dr30', 'Фамилия клиента')+'" FROM lastNameClient', lastNameClient);
  SQLQuery('SELECT id AS "'+iniLanguage.ReadString('reportmess','dr1', 'Идентификатор записи')+'", name AS "'+iniLanguage.ReadString('reportmess','dr31', 'Отчества клиента')+'" FROM otherNameClient', otherNameClient);
  SQLQuery('SELECT id AS "'+iniLanguage.ReadString('reportmess','dr1', 'Идентификатор записи')+'", id_users AS "'+iniLanguage.ReadString('reportmess','dr32', 'Идентификатор мастера')+'"'+
           ', id_equipment AS "'+iniLanguage.ReadString('reportmess','dr7', 'Идентификатор оборудования ')+'", name AS "'+iniLanguage.ReadString('reportmess','dr33', 'Имя выполненой работы')+'"'+
           ', price AS "'+iniLanguage.ReadString('reportmess','dr34', 'Цена выполненой работы')+'", quantity AS "'+iniLanguage.ReadString('reportmess','dr35', 'Количество')+'"'+
           ', allprice AS "'+iniLanguage.ReadString('reportmess','dr36', 'Полная цена')+'" FROM completedWorks', completedWorks);
  SQLQuery('SELECT id AS "'+iniLanguage.ReadString('reportmess','dr1', 'Идентификатор записи')+'", name AS "'+iniLanguage.ReadString('reportmess','dr37', 'Номер телефона')+'" FROM phoneClient', phoneClient);
  SQLQuery('SELECT id AS "'+iniLanguage.ReadString('reportmess','dr1', 'Идентификатор записи')+'", name AS "'+iniLanguage.ReadString('reportmess','dr38', 'Адрес')+'" FROM adressClient', adressClient);
  SQLQuery('SELECT id AS "'+iniLanguage.ReadString('reportmess','dr1', 'Идентификатор записи')+'", firstName AS "'+iniLanguage.ReadString('reportmess','dr39', 'Имя ')+'", lastName AS "'+iniLanguage.ReadString('reportmess','dr40', 'Фамилия ')+'"'+
           ', login AS "'+iniLanguage.ReadString('reportmess','dr41', 'Логин')+'" FROM users', users);
  SQLQuery('SELECT id AS "'+iniLanguage.ReadString('reportmess','dr1', 'Идентификатор записи')+'", name AS "'+iniLanguage.ReadString('reportmess','dr42', 'Статус')+'" FROM repairStatus', repairStatus);
  SQLQuery('SELECT id AS "'+iniLanguage.ReadString('reportmess','dr1', 'Идентификатор записи')+'", name AS "'+iniLanguage.ReadString('reportmess','dr44', 'Имя услуги')+'", price AS "'+iniLanguage.ReadString('reportmess','dr45', 'Цена')+'" FROM priceList', priceList);
  SQLQuery('SELECT id AS "'+iniLanguage.ReadString('reportmess','dr1', 'Идентификатор записи')+'", name AS "'+iniLanguage.ReadString('reportmess','dr46', 'Имя компонента')+'", price AS "'+iniLanguage.ReadString('reportmess','dr45', 'Цена')+'" FROM components', components);
  SQLQuery('SELECT id AS "'+iniLanguage.ReadString('reportmess','dr1', 'Идентификатор записи')+'", name AS "'+iniLanguage.ReadString('reportmess','lNC', 'Имя компании')+'", adres AS "'+iniLanguage.ReadString('reportmess','lAC', 'Адрес компании')+'", phone AS "'+iniLanguage.ReadString('reportmess','dr47', 'Телефон компании')+'" FROM Company', Company);
  SQLQuery('SELECT id AS "'+iniLanguage.ReadString('reportmess','dr1', 'Идентификатор записи')+'", id_users AS "'+iniLanguage.ReadString('reportmess','dr48', 'Идентификатор мастера')+'"'+
           ', id_equipment AS "'+iniLanguage.ReadString('reportmess','dr49', 'Идентификатор оборудования ')+'", name AS "'+iniLanguage.ReadString('reportmess','dr50', 'Имя использованного компонента')+'"'+
           ', price AS "'+iniLanguage.ReadString('reportmess','dr51', 'Цена использованного компонента')+'", quantity AS "'+iniLanguage.ReadString('reportmess','dr28', 'Количество')+'"'+
           ', allprice AS "'+iniLanguage.ReadString('reportmess','dr52', 'Полная цена')+'" FROM usedComponents', usedComponents);
  //сбор данных отчета отдельных данных - конец ------------------

  //сбор данных отчета связанных данных - начало -----------------
  SQLQuery('SELECT equipment.dateIn AS "'+iniLanguage.ReadString('reportmess','dr13', 'Дата принятия оборудования ')+'" ,equipment.dateOut AS "'+iniLanguage.ReadString('reportmess','dr14', 'Дата выдачи оборудования ')+'",equipment.kit AS "'+iniLanguage.ReadString('reportmess','dr15', 'Список комплектации')+'",'+
           'equipment.warranty AS "'+iniLanguage.ReadString('reportmess','dr16', 'Гарантийный ремонт (Boolean)')+'",equipment.description AS "'+iniLanguage.ReadString('reportmess','dr17', 'Описание неисправности')+'",equipment.Company AS "'+iniLanguage.ReadString('reportmess','dr18', 'Тип клинта Ч/Ю (Boolean)')+'",'+
           'equipment.descriptionVisual AS "'+iniLanguage.ReadString('reportmess','dr19', 'Описание внешнего вида')+'",equipment.requestNumberCounter AS "'+iniLanguage.ReadString('reportmess','dr20', 'Номер заявки')+'",equipment.typeOfService AS "'+iniLanguage.ReadString('reportmess','dr21', 'Только диагностика (Boolean)')+'",'+
           'equipment.phoneType AS "'+iniLanguage.ReadString('reportmess','dr22', 'Стационарный телефон (Boolean)')+'",equipment.resultDiagnostic AS "'+iniLanguage.ReadString('reportmess','dr23', 'Результат диагностики')+'",equipment.priceOff AS "'+iniLanguage.ReadString('reportmess','dr24', 'Стоимость ремонта погашена (Boolean)')+'",'+
           'firstNameClient.name AS "'+iniLanguage.ReadString('reportmess','dr29', 'Имя клиента')+'",lastNameClient.name AS"'+iniLanguage.ReadString('reportmess','dr30', 'Фамилия клиента')+'",otherNameClient.name AS "'+iniLanguage.ReadString('reportmess','dr31', 'Отчество клиента')+'",'+
           'phoneClient.name AS "'+iniLanguage.ReadString('reportmess','dr53', 'Телефон клиента')+'",adressClient.name AS "'+iniLanguage.ReadString('reportmess','dr54', 'Адрес клиента')+'",'+
           'device.name AS "'+iniLanguage.ReadString('reportmess','dr25', 'Тип оборудования ')+'", model.name AS "'+iniLanguage.ReadString('reportmess','dr26', 'Модель оборудования ')+'", theBrand.name AS "'+iniLanguage.ReadString('reportmess','dr28', 'Бренд оборудования ')+'" ,'+
           'serialNumber.name AS "'+iniLanguage.ReadString('reportmess','dr27', 'Серийный номер')+'", users.firstName AS "'+iniLanguage.ReadString('reportmess','dr55', 'Принявший оборудование')+'", repairStatus.name AS "'+iniLanguage.ReadString('reportmess','dr42', 'Статус')+'", Company.name AS "'+iniLanguage.ReadString('reportmess','lNC', 'Имя компании')+'",'+
           'Company.adres AS "'+iniLanguage.ReadString('reportmess','lAC', 'Адрес компании')+'", Company.phone AS "'+iniLanguage.ReadString('reportmess','dr47', 'Телефон компании')+'",'+
           'completedWorks.name AS "'+iniLanguage.ReadString('reportmess','dr33', 'Имя выполненой работы')+'", completedWorks.price AS "'+iniLanguage.ReadString('reportmess','dr34', 'Цена выполненой работы')+'", completedWorks.quantity AS "'+iniLanguage.ReadString('reportmess','dr56', 'Кол-во выполненных работ')+'", completedWorks.allprice AS "'+iniLanguage.ReadString('reportmess','dr57', 'Общая цена за выполненую работу')+'",'+
           'usedComponents.name AS "'+iniLanguage.ReadString('reportmess','dr58', 'Имя затраченного материала')+'", usedComponents.price AS "'+iniLanguage.ReadString('reportmess','dr59', 'Цена затраченного материала')+'", usedComponents.quantity AS "'+iniLanguage.ReadString('reportmess','dr60', 'Кол-во затраченных материалов')+'",'+
           'usedComponents.allprice AS "'+iniLanguage.ReadString('reportmess','dr61', 'Общая цена за затраченные материалы')+'",personid AS "'+iniLanguage.ReadString('reportmess','bm039', 'Номер заявки')+'" FROM equipment '+
           'LEFT OUTER JOIN firstNameClient ON firstNameClient.id=equipment.id_firstNameClient '+
           'LEFT OUTER JOIN lastNameClient ON lastNameClient.id=equipment.id_lastNameClient '+
           'LEFT OUTER JOIN otherNameClient ON otherNameClient.id=equipment.id_otherNameClient '+
           'LEFT OUTER JOIN phoneClient ON phoneClient.id=equipment.id_phoneClient '+
           'LEFT OUTER JOIN adressClient ON adressClient.id=equipment.id_adressClient '+
           'LEFT OUTER JOIN device ON device.id=equipment.id_device '+
           'LEFT OUTER JOIN model ON model.id=equipment.id_model '+
           'LEFT OUTER JOIN theBrand ON theBrand.id=equipment.id_theBrand '+
           'LEFT OUTER JOIN serialNumber ON serialNumber.id=equipment.id_serialNumber '+
           'LEFT OUTER JOIN users ON users.id=equipment.id_users '+
           'LEFT OUTER JOIN repairStatus ON repairStatus.id=equipment.id_repairStatus '+
           'LEFT OUTER JOIN Company ON Company.id=equipment.id_Company '+
           'LEFT OUTER JOIN completedWorks ON completedWorks.id_equipment=equipment.id '+
           'LEFT OUTER JOIN usedComponents ON usedComponents.id_equipment=equipment.id '+
           'WHERE equipment.id='+AObject,equipmentFull);
  //сбор данных отчета связанных данных - конец ------------------

  //передача в дизайнер отчета данных - начало ------------------
  TfrxDBDequipment := TfrxDBDataset.Create(frmLogin);
  TfrxDBDequipment.UserName        := iniLanguage.ReadString('reportmess','UserName1', 'Таблица принятого оборудования ');
  TfrxDBDequipment.CloseDataSource := True;
  TfrxDBDequipment.OpenDataSource  := True;
  TfrxDBDequipment.DataSet         := equipment;

  TfrxDBDdevice := TfrxDBDataset.Create(device);
  TfrxDBDdevice.UserName        := iniLanguage.ReadString('reportmess','UserName2', 'Таблица(тип оборудования)');
  TfrxDBDdevice.CloseDataSource := True;
  TfrxDBDdevice.OpenDataSource  := True;
  TfrxDBDdevice.DataSet         := device;

  TfrxDBDmodel := TfrxDBDataset.Create(model);
  TfrxDBDmodel.UserName        := iniLanguage.ReadString('reportmess','UserName3', 'Таблица(модель оборудования)');
  TfrxDBDmodel.CloseDataSource := True;
  TfrxDBDmodel.OpenDataSource  := True;
  TfrxDBDmodel.DataSet         := model;

  TfrxDBDserialNumber := TfrxDBDataset.Create(serialNumber);
  TfrxDBDserialNumber.UserName        := iniLanguage.ReadString('reportmess','UserName4', 'Таблица(серийный номер оборудования)');
  TfrxDBDserialNumber.CloseDataSource := True;
  TfrxDBDserialNumber.OpenDataSource  := True;
  TfrxDBDserialNumber.DataSet         := serialNumber;

  TfrxDBDtheBrand := TfrxDBDataset.Create(theBrand);
  TfrxDBDtheBrand.UserName        := iniLanguage.ReadString('reportmess','UserName5', 'Таблица(бренд оборудования)');
  TfrxDBDtheBrand.CloseDataSource := True;
  TfrxDBDtheBrand.OpenDataSource  := True;
  TfrxDBDtheBrand.DataSet         := theBrand;

  TfrxDBDfirstNameClient := TfrxDBDataset.Create(firstNameClient);
  TfrxDBDfirstNameClient.UserName        := iniLanguage.ReadString('reportmess','UserName6', 'Таблица(имя клиента)');
  TfrxDBDfirstNameClient.CloseDataSource := True;
  TfrxDBDfirstNameClient.OpenDataSource  := True;
  TfrxDBDfirstNameClient.DataSet         := firstNameClient;

  TfrxDBDlastNameClient := TfrxDBDataset.Create(lastNameClient);
  TfrxDBDlastNameClient.UserName        := iniLanguage.ReadString('reportmess','UserName7', 'Таблица(фамилия клиента)');
  TfrxDBDlastNameClient.CloseDataSource := True;
  TfrxDBDlastNameClient.OpenDataSource  := True;
  TfrxDBDlastNameClient.DataSet         := lastNameClient;

  TfrxDBDotherNameClient := TfrxDBDataset.Create(otherNameClient);
  TfrxDBDotherNameClient.UserName        := iniLanguage.ReadString('reportmess','UserName8', 'Таблица(отчество клиента)');
  TfrxDBDotherNameClient.CloseDataSource := True;
  TfrxDBDotherNameClient.OpenDataSource  := True;
  TfrxDBDotherNameClient.DataSet         := otherNameClient;

  TfrxDBDcompletedWorks := TfrxDBDataset.Create(completedWorks);
  TfrxDBDcompletedWorks.UserName        := iniLanguage.ReadString('reportmess','UserName9', 'Таблица(выполненые работы)');
  TfrxDBDcompletedWorks.CloseDataSource := True;
  TfrxDBDcompletedWorks.OpenDataSource  := True;
  TfrxDBDcompletedWorks.DataSet         := completedWorks;

  TfrxDBDphoneClient := TfrxDBDataset.Create(phoneClient);
  TfrxDBDphoneClient.UserName        := iniLanguage.ReadString('reportmess','UserName10', 'Таблица(телефон клиента)');
  TfrxDBDphoneClient.CloseDataSource := True;
  TfrxDBDphoneClient.OpenDataSource  := True;
  TfrxDBDphoneClient.DataSet         := phoneClient;

  TfrxDBDadressClient := TfrxDBDataset.Create(adressClient);
  TfrxDBDadressClient.UserName        := iniLanguage.ReadString('reportmess','UserName11', 'Таблица(адрес клиента)');
  TfrxDBDadressClient.CloseDataSource := True;
  TfrxDBDadressClient.OpenDataSource  := True;
  TfrxDBDadressClient.DataSet         := adressClient;

  TfrxDBDusers := TfrxDBDataset.Create(users);
  TfrxDBDusers.UserName        := iniLanguage.ReadString('reportmess','UserName12', 'Таблица(Пользователь программы)');
  TfrxDBDusers.CloseDataSource := True;
  TfrxDBDusers.OpenDataSource  := True;
  TfrxDBDusers.DataSet         := users;

  TfrxDBDrepairStatus := TfrxDBDataset.Create(repairStatus);
  TfrxDBDrepairStatus.UserName        := iniLanguage.ReadString('reportmess','UserName13', 'Таблица(статус ремонта)');
  TfrxDBDrepairStatus.CloseDataSource := True;
  TfrxDBDrepairStatus.OpenDataSource  := True;
  TfrxDBDrepairStatus.DataSet         := repairStatus;

  TfrxDBDpriceList := TfrxDBDataset.Create(priceList);
  TfrxDBDpriceList.UserName        := iniLanguage.ReadString('reportmess','UserName14', 'Таблица(прайс лист)');
  TfrxDBDpriceList.CloseDataSource := True;
  TfrxDBDpriceList.OpenDataSource  := True;
  TfrxDBDpriceList.DataSet         := priceList;

  TfrxDBDcomponents := TfrxDBDataset.Create(components);
  TfrxDBDcomponents.UserName        := iniLanguage.ReadString('reportmess','UserName15', 'Таблица(компоненты/материалы)');
  TfrxDBDcomponents.CloseDataSource := True;
  TfrxDBDcomponents.OpenDataSource  := True;
  TfrxDBDcomponents.DataSet         := components;

  TfrxDBDusedComponents := TfrxDBDataset.Create(usedComponents);
  TfrxDBDusedComponents.UserName        := iniLanguage.ReadString('reportmess','UserName16', 'Таблица(использованные компоненты)');
  TfrxDBDusedComponents.CloseDataSource := True;
  TfrxDBDusedComponents.OpenDataSource  := True;
  TfrxDBDusedComponents.DataSet         := usedComponents;

  TfrxDBDCompany := TfrxDBDataset.Create(Company);
  TfrxDBDCompany.UserName        := iniLanguage.ReadString('reportmess','UserName17', 'Таблица(компания клиент)');
  TfrxDBDCompany.CloseDataSource := True;
  TfrxDBDCompany.OpenDataSource  := True;
  TfrxDBDCompany.DataSet         := Company;

  TfrxDBDequipmentFull := TfrxDBDataset.Create(equipmentFull);
  TfrxDBDequipmentFull.UserName        := iniLanguage.ReadString('reportmess','UserName18', 'Общая таблица(принятое оборудование)');
  TfrxDBDequipmentFull.CloseDataSource := True;
  TfrxDBDequipmentFull.OpenDataSource  := True;
  TfrxDBDequipmentFull.DataSet         := equipmentFull;


  frmLogin.frxReport.Clear;
  frmLogin.frxReport.DataSets.Add(TfrxDBDequipment);
  frmLogin.frxReport.DataSets.Add(TfrxDBDdevice);
  frmLogin.frxReport.DataSets.Add(TfrxDBDmodel);
  frmLogin.frxReport.DataSets.Add(TfrxDBDserialNumber);
  frmLogin.frxReport.DataSets.Add(TfrxDBDtheBrand);
  frmLogin.frxReport.DataSets.Add(TfrxDBDfirstNameClient);
  frmLogin.frxReport.DataSets.Add(TfrxDBDlastNameClient);
  frmLogin.frxReport.DataSets.Add(TfrxDBDotherNameClient);
  frmLogin.frxReport.DataSets.Add(TfrxDBDcompletedWorks);
  frmLogin.frxReport.DataSets.Add(TfrxDBDphoneClient);
  frmLogin.frxReport.DataSets.Add(TfrxDBDadressClient);
  frmLogin.frxReport.DataSets.Add(TfrxDBDusers);
  frmLogin.frxReport.DataSets.Add(TfrxDBDrepairStatus);
  frmLogin.frxReport.DataSets.Add(TfrxDBDpriceList);
  frmLogin.frxReport.DataSets.Add(TfrxDBDcomponents);
  frmLogin.frxReport.DataSets.Add(TfrxDBDusedComponents);
  frmLogin.frxReport.DataSets.Add(TfrxDBDCompany);
  frmLogin.frxReport.DataSets.Add(TfrxDBDequipmentFull);

  TfrxDBDequipment.DataSet.Close;
  TfrxDBDdevice.DataSet.Close;
  TfrxDBDmodel.DataSet.Close;
  TfrxDBDserialNumber.DataSet.Close;
  TfrxDBDtheBrand.DataSet.Close;
  TfrxDBDfirstNameClient.DataSet.Close;
  TfrxDBDlastNameClient.DataSet.Close;
  TfrxDBDotherNameClient.DataSet.Close;
  TfrxDBDcompletedWorks.DataSet.Close;
  TfrxDBDphoneClient.DataSet.Close;
  TfrxDBDadressClient.DataSet.Close;
  TfrxDBDusers.DataSet.Close;
  TfrxDBDrepairStatus.DataSet.Close;
  TfrxDBDpriceList.DataSet.Close;
  TfrxDBDcomponents.DataSet.Close;
  TfrxDBDusedComponents.DataSet.Close;
  TfrxDBDCompany.DataSet.Close;
  TfrxDBDequipmentFull.DataSet.Close;

  //передача в дизайнер отчета данных - конец ------------------

  // действия с отчетоми - начало  --------------------------
  if (Action='print') then begin
  frmLogin.frxReport.LoadFromFile(ExtractFilePath(Application.ExeName)+'\Report\'+adres);
  frmLogin.frxReport.ShowReport;
  end;
  if (Action='edit') then begin
  frmLogin.frxReport.LoadFromFile(ExtractFilePath(Application.ExeName)+'\Report\'+adres);
  frmLogin.mniReport.Click;

  end;
  if (Action='new') then frmLogin.mniReport.Click ;
  // действия с отчетоми - конец  --------------------------

  TfrxDBDequipment.Free;
  TfrxDBDdevice.Free;
  TfrxDBDmodel.Free;
  TfrxDBDserialNumber.Free;
  TfrxDBDtheBrand.Free;
  TfrxDBDfirstNameClient.Free;
  TfrxDBDlastNameClient.Free;
  TfrxDBDotherNameClient.Free;
  TfrxDBDcompletedWorks.Free;
  TfrxDBDphoneClient.Free;
  TfrxDBDadressClient.Free;
  TfrxDBDusers.Free;
  TfrxDBDrepairStatus.Free;
  TfrxDBDpriceList.Free;
  TfrxDBDcomponents.Free;
  TfrxDBDusedComponents.Free;
  TfrxDBDCompany.Free;
  TfrxDBDequipmentFull.Free;
end;

Re: Не очищается память после выполнения отчета

Спасибо. Это многотабличный отчет, т.е. выборка идет из разных таблиц и результаты попадают в один отчет. Я так понимаю. У меня же выборка гораздо проще. Из одной таблицы - ekzamens. Каждой кнопке  - своя ведомость (свой скрипт). И всё равно, чтобы нормально работало, UserName желательно давать разный (выяснено методом научного тыка).

Yana

Re: Не очищается память после выполнения отчета

adiziktdy wrote:
adiziktdy wrote:

Дать ему другое имя пользователя?

Изменила

   ReportMM.UserName        := 'Report';

на

    ReportMM.UserName        := 'Report1';

Откорректировала шаблон. И вуаля - ошибок нет yikes

Это "особенность" работы FastReport в MVDB - dataset Report присутствует всегда, даже если данные передаются программно. Отсюда следствие - передаваемые датасеты не должны называться "Report"  smile

Визуальное программирование: блог и телеграм-канал.

Re: Не очищается память после выполнения отчета

k245 wrote:

Это "особенность" работы FastReport в MVDB - dataset Report присутствует всегда, даже если данные передаются программно. Отсюда следствие - передаваемые датасеты не должны называться "Report"  smile

Спасибо! Буду знать smile

Yana

10 (edited by sparrow 2022-12-13 11:27:45)

Re: Не очищается память после выполнения отчета

k245 Я не могу это подтвердить

в MVDB - dataset Report присутствует всегда, даже если данные передаются программно.

.

Ниже скрин одного из примеров.
Создание датасета из скрипта. Что всегда присутствует в таком случае, так это - frxDBDataset1.

adiziktdy - Если возможно, прикрепите ваш пример с ошибкой. Мне не удалось воспроизвести вашу ошибку.
Возможно ошибка кроется в другой части вашей программы.
Стоит обратить внимание в первую очередь: "На событие OnAfterClick "повешена"..."

Post's attachments

Attachment icon 2022-12-13_131110.jpg 96.68 kb, 39 downloads since 2022-12-13 

Re: Не очищается память после выполнения отчета

sparrow wrote:

k245 Я не могу это подтвердить

в MVDB - dataset Report присутствует всегда, даже если данные передаются программно.

.

Ниже скрин одного из примеров.

Спасибо за вдохновение - поищу в своих скриптах дефект, из-за которого у меня болтается под ногами этот самый Report1 smile

Визуальное программирование: блог и телеграм-канал.

Re: Не очищается память после выполнения отчета

Получилось получить ошибку. Действительно после програмного вызова, вызов через скрипт с именем Report и перепутаны поля запроса