Q&A

  • while문에 대해서...
while not DataForm.ExecQuery.Eof do begin

if (DataForm.ExecQuery.FieldValues['dongcode'] = strdongcode) and (DataForm.ExecQuery.Fieldvalues['bon'] = strbon) and (DataForm.ExecQuery.Fieldvalues['bu'] = strbu) and

(DataForm.ExecQuery.Fieldvalues['page'] = strpage) then begin

memo1.Lines.Add('이미 등록된 파일입니다.');

break;

end else begin



SQL_Str := 'insert into test values (''' + strdongcode + ''', ''' + strbon + ''', ''' + strbu + ''', ''' + strdaejang + ''', ''3'' , ''0'', ''00'', ''000'', ''' + strpage + ''')';

DataForm.ExecQuery.SQL.Clear;

DataForm.ExecQuery.SQL.Text := SQL_Str;

DataForm.ExecQuery.ExecSQL;

memo.Lines.Add('처리되었습니다.');

end;

DataForm.ExecQuery.Next;

end;





이런식으로 while문을 쓰려고 테스트를 해봤는데... 이게 한번 while문을 돌고 빠져나가면 다시 처음 데이터 값과 비교해서 아니면 else문으로 바로 넘어가거든요....

이런식으로 되면 안되고, 테이블에 들어있는 모든 값들과 한번씩 모두 검색을 한다음에 일치하지 않으면 else문을 수행하도록 해야하거든요... 좋은 방법이 없을까요?

부탁드립니다... 어제부터 계속 이거 하나 때문에 고생하고 있습니다.

될것 같은게 되질 않으니 말이예요... 빠른 답변 부탁드려요~~~



5  COMMENTS
  • Profile
    이상호 2000.03.03 10:12
    앞의 분들이 좋은 설명을 하셨는데 저는 플래그를 사용해서 프로그램을

    하시는 것은 어떨까 추천합니다.



    var

    FindSame: Boolean; // 이 변수는 전역 또는 프로시져 내에 새로 선언할 것



    ...



    FindSame := False;

    DataForm.ExecQuery.First;



    // 레코드의 처음부터 끝까지 순회하면서 동일한 레코드가 있는 지 검사.

    while not DataForm.ExecQuery.Eof do

    begin

    if (DataForm.ExecQuery.FieldValues['dongcode'] = strdongcode) and

    (DataForm.ExecQuery.Fieldvalues['bon'] = strbon) and

    (DataForm.ExecQuery.Fieldvalues['bu'] = strbu) and

    (DataForm.ExecQuery.Fieldvalues['page'] = strpage) then

    FindSame := True

    else DataForm.ExecQuery.Next;

    end;



    // FindSame이 True이면 동일한 레코드가 발견된 것이다.

    if FindSame = True then

    memo1.Lines.Add('이미 등록된 파일입니다.')

    else

    begin

    SQL_Str := 'insert into test values (''' + strdongcode + ''', ''' + strbon

    + ''', ''' + strbu + ''', ''' + strdaejang

    + ''', ''3'' , ''0'', ''00'', ''000'', ''' + strpage + ''')';

    with DataForm.ExecQuery do

    begin

    SQL.Clear;

    SQL.Text := SQL_Str;

    ExecSQL;

    memo.Lines.Add('처리되었습니다.');

    end;

    end;

    //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++



    김영애 wrote:

    > while not DataForm.ExecQuery.Eof do begin

    > if (DataForm.ExecQuery.FieldValues['dongcode'] = strdongcode) and (DataForm.ExecQuery.Fieldvalues['bon'] = strbon) and (DataForm.ExecQuery.Fieldvalues['bu'] = strbu) and

    > (DataForm.ExecQuery.Fieldvalues['page'] = strpage) then begin

    > memo1.Lines.Add('이미 등록된 파일입니다.');

    > break;

    > end else begin

    >

    > SQL_Str := 'insert into test values (''' + strdongcode + ''', ''' + strbon + ''', ''' + strbu + ''', ''' + strdaejang + ''', ''3'' , ''0'', ''00'', ''000'', ''' + strpage + ''')';

    > DataForm.ExecQuery.SQL.Clear;

    > DataForm.ExecQuery.SQL.Text := SQL_Str;

    > DataForm.ExecQuery.ExecSQL;

    > memo.Lines.Add('처리되었습니다.');

    > end;

    > DataForm.ExecQuery.Next;

    > end;

    >

    >

    > 이런식으로 while문을 쓰려고 테스트를 해봤는데... 이게 한번 while문을 돌고 빠져나가면 다시 처음 데이터 값과 비교해서 아니면 else문으로 바로 넘어가거든요....

    > 이런식으로 되면 안되고, 테이블에 들어있는 모든 값들과 한번씩 모두 검색을 한다음에 일치하지 않으면 else문을 수행하도록 해야하거든요... 좋은 방법이 없을까요?

    > 부탁드립니다... 어제부터 계속 이거 하나 때문에 고생하고 있습니다.

    > 될것 같은게 되질 않으니 말이예요... 빠른 답변 부탁드려요~~~

    >

  • Profile
    cws 2000.02.23 00:10
    김영애 wrote:

    >

    >

    >

    > 이런식으로 while문을 쓰려고 테스트를 해봤는데... 이게 한번 while문을 돌고 빠져나가면 다시 처음 데이터 값과 비교해서 아니면 else문으로 바로 넘어가거든요....

    > 이런식으로 되면 안되고, 테이블에 들어있는 모든 값들과 한번씩 모두 검색을 한다음에 일치하지 않으면 else문을 수행하도록 해야하거든요... 좋은 방법이 없을까요?

    > 부탁드립니다... 어제부터 계속 이거 하나 때문에 고생하고 있습니다.

    > 될것 같은게 되질 않으니 말이예요... 빠른 답변 부탁드려요~~~



    안녕하세요..윗 글을 읽어보니 if문 자체가 좀 이상하군요..

    제가 읽어보니 DataForm.ExecQuery은 물론 위에서 First하셨겠구..



    if문을 봅시다.

    1. DataForm.ExecQuery의 Record가 있으면 While문을 수행한다.

    2. if문장을 Check한다.

    가. 첫 Record가 조건에 맞으면 메세지를 보여준다.while not DataForm.ExecQuery.Eof do begin

    > if (DataForm.ExecQuery.FieldValues['dongcode'] = strdongcode) and (DataForm.ExecQuery.Fieldvalues['bon'] = strbon) and (DataForm.ExecQuery.Fieldvalues['bu'] = strbu) and

    > (DataForm.ExecQuery.Fieldvalues['page'] = strpage) then begin

    > memo1.Lines.Add('이미 등록된 파일입니다.');

    > break;

    > end else begin

    >

    > SQL_Str := 'insert into test values (''' + strdongcode + ''', ''' + strbon + ''', ''' + strbu + ''', ''' + strdaejang + ''', ''3'' , ''0'', ''00'', ''000'', ''' + strpage + ''')';

    > DataForm.ExecQuery.SQL.Clear;

    > DataForm.ExecQuery.SQL.Text := SQL_Str;

    > DataForm.ExecQuery.ExecSQL;

    > memo.Lines.Add('처리되었습니다.');

    > end;

    > DataForm.ExecQuery.Next;

    > end;

    나. 1) 첫 Record가 조건에 맞지 않으면 else문장으로 간다. // **1

    2) 무조건 두번째의 Record와는 상관없이 Insert를 시킨다. // **2

    *** 문제가 있죠--두번째 Record와는 상관없이 if..else문을 실행시키니까요..



    ### 제 생가에는 if문에서 Check시 조건에 만족하지 않으면 Record를 Next시키고,

    마지막 Record에서 까지 만족하지 않았을 경우에 Record를 Insert를 시켜야 하지

    않나요....



    예를들어서...]



    Query1.First; //가져온 Data를 맨처음 Record로 이동

    While not Query1.Eof do

    begin

    if (Query1ID.Value = Edit1.Text) and // 이미등록된 Record인가 확인.

    (Query1Name.Value = Edit2.Text) then

    begin

    Memo1.Lines.Add('이미 등록된 파일입니다.');

    break;

    end

    else if (not Query1.Eof) and // 마지막 Record가 아닐때 다음 Record로 이동.

    ((Query1ID.Value <> Edit1.Text) or (Query1Name.Value <> Edit2.Text)) then

    begin

    Query1.Next;

    if Query1.Eof then //이동 후 마지막 Record까지 같은 값이 없을때 입력.

    begin

    Query1.Append;

    Query1Id.Value := Edit1.Text;

    Query1Name.Value := Edit2.Text;

    Memo1.Lines.Add('처리되었습니다.');

    Query1.Post;

    Query1.Next;

    end;

    end

    end;



    간단한 예를 들어 보았는데 도움이 되었는지요..

    (참고..바로 여기에다 써 보았으니 확인요망..)

    그럼 좋은 하루 되세요..

  • Profile
    kingdol 2000.02.22 21:58
    김영애 wrote:

    > while not DataForm.ExecQuery.Eof do begin

    > if (DataForm.ExecQuery.FieldValues['dongcode'] = strdongcode) and (DataForm.ExecQuery.Fieldvalues['bon'] = strbon) and (DataForm.ExecQuery.Fieldvalues['bu'] = strbu) and

    > (DataForm.ExecQuery.Fieldvalues['page'] = strpage) then begin

    > memo1.Lines.Add('이미 등록된 파일입니다.');

    > break;

    > end else begin

    >

    > SQL_Str := 'insert into test values (''' + strdongcode + ''', ''' + strbon + ''', ''' + strbu + ''', ''' + strdaejang + ''', ''3'' , ''0'', ''00'', ''000'', ''' + strpage + ''')';

    > DataForm.ExecQuery.SQL.Clear;

    > DataForm.ExecQuery.SQL.Text := SQL_Str;

    > DataForm.ExecQuery.ExecSQL;

    > memo.Lines.Add('처리되었습니다.');

    > end;

    > DataForm.ExecQuery.Next;

    > end;

    >

    >

    > 이런식으로 while문을 쓰려고 테스트를 해봤는데... 이게 한번 while문을 돌고 빠져나가면 다시 처음 데이터 값과 비교해서 아니면 else문으로 바로 넘어가거든요....

    > 이런식으로 되면 안되고, 테이블에 들어있는 모든 값들과 한번씩 모두 검색을 한다음에 일치하지 않으면 else문을 수행하도록 해야하거든요... 좋은 방법이 없을까요?

    > 부탁드립니다... 어제부터 계속 이거 하나 때문에 고생하고 있습니다.

    > 될것 같은게 되질 않으니 말이예요... 빠른 답변 부탁드려요~~~

    >



    위의 예제에서 만일 if 조건에서 false 가나올경우 else 절을 수행하고 while문을

    벗어날것 같은데요...

    else 절에서 insert 사용하는 query 를 DataForm.ExecQuery 가아닌 별도의 query를

    사용하면 될거 같은데요...

    그럼...

  • Profile
    김영애 2000.02.22 23:28
    kingdol wrote:

    > 김영애 wrote:

    > > while not DataForm.ExecQuery.Eof do begin

    > > if (DataForm.ExecQuery.FieldValues['dongcode'] = strdongcode) and (DataForm.ExecQuery.Fieldvalues['bon'] = strbon) and (DataForm.ExecQuery.Fieldvalues['bu'] = strbu) and

    > > (DataForm.ExecQuery.Fieldvalues['page'] = strpage) then begin

    > > memo1.Lines.Add('이미 등록된 파일입니다.');

    > > break;

    > > end else begin

    > >

    > > SQL_Str := 'insert into test values (''' + strdongcode + ''', ''' + strbon + ''', ''' + strbu + ''', ''' + strdaejang + ''', ''3'' , ''0'', ''00'', ''000'', ''' + strpage + ''')';

    > > DataForm.ExecQuery.SQL.Clear;

    > > DataForm.ExecQuery.SQL.Text := SQL_Str;

    > > DataForm.ExecQuery.ExecSQL;

    > > memo.Lines.Add('처리되었습니다.');

    > > end;

    > > DataForm.ExecQuery.Next;

    > > end;

    > >

    > >

    > > 이런식으로 while문을 쓰려고 테스트를 해봤는데... 이게 한번 while문을 돌고 빠져나가면 다시 처음 데이터 값과 비교해서 아니면 else문으로 바로 넘어가거든요....

    > > 이런식으로 되면 안되고, 테이블에 들어있는 모든 값들과 한번씩 모두 검색을 한다음에 일치하지 않으면 else문을 수행하도록 해야하거든요... 좋은 방법이 없을까요?

    > > 부탁드립니다... 어제부터 계속 이거 하나 때문에 고생하고 있습니다.

    > > 될것 같은게 되질 않으니 말이예요... 빠른 답변 부탁드려요~~~

    > >

    >

    > 위의 예제에서 만일 if 조건에서 false 가나올경우 else 절을 수행하고 while문을

    > 벗어날것 같은데요...

    > else 절에서 insert 사용하는 query 를 DataForm.ExecQuery 가아닌 별도의 query를

    > 사용하면 될거 같은데요...

    > 그럼...



    그거보다요....

    문제는 처음에 while문을 돌면 처음 데이터값이므로, 일치하는지 그렇지 않은지를 파악해서 일치하면, if 이하문으로 일치하지 않으면 else문을 수행하거든요.,,,



    근데, 한번 while문을 돌고 break문으로 빠져나가서 다시 두번째로 while문을 돌면 이게 계속 처음 데이터값으로만 비교해서 일치하지 않는다고 else문으로 넘어가서 그 부분을 수행하거든요...

    음 그러니깐 문제는 ''DataForm.ExecQuery.FieldValues['dongcode']''

    이게 계속 처음 데이터값만 가진다는 것입니다... 어떻게 해야할지...

    좀 도와 주세요!!!!!

  • Profile
    조복기 2000.02.23 02:00
    김영애 wrote:

    > kingdol wrote:

    > > 김영애 wrote:

    > > > while not DataForm.ExecQuery.Eof do begin

    > > > if (DataForm.ExecQuery.FieldValues['dongcode'] = strdongcode) and (DataForm.ExecQuery.Fieldvalues['bon'] = strbon) and (DataForm.ExecQuery.Fieldvalues['bu'] = strbu) and

    > > > (DataForm.ExecQuery.Fieldvalues['page'] = strpage) then begin

    > > > memo1.Lines.Add('이미 등록된 파일입니다.');

    > > > break;

    > > > end else begin

    > > >

    > > > SQL_Str := 'insert into test values (''' + strdongcode + ''', ''' + strbon + ''', ''' + strbu + ''', ''' + strdaejang + ''', ''3'' , ''0'', ''00'', ''000'', ''' + strpage + ''')';

    > > > DataForm.ExecQuery.SQL.Clear;

    > > > DataForm.ExecQuery.SQL.Text := SQL_Str;

    > > > DataForm.ExecQuery.ExecSQL;

    > > > memo.Lines.Add('처리되었습니다.');

    > > > end;

    > > > DataForm.ExecQuery.Next;

    > > > end;

    > > >

    > > >

    > > > 이런식으로 while문을 쓰려고 테스트를 해봤는데... 이게 한번 while문을 돌고 빠져나가면 다시 처음 데이터 값과 비교해서 아니면 else문으로 바로 넘어가거든요....

    > > > 이런식으로 되면 안되고, 테이블에 들어있는 모든 값들과 한번씩 모두 검색을 한다음에 일치하지 않으면 else문을 수행하도록 해야하거든요... 좋은 방법이 없을까요?

    > > > 부탁드립니다... 어제부터 계속 이거 하나 때문에 고생하고 있습니다.

    > > > 될것 같은게 되질 않으니 말이예요... 빠른 답변 부탁드려요~~~

    > > >

    > >

    > > 위의 예제에서 만일 if 조건에서 false 가나올경우 else 절을 수행하고 while문을

    > > 벗어날것 같은데요...

    > > else 절에서 insert 사용하는 query 를 DataForm.ExecQuery 가아닌 별도의 query를

    > > 사용하면 될거 같은데요...

    > > 그럼...

    >

    > 그거보다요....

    > 문제는 처음에 while문을 돌면 처음 데이터값이므로, 일치하는지 그렇지 않은지를 파악해서 일치하면, if 이하문으로 일치하지 않으면 else문을 수행하거든요.,,,

    >

    > 근데, 한번 while문을 돌고 break문으로 빠져나가서 다시 두번째로 while문을 돌면 이게 계속 처음 데이터값으로만 비교해서 일치하지 않는다고 else문으로 넘어가서 그 부분을 수행하거든요...

    > 음 그러니깐 문제는 ''DataForm.ExecQuery.FieldValues['dongcode']''

    > 이게 계속 처음 데이터값만 가진다는 것입니다... 어떻게 해야할지...

    > 좀 도와 주세요!!!!!



    안녕하세요..

    break문을 걸면 next문장이 먹지않기때문에 계속 첫번째 값만 가지고있는겁니다.

    break를 걸 경우에는 그 앞에 next문장을 주던가

    아님 아래처럼 break를 걸지않고 next를 else begin end 구문밖으로 빼주면

    될겁니다..

    그리고 하나의 쿼리컴포넌트가 돌고있는상황에서

    그 쿼리컴포넌트를 또 사용하면 안되기때문에 insert용 쿼리컴포넌트를 사용하면

    될것같네요..

    온라인상으로 정리한 소스인데 한번 확인해보세요..



    좋은하루되세요..





    with DataForm.ExecQuery do

    begin

    while not Eof do

    begin

    if (FieldValues['dongcode'] = strdongcode) and

    (Fieldvalues['bon' ] = strbon) and

    (Fieldvalues['bu' ] = strbu) and

    (Fieldvalues['page' ] = strpage) then

    begin

    memo1.Lines.Add('이미 등록된 파일입니다.');

    end

    else

    begin

    with DataForm.InsertQuery do

    begin

    SQL_Str := 'insert into test values (''' + strdongcode + ''', ''' + strbon + ''', ''' + strbu + ''', ''' + strdaejang + ''', ''3'' , ''0'', ''00'', ''000'', ''' + strpage + ''')';

    SQL.Clear;

    SQL.Text := SQL_Str;

    ExecSQL;

    memo.Lines.Add('처리되었습니다.');

    end;

    end;

    Next;

    end;

    end;