* テーブルの組み立て方から [#x9853c5c]
 |RIGHT:|LEFT:|c
 |~ページ|[[OpenOffice.org FAQの登録ページ]]|
 |~投稿者|Hiroshi|
 |~分類|#listbox3(Q&A,faq03,class)|
 |~優先順位|#listbox3(普通,faq03,priority)|
 |~状態|#listbox3(回答中,faq03,state)|
 |~カテゴリー|#listbox3(Base データベース,faq03,category)|
 |~投稿日|2011-07-21 12:37:49 (木)|
 |~OS|Windows XP|
 |~依存するページ||
 |~バージョン|#listbox3(3.3.0,faq03,version)|
 
 //////////バグ対策(以降マッチさせない)
 
 ** メッセージ [#u9743528]
 |LEFT:|c
 |回答ページでは行末に「~」を付加する必要はありません|
 #contents
 
 各製品の各工程の作業時間の管理をしたいと思い、
 Baseで入力・集計ができるようにしたいと考えております。
 
 初心者でまだ理解できていないことが多いのですが、
 どのようにテーブルを作ればいいのか考え、
 
 テーブル"製品"に 製品名、ロットNo、投入数、完成数、、~
 テーブル"工程"に 製品名、工程1、工程2、工程3、工程4、、~
 テーブル"作業時間"に 製品名、ロットNo、工程、作業時間~
 としてみたのですが、いいのかどうか。
 
 (製品毎に工程が異なります。他の製品と同じ工程があっても、製品毎に時間がかわります。)
 
 作業時間の入力には、
 1画面で1つの製品・ロットで全ての工程が自動的に表示されて、
 工程の右に入力できるようにできたらと思っています。
 
 自分で試行錯誤してやってみたのですが、
 どうもうまくいかず恐縮ですがアドバイスを頂きたいです。
 #clear
 
 ----
 ***サンプルの提供は可能ですか [#mbb9f425]
 >M.Kamataki (2011-07-21 17:45:17 (木))~
 ~
 「工程」についてもう少し詳しい情報がないとよくわかりません。~
 ~
 テーブル"工程"が「製品名、工程1、工程2、工程3、工程4、、」ということですが、工程のフィールドは4つでしょうか、それとも不特定多数でしょうか。~
 ~
 また、工程の種類を管理するテーブルなら、「工程」という名称のフィールドがあり、その中に「工程1」「工程2」「工程3」「工程4」…、というデータが格納されるという想定もありえます。~
 ~
 ご質問は、このような情報が不足しています。可能なら、faq/6/264に添付されている sample.odb のようなBaseのサンプルファイルの提供をお考えください。ある程度サンプルのデータも入力されていれば、上記のような疑問も解決するかもしれませんし。~
 ~
 ファイルの添付方法は、「当サイトの使い方/高度な使い方」をご覧ください。~
 
 //
 ***サンプルファイルを送ります。 [#w743e8fc]
 >Hiroshi (2011-07-22 01:54:40 (金))~
 ~
 工程については、実際には5〜30位の間の数で、製品によってばらばらです。~
 ~
 サンプルファイルはテーブルだけ作成してあります。~
 (そもそもテーブル・フィールドの組立がいいのかもよくわかりません。)~
 ~
 表計算でもサンプルを作りました。データパイロットで作成したような製品毎・ロットごとで各工程の時間平均などを見れるようにしたいと考えております。表計算でも可能なのですが、実際には工程も多く、ロットも多いので、なんとかデータベースで作りたいと思っています。~
 
 //
 ***要求条件を整理 [#f2702025]
 >M.Kamataki (2011-07-22 11:18:13 (金))~
 ~
 faq6_269sample.odb の「作業時間」テーブルを基にCalcのデータパイロット機能でデータ分析した各工程の平均時間の表を作成してみました。サンプルを添付します。~
 ~
 &attachref(faq6_269sample1.ods);~
 ~
 BaseのデータをCalcのデータパイロット機能で分析する方法は、faq/4/927「Baseでクロス集計を行うには」を参考にしてください。なお、上記サンプルでデータパイロットの更新を行う場合は、[ツール]−[オプション]でデータソースの登録が必要です。Hiroshiさんの環境ではすでに登録済みかもしれませんが、他の方は登録が必要です。~
 ~
 さて、データパイロットで利用した「作業時間」テーブルはクエリーで作成するのが現実的だと思います。そのためのテーブルとしては、製品名、ロット番号で区別される工程の手順用のテーブル、同じく製品名、ロット番号で区別される各工程の時間を記録するテーブルを作成する必要があると思います。~
 ~
 この2つのテーブルから現在の「作業時間」テーブルと同じクエリーテーブルになれば良いのだと思います。~
 ~
 なお、最終的なデータベースの規模はどのくらいを見込んでいますか。仮にレコード数が1万行を超えるようなら、Base標準のHSQLDBでは力不足なので、データベースエンジンはMySQLやPostgreSQLなどのしっかりとした実績のあるものを利用することもご検討ください。~
 
 //
 ***質問です。 [#rb57a035]
 >Hiroshi (2011-07-23 15:11:05 (土))~
 ~
 同じ製品であれば、工程はいつも同じです。(ロットが変わっても)~
 ~
 > 製品名、ロット番号で区別される工程の手順用のテーブル~
 ~
 とありますが、これがどうフィールドの設定をしていいのかがわかりません。。~
 ~
 製品名、ロット番号、工程1、工程2、というようにすればいいのでしょうか?~
 ~
 また、レコード数は1万行は超えるものとなります。~
 ~
 > Base標準のHSQLDBでは力不足なので、データベースエンジンはMySQLやPostgreSQLなどのしっかりとした実績のあるものを利用することもご検討ください。~
 ~
 とありますが、これもどう変更するのかもわかりません。~
 
 //
 ***高度なSQLを使用する必要があるかもしれません [#p80d61f5]
 >M.Kamataki (2011-07-25 02:44:07 (月))~
 ~
 とりあえずクエリーといいますか、SQL文で作業時間を集計してみました。以下の画面などは求めているものに近いでしょうか。~
 ~
 各工程の合計時間を一覧できる表~
 &attachref(faq6_269_01.png,nolink);~
 ~
 PCB11の工程作業の平均時間~
 &attachref(faq6_269_02.png,nolink);~
 ~
 サンプルのBaseファイルも添付します。~
 ~
 &attachref(faq6_269sample1.odb);~
 ~
 一応、入力フォームの問題も考えなければいけませんが、このような表などが「作業時間の管理」に役立つかどうかご確認ください。~
 ~
 平均時間を求める場合は、テーブルのデータ型ばかりでなく小数点以下の扱い方も気を付ける必要があったり、事前に整理しておく部分が多いと思います。~
 ~
 なお、MySQLなどのデータベースエンジンは、別途インストールする必要があります。ただし、インストール後はほぼBaseの標準データベースと変わらない操作になります。こちらは今は考えないほうが良いと思いますが、将来的には検討の必要があるでしょう。~
 
 //
 ***さらに高度なSQL [#j0230050]
 >M.Kamataki (2011-07-25 11:54:19 (月))~
 ~
 サンプルとしてご提供いただいたfaq6_269samnple.odbの「作業時間」テーブルに近いものをSQLで作成してみました。とりあえず作業工程のパターン別に作成する必要がありますね。~
 ~
 「工程」テーブルは以下のようなもの~
 &attachref(faq6_269_03.png,nolink);~
 ~
 「作業時間」テーブルは以下のようなものです。~
 &attachref(faq6_269_04.png,nolink);~
 ~
 製品「PCB11」の工程別の作業時間は以下のようなSQL文で実現しました。~
 &attachref(faq6_269_05.png,nolink);~
 ~
 こちらは以下のサイトを参考にしました。~
 ~
 横方向に並んだデータをクエリで縦方向に変える方法はありますか~
 http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1254636712~
 ~
 サンプルのBaseファイルも添付します。~
 ~
 &attachref(faq6_269sample2.odb);~
 
 //
 ***無題 [#ne2e0f31]
 >Hiroshi (2011-07-26 01:53:32 (火))~
 ~
 M.Kamataki様~
 ~
 ご返信ありがとうございます。~
 ~
 製品名毎の各工程の作業時間の特に平均値が見えるようになると役立ちます。~
 求めているのはまさにfaq6_269_02.png のようなものですが、~
 1つの製品ずつこのように算出するのでは、100種類の製品があるとすると手間がかかります。~
 ”PCB11の作業時間平均クエリー”の編集から条件のPCB11を削除すれば製品名毎結果が見えると思ってやってみたのですが、そうすると製品名毎の結果が出ますが、正しくないようです。~
 (たとえば、PCB21の梱包が8となる。12のはず。PCB21は梱包は5番目の工程ではなく、7番目の工程だからですね。)~
 ~
 faq6_269sample2.odb の”PCB11の工程別作業時間クエリー”のようにできると、データパイロットで表計算に書き出せます。しかしこれも100種類の製品があるとクエリをそのつど作るのは大変そうです。~
 ~
 結局まだどうすればいいのかがよくわかりません。~
 ~
 また、データを入力するときも入力しやすいフォームができたらと思っています。~
 1つの作業時間入力画面で製品名を入れるとその製品の全ての工程が自動的に表示されて、 各工程の右に入力できるようにできたらと思っています。~
 
 //
 ***整理しましょう [#w5c7404b]
 >M.Kamataki (2011-07-26 10:47:00 (火))~
 ~
 とりあえずBaseのクエリー(SQL)で何ができるのかご確認ください。Baseが今回の案件の目的を解決できるのか判断材料を提供しているところです。もしBaseでは難しいという判断になれば、他の解決手段を探してください。Accessを購入するというのが、解決手段になっても、それは仕方がないと思います。Accessならクエリーを発行してテーブルを更新することがGUIでできますが、Baseではマクロを使わないとできません。~
 ~
 さて、「PCB11の作業時間平均クエリー」ですが、~
 ~
 >1つの製品ずつこのように算出するのでは、100種類の製品があるとすると手間がかかります。~
 ~
 現在100種類の製品があって、仮に製品がこれ以上増えないのなら、手間は一度きりですから100種類のクエリーを作成することに価値があると思います。~
 ~
 また、製品が増える頻度が1ヶ月に1度くらいなら、今後は1ヶ月に1度新しいクエリーを作成するという作業が発生します。このような案件の整理が必要ではないでしょうか。その上で、判断してください。~
 ~
 作業時間の平均値を求めるというのが、今回の案件の目的なら、上記の判断でBaseを使うかどうかはっきりするはずです。~
 ~
 一方、「PCB11の工程別作業時間クエリー」のほうは工程数が同じものなら同じクエリーで解決します。つまり、工程数が「5〜30」なら26のクエリーですみます。~
 ~
 >データパイロットで表計算に書き出せます~
 ~
 とありますが、faq6_269sample.odsのサンプルを拝見すると、製品別の作業工程の平均時間を厳密に調べるためには、データパイロットの表から製品ごとに絞り込む必要がありますよね。もちろん、データパイロットはGUIで操作できるのでたやすくわかりやすいですが、結局はクエリーと同じ作業をしていることになります。~
 ~
 一度作成すれば事足りるクエリーと目的にたどり着くためには毎回GUI操作が必要になるデータパイロットとどちらが省力化できるのか、こちらも判断が必要かと思います。~
 ~
 フォームの話は、上記どちらかを決めないと先に進めないような気がします。フォームの構築は前者のほうがたやすいと思いますが、いずれにしてもマクロが必須だと思います。マクロに踏み込むのか、という判断も必要ですね。~
 ~
 ちなみに案件としては異なりますが、マクロを使えば、faq/4/1680「複数のテーブルからちょっとづつレコードを選択して、別のテーブルへ転記したい」のようなことは実現できるわけです。~
 
 //
 ***無題 [#p27f012f]
 >Hiroshi (2011-07-28 11:29:00 (木))~
 ~
 M.Kamataki 様~
 ~
 製品が増える頻度は1カ月に5個程度なので、対応できそうです。~
 ~
 平均値を求めるのが当面の主な使い方です。~
 ~
 (今までエクセルでほとんど仕事をしていましたので、~
 データベースだとあれこれとちょっと期待が先行しています。。。)~
 
 //
 #article