다시한번 질문 할께요.
정보처리 기사 문제를 풀다가 의문이 있어서요
폼을 두개 사용 합니다.
그리고 하나는 입력과 계산에(여기에 테이블을 2개사용).. 하나는 출력에 사용하는 폼입니다.
출력테이블은 입력정보(입력테이블)를 출력테이블에 계산된필드에 계산하여 테이블을 생성합니다.
<입력폼>
출력테이블
제품. 10대 20대 30대 토탈... ->10대,20대,30대는 계산된 필드 입니다.
aaa 12 33 42 87 ->그리고 모든 제품코드는 데이블에
bbb 33 0 0 33 입력되어 있습니다.
ccc 0 0 0 0
ddd 21 0 22 43
입력 테이블
고객번호 제품 수량
32 a2 33
23 a4 32
12 a7 65
입력 ------ [button]
------ [button]
------
입력 폼은 대충 입런식 입니다.
<출력폼>
출력데이타
제품. 10대 20대 30대 토탈
aaa 12 33 42 87
bbb 33 0 0 33
ccc 0 0 0 0 <= 바로이부분 제품 ccc를 출력 되지 않게 하려 합니다.
ddd 21 0 22 43
총주문량:XXXX
입력 데이타
고객번호 제품 수량
32 a2 33
23 a4 32
12 a7 65
요렇게..
제품. 10대 20대 30대 토탈
aaa 12 33 42 87
bbb 33 0 0 33
ddd 21 0 22 43
위의 답변대로 테이블을 두개 사용 했습니다.
그리고 출력폼의 테이블은 입력폼에 있는출력테이블을 연결하여 사용 했습니다.
답변해주신 대로 했더니 토탈만 출력이 안되더라구요. 에구...
다시한번 부탁 드립니다. 방법이 없을까요. 배열을 썼으면 가능하겠지만
데이타베이스로 해보고 싶어서요.
디비그리드로는 제한을 가할수 있는 방법이 없나요?
아님 테이블을 하나더 생성해야 하나? 토탈이 0이면 새테이블에 넣지않는다.....쩝.
가능하면 새로운 테이블을 생성하지않고 하려고 합니다. 데이타가 중복되니깐요.
다시한번 부탁 드립니다.
아~그리고 퀵레포트나 다른걸로 대체해서 출력할수 있는 방법이 있을까요???
퀵레포트는 테이블 2개를 출력하려하니깐 안되더라구요..쩝.
부탁 합니다.
아래는 제가 몇일전 질문했던 내용 입니다.
이재식 wrote:
> 이상헌 wrote:
> > 정보처리 기사 문제를 풀다가 의문이 있어서요
> >
> > 폼을 두개 사용 합니다.
> > 그리고 하나는 입력과 계산에.. 하나는 출력에..테이블은2개.
> >
> > 테이블 하나에는 입력정보를 다른 하나의 테이블에는 계산된테이블을 만듭니다.
> >
> > 예)..
> >
> > 제품. 10대 20대 30대 토탈... ->10,20,30은 계산된 필드 입니다.
> > ??? 12 33 42 6767
> > ㅇㄹ 33 0 0 22
> > ㅇㅇ 0 0 0 0
>
>
> > 입력 테이블
> >
> > 고객번호 제품 수량
> > 32 44 33
> >
> >
> > 위의 출력. 계산된 테이블중 토탈이 0인 레코드는 출력을 하지 않을 려고 합니다.
> > 출력은 다른 폼에 디비그리드를 하나더 만들어 놓고 사용 합니다.
> > 테이블에 filter를 가하니가 되지 않더라구요.. 계산된 필드라 그렇다는데...쩝..
> > 부탁 드립니다.
>
> 이재식 Wrote :
> 안녕하세요?
> 질문이 다소 이해가 좀 안가지만, 의도는 알겠습니다.
> 귀하의 경우처럼, 특정 값이 무엇일때 출력을 원하지 않는다면
> 바로 GetText이벤트를 쓰는 것입니다.
> 이 이벤트는 테이블 컴포넌트이든 쿼리 컴포넌트이든
> 둘 다 있습니다.
> 위에서 보니까 테이블 컴포넌트를 쓰신 것 같아요.(Filter얘기가 있어서)
> 아무튼, Field Editor에 들어가시면(컴포넌트를 더블클릭)
> 그냥 필드이든 계산된 필드이든 그것을 Add하세요.
> 그리고, 해당 필드를 선택한뒤 F11(오브젝트 창)에 가보시면
> Event탭이 있죠.
> 거기에 보면 GetText이벤트가 있어요.
> 한마디로 특정 필드의 값이 0일때는 출력을 안하고 싶으면
> 조건을 준다음에 DisPlayText := false라고 해주면 되거든요.
> GetText이벤트 사용법은 제가 전에 설명을 한 적이 있는데요,
> 한번 검색해서 찾아보세요. 데이터베이스분류에 있어요.
> 그럼...
>
전에 있었던 제목과 틀려서 알아보질 못했습니다.
2가지 질문이군요,
먼저 제가 말씀드렸던 GetText이벤트입니다.
이것은 쿼리된 필드의 결과값을 편집하기 위해서 쓰이는
것이므로, 해당사항이 아니네요.
다시 읽어보니 원하는 레코드(즉, 출력이 0)는 아예 DBGrid에 출력을
원치 않는경우이군요.
그런데, 문제는 그 필드가 calc필드라는 것이죠.
제가 알아보니 calc필드는 filtering이 되질 않아요.
애석하군요.
그런데요, 문제는 화면출력시에 입니다.
이 결과들을 DBGrid에 보여줄 것인지, 아니면 퀵레포트를 이용해서
보여줄 것인지를 결정해야 겠죠.
제 개인적 생각으론 결과를 화면에 보여줄때는 DBGrid보다는
퀵레포트를 이용하는것이 좋을 것 같아요.
(주위 아는사람들 그렇게 하더라구요)
1. 화면에 결과를 보여줄때(DBGrid)
-> total이 0인것은 보여주기를 원치 않으므로,
open를 한다음, while를 돌려서 total이 0인것은 삭제를 하고
while이 다 끝난다음, 다시 open를 하는거죠.
(이유는 calc필드는 filtering이 안되므로)
: 좀 무식한가요?
2. 화면에 결과를 보여줄때(퀵레포트)
-> 제가 아는사람들도 결과를 화면에 출력할때는
퀵레포트를 이용하더라구요.
/* 잘 모르겠는데, 이렇게하는것이 시험취지에 맞대요.
그리고, 가급적이면 DB를 쓰는것도 그렇고요.(??~~)
*/
Detail Band의 beforePrint이벤트에 이렇게 하면 되요.
if Query1.FieldByName('total').asInteger = 0 then
PrintBand := false ;
이렇게만하면 total이 0인 레코드는 출력이 안됩니다.
(이 방법을 권장하고 싶네요)
또하나.
레포트 출력인데요.
현재, 입력 테이블, 출력 테이블 두개를 하나의 퀵 레포트에
출력을 하고 싶은 것 같아요.
일단은 출력테이블을 detail밴드와 연결시키고요,
입력 테이블 내용은 사실상 프로그램 가동시에 입력받은
원시 데이터이므로, 이것은 따로 배열등등에 저장을 해 두어야 합니다.
그러면, 그 배열등에 저장된 내용을
summary band나 pagefooter band에 출력을 시키면 되요.
이것역시 입력데이터개수가 유동적이기 때문에,
대체 몇개를 QRDBText, QRLabel를 그려야 하는문제인데요,
간단해요.
기사문제에서는 항상 입력데이터의 최대개수가 주어집니다.
따라서, 미리 그 개수만큼 QRDBText(or QRLabel)를 올려놔요.
그런다음, 실제로 몇개를 입력받았는지를 알 수 있잖아요.
그럼, 해당 band의 beforePrint이벤트에서 height값을 조절해버리면
됩니다.
물론, 다른 방법도 있습니다만...
OnNeedData이벤트를 쓰시면 되는데요,
이것을 쓰시면 따로 배열등이 필요없이 출력테이블 내용과 입력테이블
내용을 한 퀵레포트에 출력할 수 있어요.
레포트를 사실상 99% 조절할 수 있어요.
그럼...