shininggem 답변 감사합니다.
프로그램을 첨부파일(Michli.Zip)올려드리겠습니다.
코팅내용을 보시고 답변 부탁드립니다.
알리아스 : Fmsth 입니다. 델파이버전 : 6.0~ 7.0중 다 됩니다 원래는 6.0에서 개발하였습니다.
그리고 데이터는 2008년 3월부터 2009년 5월까지입니다. 프로그램에 Michli.exe 를 실행하시고
년도와 월 ["예" 2009-05] 을 입력하시고 확인버튼을 누르면 실행됩니다.
루프를 돌릴줄 몰라서 하나씩 검출히려니 속도가 많이 늦습니다. 요부분도 어떻게 안될까요?
현재 상태는 스트링그리드에 마우스로 클릭히면 값이 있는곳은 DB정보가 숫자로 나오고 값이 없는
곳에 마우스를 클릭하면 접수내용이 검색한 범위에서 전부 출력됩니다. 꼭좀 부탁드립니다.
// 스트링그리드셀에 마우스클릭시 접수내용 보여주기함수
PROCEDURE TMiChJoForm.MiChJO1_DATA(SENDER: TOBJECT);
var
l_MCode : String;
l_Hcode : integer;
BEGIN
{
내용을 ㅎㅜㅌ어 보니 각 COL 값이 A.HCODE 값과 대응 되는 군요.
그렇다면 sDBText 값을 HCODE값으로 입력받아야 원하는 값을 찾을 수 있을것 같습니다.
그리고 ROW값을 날자를 나타 내는것 같은데 이것도 조건에 넣어야 겠지요?
아래의 내용들은 합계와 날자 칼럼은 빼고 선택했을때 값을 나타냅니다.
}
if (StringGrid1.Col = 0) or (StringGrid1.Col = 12) then Exit;
l_MCode := '';
l_Hcode := 0;
l_Hcode := StrToInt(StringGrid1.col); //
Case l_Hcode of
1 : l_MCode := 'MIC1';
2 : l_MCode := 'MIC2';
3 : l_MCode := 'MIC3';
4 : l_MCode := 'MIC4';
5 : l_MCode := 'MIC5';
6 : l_MCode := 'MIC6';
7 : l_MCode := 'MIC7';
8 : l_MCode := 'MIC8';
9 : l_MCode := 'MIC9';
10 : l_MCode := 'MIC10';
11 : l_MCode := 'MIC11';
end;
SQL.ADD('SELECT A.* , B.Mname, C.Yname, D.Hname, E.Sname '+
' FROM Jaryo A,Mich B,Yhng C,Chury D,Singo E '+
' Where A.Mcode = B.Mcode '+
' AND A.Ycode = C.Ycode '+
' AND A.Hcode = D.Hcode '+
' AND A.Scode = E.Scode '+
//월별 조건은 월별을 입력하고 조회했을경우 해당됩니다. 조회시 무엇을 입력하고 조회 했는지에 따라 아래 조건은 수정되어야 합니다.
' And A.YulBul = '''+ED_YulBul.TEXT+''' '+
' And A.Mcode = '''+l_MCode+''' '+
' AND A.NALJA = '''+StringGrid1.Cells[0,StringGrid1.Row]+''' ');
이정도로 하면 대충 나올듯 싶네요!
글구 조회하는 것도 조금 수정을 봐야 할 듯 싶어요!
어차피 구하는 값이 날자에 MCODE의 합계로 나타내는 듯 한데
SELECT NALJA,MCODE,COUNT(*) ct
FROM JARYO A, Mich B,Yhng C,Chury D,SINGO E
WHERE A.YULBUL='2009-05'
AND A.MCODE = B.MCODE
AND A.YCODE = C.YCODE
AND A.HCODE = D.HCODE
AND A.SCODE = E.SCODE
AND A.MCODE <> '0' //DB내용을 보니 0인것은 미처리 대상이 아닌것 같더군요!
GROUP BY NALJA,MCODE
이렇게 group by 로 나타내고
for구문 활용해서 돌리면
// MCODE 값에 따른 Col값 리턴 하는 합수 선언해 놓고
function getColID(sCode :String):integer;
begin
if sCode ='MIC1' then result := 1;
if sCode ='MIC2' then result := 2;
......
if sCode ='MIC11' then result := 11;
end;
While Not Eof do
begin
sCol := getColID(FieldByName('MCODE').AsString);
Case FieldByName('NALJA').AsInteger of
1 : begin
StringGrid1.Cells[sCol,1] := FieldByName('ct').asString;
end;
2 : begin
StringGrid1.Cells[sCol,2] := FieldByName('ct').asString;
end;
...................
31 : begin
StringGrid1.Cells[sCol,31] := FieldByName('ct').asString;
end;
end;
Next;
end;
이런식으로 한다면 값을 뿌려 줄 수 있을것 같은데....
합계는 쿼리로 하지 마시고 위의 구문에서 값을 누적해서 한번 해보시길...
제가 도움드릴 수 있는건 여기까지 일것 같네요!
꼭 성공하시길!!