Q&A

  • 필드값 중복 검사


고수님의 도움으로 힌트를 얻어 며칠을 고민하고 이것저것 다 해보아도 도저히 풀리지 않아 고수님들께 다시 도움을 청하게되었습니다. 이 어린 백성을 어여삐 여겨 나아가는 길에 등불이 되어 주시옵소서..



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;



항상 행복하고 즐거운 일 하시기 바랍니다. 감사합니다.



2  COMMENTS
  • Profile
    류종택 2001.03.26 01:00
    우선 몇 가지 당혹스러운 점이 있습니다.



    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;

    >

    > 항상 행복하고 즐거운 일 하시기 바랍니다. 감사합니다.

    >

  • Profile
    아기코알라 2001.03.26 04:25


    류종택님의 답변 정말 정말 감사합니다.

    새로운 방향을 제시하시는 것 같아 지금 흥분이 되네요..



    당혹스러우신 점 해결...



    1. 필드명은 류종택님이 말씀하신 레코드가 정확한 표현입니다. 혼돈을 줘서 죄송..



    2. 우선 SuperNo는 자동순번이 아니라 운용자가 임의로 값을 줘야하는 값입니다.

    단 유일한 값이어야만 합니다.



    3. 여러 필드 중 SuperNo만 UpDateSQL에서 Primary Key로 설정이 되어 있읍니다.

    (DB에서 Primary Key 설정은 안되어 있음).



    아주 중요한 질문 : Try Except 안에서 Insert 및 Update 작업을 하게 되면

    중복일 경우 에러가 검출되서 알 수 있다고 말씀하셨는데

    이걸 어떻게 하나요?

    Try Except는 첨 접해보는 것이라?..아직 초보걸랑요...히히히히.

    저도 지금 부터 찾아보고 연구해 보겠읍니다만 그래도 도움을

    주신다면 그 은혜 잊지않겠읍니다.....



    추가 : 방금 조금 찾아보니 의문나는것이 있네요..



    SuperNo가 Primary Key로 설정이 되어있는데 저장할 때 어떤 에러도 발생시키지

    않습니다. 단지 삭제 할 때 에러("Update Fail")가 발생 하더군요..



    Try ~ Except를 사용할려면 입력할 때 Error가 떠야만 사용할수 있는지도 궁금합니다.



    항상 행복하시고 류종택님의 가정에 항상 행운이 깃들길 바라겠읍니다.







    류종택 wrote:

    > 우선 몇 가지 당혹스러운 점이 있습니다.

    >

    > 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;

    > >

    > > 항상 행복하고 즐거운 일 하시기 바랍니다. 감사합니다.

    > >