Q&A

  • DB출력에 관한 조언을 구합니다.
델파이 왕초보 입니다. 저는 현재 방통대 컴과학과에 다니는 학생인데
과제를 하다가 막히는 곳이 있어 도움을 구하기위해 질문을 하려 합니다.
밑의 과제 내용중.. 거의 다 했다고 생각하는데, 몇가지 더 추가할 내용이
잘 안됩니다.
추가할 내용은..
**** 과제 내용****
“고객번호, 고객종류코드, 통신사용시간”을 입력받아서 통신사용요금을 구하는 프로그램을 작성할 것.
**** 처리조건 ****
1. 통신사용요금은
1) 통신사용시간이 기본시간 이하일 경우 :
  (기본요금 + (통신사용시간 * 기본시간당 요금단가))
2) 통신사용시간이 기본시간을 초과할 경우
[기본요금 + (통신기본사용기간 * 기본시간당 요금단가) +
{(통신사용시간 – 통신기본시간) * 초과시간당 사용 요금단가}]
2. 통신사용요금이 50,000 이상이면 비고란에 “우수”라고 출력한다.
3. 입력된 모든 고객이 사용한 통신요금 “총 합계”를 구한다.
4. 입력된 모든 고객이 사용한 통신시간 “총 사용시간”을 구한다.
5. 고객종류명은 <고객종류 코드표>를 참조하여 출력한다.
                           고객종류코드표
고객코드 고객종류명
SM 우대회원
PM 일반회원
GM 단체회원
6. 기본요금은 <요금정산표>를 참조하여 출력한다.
                          요금산정표
고객코드 기본요금 통신기본사용시간 기본시간당 요금단가 초과시간당 요금단가
SM 50000 300 80 90
PM 25000 250 75 75
GM 15000 100 90 100
7. 입력화면 설계시
1) Data의 입력은 반드시 입력화면에서 받도록 설계한다.
2) 고객번호는 두 자리 정수로 입력하고, 중복되지 않는다.
3) 고객종류코드는 영문 2자리로 입력한다. 영문은 대소문자와는 무관하다.
4) 최대 입력자료의 건수는 10건이하로 한다.
5) 레코드별 입력 항목의 입력순서는 “고객번호, 고객종류코드, 통신사용시간”이 되도록 설계한다.
6) 입력과 출력을 구분하는 기능을 포함한다.
8. 출력화면 설계시
1) 출력화면은 반드시 화면으로 한다.
2) 입력받은 항목과 추가로 계산된 항목을 출력한다.
추가항목 : 통신사용요금, 비고, 총 사용시간, 총 합계를 출력한다.
9. 입력폼과 출력폼은 각각 1개로 제한한다.

*** 이 중에서 ***
2. 통신사용요금이 50,000 이상이면 비고란에 “우수”라고 출력한다.
3. 입력된 모든 고객이 사용한 통신요금 “총 합계”를 구한다.
4. 입력된 모든 고객이 사용한 통신시간 “총 사용시간”을 구한다.

<=== 위의 3개만 더 추가하면 되는데..
깡통이 어려운거 할려니 잘안되는가 봅니다 ㅡㅡ^
그래도 처음 짜보는 델파이 프로그램이 일단 실행이 되고 스트링 그리드 7칸중에
4칸이나 입력내용이 받아 지는게 참 희안하고 감동적입니다 ㅡ,.ㅡ
위의 3가지 사항이 어떤위치에 어떻게 들어가야 하는지 조언좀 부탁 드립니다.

그럼 꾸벅 ~


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;

type
TForm1 = class(TForm)
   Panel1: TPanel;
   Panel2: TPanel;
   Panel3: TPanel;
   Panel4: TPanel;
   Button1: TButton;
   Button2: TButton;
   Button3: TButton;
   Edit1: TEdit;
   Edit2: TEdit;
   ComboBox1: TComboBox;
   procedure FormCreate(Sender: TObject);
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
   procedure Button3Click(Sender: TObject);
   //이벤트 발생시 자동생성되는 프로시져
   procedure EditClear;
   //사용자가 정의한 프로시져
private
   { Private declarations }
public
   { Public declarations }
end;

var
Form1: TForm1;  //입력폼으로 사용

implementation
uses Unit2;    //유닛2를 사용한다
{$R *.dfm}
Var              //전역변수 정의
count: integer;   //입력 데이터를 count하는 변수

procedure TForm1.EditClear; //사용자가 정의한 프로시져
begin
Edit1.Clear;    //edit컴포넌트를 클리어 시킴
Edit2.Clear;
end;

//입력버튼 클릭 이벤트 발생시
procedure TForm1.Button1Click(Sender: TObject);
var
clientno, usetime, money, totaltime, totalmoney : integer;
clientcode, note : String;
nos, i, ii : integer;

begin
  if count = 10 then   //입력 데이터가 10건인지 체크
    begin
     ShowMessage('경고! 10건 이상은 처리 불가능');
     EditClear;   //edit프로시져를 이용해 클리어 시킴
     exit;       //입력버튼으로 빠져나감
    end;

    if (clientno >= 100) and (clientno <0) then //고객번호가 두자리 정수인지 체크
    begin
     ShowMessage('고객번호를 두자리 정수로 입력하시오.');
     EditClear;
     exit;
    end
    else if Edit1.Text = '' then    //edit박스 내용 입력 유무 확인
    begin
     ShowMessage('고객번호 입력');
     exit;
    end;

  for i := 1 to 99 do  //고객등록번호 중복 방지
    if (Edit1.Text = Form2.StringGrid1.Cells[0, i]) then
      begin
       ShowMessage('이미 등록된 번호입니다.')
      end;
        
  if ComboBox1.Text = '고객종류코드' then
    begin
     ShowMessage('고객종류코드를 선택하세요');
     exit;
    end;
  if Edit2.Text = '' then
    begin
     ShowMessage('통신사용시간 입력');
     EditClear;
     exit;
    end;
with Form2.StringGrid1 do
    begin
    Cells[0, RowCount-1]:= Edit1.Text;
    Cells[1, RowCount-1]:= Combobox1.Text;
    Cells[2, RowCount-1]:= Edit2.Text;
   if Combobox1.Text = 'SM' then  //고객등급이 'SM'인 경우 요금 계산
  begin
    if StrToInt(Edit2.Text) <= 300 then  //통신사용시간이 기본시간 이하
      begin
        Cells[3, RowCount-1] := IntToStr(50000 + ( StrToInt(Edit2.Text) * 80 ));
      end
    else if StrToInt(Edit2.Text) > 300 then  //통신사용시간이 기본시간 초과
      begin
        Cells[3, RowCount-1] := IntToStr(50000 + ( 300 * 80 ) + ((StrToInt(Edit2.Text) - 300 ) * 90));
      end;
    end;
  if Combobox1.Text = 'PM' then  //고객등급이 'PM'인 경우 요금 계산
    begin
      if StrToInt(Edit2.Text) <= 250 then  //통신사용시간이 기본시간 이하
        begin
          Cells[3, RowCount-1] := IntToStr(25000 + ( StrToInt(Edit2.Text) * 75 ));
        end
      else if StrToInt(Edit2.Text) > 250 then  //통신사용시간이 기본시간 초과
        begin
          Cells[3, Form2.StringGrid1.RowCount-1] := IntToStr(25000 + ( 250 * 75 ) + ((StrToInt(Edit2.Text) - 250 ) * 75));
        end;
      end;
   if Combobox1.Text = 'GM' then  //고객등급이 'GM'인 경우 요금 계산
      begin
        if StrToInt(Edit2.Text) <= 100 then  //통신사용시간이 기본시간 이하
          begin
            Cells[3, RowCount-1] := IntToStr(15000 + ( StrToInt(Edit2.Text) * 100 ));
          end
        else if StrToInt(Edit2.Text) > 100 then  //통신사용시간이 기본시간 초과
          begin
            Cells[3, RowCount-1] := IntToStr(15000 + ( 100 * 90 ) + ((StrToInt(Edit2.Text) - 100 ) * 100));
          end;

       end;

  RowCount := RowCount + 1
  end;    //end of with

EditClear;
   Edit1.SetFocus;
   Inc(Count);
end;

procedure TForm1.Button2Click(Sender: TObject);  //출력버튼 클릭
begin
Form2.show; //출력결과를 출력폼에 보여줌
end;

procedure TForm1.Button3Click(Sender: TObject);   //종료 버튼 클릭
begin
close;   //입력폼 실행을 종료
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
count:= 0;  //카운트 변수를 초기화
end;


end.
unit Unit2;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, StdCtrls, ExtCtrls;

type
TForm2 = class(TForm)
   Panel1: TPanel;
   StringGrid1: TStringGrid;
   Button1: TButton;
   procedure FormCreate(Sender: TObject);
   procedure Button1Click(Sender: TObject);
private
   { Private declarations }
public
   { Public declarations }
end;

var
Form2: TForm2;

implementation

{$R *.dfm}
const     //상수로 정의 - 고정된 특정한 변수 사용 가능
sub: array[0..6] of string[13] = ('고객번호', '고객종류코드', '통신사용시간', '통신사용요금', '비  고', '총 사용시간', '총 합계(요금)');
   //스트링 그리드의 제목을 초기화 위해 배열로 선언
procedure TForm2.Button1Click(Sender: TObject);
begin
close;
end;

procedure TForm2.FormCreate(Sender: TObject);
var
i: integer; //반복을 위한 임시 변수 선언
begin
for i:= 0 to 6 do
   StringGrid1.Cells[i,0]:= sub[i]; //제목을 초기화
end;

end.
1  COMMENTS
  • Profile
    이재식 2002.06.12 12:36
    안녕하세요.
    님이 원하시는 내용을 위해서 몇가지 추가를 해야하고
    또 몇가지를 삭제해야 합니다.
    스트링그리드에는
    고객번호, 고객종류코드, 통신사용시간, 통신사용요금, 비  고
    이렇게 5개의 칼럼만 있으면 되구여,

    총통화시간과 총통화요금은 입력된 각고객의 누적이므로
    form2에 Edit1과 Edit2를 올려놓으셔서 하시는것이 나을듯 합니다.
    먼저 form1의 button1클릭이벤트에서는 다음과 같이 하시면 됩니다.
    님것에서 그냥 제가 변형을 했습니다.
    procedure TForm1.Button1Click(Sender: TObject);
    var
    clientno, usetime, money  : integer;
    clientcode, note : String;
    nos, i, ii : integer;

    begin
      if count = 10 then   //입력 데이터가 10건인지 체크
        begin
         ShowMessage('경고! 10건 이상은 처리 불가능');
         EditClear;   //edit프로시져를 이용해 클리어 시킴
         exit;       //입력버튼으로 빠져나감
        end;

        if (clientno >= 100) and (clientno <0) then //고객번호가 두자리 정수인지 체크
        begin
         ShowMessage('고객번호를 두자리 정수로 입력하시오.');
         EditClear;
         exit;
        end
        else if Edit1.Text = '' then    //edit박스 내용 입력 유무 확인
        begin
         ShowMessage('고객번호 입력');
         exit;
        end;

      for i := 1 to 99 do  //고객등록번호 중복 방지
        if (Edit1.Text = Form2.StringGrid1.Cells[0, i]) then
          begin
           ShowMessage('이미 등록된 번호입니다.') ;
           Exit ;
          end;

      if ComboBox1.Text = '고객종류코드' then
        begin
         ShowMessage('고객종류코드를 선택하세요');
         exit;
        end;
      if Edit2.Text = '' then
        begin
         ShowMessage('통신사용시간 입력');
         EditClear;
         exit;
        end;

      with Form2.StringGrid1 do
        begin
        Cells[0, RowCount-1]:= Edit1.Text;
        Cells[1, RowCount-1]:= Combobox1.Text;
        Cells[2, RowCount-1]:= Edit2.Text;
       if Combobox1.Text = 'SM' then  //고객등급이 'SM'인 경우 요금 계산
      begin
        if StrToInt(Edit2.Text) <= 300 then  //통신사용시간이 기본시간 이하
          begin
            Cells[3, RowCount-1] := IntToStr(50000 + ( StrToInt(Edit2.Text) * 80 ));
          end
        else if StrToInt(Edit2.Text) > 300 then  //통신사용시간이 기본시간 초과
          begin
            Cells[3, RowCount-1] := IntToStr(50000 + ( 300 * 80 ) + ((StrToInt(Edit2.Text) - 300 ) * 90));
          end;
        end;
      if Combobox1.Text = 'PM' then  //고객등급이 'PM'인 경우 요금 계산
        begin
          if StrToInt(Edit2.Text) <= 250 then  //통신사용시간이 기본시간 이하
            begin
              Cells[3, RowCount-1] := IntToStr(25000 + ( StrToInt(Edit2.Text) * 75 ));
            end
          else if StrToInt(Edit2.Text) > 250 then  //통신사용시간이 기본시간 초과
            begin
              Cells[3, Form2.StringGrid1.RowCount-1] := IntToStr(25000 + ( 250 * 75 ) + ((StrToInt(Edit2.Text) - 250 ) * 75));
            end;
          end;
       if Combobox1.Text = 'GM' then  //고객등급이 'GM'인 경우 요금 계산
          begin
            if StrToInt(Edit2.Text) <= 100 then  //통신사용시간이 기본시간 이하
              begin
                Cells[3, RowCount-1] := IntToStr(15000 + ( StrToInt(Edit2.Text) * 100 ));
              end
            else if StrToInt(Edit2.Text) > 100 then  //통신사용시간이 기본시간 초과
              begin
                Cells[3, RowCount-1] := IntToStr(15000 + ( 100 * 90 ) + ((StrToInt(Edit2.Text) - 100 ) * 100));
              end;

           end;

      //*******비고값 넣기 및 모든고객 사용시간과 총통화요금 구하기***********
        // 비고값 구하기
        with Form2.StringGrid1 do
        begin
            money := StrToIntDef(Cells[3, RowCount-1], 0) ;
            if money = 0 then
                showMessage('수치데이터 변환에러')
            else if money >= 50000 then
                    Cells[4, RowCount-1] := '우수' ;

            // 모든고객 총사용시간 및 총통화요금 구하기
            totaltime := totaltime + StrToInt(Cells[2, RowCount-1]) ;
            totalmoney := totalmoney + StrToInt(Cells[3, RowCount-1]) ;
        end ;

      //************************************************************




      RowCount := RowCount + 1
      end;    //end of with

       EditClear;
       Edit1.SetFocus;
       Inc(Count);

    //*****************모든고객 총통화시간 및 통통화요금 출력하기 ************
        with form2 do
        begin
            Edit1.Text := IntToStr(totaltime) ;
            Edit2.Text := IntToStr(totalmoney) ;
        end ;


    //***************************************


    end;

    위에서 , 고객코드중복방지 루틴에서 exit를 빠뜨렸더군여. 그것도
    함께 추가하셔야 합니다. ^^

    그리고, totaltime과 totalmoney변수는 외부변수로 하셔야 합니다.
    외부변수는 굳이 0으로 초기화 안해도 integer변수는 자동 0으로
    초기화 됩니다. 그래도 가식성을 위해서 늘 해주는것이 좋습니다 ^^

    그럼 이젠 form2에서는 제가 말씀드린대로 eidt1, edit2를 올려놓으시구여.
    아래와같이 하시면 됩니다.
    const     //상수로 정의 - 고정된 특정한 변수 사용 가능
    sub: array[0..4] of string[13] = ('고객번호', '고객종류코드', '통신사용시간', '통신사용요금', '비  고');
       //스트링 그리드의 제목을 초기화 위해 배열로 선언
    procedure TForm2.Button1Click(Sender: TObject);
    begin
    close;
    end;

    procedure TForm2.FormCreate(Sender: TObject);
    var
    i: integer; //반복을 위한 임시 변수 선언
    begin
    for i:= 0 to 4 do
       StringGrid1.Cells[i,0]:= sub[i]; //제목을 초기화
    end;

    이상 님것과 함 비교해보세요.
    문제 있으면 연락주십시요.

    참, 숫자는 기본적으로 오른쪽 정렬을 하셔야하구여,
    숫자에는 천단위마다 콤마가 찍히는것이 기본입니다.
    아시죠? 이것까지 잘 처리해주시기 바랍니다. ^^;

    그런데, 방통대 다니시면 지금 제 친구가 방통대 전산실에서
    일하고 있는데 ㅋㅋㅋ(단기직으로 ^^;)

    아무튼, 건투를 빕니다.

    • 최용일
      2002.06.13 00:27
      제가 말한 대로 아이콘 바꾸어 보셨나요? Project/Options...에서 Application탭에서 바꾸어 보세요. 25...
    • 이영주
      2002.06.13 00:50
      저... Application탭에서 색을 바꾸는 부분은 없는데.. 뭘 말씀 하시는지... 잘몰겠떠염.. 상세히점......
    • 최용일
      2002.06.13 01:47
      아이콘 칼라바꾸는 것은 다른 툴로 해야죠... 델파이 이미지에디터나 마이크로안젤로같은... 쩝 제 말은...
    • 이현철
      2002.06.16 00:09
      Ping 소스를 함수 형식으로 만들어 보세요. Function isPing(IpAddress:String):Boolean begin  ...
    • 성대현
    • 2002.06.12 21:40
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 김은영
    • 2002.06.12 21:37
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 이재식
      2002.06.13 03:21
      안녕하세요. 전 질문하고 데이터가 또 틀리네요. packed라해도 변환하는데는 아무런 문제가 없어요 va...
    • 이동현
    • 2002.06.12 21:25
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 김지엽
      2002.06.12 22:43
      ALTER TABLE 테이블명 DROP 컬럼명
    • 염상철
      2002.06.19 19:46
      Group Band쓰시면..되는데..
    • 김광호
    • 2002.06.12 21:09
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 아폴론
    • 2002.06.12 20:56
    • 4 COMMENTS
    • /
    • 0 LIKES
    • KDDG_zzang
      2002.06.12 21:01
         if key = vk_Next then begin       key := word(#0);&nbs...
    • 아폴론
      2002.06.13 00:27
      procedure TFm102.Ne_gjmnKeyDown(Sender: TObject; var Key: Word;   Shift: TShiftStat...
    • KDDG_zzang
      2002.06.13 02:18
      죄송한데요. 질문이 잘 이해가 안 되요. ^^;; 원하시는 결과가 무엇인지를 다시 한번 자세하게 설명 부...
    • 아폴론
      2002.06.13 04:38
      procedure TFm102.Ne_gjmnKeyDown(Sender: TObject; var Key: Word;   Shift: TShiftState); ...
    • 김진철
    • 2002.06.12 20:44
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 곰다방~미스김
      2002.06.12 22:38
      휠마우스 드라이버를 해당제품 만든곳에서 업데이트 받으세요.... 그럼 됩니다...... -_-; 아니면.........
    • GanJang
    • 2002.06.12 20:23
    • 4 COMMENTS
    • /
    • 0 LIKES
    • 프리맨
      2002.06.13 00:52
      델파이도 호출되지 않는 루틴은 실행파일에 포함시키지 않으므로써 실행파일 크기를 상당히 줄입니다....
    • GanJang
      2002.06.13 02:02
      넵.. 지금 제가 만든 간단한 알람 프로그램이 실행파일 사이즈가.. 500kb 를.. 넘어가고 있습니다. -_=;...
    • 프리맨
      2002.06.13 02:42
      소스를 보시면 VCL 객체가 전혀 사용되지 않았습니다. 객체를 사용하지 않았으니 객체안의 가상메소드...
    • GanJang
      2002.06.13 03:19
      에고.. 손수 파일 다운로드 받으셔서,, 소스까지 확인해 주시고.. 정말 감사 T.T;; 월드 컵.. ...
    • 이은호
    • 2002.06.12 19:57
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 박상윤
      2002.06.18 07:05
      음 저는 DirectShow하는 방법 뿐이 몰라서..^^;; 우선 디바이스의 포인터를 얻은후 ... KSProperty얻고...
    • 이동현
    • 2002.06.12 19:55
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 하기
      2002.06.18 02:34
      '[id] = '+QuotedStr(msg1)  AND '[password] ='+QuotedStr(msg2); 'Field명1 = ' + Value...
    • 윤도상
    • 2002.06.12 19:08
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 장명선
      2002.06.12 19:44
      Oracle Net setting을 먼저 하셔야 합니다. setting하면 서비스이름인가 하는것을 만들거든요.... 그것을...
    • 윤도상
      2002.06.12 20:38
      오라클은 폴더 또는 파일명에 ( 가 포함되어있으면 안됩니다. 혹 다른 문자도 안되는지는 모르겠네요., ...
    • 윤도상
      2002.06.12 20:33
      BDE에서는 데이터베이스 명에서 더블클릭해서 사용자 이름과 패스워드를 주면 로긴이 됩니다. 그리고 델...
    • 김수경
      2002.06.12 19:11
      아래와 같이 처리해 보세요.   1. F7(Trace Into), F8(Step Over) 키를 이용해서 단계적으로 ...
    • 이영주
      2002.06.12 19:18
      감사합니다.. 아래와 같이 해보았는데염.... 1번은 전혀 소용이 없어염.. 키를 누르자마자 cpu창이 뜨...
    • 김수경
      2002.06.13 00:33
      2 번이 올바르게 실행된다면 Delphi엔 문제가 없는 것 같습니다. 단계별로 Debugging이 불가능 하다면 Ful...
    • 이영주
      2002.06.13 00:57
      저 우선 감사합니다.. ^^; full debug mode라는 건 없구염.. Project/Option/Compiler 쪽에 있는 모든 ...
    • 나그네
    • 2002.06.12 18:31
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 김수경
      2002.06.12 18:58
      받는 쪽 컴터의 통신 Buffer가 가득 찬 경우에 자료를 보낼 경우 자료가 제대로 전송되지 않습니다(이런 ...
    • 장명선
      2002.06.12 18:53
      에공 에공 아직까지 안되셨나부네요 어떤 기계인지는 모르지만 디기 까다롭네요 혹 메뉴얼같은게 있으...
    • 김관식
    • 2002.06.12 12:17
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 하기
      2002.06.18 02:38
      if not Table1.FindKey([Input.Text]) then 이렇게 쓰셨는데... 아마도 FindKey = True or False 이런식으...
    • 이재식
      2002.06.12 12:44
      안녕하세요 실무상에서는 테이블 컴포넌트를 안쓰는것이 좋다고 전 개인적으로 생각합니다 ^^; 아무...
    • 박희경
    • 2002.06.12 10:27
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 이추형
      2002.10.09 00:03
      domain name server 이므로 범용서버를 찾으시면 가능합니다.
    • 강영원
    • 2002.06.12 10:03
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 이재식
      2002.06.12 12:36
      안녕하세요. 님이 원하시는 내용을 위해서 몇가지 추가를 해야하고 또 몇가지를 삭제해야 합니다. 스트...
    • 박영수
    • 2002.06.12 06:27
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2002.06.12 11:30
      안녕하세요. 최용일입니다. 흠~ 이 부분에서 Access violation에러가 날 이유는 없는데요... 한 줄씩 디...