FC2ブログ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

↑やる気アップにご協力をお願いします。わぁいヽ(∇⌒ヽ)(ノ⌒∇)ノわぁい♪

こんな記事もありますよ


連番を取得したい

本日のお悩みは・・・

レコードに連番を利用したいと思ってるんだけど・・・
商品ID毎に連番を振ろうとした場合、
オートナンバーが利用できないんですけれど・・・

つまり・・・

オートナンバーを利用せずに連番を取得したい

ということですね (-_-☆キラーン



連番を取得する場合は、テーブルの型でオートナンバー型を
取得するのが一番簡単だと思います。

が・・・、オートナンバー(インクリメント)を利用する場合、
例1)のように、商品Noに対して、レコード毎に連番が振られてしまいます

例1)
商品ID
商品No
AAA
1
AAA
2
BBB
3
AAA
4
BBB
5
CCC
6

となってしまうわけです。

でも今回は、例2) のように商品ID毎に、商品Noの連番を振りたいわけです。

例2)
商品ID
商品No
AAA
1
AAA
2
BBB
1
AAA
3
BBB
2
CCC
1

(あ!(゚o゚;) そうそう・・・このテーブルの名前を仮にTbl_Aとしておきますね・・・)

上記のような連番を振っていくのに代表的なものが、
Dcount関数やDmax関数が、よく利用(説明)されたりします。

個人的にDcount関数では、問題が発生する可能性が高くなるので、
Dmax関数で説明しませう (@_@)/

え? どんな問題が発生するのかって?

もう~・・・あわてんぼさんなんだから~~~・・・

・・・あ・・・ごめんなさい・・・調子にのりました・・・・・・
とりあえず、その鈍器、床においてください・・・・・・
・・・そのグーも・・・ね・・・ね・・・って・・・お願いします。m(_ _)m

えっと、Dmax関数で作成した後に説明しますので・・・

とりあえず、今回の連番の振り方を文章で書いてみたいと思います。

「"tbl_A"の中で、"商品IDが○○○になっている"、"商品No”の最大値を求める」

ということですね・・・。

ちょっと補足的に記述すると
「"tbl_A"(テーブル名)の中で、"商品IDが○○○になっている"(条件)、
"商品No”(最大値を求めるフィールド)の最大値を求める」となります。

これをDmax関数に当てはめてみたいと思います。
Dmax("最大値を求めるフィールド","テーブル名","条件")
上記のような感じで、Dmax関数は引数を設定します。
(記述している引数名は、Genzoが理解できる言葉に直しています。)

つまり、
Dmax("商品No","tbl_A","[商品ID] = ○○○")
という形になるわけです。

条件には○○○としていますが、仮にフォーム(仮にFrm_B)のテキストボックス(Txt_C)の
値を利用したい場合(Txt_Cには商品IDが入るとして)は
Dmax("商品No","tbl_A","[商品ID] = " & [Forms]![Frm_B].[Txt_C])
と記述すればよいわけです。

え?最大値じゃ、重複するって?? そうですね・・・だから・・・

この求めた最大値に+1をしてあげれば・・・連番として値を取得できるわけです。
つまり!
Dmax("商品No","tbl_A","[商品ID] = ○○○")+1
これでよいわけですよ・・・(-_-☆キラーン

どうですか? 動きましたか? え? エラー??
そんな・・・ありえませんよ・・・┐('~`;)┌

え?データが一件もない時にエラーになる??

(;゜∇゜)は! そうでした。Dmax関数内の条件に適応するデータが
存在しない場合・・・Dmax関数が返す値は・・・Null・・・
そのNull値に対して1を足しても・・・答えはNull・・・
チクショー (ノ#-◇-)ノ ~~┻━┻ チャブダイクラッシュ

そんな時に役に立つのがNz関数です・・・値がNullの場合、別の値を
代入することが出来る関数です。

今回はDmaxで求めた値がNullだった場合、「0」を返して欲しいわけです。
で・・・、その「0」に1を足して・・・連番の1となれば、おっけりんぐなわけです。

つまり、最終的にこれでどうでしょう?
Nz(Dmax("商品No","tbl_A","[商品ID] = ○○○"),0)+1


これで、連番の取得が可能になったと思います。
(良かった・・・ε-(´▽`) ホッ)

これで今日のお悩みは解決したと・・・( ゚o゚)あ・・・

Dcountの謎がまだでしたね・・・

だいぶ長くなったので、簡単に説明します。

Dcount関数では、条件に適合するレコードの件数を求める関数になります。

この場合、レコードの削除などを行ったりすると、条件に適合するレコードの数が、
既に商品Noに付与された連番の値を下回る可能性があるからです。

例えば、
AAAの商品Noが、既に5まで振られていたとします。
しかし、AAAの商品No3のレコードを削除していた場合、実際の商品AAAの
レコード数は、4件になるわけです。

この場合Dcount関数で求めたレコード件数に+1をする方法では
商品Noが「5」になってしまい、既存のデータと重複してしまいます。

Dcount関数では、このような問題が起こる可能性があるわけです。

データによっては、Dcountでも良い場合もあるかもしれませんが、
自分はいつも、Dmax関数で連番を作成しています。

・・・あぅあぅ・・・それと、もう1つ・・・今回は欠番に関しては、
全く考慮していません。そのうち考えてみたいと思います (;^_^A アセアセ

では、改めて・・・

これで今日のお悩みは解決したと、とりあえずしておきましょう。

ではでは・・・(・・)/ シュタ 。。。タタタッ。ヘ(;・・)ノ

今日の関数:

DMax関数・・・Dmax("最大値を求めるフィールド","テーブル名","条件")
 指定したテーブル(クエリ)から条件に適合したレコードで、指定したフィールドの最大値を
 求める関数。条件がない場合は、全レコードの中での最大値を返す。
 条件は複数あっても大丈夫で、その場合は ANDでつなげることができます。

Dcount関数・・・DCount("数を数えるフィールド","テーブル名","条件")
 指定したテーブル(クエリ)から、条件に適合したレコードを数える関数。
 フィールド名を特に指定せずに"*"と記述することも多い。
 条件は複数あっても大丈夫で、その場合は ANDでつなげることができます。

関数の引数に利用している言葉や説明は、自分の感覚の言葉にしています。
正しくはAccessのヘルプや参考書などで確認してください。(T‐T)
↑やる気アップにご協力をお願いします。わぁいヽ(∇⌒ヽ)(ノ⌒∇)ノわぁい♪

こんな記事もありますよ


コメントの投稿

非公開コメント

おもしろいですね^^

書きだしがまじめだったので
>もう~・・・あわてんぼさんなんだから~~~・・・
のところで飲み物吹いてしまいました(笑)

>Dmax関数内の条件に適応するデータが
>存在しない場合・・・Dmax関数が返す値は・・・>Null・・・
>そのNull値に対して1を足しても・・・答えはNull・・・

へ~私は連番とか振り直すことなかったのでとても参考になりました^^


Re: おもしろいですね^^

書き出しがまじめ・・・?え?え~~??まじめ??(゚ロ゚;ノ)ノ

真面目に不真面目がモットーなのに…orz

とりあえず、その所感が「あわてんぼさんv-238」なんですよ。
ヾ(@^▽^@)ノわはは

> へ~私は連番とか振り直すことなかったのでとても参考になりました^^

自分の作ったシステムに一切の自信がないので、
何度もデータの入力と削除を繰り返してしまうんですよ~。
なので、どうしても、考えないといけないところでした…(;^_^A アセアセ

そんなわけで、無駄な工数がどんどん増えてしまうGenzoでした。

Author's Profile ~自己紹介~

Genzo

Author:Genzo
PCは一応自作できるレベル。
ワード・エクセルなら基本的に
扱えるレベル。
プログラム・・・?ん?
VBA・・・?ん?ん??
それって美味しいですか?


~ 当ブログについて ~

~ Mail2Genzo  ~

Calender&Search かれんだーと検索

11 | 2018/12 | 01
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 - - - - -

Access2Genzo内で検索

Category ~かてごりー~

Comments Tree ~こめんとつりー~


Link ~りんく~

ブロとも申請フォーム

Counter ~かうんた~

Since 2010/08/01:

Online:

タグクラウド

最新トラックバック

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。