過去の桐井戸端BBS (桐ver.9)
29867 ある項目に2行以上同じ数値が表示されていたら別の項目に加算したい。 景浦 2005/05/09-11:39
宜しくお願いいたします。

[項目A]に●が表示されていて、なおかつ[項目D]に2行以上同じ「数値」が表示されていたら
[項目B]の数値を[項目C]に自動加算させたい。

項目[D]  [A]   [B]   [C]
  111   ●     3
  111   ●     2
  111   ●     1
  111   ●     3     9
  222   ●     4    
  333         3    
  444   ●     2
  444   ●     1     3

29872 Re:二つの項目値が一致した場合、数値を加算したい。 Ryune 2005/05/09-20:03
記事番号29867へのコメント
一括処理を利用するなら、どうとでもなるでしょうが、
項目計算式だけで、対処しようとすると、無理なような気も。

ハードル1:項目計算式で、直前行より前の行の値が取得できないのでは?

ただ、「ハードル1」は、作業用項目をつくり、[項目D]が等しく、
[項目A]に"●"のある行の[項目B]の値を加算しておくことはでそうにおもいます。

ハードル2:項目計算式で、次行のデータ内容は取得できないのでは?

次行のデータ内容が取得できなければ、[項目D]の内容が、
次行で変わるかどうか(ひいては加算結果を代入するべきかどうか)わかりません。

計算式などで対応しようとすると、ハードル2が致命的のような。。。

・・・あくまでも、当方の判る範囲での回答ですので。。。

Ryune ver8sp6

29873 Re:二つの項目値が一致した場合、数値を加算したい。 うにん 2005/05/10-12:11
記事番号29867へのコメント
Ryuneさんの言ってる通りだと思います。

別の見方をすると、「明細部で小計を見たい」ということのようですが、
レポートならできるかと思ったのですが#SUMは総計でしかできませんね。。。

29874 Re:二つの項目値が一致した場合、数値を加算したい。 うにん 2005/05/10-12:18
記事番号29873へのコメント

>レポートならできるかと思ったのですが#SUMは総計でしかできませんね。。。

違った。伝票ならできました。
「●」の意味が今一わかりませんが(同じ[D]で●でない行があるのか、など)
伝票レポートで、グループ表示で下寄せにした小計オブジェクトを置いて
#SUM([B])を表示させるとイメージのようになります。

29875 ご回答ありがとう御座います。 景浦 2005/05/10-16:27
記事番号29867へのコメント
Ryuneさん うにんさん ご回答ありがとう御座います。
項目計算式では難しいことがわかりました。
レポートもしくは一括処理ですね。

> 一括処理を利用するなら、どうとでもなるでしょうが、
>項目計算式だけで、対処しようとすると、無理なような気も。

>伝票レポートで、グループ表示で下寄せにした小計オブジェクトを置いて
>#SUM([B])を表示させるとイメージのようになります。

うにんさんの回答については、この後にまだ加工処理があることからレポートでの処理は考えておりません。
(申しわけ御座いません説明不足で・・)

一括処理なら出来ると言うことですが、一括処理がわかりません。
一括処理なら[項目C]に計算結果を表示可能なのでしょうか。

29876 Re:二つの項目値が一致した場合、数値を加算したい。 しぼうかん 2005/05/10-20:44
記事番号29867へのコメント
景浦さんは こんばんは.

項目計算式だけでは無理な感じがしますが、項目[E]を追加して
2つの置き換え条件,1つの並べ替え条件,1つの履歴を使います。


1つ目の置き換え条件は・・・(1)

項目名=[E]
計算式=#条件選択(#直前値([D],"")=[D],#直前値([E],0)+[B],1,[B])

並べ替え条件は・・・(2)

整列項目=[D]
整列順=降順

2つ目の置き換え条件は・・・(3)

項目名=[C]
計算式=#条件選択(#直前値([D],"")<>[D] .and [A]=● .or #行番号=1 .and [A]=●,[E])

(1)→(2)→(3)と条件を実行した後に並べ替え解除をする操作を履歴に登録して実行。

こんな感じでどうでしょうか?
29877 もう少しご教授お願いいたします。 景浦 2005/05/11-12:09
記事番号29876へのコメント
しぼうかんさんご回答ありがとう御座います。
希望がわいてきたのですがもう少しご教授お願いいたします。

>1つ目の置き換え条件は・・・(1)
>項目名=[E]
>計算式=#条件選択(#直前値([D],"")=[D],#直前値([E],0)+[B],1,[B])

※@[項目E]を追加して、項目計算式に上記の計算式を入れました。
  [項目D]の同じ数値毎に加算されております。(希望通りです。)

>並べ替え条件は・・・(2)
>整列項目=[D]
>整列順=降順

※B[項目D]を手動で昇順並べ替え後、手動で[項目C]の項目置き換えを
  それぞれ履歴登録でしょうか。

>2つ目の置き換え条件は・・・(3)
>項目名=[C]
>計算式=#条件選択(#直前値([D],"")<>[D] .and [A]=● .or #行番号
>=1 .and [A]=●,[E])

※A[項目C]の項目計算式に上記計算式を入れました。
  [項目C]に数値が表示されるのですが[項目D]の同数値の1行目に[項目E]の数値
   が表示されます。
◎[項目D]の同数値の最終行に[項目E]の数値を表示することは可能でしょうか。
 -----------------------------------------------------------------------------

>(1)→(2)→(3)と条件を実行した後に並べ替え解除をする操作を履歴に登録し
>て実行。

※C(1)及び(3)は項目計算式上に計算式が既に入れてあるため、
  履歴登録=(2)→[項目C]もしくは[項目E]での項目置換→再計算→並替えの解除
  上記の通りの理解で宜しいのでしょうか。

 宜しくお指導お願いいたします。

29878 Re:もう少しご教授お願いいたします。 うにん 2005/05/11-12:17
記事番号29877へのコメント

>>並べ替え条件は・・・(2)
>>整列項目=[D]
>>整列順=降順

[D]はグループ項目なので必ずしも降順にする必要はなくて、

>◎[項目D]の同数値の最終行に[項目E]の数値を表示することは可能でしょうか。

この「最終行」を1行目にするために「降順」の整列をするわけです。
(最終行の判定はできないが1行目の判定はできるので、一旦逆順にして1行目に目的の数値を入れる)
したがって、グループ内でどの行が最終行なのかを決める項目が必要です。

他に、データでは[D]が同じなら[A]も同じになっていますが常にそうなのかどうかという点が。。。

29879 Re:もう少しご教授お願いいたします。 景浦 2005/05/11-15:23
記事番号29878へのコメント
うにんさん いつもご指導ありがとう御座います。

>>>並べ替え条件は・・・(2)
>>>整列項目=[D]
>>>整列順=降順
>
>[D]はグループ項目なので必ずしも降順にする必要はなくて、
>
>>◎[項目D]の同数値の最終行に[項目E]の数値を表示することは可能でしょうか。
>
>この「最終行」を1行目にするために「降順」の整列をするわけです。

項目[D]  [A]   [B]   [C]  [E]
  111   ●     3          9
  111   ●     1          6
  111   ●     2          5
  111   ●     3     3    3
                   (9にしたい)
--------------------------------------------------------------
並べ替え条件で[項目D][項目E]を降順で行い、
項目置き換えで再計算を行うと[項目C]が"3"となり
並べ替えを解除すると最終行が"3"になり、目的のグループ項目値の合計
"9"にはなりません。
※[項目C]を再計算すると、[項目E]も再計算されてしまいます。

>(最終行の判定はできないが1行目の判定はできるので、一旦逆順にして1行目に
>目的の数値を入れる)
>したがって、グループ内でどの行が最終行なのかを決める項目が必要です。

何行目が最終行かは決まっておりません。

>他に、データでは[D]が同じなら[A]も同じになっていますが常にそうなのかどうかという点が。。。
[項目D]が同数なら[項目A]も常に同じです。
宜しくお願いいたします。
29880 Re:もう少しご教授お願いいたします。 うにん 2005/05/11-15:58
記事番号29879へのコメント

>項目[D]  [A]   [B]   [C]  [E]
>  111   ●     3          9
>  111   ●     1          6
>  111   ●     2          5
>  111   ●     3     3    3
>                   (9にしたい)
>--------------------------------------------------------------
>並べ替え条件で[項目D][項目E]を降順で行い、
>項目置き換えで再計算を行うと[項目C]が"3"となり
>並べ替えを解除すると最終行が"3"になり、目的のグループ項目値の合計
>"9"にはなりません。
>※[項目C]を再計算すると、[項目E]も再計算されてしまいます。

[E]も[C]も項目置換の時の計算式で、項目計算式ではありません。
(一括処理で置換しないと有効な値にならないので項目計算式にする必要ありませんので)

>>(最終行の判定はできないが1行目の判定はできるので、一旦逆順にして1行目に
>>目的の数値を入れる)
>>したがって、グループ内でどの行が最終行なのかを決める項目が必要です。
>
>何行目が最終行かは決まっておりません。

逆順に整列すれば1行目になるので、最終行が何行目かは関係なくなります。
上の例のように[B]が常に1以上なら累計値の[E]を降順整列に使えます。

>>他に、データでは[D]が同じなら[A]も同じになっていますが常にそうなのかどうかという点が。。。
>[項目D]が同数なら[項目A]も常に同じです。

それでしたら、一度[A]="●"で絞り込んでから[C]に入れる処理をして、その後
1段解除すれば計算式が簡単になります。
[C]の置換は#COND(#直前値([D],"")=[D],[E])
これで上の例の「1行目」に9が入り、整列を解除すれば最終行になります。

29881 Re:もう少しご教授お願いいたします。 しぼうかん 2005/05/11-16:10
記事番号29877へのコメント
どうも私の説明が悪かった様です。

(1)(3)の計算式は項目計算式では無くて
表編集メニューの

編集→置換→条件名→新規作成

で作成して名前を付けて登録する置換条件の"項目名"欄と"計算式"欄に書く記述です。
つまり[E]と[C]の項目計算式の欄には何も書きません。

並べ替え条件も同様に

行操作→並べ替え→新規作成

で作成し名前を付けて登録する並べ替え条件の事です。

※今桐v9が手元に無く桐v8での操作手順なので細かい所で桐v9と操作が違うかもしれませんが、

29882 解決しました。ありがとう御座いました。 景浦 2005/05/11-16:44
記事番号29877へのコメント
しぼうかんさん うにんさん ありがとう御座いました。
あきらめておりましたが、おかげさまで解決できました。
やっと、次の工程に進めます。
今度ともご指導宜しくお願いいたします。

追伸:しぼうかんさん、体には十分気をつけてください。
29883 Re:ご回答ありがとう御座います。 Ryune 2005/05/11-19:13
記事番号29875へのコメント
解決済みのようですので、今更なのですが・・・・

一括ならどうとでもなる、といった手前、(一括好きの私としては)サンプルを出しておきます。

一括処理は、知っておくと、データ処理の幅も広がりますので、スキルアップの一助になればと思います。

以下のテキストを一括処理の定義内容に貼り付けて、一括処理ファイルを作成して下さい。

該当のテーブルファイルを開いた状態で、メニューで、
  ファイル-一括処理実行
で、上記の一括処理ファイルを指定すると、実行できます。

※事前に開くテーブルファイルは、処理対象のテーブルファイル1つだけにしてください。

では、以下がサンプルソースです。

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

変数宣言 文字列{&前行の項目D,&前行の項目A},数値{&前行までのB
累計,&加算回数}¥
     ,整数{&小計設定する,&当行加算する,&リターンコード}

*念のため、変数を初期化
&前行の項目D=#U, &前行の項目A=#U, &前行までのB累計=0, &加算回数=0

IF(#総件数<=0) /* 表に1件もレコードがなければ終了しておきます
*/
  確認 "表にレコードがありません"
  終了
END

ジャンプ 行番号=先頭 /* 処理対象行を先頭行にします */

*以下、1行目から順に確認していきます。
繰り返し

****小計を設定するかどうかのチェック
  IF(#終端行) /* 終端行(最終行の次の行)なら、小計設定を行って、
終了 */
    &小計設定する=1 /* 前行に小計を設定する */
    &当行加算する=0 /* 現在の行の[B]を加算しない・・・念のため
*/
  ELSE 
    IF(&前行の項目D=[D] .AND [A]="●") /* [D]が前行と同じで、[A]が● */
      &小計設定する=0 /* 前行に小計を設定しない */
      &当行加算する=1 /* 現在の行の[B]を加算する */
    ELSE IF(&前行の項目D=[D] .AND [A]<>"●") /* [D]が前行と同じで、[A]が●でない */
      &小計設定する=1 /* 前行に小計を設定する */
      &当行加算する=0 /* 現在の行の[B]を加算しない */
    ELSE IF(&前行の項目D<>[D] .AND [A]="●") /* [D]が前行と違いで、[A]が● */
      &小計設定する=1 /* 前行に小計を設定する */
      &当行加算する=1 /* 現在の行の[B]を加算する */
    ELSE IF(&前行の項目D<>[D] .AND [A]<>"●") /* [D]が前行と違いで、[A]が●でない */
      &小計設定する=1 /* 前行に小計を設定する */
      &当行加算する=1 /* 現在の行の[B]を加算する */
    END
  END

  IF(&小計設定する=1) /* 小計設定する場合 */
********小計設定
    IF(#行番号<>1) /* 1行目なら、小計設定を行わない */
      IF(&加算回数>=2) /* 累計の加算回数が1回以下なら、小計設定を行わない */
        ジャンプ 行番号=-1 /* 1行戻る */
        行訂正 終了状態=&リターンコード,[C]=&前行までのB累計  /* [C]に小計を設定 */
        ジャンプ 行番号=+1 /* 1行進む もとの行に戻る */
      END
    END
********終端行なら、終了する
    IF(#終端行)
      繰り返し中止
END
********累計をクリア
    &加算回数=0,&前行までのB累計=0
  END

  IF(&当行加算する=1) /* 処理対象行の[C]を加算する場合 */ 
    &加算回数=&加算回数+1, &前行までのB累計=&前行までのB累計+[B]
  END

  &前行の項目D=[D] /* Dの内容を保持 */

  ジャンプ 行番号=+1 /* 次の行へ進む */

繰り返し終了

確認 "終了"
終了 /* 念のため */

29898 Re:解決しました。ありがとう御座いました。 しぼうかん 2005/05/12-19:58
記事番号29882へのコメント
解決したとの事でなによりです。
すでに修正済みとは思いますがうにんさんが指摘している通り
[D]が同じ値の場合整列項目に[E]を加える([E]が1以上の場合)などの工夫をする必要がありますね。

(2)の並べ替え条件を

整列項目=[D] 整列順=降順
整列項目=[E] 整列順=降順

の様に変えるとか、別に整列用の項目を作るとか。


>追伸:しぼうかんさん、体には十分気をつけてください。

しぼうかんは脂肪歓と書きます・・・・ウソです。
29899 Re:解決しました。ありがとう御座いました。 悲しげ 2005/05/12-23:36
記事番号29898へのコメント
全然余談ですが。

>>追伸:しぼうかんさん、体には十分気をつけてください。
>
>しぼうかんは脂肪歓と書きます・・・・ウソです。

私は「しぼうかん」さんの名を、省略して「しぼう」さんと呼んでしまったことがあります。(^^;)
うっかりタイプミスだったのか、あるいはひょっとしたら確信犯的だったのか、
いずれにせよ、今となっては「記憶にございません」ですが・・・・。(^^;)

戻る