Microsoft Access ClubAccess超初心者対象ForumAccess初級者対象ForumAccess初・中級者対象ForumAccess VBA Tips ForumDAO、ADO、SQL Forum

     

No39524.欠番のない連番の振り方を教えてください

タイトル欠番のない連番の振り方を教えてください
記事No: 39524
投稿日: 2005/12/08(Thu) 11:58
投稿者: hoto45
OS:win2000
Access Version:2000
こんにちわ。
欠番の無い連番をマクロで!!驚きとともに私も挑戦と喜び勇んで記事No : 13559を
参考に挑戦してみました。

記事No : 13559  のミオナさん投稿記事以下
「まず、削除された番号を保管するテーブルを作ります。
そして、レコードを削除する時点で、欠番にする番号をそのテーブルに保管するという
のはいかがでしょうか。
フォームへ新規レコードを入力する際には、欠番が存在する場合はそのテーブルに保存
されている欠番の中から最小値を選びそれを再び連番として採用します。
と同時に、採用された欠番は欠番テーブルから削除します。
欠番がなければ番号の最小値+1の値を新規レコードの番号として付けます。
上記はマクロで実現できます。」
アクションクエリを2つ作りました。
 ・Q 欠番テーブル追加
 ・Q 欠番テーブル削除
マクロもM_自動採番M_レコードの削除と2つ作りました。
  ・フォームの「挿入前処理」イベント: M_自動採番
  ・表示中のレコードを削除するコマンドボタンを作ります。
        「クリック時」イベント: M_レコードの削除
実際にフォームからレコードを削除すると、追加クエリに追加されないためか
レコードを追加するといつも末番に1足してしまいます。
色々試してみたのですが、どこをどう直してよいか、途方にくれています。
M_自動採番をフォームの「挿入前処理」に行うということは、フォームを開いた
時点でもう新しい番号を取得しているはず、、、?ですか???
番号は空っぽのままで入力を始めると末番に1を足していってしまうのは、マクロ
作成がおかしいのでしょうか。
何回も何回もやり直ししてみました。私の技量で思い当たることは色々と試して
みたのですが、解決に至りません。
どうかアドバイスをお願いいたします。

タイトルRe: 欠番のない連番の振り方を教えてください
記事No: 39525
投稿日: 2005/12/08(Thu) 12:13
投稿者: TWEST
> M_自動採番をフォームの「挿入前処理」に行うということは、フォームを開いた
> 時点でもう新しい番号を取得しているはず、、、?ですか???

ヘルプより
 "BeforeInsert/挿入前処理" イベントは、新規レコードに最初の文字を入力したときに発生します。
 ただし、レコードが実際に作成される前に発生します。

タイトルRe^2: 欠番のない連番の振り方を教えてください
記事No: 39533
投稿日: 2005/12/08(Thu) 14:41
投稿者: hoto45
TWEST さま

早速ありがとうございます。
> ヘルプより
>  "BeforeInsert/挿入前処理" イベントは、新規レコードに最初の文字を入力したときに発生します。
>  ただし、レコードが実際に作成される前に発生します。

ということは、「フォームへ新規レコードを入力する際には、欠番が存在する場合はそのテーブルに保存
されている欠番の中から最小値を選びそれを再び連番として採用」ができていないということでしょうか。

変な質問の仕方しかできず、すみません。

つ、つまり、、、データを削除した時点で「Q 欠番テーブル追加」クエリにデータが追加されていないということでしょうか。
[T_A]テーブルを追加し、クエリの種類を「追加クエリ」に変更しました。
[T_A]テーブルから[番号]フィールドを追加し、その列の抽出条件欄には
[Forms]![データを入力するフォームの名前]![番号]としてレコードの追加を[番号]としています。
ちなみに、[番号]のデータ型は数値型:長整数型となっています。

タイトルRe^3: 欠番のない連番の振り方を教えてください
記事No: 39551
投稿日: 2005/12/08(Thu) 22:55
投稿者: TWEST
追加クエリ・削除クエリの中身が分からないとなんとも云えませんね。

タイトルRe^4: 欠番のない連番の振り方を教えてください
記事No: 39553
投稿日: 2005/12/09(Fri) 08:44
投稿者: TWEST
> 追加クエリ・削除クエリの中身が分からないとなんとも云えませんね。

まあ、空番テーブルを使わなくても、最小の空番号を探すだけなら

選択クエリ:

SELECT
IIf(DCount("*", "TBL", "番号=1"), Min(Q.空番号), 1) AS 空番号
FROM
[SELECT
TBL.番号 + 1 AS 空番号
FROM
TBL LEFT JOIN TBL AS T ON T.番号 = TBL.番号 + 1
WHERE
T.番号 IS NULL]. AS Q;

で、出来ますけど。
'TBLがテーブル名。
'飛んでいる番号が無い場合は、番号の最大 +1 が返る。

タイトルRe^5: 欠番のない連番の振り方を教えてください
記事No: 39564
投稿日: 2005/12/09(Fri) 16:51
投稿者: hoto45
TWESTさま
こんにちわ。
> > 追加クエリ・削除クエリの中身が分からないとなんとも云えませんね。
追加クエリ
INSERT INTO [T テーブル] ( 番号 )
SELECT [T テーブル].番号
FROM [T テーブル]
WHERE ((([T テーブル].番号)=[Forms]![F フォーム]![番号]));

削除クエリ
DELETE [T 欠番].番号
FROM [T 欠番]
WHERE ((([T 欠番].番号)=[Forms]![F フォーム]![番号]));
に作成してありました。

>
> まあ、空番テーブルを使わなくても、最小の空番号を探すだけなら
>
> 選択クエリ:
>
> SELECT
> IIf(DCount("*", "TBL", "番号=1"), Min(Q.空番号), 1) AS 空番号
> FROM
> [SELECT
> TBL.番号 + 1 AS 空番号
> FROM
> TBL LEFT JOIN TBL AS T ON T.番号 = TBL.番号 + 1
> WHERE
> T.番号 IS NULL]. AS Q;

欠番テーブル作らない方法というのもやってみました。

SELECT
IIf(DCount("*", "T テーブル", "番号=1"), Min(Q.空番号), 1) AS 空番号
FROM
[SELECT
T テーブル.番号 + 1 AS 空番号
FROM
T テーブル LEFT JOIN T テーブル AS T ON T.番号 = T テーブル.番号 + 1
WHERE
T.番号 IS NULL]. AS Q;

SQL 難しくて良く分からないので、コピペしたもののTBLだけ置き換えてみました。
構文エラーと出てしまいました、、、。T テーブル.番号 + 1が違うみたいなのです。(泣)
AS T ON Tはどういう意味なのでしょうか?難しくてヘルプと格闘していますが、理解が
できません。わかりやすく教えていただけないでしょうか。

タイトルRe^6: 欠番のない連番の振り方を教えてください
記事No: 39565
投稿日: 2005/12/09(Fri) 16:58
投稿者: TWEST
> SQL 難しくて良く分からないので、コピペしたもののTBLだけ置き換えてみました。
> 構文エラーと出てしまいました、、、。T テーブル.番号 + 1が違うみたいなのです。(泣)


まず、"T テーブル"というテーブル名を、T_テーブルなどのスペースを使わない名前に変更してから
もう一度やってみてください。
テーブル名やフィールド名にスペースや全角英数文字を使うと、ろくなことはないので
止めた方が良いです。

タイトルRe^7: 欠番のない連番の振り方を教えてください
記事No: 39566
投稿日: 2005/12/09(Fri) 17:48
投稿者: hoto45
TWEST さま
こんにちわ。
皆様半角英数とかを使っているのはそういう訳なのですね。
直したら出来ました。
ちゃんとちゃんと選択クエリに 欠番した番号が入っていました。ありがとうございます。

欠番テーブルも、追加クエリも削除クエリも使わなくても出来るんですか?すごい嬉しいです。
ででででで、でも、フォームのどこに入れたらいいのかわからないんです。
また、ボケたことを!?われながら聞いています。
フォームのどこでどういう風に使ったら良いのでしょうか。

タイトルRe^8: 欠番のない連番の振り方を教えてください
記事No: 39574
投稿日: 2005/12/09(Fri) 23:17
投稿者: TWEST
> フォームのどこでどういう風に使ったら良いのでしょうか。

1.作ったクエリを「空番クエリ」とでも名前を付けて保存してください。

2.マクロを作ります。
 アクション:値の代入
  アイテム:空番を入れる、フォームのテキストボックス名またはフィールド名
     式:DLookUp("空番号","空番クエリ") 注: = を付けないこと。

3.作ったマクロを、フォームのコントロール(テキストボックスなど)のうち、
 必ず入力を実行するコントロールの「更新後処理イベント」に設定してください。

タイトルRe^9: 欠番のない連番の振り方を教えてください
記事No: 39600
投稿日: 2005/12/12(Mon) 12:00
投稿者: hoto45
TWESTさま
出来ました。
イメージしていたものが、しかもすごくシンプルな形で!!
皆様の投稿記事をもっともっと勉強してAccessを少しでも使いこなせるよう
頑張っていきたいです。
SQLについては、良く理解できていないので、今後の課題としていきたいと思います。
ありがとうございました。

> > フォームのどこでどういう風に使ったら良いのでしょうか。
>
> 1.作ったクエリを「空番クエリ」とでも名前を付けて保存してください。
>
> 2.マクロを作ります。
>  アクション:値の代入
>   アイテム:空番を入れる、フォームのテキストボックス名またはフィールド名
>      式:DLookUp("空番号","空番クエリ") 注: = を付けないこと。
>
> 3.作ったマクロを、フォームのコントロール(テキストボックスなど)のうち、
>  必ず入力を実行するコントロールの「更新後処理イベント」に設定してください。


このAccessフォーラム過去ログ集は、Microsoft Access Club が運営しています

動画配信(ダウンロード、ストリーミング)対応の専用レンタルサーバー。データセンター設置場所はアメリカ合衆国です。: 動画サーバードットコム
動画配信(ダウンロード、ストリーミング)対応の専用レンタルサーバー。
データセンター設置場所はアメリカ合衆国です。
100Mbps〜1Gbpsまで対応できます。

 

ページの先頭へ 前ページへ戻る