온라인으로 작성해야하는 상황 때문에..
다소 오타가 있을 수 있으니 양해 바랍니다..
(아침에는 델파이를 사용할 수 없는 곳에 있기 때문에..)
From 류..
---------
질문1)예를 들어서 특정화일에
... 숫자필드 .. 잔액필드(임시필드) ....
1000 1000
2000 3000
3000 6000
1500 7500 (숫자필드값을 계속 더해져서 만들어지는값)
: :
: :
참고)
우선적으로 질문하신 문제에서 잔액필드를 항상 계산을 한다는
것은 별로 바람직한 일이 못됩니다. 데이타가 계산을 요구를하고
변동이 적은 경우에는 미리 계산되어진 Table을 사용하는 것이
유리합니다. 예를 들어 통계와 같은 정보들은 더욱 그렇습니다.
월단위로 통계를 알고자할 때 이미 지난 달들의 데이타는 고정적인데도
불구하고 매번 계산해야 한다면 퍼포먼스의 손해를 보겠죠.
답변1) View Table을 사용
Paradox같은 곳에서는 안됩니다..
Create View [원하시는 이름] as
Select A.PK,
(Select Sum(B.숫자필드) From [사용하시는 테이블 이름] B
Where B.PK <= A.PK)
From [사용하시는 테이블 이름] A
답변2) 델파이 코딩을 이용
procedure TForm1.FormCreate(Sender: TObject);
begin
Query1.SQL.Add('Select Sum(숫자필드) From [사용하시는 테이블 이름]');
Query1.SQL.Add('Where PK <= :PK');
end;
procedure TForm1.Table1CalcFields(DataSet: TDataSet);
begin
Query1.Close;
// PK는 사용하시는 테이블의 Primary Key Field 이름을 넣어 주세요..
Query1.ParamByName('PK').AsInteger:= Table1['PK'];
Query1.Open;
Table1['잔액필드']:= Query1.Field[0].AsInteger;
end;
답변3) RDBMS의 Trigger를 이용하는 경우
해당 Table 에 잔액필드를 생성하고..
Trigger를 이용해서 매 삽입/삭제 마다 계산을 해서..
필드를 채워주는 방법도 고려해보세요..
질문2) 신규 값을 등록하는데...
답변1) TTable의 BeforePost Event를 사용
TTable.FindKey로 미리 Record를 검사하는 방법..
Multi User의 경우에는 미리 검사해도 키가 중복될 수 있으니..
에러처리를 하시고요.. (거의 드물겠지만)
procedure TForm1.Table1AfterPost(DataSet: TDataSet);
begin
If Table1.FindKey([DBEdit1.Text]) then
Begin
ShowMessage('같은 내용이 이미 있습니다.');
Table1.Cancel;
End;
end;
답변2) Try Except 사용
Try Except를 사용해서 에러가 나도 메시지를 뿌리지 않고..
프로그래머가 에러가 났을 때 에러처리를 해주는 방법을 고려하세요..
procedure TForm1.Button1Click(Sender: TObject);
begin
Try
Table1.Post;
Except
ShowMessage('데이타를 저장하는 도중 에러가 발생했습니다.');
Table1.Cancel; // 또는 기타 에러처리
End;
end;
* 음 너무 오랫 동안 DB 프로그래밍을 손을 때서리..
가물거리네요.. 더욱이 메뉴얼 하나 없어서리..
DB 프로그램도 없어 태스트도 못해봤구요..
여하튼 조금이라도 이상이 있다면 양해를 바랍니다..
|