「Web出版サイト」ベータ公開

Q&A集[?]

当サイトでのご質問の受付は終了しました

すべてのコンテンツを読み込み専用としたため、回答欄からも投稿できません

Apache OpenOffice/LibreOfficeのご質問はそれぞれのフォーラムへご投稿ください

質問コーナー

サイト内検索

分類メニュー

関連サイト


本日:1
昨日:0
総数:1713
現在:7


別フィールドの値を参照にしながら、オートナンバーで数値を割り振っていく

ページOpenOffice.org FAQの登録ページ
投稿者ki
分類
edit/refer
優先順位
edit/refer
状態
edit/refer
カテゴリー
edit/refer
投稿日2009-09-08 10:40:51 (火)
OSWindows Vista
依存するページ
バージョン
edit/refer

メッセージ

回答ページでは行末に「~」を付加する必要はありません

添付のようにIDフィールドに自動で数値をつけていきたいと考えています。 同サービスがいくつ利用されているか整理するために、サービスコードに通し番号を付けたものをIDとして設定をしたいと思っています。 その際、サービスコードフィールドの値を引っ張ってきて、それに自動で3桁の数値を振っていき、同時にサービスコードフィールドの値が変われば(別サービスになれば)自動で001に戻ってナンバリングしていくような)自動で対応していく設定にしたいのですが、そのような設定は可能でしょうか。

number_sample02.jpg

実現方法

M.Kamataki (2009-09-08 11:30:50 (火))

SQLかマクロで実現することになると思います。

SQLの場合は、テーブルにデータが格納されませんが、サンプル画像のようにフォームに表示することは可能だと思います。SQLのほうがマクロより手軽です。ただし、レコードが削除されると、そのレコードに振られたIDは変化してしまいます。レコードは削除しないというルールが必要かもしれません。

マクロの場合は、サービスコードの更新のイベントに割り当てて実行させるようになると思います。つまり、サービスコードの確定後にIDが決まりますから、サンプル画像の順番だとちょっと戸惑うかもしれません。また、OpenOffice.orgのデフォルトでは、マクロが無効になっており、その設定を変更しないといけないのは、ちょっとわずらわしいかもしれません。

ということで、ご希望のサービスコードごとの通し番号をテーブルに格納するかどうかで、SQLかマクロか実現方法が決まると思います。ご希望の要件はどちらでしょうか。

p.s. 具体的なサンプルコードは調べていないので、いずれも実現可能かどうかは未定です。

SQLとマクロ

kimura (2009-09-08 13:41:34 (火))

先日に続きご回答ありがとうございます。
SQLかマクロも使用したことがないので、とんちんかんな質問になっていたら
申し訳ありません。

SQLの場合は、テーブルにデータが格納されないということですが、これはフォームでのみ表示され、テーブル内のIDフィールドにはデータが入らないということでしょうか。
目的としては、サンプル画像にしてあるテーブルが、メインテーブルとなっており、このIDフィールドがプライマリフィールドとなっているので、自動で割り当てられた値がIDフィールドに記録されるようにしたいと思っています。
今後IDフィールドの値も使用してクエリーやレポートも作成する予定です。

SQLやマクロを使ったことがない初心者が、考えなしに高度な設定を要求していたら申し訳ありません。
不可能や難しい設定になるようでありましたら、自動ではないやり方を再思考しようと思っています。よろしくお願いいたします。

不可能なこと

M.Kamataki (2009-09-08 17:08:23 (火))

>このIDフィールドがプライマリフィールドとなっている
これ、不可能です。

SQL的には、IDフィールドの値を、サービスコード+サービスコードでグループ化された最大値(通し番号)という式で割り出します。サービスコードはフォームの表示値を利用できるものの、サービスコードごとの通し番号は入力中のレコードが更新されないとわかりません。ところが、IDフィールドを未入力のまま更新しようとすると、プライマリキーの未入力ということで警告メッセージが表示されると思います。ということで不可能なわけです。

今お考えのIDフィールドとは別に、単純な通し番号のフィールドを設けて、そちらをプライマリキーにされたほうが無難です。このようなフィールドがあると、SQLで通し番号をつける際の並べ替えなどに利用できるので、むしろ必須のフィールドになります。

Re: 不可能なこと

M.Kamataki (2009-09-08 17:46:09 (火))

失礼しました。「サービスコード+サービスコードでグループ化された最大値(通し番号)+1」とすれば、不可能じゃないですね。

でも、単純な通し番号のフィールドをプライマリキーとして用意するのは必須かなと思っています。プライマリキーを計算で求めるというのは、なんとなくバグの温床になりそうな気がします。

SQLかマクロか

M.Kamataki (2009-09-09 06:34:58 (水))

>同サービスがいくつ利用されているか
これは以下のようなSQLで、サービスコードごとのカウント数の一覧が求められます。

SELECT "サービスコード",count("サービスコード") FROM "テーブル名" GROUP BY "サービスコード";

一番最初のコメントでも触れたように、レコードの削除の可能性によって、「SQLかマクロか」の検討にも影響が出そうです。

レコードの削除がない場合ですが、SQLでもマクロでも、上記と同じSQLを使って通し番号の基になるサービスコードごとのカウント数を計算できます。

一方、レコードの削除がある場合ですが、SQLでの実現方法では同じ式が使えます。しかし、マクロでは以下のように、すでに入力された通し番号の最大値を求めるSQLを使うことになると思います。サービスコードごとの数をカウントしてしまうと、入力済みのIDと番号が重なってしまい、入力時にエラーになります。

 SELECT max("ID") FROM "テーブル名" GROUP BY "サービスコード" WHERE "サービスコード" = 求めたいサービスコード番号;

この場合、IDの末尾3桁の通し番号は、「同サービスがいくつ利用されているか」の要件は満たさないことになります。IDの末尾3桁の通し番号は過去削除されたものも含む累計になるわけです。もちろん、「同サービスがいくつ利用されているか」はcount("サービスコード")のほうのSQLでいつでも求められます。

SQLかマクロかを判断するためには、このあたりの整理も必要ですね。

ありがとうございます。

kimura (2009-09-09 13:14:37 (水))

いつも丁寧なご回答を本当にありがとうございます。

SQLかマクロか、いずれにせよ、まずプライマリキーを計算で求めず、単純な通し番号のフィールドを設けようと思います。
レコードの削除の可能性については現在社内で検討中ですので、
今後の構築の方向を整理したうえで、お教えいただいた方法を試してみようと思います。

知識の浅いわたしにいつも丁寧にご回答いただき、本当に感謝しています。
ありがとうございました。

お名前:
題名:


添付ファイル: filenumber_sample02.jpg 837件 [詳細] filenumber_sample.jpg 527件 [詳細]