2017-07-07 7 views
0

進捗中のDBから値をフェッチする方法4glでは、最初にレコードが表示される値に基づいてレコードを選択する入力をユーザから受け取ります。私たちはそれを試みますが、正確な値を取得することはできません。進行中のDBからデータを取得する方法4gl?

これが私たちのプログラムです:

def var b as int. 
def var obj as int. 
/*set obj. 
prompt-for obj.*/ 
def var sum as int. 
def var a as int no-undo. 
def var i as int no-undo. 
for each po_mstr break by po_nbr. 
select count (*) from po_mstr. 
    assign 
     a = 1 
     b = 583 . 
    repeat: 
     if first-of (po_nbr) then 
      set obj. 
     prompt-for obj. 
     if (a le obj and obj lt b) then 
      disp po_nbr po_vend po_ship po_ord_date with 2 col. 
    end. 
end. 

私たちは与える場合にのみ、2つ以上の値が、それは同じ最初の値を表示することを意味し、単一のデータを取得することができます。

+0

ABLでSELECTを使用するのは悪い考えです! – Austin

答えて

0

これを分解しましょう。あなたは本当に自分のために何を実現していない多くのコマンドを使用しています。

FOR EACHはブロックを開き、選択した並べ替え順序で各ループのレコード読み取りを実行します(選択されていない場合は、プライマリインデックスが使用されます)。

SELECTはデータベース操作を実行しますが、必ずしもオンザフライではありませんが、そうでなくてもかまいません。

REPEATはブロックを開き、追加のコマンドでレコードをループする場合とそうでない場合があります。これを書いたのですが、どうすればいいですか?

def var a as int no-undo. 
def var b as int. 
def var sum as int. 
/* 
def var obj as int. 
update obj. 
def var i as int no-undo. 
you're not using this */ 
select count (*) into sum from po_mstr. 
/* is this what you wanted? To have the count in sum? I don't see a reason, but suit yourself */ 
assign a = 1 b = 583 . /* or use UPDATE a b. if you would like to make that variable */ 
/* Since a and b are not changing, I moved it to outside the loop */ 
for each po_mstr where po_nbr >= a and po_nbr < b: 
    disp po_nbr po_vend po_ship po_ord_date with 2 col. 
end. 

私はいくつかの自由を取った。私が評価できる限り、po_nbrの値をコピーして、それを使って見たい範囲に入っているかどうかを確認しようとしていたので、objを削除しました。私はpo_nbrがpo番号を表していると思うので、それはおそらくユニークです。私は、すべての反復がそれに対して異なる値を持つと推測します。したがって、最初の場合は使用する必要はありません。また、変数にコピーする必要もありません。あなたが見たいと思う範囲に直接比較するだけです。最後に、表示がうまくいくはずです。

私はあなたのチームが訓練を受けていないと仮定します。これは、QAD(実際にはどのERPソフトウェアでも)が無害であっても、パフォーマンスとユーザビリティに影響を与える可能性がある、実際には速くてひどく書かれたコードを膨らませるため、今後大変重要です。スタックオーバーフローは時間厳守の質問に役立つかもしれませんが、準備ができていない場合に実行する問題の種類はここで解決できない可能性があります。

これが役に立ちます。

関連する問題