안뇽하신가엽 여러 고수님&중수님들 ^^ 전 초보 사발임당....^^
헐 지가 조인을 사용하다가 실패해서리 부득불 ㅠ.ㅠ 쿼릴 두개를 사용 하게 되었슴
당 ㅠ.ㅠ
그런디엽 스트리그리드에 지가 원하는 값들이 다 안나옴당 ㅠ.ㅠ
ㅠ.ㅠ 원래는 불량내역의 불량코드와 불량명세의 불량코드를 조인해서 불량부위와 불
량내역을 맹글어야
하는디 ㅠ.ㅠ 불량내역의 불량코드와 불량명세의 불량코드의 타입이 달라서 ㅠ.ㅠ
조인을 못하구 아래와 같이 속도도 느린 뽀록을 구사하고 있슴당 ㅠ.ㅠ
아래의 소스를 돌리면 값은 나오긴 한는디 ㅠ.ㅠ
값이 두개이상 나와야 하는디 하나만 달랑 남옴당...ㅠ.ㅠ
미티 미티 ㅠ.ㅠ 진짜루 환장 하겠슴당 ㅠ.ㅠ
아래의 소스를 보심 알겠쥐만엽 2번째 sql문의
where절 에서 불량코드를 k 로 하고 나온값을 다시
if not qur.eof then begin.....end;
이런식으로 했는디 ㅠ.ㅠ 값이 2개가 나와야 하는디 달랑 하난만 나옴당....
고수님들 도와 주이소 ㅠ.ㅠ 그럼 ㅠ.ㅠ 편안 하십쇼 ^^
procedure Tdeleteform.listbox1Click(Sender: TObject);
var
qur:Tquery;
i,j:integer;
K,m,n:string;
begin
i:=1;
j:=1;
qur:=Tquery.Create(self);
qur.DatabaseName:='연습데이터';
stringgrid1.ColCount:=7;
with qur do
begin
close;
sql.clear;
sql.add('select 검사번호,제조번호,순번,유발공정,조치내역,불량코드,조치일자 from 불량내역');
sql.Add('where 검사번호='''+edit1.Text+'''');
prepare;
open;
with stringgrid1 do
begin
rowcount := qur.RecordCount;
cells[0,0]:='제조번호';
cells[1,0]:='검사번호';
cells[2,0]:='순번';
cells[3,0]:='유발공정';
cells[4,0]:='조치일자';
cells[5,0]:='불량부위';
cells[6,0]:='불량내역';
end;
while not qur.Eof do
begin
stringgrid1.Cells[i,j]:=qur.fieldbyname('제조번호').asstring;
i:=0;
stringgrid1.Cells[i,j]:=qur.fieldbyname('검사번호').asstring;
i:=i+1;
stringgrid1.Cells[i,j]:=qur.fieldbyname('순번').asstring;
i:=i+1;
stringgrid1.Cells[i,j]:=qur.fieldbyname('유발공정').asstring;
i:=i+1;
stringgrid1.Cells[i,j]:=datetimetostr(qur.fieldbyname('조치일자').asdatetime);
i:=i+1;
k:=qur.fieldbyname('불량코드').asstring;
with qur do
begin
close;
sql.Clear;
sql.Add('select 불량부위,불량내역 from 불량명세');
sql.Add('where 불량코드='''+k+'''');
prepare;
open;
end;
if not qur.Eof then
begin
m:=qur.fieldbyname('불량부위').asstring;
n:=qur.fieldbyname('불량내역').asstring;
end;
stringgrid1.Cells[i,j]:=m;
i:=i+1;
stringgrid1.Cells[i,j]:=n;
i:=1;
j:=j+1;
stringgrid1.RowCount:=stringgrid1.RowCount+1;
qur.next;
end
end;
qur.Free;
end;
우선 불량내역 테이블에서 값들을 가져오고, 그다음에 qur.next를 하기 전에 qur의 쿼리문을 바꿔서 다시 여는데, 그럼 나중에 next를 하는데 문제가 있지요.
이럴 경우는 qur를 하나 선언해서 SQL문을 바꾸지 말고, 아예 TQuery 컴포넌트를 두개를 사용하셔야 합니다.
왜냐하면, 첫번째 SQL문이 계속 살아 있어야 next를 할 수 있으니까요. 그렇지않으면 next는 불량명세를 가져온 SQL문의 결과를 가지고 next를 하게 됩니다.
고친 소스:
{참고: 이코드는 불량 명세를 쿼리 했을 때에는 레코드가 불량코드 1개당 1개의 레코드를 가지고 온다는 가정이 있는 것 같군요. 만약에 두번째 쿼리가 한개 이상의 레코드를 가지고 온다면 코드는 추가로 변경되어야 합니다.}
procedure Tdeleteform.listbox1Click(Sender: TObject);
var
qur, qrySecond:Tquery;
i,j:integer;
K,m,n:string;
begin
i:=1;
j:=1;
qur:=Tquery.Create(self);
////////////////////////////////
// 두번째 쿼리 생성
qrySecond := TQuery.Create(Self);
////////////////////////////////
qur.DatabaseName:='연습데이터';
////////////////////////////////
// 두번째 쿼리 연결
qrySecond.DatabaseName := '연습데이터';
////////////////////////////////
stringgrid1.ColCount:=7;
with qur do
begin
close;
sql.clear;
sql.add('select 검사번호,제조번호,순번,유발공정,조치내역,불량코드,조치일자 from 불량내역');
sql.Add('where 검사번호='''+edit1.Text+'''');
prepare;
open;
with stringgrid1 do
begin
rowcount := qur.RecordCount;
cells[0,0]:='제조번호';
cells[1,0]:='검사번호';
cells[2,0]:='순번';
cells[3,0]:='유발공정';
cells[4,0]:='조치일자';
cells[5,0]:='불량부위';
cells[6,0]:='불량내역';
end;
while not qur.Eof do
begin
stringgrid1.Cells[i,j]:=qur.fieldbyname('제조번호').asstring;
i:=0;
stringgrid1.Cells[i,j]:=qur.fieldbyname('검사번호').asstring;
i:=i+1;
stringgrid1.Cells[i,j]:=qur.fieldbyname('순번').asstring;
i:=i+1;
stringgrid1.Cells[i,j]:=qur.fieldbyname('유발공정').asstring;
i:=i+1;
stringgrid1.Cells[i,j]:=datetimetostr(qur.fieldbyname('조치일자').asdatetime);
i:=i+1;
k:=qur.fieldbyname('불량코드').asstring;
/////////////////////////////////////////////
// 이부분은 없에고...
// with qur do
// begin
// close;
// sql.Clear;
// sql.Add('select 불량부위,불량내역 from 불량명세');
// sql.Add('where 불량코드='''+k+'''');
// prepare;
// open;
// end;
// if not qur.Eof then
// begin
// m:=qur.fieldbyname('불량부위').asstring;
// n:=qur.fieldbyname('불량내역').asstring;
// end;
/////////////////////////////////////////////////////
// 두번째 쿼리로 불량명세 작업
with qrySecond do
begin
close;
clear;
sql.Add('select 불량부위,불량내역 from 불량명세');
sql.Add('where 불량코드='''+k+'''');
prepare;
open;
end;
if not qrySecond.IsEmpty then
begin
m:=qrySecond.fieldbyname('불량부위').asstring;
n:=qrySecond.fieldbyname('불량내역').asstring;
end;
/////////////////////////////////////////////////////
stringgrid1.Cells[i,j]:=m;
i:=i+1;
stringgrid1.Cells[i,j]:=n;
i:=1;
j:=j+1;
stringgrid1.RowCount:=stringgrid1.RowCount+1;
qur.next;
end;
end;
////////////////////////
// 깨끗한 끝처리
qur.Close;
qrySecond.Close;
////////////////////////
qur.Free;
////////////////////////
// 최종 두번째 쿼리 프리
qrySecond.Free;
////////////////////////
end;
사발우성 wrote:
>
> 안뇽하신가엽 여러 고수님&중수님들 ^^ 전 초보 사발임당....^^
>
> 헐 지가 조인을 사용하다가 실패해서리 부득불 ㅠ.ㅠ 쿼릴 두개를 사용 하게 되었슴
>
> 당 ㅠ.ㅠ
>
> 그런디엽 스트리그리드에 지가 원하는 값들이 다 안나옴당 ㅠ.ㅠ
>
> ㅠ.ㅠ 원래는 불량내역의 불량코드와 불량명세의 불량코드를 조인해서 불량부위와 불
>
> 량내역을 맹글어야
>
> 하는디 ㅠ.ㅠ 불량내역의 불량코드와 불량명세의 불량코드의 타입이 달라서 ㅠ.ㅠ
>
> 조인을 못하구 아래와 같이 속도도 느린 뽀록을 구사하고 있슴당 ㅠ.ㅠ
>
> 아래의 소스를 돌리면 값은 나오긴 한는디 ㅠ.ㅠ
>
> 값이 두개이상 나와야 하는디 하나만 달랑 남옴당...ㅠ.ㅠ
>
> 미티 미티 ㅠ.ㅠ 진짜루 환장 하겠슴당 ㅠ.ㅠ
>
>
>
> 아래의 소스를 보심 알겠쥐만엽 2번째 sql문의
>
> where절 에서 불량코드를 k 로 하고 나온값을 다시
>
> if not qur.eof then begin.....end;
>
> 이런식으로 했는디 ㅠ.ㅠ 값이 2개가 나와야 하는디 달랑 하난만 나옴당....
>
> 고수님들 도와 주이소 ㅠ.ㅠ 그럼 ㅠ.ㅠ 편안 하십쇼 ^^
>
>
> procedure Tdeleteform.listbox1Click(Sender: TObject);
> var
> qur:Tquery;
> i,j:integer;
> K,m,n:string;
>
> begin
> i:=1;
> j:=1;
> qur:=Tquery.Create(self);
> qur.DatabaseName:='연습데이터';
> stringgrid1.ColCount:=7;
>
> with qur do
> begin
> close;
> sql.clear;
> sql.add('select 검사번호,제조번호,순번,유발공정,조치내역,불량코드,조치일자 from 불량내역');
> sql.Add('where 검사번호='''+edit1.Text+'''');
> prepare;
> open;
>
> with stringgrid1 do
> begin
> rowcount := qur.RecordCount;
> cells[0,0]:='제조번호';
> cells[1,0]:='검사번호';
> cells[2,0]:='순번';
> cells[3,0]:='유발공정';
> cells[4,0]:='조치일자';
> cells[5,0]:='불량부위';
> cells[6,0]:='불량내역';
> end;
>
> while not qur.Eof do
> begin
> stringgrid1.Cells[i,j]:=qur.fieldbyname('제조번호').asstring;
> i:=0;
> stringgrid1.Cells[i,j]:=qur.fieldbyname('검사번호').asstring;
> i:=i+1;
> stringgrid1.Cells[i,j]:=qur.fieldbyname('순번').asstring;
> i:=i+1;
> stringgrid1.Cells[i,j]:=qur.fieldbyname('유발공정').asstring;
> i:=i+1;
> stringgrid1.Cells[i,j]:=datetimetostr(qur.fieldbyname('조치일자').asdatetime);
> i:=i+1;
> k:=qur.fieldbyname('불량코드').asstring;
> with qur do
> begin
> close;
> sql.Clear;
> sql.Add('select 불량부위,불량내역 from 불량명세');
> sql.Add('where 불량코드='''+k+'''');
> prepare;
> open;
> end;
> if not qur.Eof then
> begin
> m:=qur.fieldbyname('불량부위').asstring;
> n:=qur.fieldbyname('불량내역').asstring;
> end;
> stringgrid1.Cells[i,j]:=m;
> i:=i+1;
> stringgrid1.Cells[i,j]:=n;
> i:=1;
> j:=j+1;
> stringgrid1.RowCount:=stringgrid1.RowCount+1;
> qur.next;
> end
> end;
> qur.Free;
> end;