Кто-нибудь конвертировал IBX (Interbase Express) TClientDataSet -> TDatasetProvider -> TIBQuery в FireDA C? - PullRequest
1 голос
/ 29 апреля 2020

Я изучал, что может потребоваться для преобразования моего приложения Delphi 10.3.3 из TDataSource -> TClientDataSet -> TDataSetProvider -> TIBQuery в FireDA C.

Из всех Я читал, что не стоит просто заменять TIBQuery на TFDQuery, как в TDataSource -> TClientDataSet -> TDataSetProvider -> TFDQuery. Это связано с тем, что TDFQuery сам по себе является набором данных в памяти и обладает всеми теми же функциональными возможностями, что и набор данных клиента. Поэтому я хочу удалить компоненты TClientDataSet и TDataSetProvider и просто иметь компоненты TDataSource -> TFDQuery.

При этом есть одно событие TDataSetProvider, для которого я не смог найти подходящую замену. Это событие OnGetData. В этом случае я выполняю дополнительную обработку до того, как эти данные отображаются пользователю в интерфейсе.

В файле справки для этого события указано «Происходит после того, как поставщик извлекает данные, но до того, как они отправляются клиенту. Напишите обработчик события OnGetData для выполнения любой пользовательской обработки данных, которую должен обработать поставщик, прежде чем возвращать данные клиенту. Событие OnGetData наступает после того, как поставщик извлекает данные из своего набора данных, но до того, как данные отправляются клиенту. Используя методы Параметр DataSet, данные могут быть отредактированы в обработчике события OnGetData перед отправкой в ​​набор данных клиента. "

Я широко использую это событие в своем приложении.

Так кто-нибудь знает, как я могу сделать это, используя только FireDA C FDQuery?

Например, у меня есть следующий оператор SQL в моем запросе

    SELECT ACC.ACCT_ID,
       ACC.CASE_ID,
       ACCG.*,
       ATDTM.HAND_FILE_WHEN_FORMAT_IS_EFILE,
       ATDTM.ROS_CREATE_DATE,
       ATDTM.ROS_CREATE_USER,
       ATDTM.ROS_SERV_TYPE_REQ_ID,
       ATDTM.ROS_SERV_REQ_WAIT_DAYS,
       ATDTM.ROS_MODIFY_DATE,
       ATDTM.ROS_MODIFY_USER,
       ATDTM.ROS_DATE_OF_SERVICE,
       ATDTM.ROS_SERV_TYPE_REC_ID,
       ATDTM.ROS_SERVED_TO,
       ATDTM.ROS_SERVICE_BY,
       CAST(NULL AS VARCHAR(10)) AS ROS_SERVICE_BY_DESC,
       ATDTM.ROS_NO_SERV_REASON_ID,
       ATDTM.ROS_MEMO,
       GS.IMAGE_INDEX AS GARN_STATUS_IMAGE_INDEX,
       STR.SERV_TYPE_REQ_CODE AS ROS_SERV_TYPE_REQ_CODE,
       STR.DESCRIPTION AS ROS_SERV_TYPE_REQ_DESC,
       STR2.SERV_TYPE_REC_CODE AS ROS_SERV_TYPE_REC_CODE,
       STR2.DESCRIPTION AS ROS_SERV_TYPE_REC_DESC,
       NSTR.DESCRIPTION AS ROS_NO_SERV_REASON_DESC,
       CAST(NULL AS VARCHAR(50)) AS DEBTOR_FULL_NAME,
       CAST(NULL AS VARCHAR(60)) AS GARNISHEE_NAME,
       CAST(NULL AS VARCHAR(20)) AS GARN_TYPE_DESC,
       CAST(NULL AS SMALLINT) AS GARN_COMPLETED_IMAGE_INDEX,
       CAST(NULL AS INTEGER) AS TRAN_ID,
       ATDTM.ROS_COURT_FILE_STAMPED_DATE,
       CAST(NULL AS DATE) AS NMA_EMP_TERM_DATE,
       ATM.FILING_COUNTY_ID,
       C.COUNTY_CODE || C.STATE AS FILING_COUNTY_DESC
  FROM ACCT_CASE_COURT_GARNISHMENT ACCG
  JOIN ACCT_CASE_COURT ACC ON ACC.ACCT_CASE_COURT_ID = ACCG.ACCT_CASE_COURT_ID
  LEFT OUTER JOIN ACCT_TRAN_DETAIL_TASK_MERGE ATDTM ON ATDTM.ACCT_TRAN_ID = ACCG.ACCT_TRAN_ID
   AND ATDTM.ACCT_TRAN_DETAIL_ID = ACCG.ACCT_TRAN_DETAIL_ID
   AND ATDTM.ACCT_TASK_ID = ACCG.ACCT_TASK_ID
  JOIN SERVICE_TYPE_REQ STR ON STR.SERV_TYPE_REQ_ID = ATDTM.ROS_SERV_TYPE_REQ_ID
  LEFT OUTER JOIN SERVICE_TYPE_REC STR2 ON STR2.SERV_TYPE_REC_ID = ATDTM.ROS_SERV_TYPE_REC_ID
  LEFT OUTER JOIN NO_SERVICE_TYPE_REASON NSTR ON NSTR.REASON_ID = ATDTM.ROS_NO_SERV_REASON_ID
  LEFT OUTER JOIN GARN_STATUS GS ON GS.STATUS_CODE = ACCG.GARN_STATUS_CODE
  LEFT OUTER JOIN ACCT_TRAN_MASTER ATM ON ATM.ACCT_TRAN_ID = ACCG.ACCT_TRAN_ID
  LEFT OUTER JOIN COUNTY C ON C.COUNTY_ID = ATM.FILING_COUNTY_ID  
 WHERE ACC.ACCT_ID = :ACCT_ID
   AND ACC.CASE_ID = :CASE_ID
 ORDER BY ACCG.ACCT_TRAN_DETAIL_ID

А затем в событии TDataSetProvider.OnGetData у меня есть это

procedure TdtmCaseManagement.prvGarnishmentsGetData(Sender: TObject;

DataSet: TCustomClientDataSet); начать, пока не DataSet.Eof действительно начать DataSet.Edit;

  if (DataSet.FieldByName('ROS_SERV_TYPE_REC_ID').AsInteger = 1) and
     (DataSet.FieldByName('ROS_NO_SERV_REASON_ID').AsInteger = 18) then
    DataSet.FieldByName('ROS_SERV_TYPE_REC_DESC').AsString := 'No Return';

  with spsGetPersonInfo do
    begin
      if not Prepared then
        begin
          Params.Clear;
          Prepare;
        end;

      Params.ParamByName('V_PERSON_ID').AsInteger :=
        DataSet.FieldByName('PERSON_ID').AsInteger;
      Params.ParamByName('V_LAST_NAME_FIRST').AsInteger := 0;

      ExecProc;

      DataSet.FieldByName('DEBTOR_FULL_NAME').AsString :=
        Params.ParamByName('R_FULL_NAME').AsString;

      UnPrepare;
    end;

  with spsFetchGarnishee do
    begin
      if not Prepared then
        begin
          Params.Clear;
          Prepare;
        end;

      Params.ParamByName('V_GARN_TYPE').AsString :=
        DataSet.FieldByName('GARN_TYPE').AsString;
      Params.ParamByName('V_GARN_ENTITY_ID').AsInteger :=
        DataSet.FieldByName('GARN_ENTITY_ID').AsInteger;

      ExecProc;

      DataSet.FieldByName('GARNISHEE_NAME').AsString :=
        Params.ParamByName('R_GARNISHEE_NAME').AsString;

      UnPrepare;
    end;

  DataSet.Post;
  DataSet.Next;
end;

end;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...