■記事リスト / ▲上のスレッド
□投稿者/ キリマンジャロ -(2025/08/07(Thu) 12:51:48)
| WIN11、桐10S使用です いつもお世話になっております
項目 データ型 部品コード 文字列 加工数 通貨
表 部品コード 加工数
1 1200 6000
2 1200 7000
3 1200 4000
4 1200 10000
とデータがあります。このデータから部品コードごとに、加工数の中央値を出したいと考えております。 部品コードによって、レコードが奇数や偶数になっています。 中央値を簡単に出す方法があれば教えていただけますでしょうか。 よろしくお願いいたします。
|
|
|
▽[全レス10件(ResNo.6-10 表示)]
■15083 / ResNo.6) |
Re[1]: 中央値について
|
□投稿者/ うにん -(2025/08/13(Wed) 17:57:54)
| 文字列関数とか配列変数を使って1パスか2パスでできないかと思ったけど、文字長や要素数の制限が色々ありすぎて実際のデータには使えないかなあと思いました。
|
|
|
■15084 / ResNo.7) |
Re[2]: 中央値について
|
□投稿者/ ONnoji -(2025/08/13(Wed) 20:40:46)
| 2025/08/14(Thu) 21:10:24 編集(投稿者) 2025/08/13(Wed) 21:05:07 編集(投稿者)
> 文字列関数とか配列変数を使って1パスか2パスでできないかと思ったけど、 > 文字長や要素数の制限が色々ありすぎて実際のデータには使えないかなあと思いました。
↑これいいヒントですね。(^^♪
手続き実行 procedureName( "6000,7000,4000", &result )
こんなイメージかなぁ〜と思いました。アハハハha
◇ ◇ ◇ ◇ ◇ ◇ ◇
サンプルを作ってみました。
数日を目途に削除しますのでダウンロードはお早めに願います。
追記:2025-08-14
新たに元データから併合:連結でデータを集計する方式のサンプルを用意しましたので、この投稿のサンプルは削除しました。(^^ok ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇
部品コード 加工数 ---------------- 部品A 6000 部品A 7000 部品A 4000 部品A 10000 部品B 7000 部品B 4000 部品B 10000
■トレース
:&dimMax : 4 &oddNumber : 0 &pcsList : 6000,7000,4000,10000 :ソート前 1 &pcsListDim[ &i ] : 6000 :ソート前 2 &pcsListDim[ &i ] : 7000 :ソート前 3 &pcsListDim[ &i ] : 4000 :ソート前 4 &pcsListDim[ &i ] : 10000 : :ソート後 1 &pcsListDim[ &i ] : 4000 :ソート後 2 &pcsListDim[ &i ] : 6000 :ソート後 3 &pcsListDim[ &i ] : 7000 :ソート後 4 &pcsListDim[ &i ] : 10000 : :偶数 &dimMax : 4 &targetDimNumPrimary : 2 &targetDimNumSecondary : 3 :&targetDimNumPrimary : 2 &targetDimNumSecondary : 3 &result : 6500 ← 中央値 : ・・・・・・・・・・・・ :&dimMax : 3 &oddNumber : 1 &pcsList : 7000,4000,10000 :ソート前 1 &pcsListDim[ &i ] : 7000 :ソート前 2 &pcsListDim[ &i ] : 4000 :ソート前 3 &pcsListDim[ &i ] : 10000 : :ソート後 1 &pcsListDim[ &i ] : 4000 :ソート後 2 &pcsListDim[ &i ] : 7000 :ソート後 3 &pcsListDim[ &i ] : 10000 : :奇数 &dimMax : 3 &targetDimNum : 2 &result : 7000 ← 中央値 : ・・・・・・・・・・・・
■test_中央値.kex
名札 メイン
*
手続き定義開始 cmd中央値を求めるClick( ) 変数宣言 自動,文字列{ &title = "cmd中央値を求めるClick( )" } 変数宣言 自動,文字列{ &partsCode } 変数宣言 自動,文字列{ &pcsList } 変数宣言 自動,文字列{ &comma = #jis( #hex("2C") ) } 変数宣言 自動,整数 { &multTblNum }
多重化 &multTblNum = #is表
解除 * /* 多重化した直後はすべて解除されていますが念のために */ 並べ替え { [部品コード]昇順 }
ジャンプ 行番号 = 先頭行 &partsCode = [部品コード] 繰り返し ( .not #eof )
&pcsList = &pcsList + #cond( &pcsList <> #u, &comma ) + #str( [加工数] ) **トレース出力 _&pcsList
ジャンプ 行番号 = 次行 /* これを忘れると無限ループになるよ */ if ( &partsCode <> [部品コード] ) **メッセージボックス &title, &partsCode + ":" + &pcsList, アイコン = i, ボタン指定 = 1
手続き実行 prc中央値を求める( &partsCode, &pcsList )
&partsCode = [部品コード] &pcsList = #u end 繰り返し終了
終了 表 &multTblNum
手続き定義終了
手続き定義開始 prcSort(参照 数値 &dim[] ) 変数宣言 自動,数値{ &s, &fin, &n, &i, &numA, &numB }
&n = #配列要素数( "dim" ) &s = 2 繰り返し
&fin = &s &s = &n 繰り返し &i = &n, &fin, -1
&numA = &dim[ &i ] /* 数値の場合は &numA */ &numB = &dim[ &i - 1 ] /* 数値の場合は &numB */
if ( &numA < &numB ) /* 数値の場合は &numA < &numB */ &dim[ &i - 1 ] = &numA /* 数値の場合は &numA */ &dim[ &i ] = &numB /* 数値の場合は &numB */ &s = &i end 繰り返し終了
if ( &s = &n ) 繰り返し中止 end 繰り返し終了
**<参考書籍> **現代データ構造とプログラム技法 萩原宏・西原清一 著 オーム社刊 ISBN4-274-12831-8 手続き定義終了
手続き定義開始 prc中央値を求める( 文字列 &partsCode, 文字列 &pcsList ) 変数宣言 自動,文字列{ &title = "prc中央値を求める( )" } 変数宣言 自動,文字列{ &comma = #jis( #hex("2C") ) } 変数宣言 自動,整数 { &dimMax } 変数宣言 自動,整数 { &oddNumber } /* 奇数ならば1 偶数ならば0 */ 変数宣言 自動,整数 { &i, &loop, &step = 1 } 変数宣言 自動,整数 { &targetDimNum } 変数宣言 自動,整数 { &targetDimNumPrimary, &targetDimNumSecondary } 変数宣言 自動,数値 { &result }
**メッセージボックス &title, &partsCode + ":" + &pcsList, アイコン = i, ボタン指定 = 1
&dimMax = 1 + #文字数( &pcsList ) - #文字数( #文字置換( &pcsList, &comma, #u ) ) &oddNumber = #mod( &dimMax, 2 ) トレース出力 _&dimMax, " ", _&oddNumber, " ", _&pcsList
変数宣言 自動,数値{ &pcsListDim[ &dimMax ] } &loop = &dimMax 繰り返し &i = 1, &loop, &step &pcsListDim[ &i ] = #num( #対応文字列( &pcsList, &i ) ) トレース出力 "ソート前", " ", &i, " ", _&pcsListDim[ &i ] 繰り返し終了 トレース出力 ""
手続き実行 prcSort( &pcsListDim) /* 配列変数:&pcsListDim を昇順でソートする */
&loop = &dimMax 繰り返し &i = 1, &loop, &step トレース出力 "ソート後", " ", &i, " ", _&pcsListDim[ &i ] 繰り返し終了 トレース出力 ""
if ( &oddNumber ) /* &oddNumber は1(イチ)または0(ゼロ)の論理値なので &oddNumber = 1 と書かなくて良い */
** 奇数 &targetDimNum = #切り上げ( &dimMax / 2, 0 ) &result = &pcsListDim[ &targetDimNum ] トレース出力 "奇数", " ", _&dimMax, " ", _&targetDimNum, " ", _&result トレース出力 ""
else
** 偶数 &targetDimNumPrimary = &dimMax / 2 &targetDimNumSecondary = &targetDimNumPrimary + 1 &result = ( &pcsListDim[ &targetDimNumPrimary ] + &pcsListDim[ &targetDimNumSecondary ] ) / 2 トレース出力 "偶数", " ", _&dimMax, " ", _&targetDimNumPrimary, " ", _&targetDimNumSecondary トレース出力 _&targetDimNumPrimary, " ", _&targetDimNumSecondary, " ", _&result トレース出力 "" end
メッセージボックス &title, &partsCode + "の中央値:" + #str( &result ), アイコン = i, ボタン指定 = 1
手続き定義終了
p.s.
なお、文字列型の配列変数のソートについては拙作webページをご覧ください。
コチラ ↓ 桐の釣魚大全のトップ > フォームアプリケーション教書 第2部 https://silicon7565.cloudfree.jp/guide/guide_Part2.htm#section28-1 28.1 配列変数のソート ■配列変数をソートする方法 ― 桐のイベント道場 かっこうログ 2002年06月03日より
|
|
|
■15085 / ResNo.8) |
Re[3]: 中央値について
|
□投稿者/ ONnoji -(2025/08/13(Wed) 23:55:07)
| そうそう、値が1つだったらどうするのかな??
それでも[中央値]と呼ぶのでしょうかね。アハハハ。
こんな感じでよさそうですが?・・・
◇ ◇ ◇ ◇ ◇
手続き定義開始 prc中央値を求める( 文字列 &partsCode, 文字列 &pcsList ) 変数宣言 自動,文字列{ &title = "prc中央値を求める( )" } 変数宣言 自動,文字列{ &comma = #jis( #hex("2C") ) } 変数宣言 自動,整数 { &dimMax } 変数宣言 自動,整数 { &oddNumber } /* 奇数ならば1 偶数ならば0 */ 変数宣言 自動,整数 { &i, &loop, &step = 1 } 変数宣言 自動,整数 { &targetDimNum } 変数宣言 自動,整数 { &targetDimNumPrimary, &targetDimNumSecondary } 変数宣言 自動,数値 { &result }
**メッセージボックス &title, &partsCode + ":" + &pcsList, アイコン = i, ボタン指定 = 1
&dimMax = 1 + #文字数( &pcsList ) - #文字数( #文字置換( &pcsList, &comma, #u ) ) &oddNumber = #mod( &dimMax, 2 ) トレース出力 _&dimMax, " ", _&oddNumber, " ", _&pcsList
変数宣言 自動,数値{ &pcsListDim[ &dimMax ] } &loop = &dimMax 繰り返し &i = 1, &loop, &step &pcsListDim[ &i ] = #num( #対応文字列( &pcsList, &i ) ) トレース出力 "ソート前", " ", &i, " ", _&pcsListDim[ &i ] 繰り返し終了 トレース出力 ""
手続き実行 prcSort( &pcsListDim) /* 配列変数:&pcsListDim を昇順でソートする */
&loop = &dimMax 繰り返し &i = 1, &loop, &step トレース出力 "ソート後", " ", &i, " ", _&pcsListDim[ &i ] 繰り返し終了 トレース出力 ""
if ( &oddNumber ) /* &oddNumber は1(イチ)または0(ゼロ)の論理値なので &oddNumber = 1 と書かなくて良い */
if ( &dimMax > 1 )
** 奇数 &targetDimNum = #切り上げ( &dimMax / 2, 0 ) &result = &pcsListDim[ &targetDimNum ] トレース出力 "奇数", " ", _&dimMax, " ", _&targetDimNum, " ", _&result トレース出力 ""
else
&result = &pcsListDim[ 1 ] トレース出力 "奇数", " ", _&dimMax, " ", _&targetDimNum, " ", _&result トレース出力 ""
end
else
** 偶数 &targetDimNumPrimary = &dimMax / 2 &targetDimNumSecondary = &targetDimNumPrimary + 1 &result = ( &pcsListDim[ &targetDimNumPrimary ] + &pcsListDim[ &targetDimNumSecondary ] ) / 2 トレース出力 "偶数", " ", _&dimMax, " ", _&targetDimNumPrimary, " ", _&targetDimNumSecondary トレース出力 _&targetDimNumPrimary, " ", _&targetDimNumSecondary, " ", _&result トレース出力 "" end
メッセージボックス &title, &partsCode + "の中央値:" + #str( &result ), アイコン = i, ボタン指定 = 1
手続き定義終了
|
|
|
■15086 / ResNo.9) |
Re[4]: 中央値について
|
□投稿者/ ONnoji -(2025/08/14(Thu) 10:32:04)
| 2025/08/17(Sun) 15:40:32 編集(投稿者)
> 手続き実行 procedureName( "6000,7000,4000", &result )
このイメージで、併合の[連結]を使って加工数リストを作成しました。(^^♪
添付ファイルがあります。
解凍すると4つのファイルがあります
test2_参照表.tbx test2_中央値.kex test2_中央値.tbx test2_中央値.wfx ← コマンドボタンを実行してください
数日を目途に削除しますのでダウンロードはお早めに願います。
◇ ◇ ◇ ◇
■ test2_参照表.tbx
項目番号 項目名 データ型 項目計算式 1 部品コード 文字列 2 加工数 数値 3 作業用 文字列 "," + #str( [加工数] )
部品コード 加工数 作業用 -------------------------- 部品A 6000 ,6000 部品A 7000 ,7000 部品A 4000 ,4000 部品A 10000 ,10000 部品B 7000 ,7000 部品B 4000 ,4000 部品B 10000 ,10000 部品C 500 ,500
■ test2_中央値.tbx
項目番号 項目名 データ型 項目計算式 1 部品コード 文字列 2 連結リスト 文字列 3 中央値 数値
部品コード 連結リスト 中央値 ---------------------------------------- 部品A ,6000,7000,4000,10000 6500 部品B ,7000,4000,10000 7000 部品C ,500 500
※このデータはフォームの[中央値を求める]ボタンを実行した結果の値
■ test2_中央値.wfx
フォーム ├ ファミリ ├ ワークスペース ├ フォーム操作バー ├ フォームヘッダ部 │ ├ cmd中央値を求める ← コマンドボタンを実行してください │ ├ a │ ├ lbl部品コード │ ├ lbl中央値 │ └ lbl連結リスト └ フォーム明細部 ├ 行セレクタ ├ txt部品コード ├ txt中央値 └ txt連結リスト
オブジェクト名: cmd中央値を求める 標題 : 中央値を求める
機能名 機能パラメータリスト 1 表示 2 手続き実行 cmd中央値を求めるClick 3 なし 4 なし
■ test2_中央値.kex
名札 メイン
*
手続き定義開始 prcSort(参照 数値 &dim[] ) 変数宣言 自動,数値{ &s, &fin, &n, &i, &numA, &numB }
&n = #配列要素数( "dim" ) &s = 2 繰り返し
&fin = &s &s = &n 繰り返し &i = &n, &fin, -1
&numA = &dim[ &i ] /* 数値の場合は &numA */ &numB = &dim[ &i - 1 ] /* 数値の場合は &numB */
if ( &numA < &numB ) /* 数値の場合は &numA < &numB */ &dim[ &i - 1 ] = &numA /* 数値の場合は &numA */ &dim[ &i ] = &numB /* 数値の場合は &numB */ &s = &i end 繰り返し終了
if ( &s = &n ) 繰り返し中止 end 繰り返し終了
**<参考書籍> **現代データ構造とプログラム技法 萩原宏・西原清一 著 オーム社刊 ISBN4-274-12831-8 手続き定義終了
手続き定義開始 cmd中央値を求めるClick( ) 変数宣言 自動,文字列{ &title = "cmd中央値を求めるClick( )" } 変数宣言 自動,文字列{ &targetTbl } 変数宣言 自動,整数 { &status }
解除 * 行削除 *, 圧縮
&targetTbl = #一括パス名 + "test2_参照表.tbx" 併合 &targetTbl, 両方, 編集表 = する, 終了状態 = &status, { [部品コード]照合[部品コード],[連結リスト]連結[作業用] } **戻り値 説明 ** 1 正常に終了した ** 0 共有違反以外のエラーが発生した **-2 他の利用者が置換や併合などの処理を実行中(ファイル排他) トレース出力 _&status, " ", _&targetTbl
if ( &status = 1 ) 手続き実行 prc中央値を求める( ) else メッセージボックス &title, "[併合]コマンドの実行に失敗しました:終了状態 = " + #str( &status ), アイコン = e, ボタン指定 = 1 end
手続き定義終了
手続き定義開始 prc中央値を求める( ) 変数宣言 自動,文字列{ &title = "prc中央値を求める( )" } 変数宣言 自動,数値 { &result }
解除 * ジャンプ 行番号 = 先頭 繰り返し ( .not #eof )
手続き実行 prc中央値の計算( [部品コード], #sstr([連結リスト], 2 ), &result ) /* #sstr([連結リスト], 2 ) は、先頭のコンマ(,)が不要のため */ 行訂正 [中央値] = &result
ジャンプ 行番号 = 次行 /* これを忘れると無限ループになるよ */ 繰り返し終了
手続き定義終了
手続き定義開始 prc中央値の計算( 文字列 &partsCode, 文字列 &pcsList, 参照 数値 &result ) 変数宣言 自動,文字列{ &title = "prc中央値の計算( )" } 変数宣言 自動,文字列{ &comma = #jis( #hex("2C") ) } 変数宣言 自動,整数 { &dimMax } 変数宣言 自動,整数 { &oddNumber } /* 奇数ならば1 偶数ならば0 */ 変数宣言 自動,整数 { &i, &loop, &step = 1 } 変数宣言 自動,整数 { &targetDimNum } 変数宣言 自動,整数 { &targetDimNumPrimary, &targetDimNumSecondary }
**メッセージボックス &title, &partsCode + ":" + &pcsList, アイコン = i, ボタン指定 = 1
&dimMax = 1 + #文字数( &pcsList ) - #文字数( #文字置換( &pcsList, &comma, #u ) ) &oddNumber = #mod( &dimMax, 2 ) トレース出力 _&dimMax, " ", _&oddNumber, " ", _&pcsList
変数宣言 自動,数値{ &pcsListDim[ &dimMax ] } &loop = &dimMax 繰り返し &i = 1, &loop, &step &pcsListDim[ &i ] = #num( #対応文字列( &pcsList, &i ) ) トレース出力 "ソート前", " ", &i, " ", _&pcsListDim[ &i ] 繰り返し終了 トレース出力 ""
手続き実行 prcSort( &pcsListDim) /* 配列変数:&pcsListDim を昇順でソートする */
&loop = &dimMax 繰り返し &i = 1, &loop, &step トレース出力 "ソート後", " ", &i, " ", _&pcsListDim[ &i ] 繰り返し終了 トレース出力 ""
if ( &oddNumber ) /* &oddNumber は1(イチ)または0(ゼロ)の論理値なので &oddNumber = 1 と書かなくて良い */
** 奇数 if ( &dimMax > 1 )
&targetDimNum = #切り上げ( &dimMax / 2, 0 ) &result = &pcsListDim[ &targetDimNum ] トレース出力 "奇数", " ", _&dimMax, " ", _&targetDimNum, " ", _&result トレース出力 ""
else
&result = &pcsListDim[ 1 ] トレース出力 "奇数", " ", _&dimMax, " ", _&targetDimNum, " ", _&result トレース出力 ""
end
else
** 偶数 &targetDimNumPrimary = &dimMax / 2 &targetDimNumSecondary = &targetDimNumPrimary + 1 &result = ( &pcsListDim[ &targetDimNumPrimary ] + &pcsListDim[ &targetDimNumSecondary ] ) / 2 トレース出力 "偶数", " ", _&dimMax, " ", _&targetDimNumPrimary, " ", _&targetDimNumSecondary トレース出力 _&targetDimNumPrimary, " ", _&targetDimNumSecondary, " ", _&result トレース出力 "" end
メッセージボックス &title, &partsCode + "の中央値:" + #str( &result ), アイコン = i, ボタン指定 = 1
手続き定義終了
p.s.
なお、文字列型の配列変数のソートについては拙作webページをご覧ください。
コチラ ↓ 桐の釣魚大全のトップ > フォームアプリケーション教書 第2部 https://silicon7565.cloudfree.jp/guide/guide_Part2.htm#section28-1 28.1 配列変数のソート ■配列変数をソートする方法 ― 桐のイベント道場 かっこうログ 2002年06月03日より
|
|
|
■15087 / ResNo.10) |
Re[5]: 中央値について
|
□投稿者/ キリマンジャロ -(2025/08/20(Wed) 13:41:26)
| うにんさん、ONnojiさんありがとうございます。
アドバイスを頂いて、中央値の値を求めることが簡単になりデータの集計がかなり楽になりました。 また、質問させていただくかと思いますが、よろしくお願いします!
|
解決済み! |
|
■記事リスト /
レス記事表示 →
[親記事-9]
[10-10]
|