0

私は4glを進めるのが初めてです。特定の顧客の販売注文数をカウントする必要があるクエリが 1 つあります。

例: so_mstr としてテーブルがあり、so_cust は顧客名フィールドであり、so_nbr は販売注文番号フィールドです。

SQLで私はこのように試しました、

select so_cust,count(distinct so_nbr) from so_mstr group by so_cust.

進行中の私を助けてください。ありがとう。

4

1 に答える 1

5

ルール #1 -- 進捗はSQLではありません。4gl 内で SQL を使用しようとすると、痛みと苦痛以外の何物もありません。

4gl は、次のような限定された SQL-89 構文をサポートしています。

select count(*) from customer.

しかし、それはかなり前に製品に組み込まれたものであり、実際には 90 年代初頭からのチェックリスト指向の製品評価を満たすためのものです。アドホック クエリでの簡単なハックに役立つこともありますが、本格的な使用には適していません。IOW「いいデモになる」。実際の SQL は、SQL-92 インターフェイスを介してサポートされています。これは 4gl とは別の製品であり、Crystal Reports などのレポート ツールをサポートするために一般的に使用されます。

注文ごとに 1 つの「so_mstr」があり、すべての顧客の注文数を知る必要がある場合、それらのレコードをカウントする簡単な 4gl の方法は次のとおりです。

define variable i as integer no-undo.

for each so_mstr no-lock where so_mstr.so_domain = "xxx" break by so_mstr.so_cust:
  i = i + 1.
  if last-of( so_mstr.so_cust ) then
    do:
      display so_mstr.so_cust i.
      i = 0.
    end.
end.

あなたのコードは「個別」で何かをしようとしているので、顧客ごとの販売注文数の一意性に関する私の仮定は間違っている可能性があります (しかし、それは誰かの側で本当に悪い設計のようです)。

ブレーク グループと自動カウント関数を含む FOR EACH を使用すると、より複雑なことを行うことができますが、これらのオプションはそれほど高速ではなく、IMHO では読みにくいものです。特に4GLを始めたばかりの人にとっては。

(パフォーマンスのために「フィールドリスト」を使用することもできますが、それは接続が共有メモリ経由ではなくWAN経由である場合にのみ重要であり、構文が複雑になります。単純な例ではこれを行いたくありませんでした。)

于 2014-10-12T12:50:36.630 に答える