Q&A

  • DBGrid의 합산부분을 Table에 저장하는 방법좀...부탁
<!--CodeS-->
  With Query1 do begin
    if HavingTbl('Temptbl') <> -1 then
      begin
      Close;
      SQL.Clear;
      SQL.Add('drop table Temptbl');
      ExecSQL;
      end;
      // HavingTbl end
    Close;
    SQL.Clear;
    SQL.Add('Create Table Temptbl(CustName Text(20),');
    SQL.Add('CustCode Text(05),');
    SQL.Add('CustAmt Double,');
    SQL.Add('CustCostAmt Double,');
    SQL.Add('CustBeforeDebt Double,');
    SQL.Add('CustReceipt Double,');
    SQL.Add('CustTodayDebt Double,');
    SQL.Add('CustBuyTotal Double,');
    SQL.Add('CustPercent Double)');
    ExecSQL;

    Close;
    SQL.Clear;
    SQL.Add('Select Sa_Cust,Sa_Amt,Sa_CostAmt ');
    SQL.Add('from Sa010sm ');
    SQL.Add('Where Sa_Year = :edtDate and Sa_Jpgbn like :JpCheck ');
    SQL.Add('Order by Sa_Cust ');
    ParamByName('edtDate').AsString := edtYear.Text + edtMonth.Text + edtDay.Text;
    ParamByName('jpCheck').AsString := '0';
    Open;

    While i < RecordCount-1 do
      begin
        if DbGrid1.Fields[0].Value <> TempString1 then
          begin
            // 거래처 명을 받아오기 위한 쿼리
            Query2.Close;
            Query2.SQL.Clear;
            Query2.SQL.Add('Select Name ');
            Query2.SQL.Add('from As030sm ');
            Query2.SQL.Add('Where Cust = :Cust ');
            Query2.SQL.Add('Order by Cust ');
            Query2.ParamByName('Cust').AsString := DbGrid1.Fields[0].Value;
            Query2.Open;    // 조회시에는 Open, 삭제,업데이트시에는 Exec
            // 채무 테이블을 가져오는 쿼리
            Query3.Close;
            Query3.SQL.Clear;
            Query3.SQL.Add('Select Sb_J_JuruAmt, Sb_JuruAmt ');
            Query3.SQL.Add('from Sb040sm ');
            Query3.SQL.Add('Where Sb_Cust = :Cust ');
            Query3.SQL.Add('Order by Sb_Cust ');
            Query3.ParamByName('Cust').AsString := DbGrid1.Fields[0].Value;
            Query3.Open;    // 조회시에는 Open, 삭제,업데이트시에는 Exec

            inc(j);
            TempString1 := DbGrid1.Fields[0].Value ;
            Table1.Open;
            Table1.Insert;
            Table1.FieldByName('CustName').AsString := DbGrid3.Fields[0].Value ;
            Table1.FieldByName('CustCode').AsString := DbGrid1.Fields[0].Value ;
==>     Table1.FieldByName('CustAmt').AsFloat := StrToFloat(DbGrid1.Fields[1].Value);
            Table1.FieldByName('CustCostAmt').AsFloat := StrToFloat(DbGrid1.Fields[2].Value);

            if Query3.RecordCount > 0 then begin
              Table1.FieldByName('CustTodayDebt').AsFloat := StrToFloat(DbGrid4.Fields[0].Value);
              Table1.FieldByName('CustReceipt').AsFloat := StrToFloat(DbGrid4.Fields[1].Value);
              Table1.FieldByName('CustBeforeDebt').AsFloat := StrToFloat(DbGrid4.Fields[1].Value)
                                                                                     + StrToFloat(DbGrid4.Fields[0].Value);
            end;
            Next;
            DbGrid3.SetFocus;
            DbGrid3.SelectedIndex := j;
            if Query3.RecordCount > 0 then begin
              DbGrid4.SetFocus;
              DbGrid4.SelectedIndex := j;
            end;    
          end       // dbGrid의 거래처가 다를때
        else
          begin
==>     Table1.FieldByName('CustAmt').AsFloat := Table1.FieldByName('CustAmt').AsFloat +
                                                     StrToFloat(DbGrid1.Fields[1].Value);
            Table1.FieldByName('CustCostAmt').AsFloat := Table1.FieldByName('CustCostAmt').AsFloat +
                                                         StrToFloat(DbGrid1.Fields[2].Value);
            Next;
          end;
        inc(i);
      end;    // While end
  end;        // With end
<!--CodeE-->

좀 막짜서 보시기 어렵겠지만...
DB:MS Access 툴 : Delphi 7
임시테이블을 만들고 그곳에 값들을 집어넣어서 퀵리포트로 출력을 하려고 합니다.
일단 앞의 사항들은 제대로 다 돌아가는데요
Table의 값중  ==> 표시부분이 거래처가 다를때 값을 받는 부분이고
아래쪽의 ==> 표시부분이 거래처가 같을때 값을 받는 부분입니다.
그래서 DBGrid한줄에 거래처마다 한개씩만 값이 합쳐져서 보여집니다.
여기까지는 성공인데
실제 디비에는 한거래처에 5~4개씩 레코드가 있는걸

<!--CodeS-->
Ex)   거래처      공급가                                      거래처       공급가
        20001  1,253,252                                  20001   1,878,684
        20001     625,432      => DBGrid에서      20002   1,976,704
        20002     724,452
        20002   1,252,252
<!--CodeE-->

위와 같이 나타납니다.
여기서 거래처 전체의 공급가를 구해서 Table1의 CustBuyTotal필드에 넣을려구
하는데 생각만큼 잘 안되네요...
합산을 구한다음 각 거래처마다 전체 매출의 몇퍼센트인지 퀵리포트에 출력할려구 하니
방법이 잘 ....ㅠㅠ

고수님들 조언좀 부탁드립니다....


2  COMMENTS
  • Profile
    윤수아 2006.06.07 23:16
    음..
    Ex)   거래처      공급가                                      거래처       공급가
            20001  1,253,252                                  20001   1,878,684
            20001     625,432      => DBGrid에서      20002   1,976,704
            20002     724,452
            20002   1,252,252
    1.일케 하시구서
    2.전체 공급가는 1,878,684 + 1,976,704 = 3,855,388
    3.그리고 거래처 20001 , 20002  의 공급가에 대한 퍼센트를 구하고 싶다는 것이군요...

    우선 1번은 거래처로 Group By 하셔서 공급가를 Sum 하시면 될 거구요..
    2번은 Sum(공급가) 하시면 총액 나올 거구...
    3번은 1번과 2번을 적당히 섞으시면..

    우선 2번을 구하셔서 변수에 넣으시고...
    Select SUM(공급가) AS Total_I From Sa010sm
    myTotal := FieldbyName('Total_I').asinteger;

    그 다음 1번 쿼리
    Select 거래처, SUM(공급가), (SUM(공급가) / myTotal * 100)  AS AAA From Sa010sm
    Group by 거래처

    일케하시면... 거래처별로 공급가와 비율이 나오게 되지 않을까요?

    그리고 // 거래처 명을 받아오기 위한 쿼리 랑 // 채무 테이블을 가져오는 쿼리 이 부분은
    1번 쿼리 쓸때.. join으로 해서 할 수 있지 않을까요...

    음 자세히 뭘 하시는지 몰라서...

    A 테이블
    거래처 코드 , 거래처 이름

    B 테이블
    거래처 코드, 공급가

    원하는 테이블
    거래처 이름, 거래처별 총 공급가, 비율

    이라고 하면

    Select A테이블.거래처 이름, SUM(B 테이블.공급가), (SUM(B 테이블.공급가) / myTotal * 100)  AS AAA
    From A 테이블, B 테이블
    Where A 테이블.거래처 코드 = B 테이블.거래처 코드
    OrderBy A테이블.거래처 이름

    이렇게 될 거 에요.. 웅.. Order By랑 join이랑 별 문제 없나..음..기억이 가물치..가물치...

  • Profile
    초봉델파이어 2006.06.08 09:14


    위에 Group by를 잘쓰면 될거 같기도 한데요..
    전거래처가 아니라 거기에서 특정거래처들만 뽑아와서 임시테이블에 넣는거라서
    걍 노가다로...^^
    하고 있슴당..  시간이 좀 여유있을때 좀더 빠르게 돌수 있도록 수정해야지요.