4-5. 상속용 부모폼의 데이터 처리 등록폼의 경우 데이터가 등록되거나 수정, 삭제되면 서버에도 동일하게 적용 해야한다. 적용 방법은 DataSet의 데이터 조작시 발생하는 Event에 앞에서 작성한 TField의 ProviderFlags를 이용한 SQL 생성함수를 사용해 SQL 구문을 생성하고 생성된 SQL을 서버로 보내 실행한다. DataSet의 Event에는 Befere로 시작하는 Event와 After로 시작하는 Event가 있는데 예를 들면 BeforePost의 경우 데이터가 저장되기 전에 발생하고 AfterPost는 데이터가 저장된 후 발생된다. 이 두가지 Event의 특성을 이용해서 Before Event에서는 각종 체크와 SQL 구문 생성 처리를 하고 After Event에서는 서버로 SQL 구문을 보내는 처리를 한다.
    procedure TfrmSIMLazQ.qrMasterBeforeDelete(DataSet: TDataSet);
    begin
      if (not u_auth_d) and DataSet.Active then
      begin
        MessageDlg(Self.Caption, '삭제 권한이 없습니다!', mtError, [mbOK], 0);
        Abort;
      end
      else
      begin
        if (u_TableName = '') or (DataSet.State in [dsInsert]) then u_SQL := ''
        else u_SQL := dmSIMLaz.UF_SIMLazDML(qrMaster, u_TableName, ukDelete);
      end;
    end;

    procedure TfrmSIMLazQ.qrMasterBeforeEdit(DataSet: TDataSet);
    begin
      if (not u_auth_m) and DataSet.Active then
      begin
        MessageDlg(Self.Caption, '수정 권한이 없습니다!', mtError, [mbOK], 0);
        Abort;
      end;
      // Record Count가 0일 경우 Edit가 발생하면 Append
      if DataSet.RecordCount < 1 then DataSet.Append;
    end;

    procedure TfrmSIMLazQ.qrMasterBeforeInsert(DataSet: TDataSet);
    begin
      if (not u_auth_n) and DataSet.Active then
      begin
        MessageDlg(Self.Caption, '등록 권한이 없습니다!', mtError, [mbOK], 0);
        Abort;
      end
      else if u_downkey_flag then Abort;
    end;

    procedure TfrmSIMLazQ.qrMasterBeforePost(DataSet: TDataSet);
    begin
      u_SQL := '';
      if u_TableName <> '' then
      begin
        if DataSet.State in [dsInsert] then
          u_SQL := dmSIMLaz.UF_SIMLazDML(qrMaster, u_TableName, ukInsert)
        else
          u_SQL := dmSIMLaz.UF_SIMLazDML(qrMaster, u_TableName, ukModify);
      end;
    end;

    procedure TfrmSIMLazQ.qrMasterAfterDelete(DataSet: TDataSet);
    begin
      if (u_SQL <> '') and DataSet.Active then
        qrMaster.Tag := dmSIMLaz.UF_SIMLazExec(u_SQL);
    end;

    procedure TfrmSIMLazQ.qrMasterAfterPost(DataSet: TDataSet);
    begin
      if (u_SQL <> '') and DataSet.Active then
        qrMaster.Tag := dmSIMLaz.UF_SIMLazExec(u_SQL);
    end;
데이터 조회용 SQL구문 처리를 위한 별도의 procedure를 만들고 상속폼에서 override한 후 미리 정한 SQL 저장용 변수(u_SQL)에 SQL 구문을 등록한다. DatSet을 닫거나 서버로부터 데이터를 가져오는 처리는 부모폼에 되어있으므로 상속폼에서는 조회 후 Focus 처리 같은 나머지 처리를 하면 된다.
    procedure TfrmSIMLazQ.UP_SetSQL;
    begin
    // Set Parameters Methode
    end;

    procedure TfrmSIMLazQ.UP_OpenSQL;
    begin
      qrMaster.DisableControls;
      try
        qrMaster.Close;
        UP_SetSQL;
        dmSIMLaz.UP_SIMLazOpen(qrMaster, u_SQL, False);
      finally
        qrMaster.EnableControls;
      end;
    end;
등록/삭제/저장 시 권한을 먼저 확인한다. 상속폼에서 추가적인 처리가 필요하다면 해당 procedure를 override해서 사용한다.
    procedure TfrmSIMLazQ.UP_Append;
    begin
      if not u_auth_n then Exit;

      with qrMaster do
        if Active and (not ReadOnly) then Append;
    end;

    procedure TfrmSIMLazQ.UP_Delete;
    begin
      if not u_auth_d then Exit;

      with qrMaster do
      begin
        if (not Active) or (RecordCount < 1) or ReadOnly then Exit;
        if MessageDlg(Self.Caption,
          '선택된 자료를 삭제 하시겠습니까?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
          Delete;
      end;
    end;

    procedure TfrmSIMLazQ.UP_Save;
    begin
      if not (u_auth_n or u_auth_m or u_auth_d) then Exit;

      with qrMaster do
      begin
        if Active and (not ReadOnly) and (State in [dsEdit, dsInsert]) then
        begin
          Post;
          ShowMessage('변경된 내용이 저장 되었습니다!');
        end;
      end;
    end;