Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


194 / 2272 ツリー ←次へ | 前へ→

【12595】データーの型について いーぐる428 14/8/14(木) 8:16 質問[未読]
【12596】Re:データーの型について かるびの 14/8/16(土) 1:38 回答[未読]
【12597】Re:データーの型について いーぐる428 14/8/16(土) 4:21 お礼[未読]
【12598】Re:データーの型について いーぐる428 14/8/17(日) 17:46 質問[未読]
【12599】Re:データーの型について かるびの 14/8/18(月) 2:13 回答[未読]
【12600】Re:データーの型について いーぐる428 14/8/18(月) 4:30 質問[未読]
【12602】Re:データーの型について かるびの 14/8/19(火) 0:48 回答[未読]
【12603】Re:データーの型について いーぐる428 14/8/19(火) 5:25 お礼[未読]

【12595】データーの型について
質問  いーぐる428  - 14/8/14(木) 8:16 -

引用なし
パスワード
   お世話になります。

部品情報が含まれているテーブル「部品マスター」は
プレフィックス  (短いテキスト)
部品番号     (短いテキスト)
サフィックス   (短いテキスト) 
部品名、     (短いテキスト) 
等のフィールドでできています。

今、部品番号を自動的に採番するために以下のような例を参照しました。

Private Sub Forom_BeforeInsert(Cancel As Integer)
 If Dcount("*","部品マスタ")= 0 then
   Me.部品番号 = "0000001"
 Else
   Me.部品番号 = Format(DMax("部品番号","部品マスタ") + 1,"0000000")
 End if
End Sub

ただし、テーブル定義では部品番号は短いテキスト型になっています。テーブルの部品番号の型を数値型にすれば問題ないのですが、型を変更できないとき、どのようにすればよいでしょうか。

また、プレフィックス、部品番号、スァフィックスの組で重複は許されません。
プレフィックス、部品番号、サフィックスが入力された時点で重複レコードがないかチェックし、あればアラーム、なければ続いて部品名等を入力したいです。

上記2点、ご指導の程よろしくお願いもうしあげます。

【12596】Re:データーの型について
回答  かるびの E-MAIL  - 14/8/16(土) 1:38 -

引用なし
パスワード
   >Private Sub Forom_BeforeInsert(Cancel As Integer)
> If Dcount("*","部品マスタ")= 0 then
>   Me.部品番号 = "0000001"
> Else
>   Me.部品番号 = Format(DMax("部品番号","部品マスタ") + 1,"0000000")
> End if
>End Sub
>
>ただし、テーブル定義では部品番号は短いテキスト型になっています。テーブルの部品番号の型を数値型にすれば問題ないのですが、型を変更できないとき、どのようにすればよいでしょうか。

 当方のアクセスは2003ですが、上記のコード(一部誤字がありますが)で
動きました。

 ただ、データ型をシビアに考えていくと、上記のコードには問題がありますね。
 問題となるのは、Else以下です。
 なお、「部品番号」フィールド中の最大の値が「0123」であるとします。

 「部品番号」フィールドはテキスト型ですから、
上記のDMax関数は、テキスト型の値である"0123"を返します。
 上記コードでは、"0123"に1を加えようとしていますが、
テキスト型の値に数値をプラスしようとしても、データ型違いというエラーになるはずです。

 アクセス2003では、暗黙の型変換というのが行われるのでエラーにはなりません。
つまり、"0123"という文字列を、VBAが勝手に数値と解釈してくれるということです。
 2007以降、データ型にはシビアになった、
つまり、暗黙の型変換をあまりやってくれないようになった
と聞いたことがあります。

 対策ですが、DMax関数の返り値はテキスト型なので、これを数値型に変えた上で、
1を加えればいいです。
 CLng関数を使います。


 ただ、「部品番号」フィールドをテキスト型とすることには賛成できません。
おそらく、「部品番号」は、例えば、「1234」ではなく、「0001234」のように表示したい
ということから、テキスト型にしたのだと思いますが、本末転倒です。
 第一に、
「部品番号」フィールドは、7桁の数字からなる文字列をその値とするようですから、
それに要するデータ量は、1レコード当たり、2バイト×7字=14バイトとなります。
他方、これを長整数型にすれば、1レコード当たり4バイトで済みます。
 データベースは、テーブルに何万レコードも格納しますから、1レコード当たり10バイトの差は、
レコード数が多くなるといろいろと効いてきます。

 第二に、コンピュータは、文字列と数値とでは、数値を処理する方が得意です。

 第三に、「部品番号」フィールドが長整数型のままでも、
「部品番号」テキストボックスのFormatプロパティをうまく設定してやれば、
テキストボックスに「0001234」のように表示させることは可能です。

 なので、少なくとも「部品番号」フィールドは数値型とすべきだと思います。


>また、プレフィックス、部品番号、スァフィックスの組で重複は許されません。
>プレフィックス、部品番号、サフィックスが入力された時点で重複レコードがないかチェックし、あればアラーム、なければ続いて部品名等を入力したいです。
 方法としては、2つ考えられます。
 第一に、プレフィックス、部品番号、サフィックスの各フィールドで
複合インデックスを作る方法が考えられます。
 でも、どこかの本に「重複排除のためだけにインデックスを使うのは好ましくない」
と書かれていましたし、私もそう思うので、おすすめできません。
 
 第二に、然るべきイベントで、DCount関数を使って、
同じ組み合わせが既にテーブルに格納されていないかどうかチェックするという方法です。
 使うイベントは、おそらくテキストボックスのBeforeUpdateイベントになると思います。
 また、DCount関数の第3引数に設定する条件式をどう書くかというところもポイントとなります。

【12597】Re:データーの型について
お礼  いーぐる428  - 14/8/16(土) 4:21 -

引用なし
パスワード
   かるびのさん、いつもいたらないわたくしにご教授いただきまして本当にありがとうございます。返信をよく拝見し、アドバイスに従ってトライしてみます。やはり部品番号は数値型に変更してもらった方がよいようですね。交渉してみます。
これからトライアンドエラーですが、また不明な点がありましたらご指導の程、よろしくお願いいたします。取り急ぎ御礼まで。

いーぐる428

【12598】Re:データーの型について
質問  いーぐる428  - 14/8/17(日) 17:46 -

引用なし
パスワード
   部品番号のデータ型を数値にすることはできました。

> 第三に、「部品番号」フィールドが長整数型のままでも、
>「部品番号」テキストボックスのFormatプロパティをうまく設定してやれば、
>テキストボックスに「0001234」のように表示させることは可能です。

と教えていただきましたが、テキストボックスのFormatプロパティを工夫してみても上記のように頭に0を付加して表示することができません。ご指導の程よろしくお願い申し上げます。

いーぐる428

【12599】Re:データーの型について
回答  かるびの  - 14/8/18(月) 2:13 -

引用なし
パスワード
   >テキストボックスのFormatプロパティを工夫してみても上記のように頭に0を付加して表示することができません。

 Form_Loadイベントで「部品番号」テキストボックスについて
   部品番号.Format = "0000000"
というコードを実行させるか、
 プロパティシートで、「部品番号」テキストボックスの「書式」プロパティに
「0000000」(ダブルコーテーションは付けません)と指定してみてください。

【12600】Re:データーの型について
質問  いーぐる428  - 14/8/18(月) 4:30 -

引用なし
パスワード
   かるびのさん、返信ありがとうございました。Form_Loadイベントがみつからなかったので、Form_Openイベントに

Private Sub Form_Open(Cancel As Integer)
 FBUBAN.Format = "0000000"
End Sub

としてうまくいきました。ただ部品番号フィールドの含まれる「品目マスタ」テーブルの中身をみてみると部品番号フィールドが7桁に満たない場合は頭にゼロが付加されません。数値型ですからしょうがないと思うのですが、例えばレポートで部品番号を印字するときには頭にゼロを付加するなんらかの処置がとれると勝手に思っていますが、品目マスタテーブルの部品番号フィールドをの中身を見たときにも頭のゼロを付加することはできませんでしょうか。ご指導の程、よろしくお願い申し上げます。

いーぐる428

【12602】Re:データーの型について
回答  かるびの  - 14/8/19(火) 0:48 -

引用なし
パスワード
   >ただ部品番号フィールドの含まれる「品目マスタ」テーブルの中身をみてみると部品番号フィールドが7桁に満たない場合は頭にゼロが付加されません。数値型ですからしょうがないと思うのですが、例えばレポートで部品番号を印字するときには頭にゼロを付加するなんらかの処置がとれると勝手に思っていますが、
 フォームでやったのと同じことを、レポートでも行えばいいです。
 つまり、レポートにおいて、「部品番号」フィールドをコントロールソースとする
テキストボックスのFormatプロパティを同様に設定します。

>品目マスタテーブルの部品番号フィールドをの中身を見たときにも頭のゼロを付加することはできませんでしょうか。
 方法がないわけではないですが、
テーブルの機能を考えると、そんなことはやらない方がいいと思います。

 テーブルは、レコードを保存しておくためのものです。
レコードを表示するためのものではありませんし、レコードを入力するためのものでもありません。
この点がエクセルのワークシートとは決定的に異なります。
 アクセスでは、レコードの表示や入力するためのオブジェクトは、フォームです。
 なので、レコードを見易くするための仕掛けをテーブルに設定するのは邪道です。

 また、データベース運用中にテーブルを開くような使い方は、やってはいけません。
 例えば、株式会社の表記法にはいろいろなものがあります。
 「株式会社」とか、全角括弧に「株」、半角括弧に「株」、
(株)を1字で表すもの(シフトJISの文字コードで878A)などです。
 これらがバラバラに使われていると、集計のときに困るので、
半角括弧に「株」以外のものの入力はできないような仕掛けをフォームに作ったとします。
 しかし、テーブルを直接開くと、例えば全角括弧に「株」という入力ができてしまいます。
 その結果、正しい集計ができないという事態に陥ってしまいます。
 なので、普通にデータベースを使っているときに、テーブルを開くような使い方はしてはいけないのです。

 テーブルを開くのは、データベースを改造するときに、
ちゃんとテーブルにレコードが保存されたかどうかをチェックするような場合に限られるはずです。

 このように、テーブルはレコードを保存するためのものであって、
レコードを表示するためのものではないので、
テーブルでのレコード表示を見易くしたいという希望は、そもそも持つべきではありません。


 私の回答は以上となりますが、それでもなお、テーブルにおいて頭のゼロを付加したいということがあるかもしれませんので、それへのヒントに触れておきます。
 結局はフォームの場合と同じです。
 つまり、テーブルにおけるフィールドのFormatプロパティを、
フォームと同様に設定してあげるということになります。
 VBAでの設定はできないので、デザインビューで設定します。
なお、デザインビューでのプロパティシートには、「Format」と表記されたプロパティはなく、
別の表記になっています。

【12603】Re:データーの型について
お礼  いーぐる428  - 14/8/19(火) 5:25 -

引用なし
パスワード
   かるびのさん、詳細にご回答いただき、本当にありがとうございます。下記の件よくわかりました。
わたくしACCESSやACCESS VBAのまったくの初心者ですが、今週の金曜日までに品目マスター管理プログラム(入力、修正、削除)を書かなければいけないことになっています。かなりハードルが高く、投げ出したくなりますがかるびのさんにご教授いただけることでどれだけ助かっていることか計り知れません。また質問が出てくるかもしれませんが、自分で出来るだけやってみて、どうしてもわからないことがありましたらまた質問いたします。よろしくお願いいたします。

いーぐる428


▼かるびの さん:
>>ただ部品番号フィールドの含まれる「品目マスタ」テーブルの中身をみてみると部品番号フィールドが7桁に満たない場合は頭にゼロが付加されません。数値型ですからしょうがないと思うのですが、例えばレポートで部品番号を印字するときには頭にゼロを付加するなんらかの処置がとれると勝手に思っていますが、
> フォームでやったのと同じことを、レポートでも行えばいいです。
> つまり、レポートにおいて、「部品番号」フィールドをコントロールソースとする
>テキストボックスのFormatプロパティを同様に設定します。
>
>>品目マスタテーブルの部品番号フィールドをの中身を見たときにも頭のゼロを付加することはできませんでしょうか。
> 方法がないわけではないですが、
>テーブルの機能を考えると、そんなことはやらない方がいいと思います。
>
> テーブルは、レコードを保存しておくためのものです。
>レコードを表示するためのものではありませんし、レコードを入力するためのものでもありません。
>この点がエクセルのワークシートとは決定的に異なります。
> アクセスでは、レコードの表示や入力するためのオブジェクトは、フォームです。
> なので、レコードを見易くするための仕掛けをテーブルに設定するのは邪道です。
>
> また、データベース運用中にテーブルを開くような使い方は、やってはいけません。
> 例えば、株式会社の表記法にはいろいろなものがあります。
> 「株式会社」とか、全角括弧に「株」、半角括弧に「株」、
>(株)を1字で表すもの(シフトJISの文字コードで878A)などです。
> これらがバラバラに使われていると、集計のときに困るので、
>半角括弧に「株」以外のものの入力はできないような仕掛けをフォームに作ったとします。
> しかし、テーブルを直接開くと、例えば全角括弧に「株」という入力ができてしまいます。
> その結果、正しい集計ができないという事態に陥ってしまいます。
> なので、普通にデータベースを使っているときに、テーブルを開くような使い方はしてはいけないのです。
>
> テーブルを開くのは、データベースを改造するときに、
>ちゃんとテーブルにレコードが保存されたかどうかをチェックするような場合に限られるはずです。
>
> このように、テーブルはレコードを保存するためのものであって、
>レコードを表示するためのものではないので、
>テーブルでのレコード表示を見易くしたいという希望は、そもそも持つべきではありません。
>
>
> 私の回答は以上となりますが、それでもなお、テーブルにおいて頭のゼロを付加したいということがあるかもしれませんので、それへのヒントに触れておきます。
> 結局はフォームの場合と同じです。
> つまり、テーブルにおけるフィールドのFormatプロパティを、
>フォームと同様に設定してあげるということになります。
> VBAでの設定はできないので、デザインビューで設定します。
>なお、デザインビューでのプロパティシートには、「Format」と表記されたプロパティはなく、
>別の表記になっています。

194 / 2272 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
1078188
(SS)C-BOARD v3.8 is Free