FreePascal Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
FreePacal 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

FreePascal 강좌/문서
[17] 라자루스를 이용한 업무 프로그램 개발 - 16
어느좋은날 [freepascal] 1055 읽음    2020-06-13 22:54
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;
  if DataSet.RecordCount < 1 then DataSet.Append; // Record Count가 0일 경우 Edit가 발생하면 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;

+ -

관련 글 리스트
17 라자루스를 이용한 업무 프로그램 개발 - 16 어느좋은날 1055 2020/06/13
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.