2016-09-15 4 views
0

最初に、私は進歩4GLにはまだ新しく、各ブロックのネスティングがどのように機能するかについて頭を悩ませようとしています。私は、ivc_headerとivc_mchgsから情報を取得しています以下の2つの表があります。進捗状況関連するデータを表示するための4GLネスティングブロック

ivc_header 
    invoice_nbr  | sold_to_cust_nbr | sold_to_cust_seq | invoice_amt 
     1000051  |  70  |  0   | $1,000 
     1000049  |  70  |  1   | $1,500 
     1000010  |  310  |  0   | $2,000 
     1000011  |  310  |  1   | $2,500 

ivc_mchgs 
    invoice_nbr | line_nbr | misc_seq_nbr | extension 
     1000051 |  1 |  1  | $300 
     1000051 |  1 |  2  | $200 
     1000051 |  2 |  1  | $100 
     1000049 |  1 |  1  | $400 
     1000049 |  1 |  2  | $100 
     1000049 |  2 |  1  | $150 
     1000010 |  1 |  1  | $50 
     1000010 |  1 |  2  | $50 
     1000010 |  2 |  1  | $100 
     1000011 |  1 |  1  | $75 
     1000011 |  1 |  2  | $80 
     1000011 |  2 |  1  | $90 

ちょうどFYI、ivc_headerの主キーがinvoice_nbrあるとivc_mchgsのプライマリがinvoice_nbrからなる複合キーであるが、line_nbr 、およびmisc_seq_nbr。外部キーはinvoice_nbrです。

ivc_mchgsの情報は、データに関するちょっとしたメモです。請求書line_nbrによる雑多な料金です。

私が得ようとしているのは、総額invoice_amtと拡張子by sell_to_cust_nbr + sold_to_cust seqです。いくつかの調査をした後、ProgressのACCUMULATE関数を使う代わりに、変数に合計を入れることに決めました。ここで

は私が持っているコードです:

DEFINE VARIABLE cCustNum AS CHARACTER   NO-UNDO. 
DEFINE VARIABLE dInvoiceSubTotal AS DECIMAL  NO-UNDO. 
DEFINE VARIABLE dSurchargeTotal AS DECIMAL  NO-UNDO. 

FOR EACH ivc_header 
    NO-LOCK 
    WHERE (ivc_header.sold_to_cust_nbr = "000070") 
      OR (ivc_header.sold_to_cust_nbr = "000310") 
    BREAK BY ivc_header.sold_to_cust_nbr: 
    IF FIRST-OF(ivc_header.sold_to_cust_nbr) THEN 
     ASSIGN dInvoiceSubTotal = 0. 
     ASSIGN dInvoiceSUbTotal = dInvoiceSUbTotal + ivc_header.invoice_amt. 
    IF LAST-OF(ivc_header.sold_to_cust_nbr) THEN 
     DISPLAY ivc_header.sold_to_cust_nbr + ivc_header.sold_to_cust_seq FORMAT "x(9)" LABEL "CustNum" 
      dInvoiceSUbTotal LABEL "SubTotal". 
FOR EACH ivc_mchgs WHERE ivc_header.invoice_nbr = ivc_mchgs.invoice_nbr 
    NO-LOCK 
    BREAK BY ivc_mchgs.invoice_nbr: 
    IF FIRST-OF(ivc_mchgs.invoice_nbr) THEN 
     ASSIGN dSurchargeTotal = 0. 
     ASSIGN dSurchargeTotal = dSurchargeTotal + ivc_mchgs.extension. 
    IF LAST-OF (ivc_mchgs.invoice_nbr) THEN 
     DISPLAY 
       dSurchargeTotal LABEL "Surcharge". 
    END. 
END. 

このコードはsold_to_cust_nbr + sold_to_cust_seqで私に総invoice_amtを与え、invoice_nbrによる伸長を合計します。私のやり方を理解できないのは、sold_to_cust_nbr + sold_to_cust_seqで合計延長を得ることです。

何か助けていただければ幸いです。

おかげ

答えて

0

したい仮定の両方の請求書及び要約による交換、合計で:

IOWあなたがこのようなEACH何かのために内部をコーディングする場合がありますこの:

DEFINE VARIABLE cCustNum AS CHARACTER   NO-UNDO. 
DEFINE VARIABLE dInvoiceSubTotal AS DECIMAL  NO-UNDO. 
DEFINE VARIABLE dSurchargeTotal AS DECIMAL  NO-UNDO. 
DEFINE VARIABLE dSurchargeSubTl AS DECIMAL  NO-UNDO. 

FOR EACH ivc_header 
    NO-LOCK 
    WHERE (ivc_header.sold_to_cust_nbr = "000070") 
      OR (ivc_header.sold_to_cust_nbr = "000310") 
    BREAK BY ivc_header.sold_to_cust_nbr: 
    IF FIRST-OF(ivc_header.sold_to_cust_nbr) THEN 
     ASSIGN dInvoiceSubTotal = 0 
       dSurchargeSubTl = 0. 
    ASSIGN dInvoiceSUbTotal = dInvoiceSUbTotal + ivc_header.invoice_amt. 
    IF LAST-OF(ivc_header.sold_to_cust_nbr) THEN 
     DISPLAY ivc_header.sold_to_cust_nbr + ivc_header.sold_to_cust_seq FORMAT "x(9)" LABEL "CustNum" 
      dInvoiceSUbTotal LABEL "SubTotal" 
      dSurchargeSubTL LABEL "Srchg SubTl". 
    FOR EACH ivc_mchgs WHERE ivc_header.invoice_nbr = ivc_mchgs.invoice_nbr 
     NO-LOCK 
     BREAK BY ivc_mchgs.invoice_nbr: 
     IF FIRST-OF(ivc_mchgs.invoice_nbr) THEN 
      ASSIGN dSurchargeTotal = 0. 
     ASSIGN dSurchargeTotal = dSurchargeTotal + ivc_mchgs.extension. 
     IF LAST-OF (ivc_mchgs.invoice_nbr) THEN DO: 
      DISPLAY dSurchargeTotal LABEL "Surcharge". 
      ASSIGN dSurchargeSubTl = dSurchargeSubTl + dSurchargeTotal. 
     END. 
    END. 
END. 

エレガント方法は、左外部結合を使用して、両方のクエリを結合すること、およびACCUMUを使用しますLATE関数が動作するはずです。

2

は、私はあなたが句BY複数を指定できることを認識していないかもしれないと思います。その後、あなただけ行うことができ、

FOR EACH ivc_mchgs NO-LOCK WHERE ivc_header.invoice_nbr = ivc_mchgs.invoice_nbr 
    BREAK BY ivc_mchgs.invoice_nbr 
      BY ivc_mchgs.sold_to_cust_nbr 
      BY ivc_mchgs.sold_to_cust_seq: 

    IF FIRST-OF(ivc_mchgs.invoice_nbr) THEN 
     ASSIGN dSurchargeTotal = 0. 

    IF FIRST-OF(ivc_mchgs.sold_to_cust_nbr) THEN ... 

など

+0

複数のBY節のヒントをお寄せいただきありがとうございます。私は気付いていませんでした。 – CuriousOne

関連する問題