고수님의 도움으로 힌트를 얻어 며칠을 고민하고 이것저것 다 해보아도 도저히 풀리지 않아 고수님들께 다시 도움을 청하게되었습니다. 이 어린 백성을 어여삐 여겨 나아가는 길에 등불이 되어 주시옵소서..
DB : paradox 7
컴포넌트 : Query2, DataSource2, UpdateSQL2, DBGrid2 등등
UpDateSQL사용으로 DBGrid에 직접 Data를 삽입하고 삭제합니다. 아래는 저장을 위한
버턴입니다. 테이블에 입력을 할 때 SuperNo라는 필드명을 조사해서 같은 필드명이
있으면 경고메세지를 아니면 저장하는 프로시져입니다.
경우 1 : 중복번호나 중복 아닌 번호를 입력해도 모든 레코드가 DBGrid에서 사라지고 저장도 안됩니다. 에러메제지 없음
경우 2 : 저장하면 “Query2: Field ‘SuperNo’ not Found”의 에러메세지가 뜹니다. 그 외에도 별 짓을 다해보았는데 안되더군요..
// 장비현황 저장 툴바
procedure TEquipment.ToolButton2Click(Sender: TObject);
var super : string; // 경우 1 에만 해당
begin
with Front.Query2 do begin
//{ 경우1 시작
SQL.Text := 'Select * from equipmentTable where SuperNo = :SN';
ParamByName('SN').AsString := super;
Open;
super := fieldByName('SuperNo').AsString;
if not eof then
begin
ShowMessage('같은 관리번호가 존재합니다!!!');
end;
// 경우1 끝}
{ 경우 2 시작
Close;
SQL.Clear;
SQL.Add('Select * from EquipmentTable');
SQL.Add('Where SuperNo =:SN');
ParamByName('SN').AsString := FieldByName('SuperNo').AsString;
if RecordCount > 0 then
ShowMessage('관리번호가 중복되었읍니다')
else begin
// 경우 2 끝 }
ApplyUpdates;
CommitUpdates;
// end; // 경우 2에만 해당
Close;
Open;
end;
end;
항상 행복하고 즐거운 일 하시기 바랍니다. 감사합니다.
1. '같은 필드명이 있으면 경고..'라는 부분에서 혹시 레코드를 필드로 잘못 표현하신 것이 아닌지 하는 의문
2. SN은 자동 순번을 부여받는 필드 같은데. 자동증가 필드타입을 사용하면
중복 검사는 따로 하지 않아도 되니 간단히 해결되지 않을 까하는 부분
3. 올려주신 소스가 설명을 위해 간략화되어서 인지.
Close;
SQL.Clear;
SQL.Add('Select * from EquipmentTable');
SQL.Add('Where SuperNo =:SN');
ParamByName('SN').AsString := FieldByName('SuperNo').AsString;
에서 이미 닫혀진 Query콤포넌트에서 FieldByName('SuperNo').AsString를
사용한 것은 명백한 버그 입니다. 당연히 오픈되지 않았으니 필드를 찾을 수 없을테고요.
4. 자동순번이 아니더라도 겹쳐서는 안되는 필드는 분명 Primary Key일 가능성이 있는데
만약 Primary Key라면 Try Except 안에서 Insert 및 Update 작업을 하게 되면
중복일 경우 에러가 검출되서 알 수 있습니다. 굳이 Query를 미리 실행해서
퍼포먼스만 낭비할 필요가 없는거지요.
From 류..
아기코알라 wrote:
>
> 고수님의 도움으로 힌트를 얻어 며칠을 고민하고 이것저것 다 해보아도 도저히 풀리지 않아 고수님들께 다시 도움을 청하게되었습니다. 이 어린 백성을 어여삐 여겨 나아가는 길에 등불이 되어 주시옵소서..
>
> DB : paradox 7
> 컴포넌트 : Query2, DataSource2, UpdateSQL2, DBGrid2 등등
>
> UpDateSQL사용으로 DBGrid에 직접 Data를 삽입하고 삭제합니다. 아래는 저장을 위한
> 버턴입니다. 테이블에 입력을 할 때 SuperNo라는 필드명을 조사해서 같은 필드명이
> 있으면 경고메세지를 아니면 저장하는 프로시져입니다.
>
> 경우 1 : 중복번호나 중복 아닌 번호를 입력해도 모든 레코드가 DBGrid에서 사라지고 저장도 안됩니다. 에러메제지 없음
>
> 경우 2 : 저장하면 “Query2: Field ‘SuperNo’ not Found”의 에러메세지가 뜹니다. 그 외에도 별 짓을 다해보았는데 안되더군요..
>
> // 장비현황 저장 툴바
> procedure TEquipment.ToolButton2Click(Sender: TObject);
> var super : string; // 경우 1 에만 해당
> begin
> with Front.Query2 do begin
>
> //{ 경우1 시작
> SQL.Text := 'Select * from equipmentTable where SuperNo = :SN';
> ParamByName('SN').AsString := super;
> Open;
> super := fieldByName('SuperNo').AsString;
> if not eof then
> begin
> ShowMessage('같은 관리번호가 존재합니다!!!');
> end;
> // 경우1 끝}
> { 경우 2 시작
> Close;
> SQL.Clear;
> SQL.Add('Select * from EquipmentTable');
> SQL.Add('Where SuperNo =:SN');
> ParamByName('SN').AsString := FieldByName('SuperNo').AsString;
> if RecordCount > 0 then
> ShowMessage('관리번호가 중복되었읍니다')
> else begin
> // 경우 2 끝 }
>
> ApplyUpdates;
> CommitUpdates;
> // end; // 경우 2에만 해당
> Close;
> Open;
> end;
> end;
>
> 항상 행복하고 즐거운 일 하시기 바랍니다. 감사합니다.
>