postgresのSEQUENCEを使って伝票番号を採番しています。
しかし、このシーケンスは時々、勝手にとび番となってしまい困っています。
もちろんCACHEは1としています。
プログラムが悪いのかデータベースの設定に誤りがあるのか不明な
状況です。何か調査の方法があれば教えて下さい。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

SEQUENCEは一意性を保証するものであり、連番を保証する


ものではありません。
連番にする必要があるのであれば、SEQUENCEは使用できません。
    • good
    • 0
この回答へのお礼

早々のご回答誠にありがとうございます。
知識不足のまま、 SEQUENCEを使用していました。
早く、連番用処理の作成に取り組みます。

お礼日時:2001/01/15 08:40

トランザクションを使用可能なデータベースサーバは


通常この現象が発生します。
したがって連番つけたければ自力で行う必要があります。
    • good
    • 0
この回答へのお礼

早々のご回答誠にありがとうございます。
ということは、Postgresに限らず、連番というのは、
自力で行わないといけないのですね。

お礼日時:2001/01/15 08:42

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す

このQ&Aと関連する良く見られている質問

QAccessで自前の自動採番処理で採番テーブルを

Accessで自前の自動採番処理で採番テーブルを作り、その採番テーブルに格納してある最後の主キーのNO.を取得して、それに1加算したものを、新規レコードの主キーの自動採番処理結果として設定するやり方を考えていますが、その場合に

1) 複数レコードにエクセルなどから複数行データをコピーして貼り付けた場合には、採番がうまくいくのでしょうか?行かない場合には、その対処策はありますでしょうか。

2) 一行、または、複数行を削除した場合には、採番は既に登録済みの最後のNo.から自動採番するようになると思いますが、通常のアクセスのシステムでは、このような挙動で宜しいのでしょうか?

ご回答のほうよろしくお願いします。

Aベストアンサー

#1 の回答は番号フィールドにNull がある複数のレコードが存在する場合の
サンプルです。
※最後に採番テーブルの番号の値を変更するのが抜けてました。
rs.close:set rs =nothing の前に
currentdb.execute("update 採番テーブル set 番号 =" & maxnum)
を追加してください。

1レコードずつ手入力で行っている場合はまた別の話になります。
フォームのレコード移動時イベントに
if me.newrecord then
me!フォームの番号コントロール名 = Nz(DMax("番号", "採番テーブル"), 0) +1
・・・とかになりますが
採番テーブルの方の番号を更新するタイミングは更新前処理に行えば
良いでしょう。

が、もしかしてマルチユーザー環境で・・・と考えているのなら
全部忘れてください。ハードルがぐっと上がりますので確かな回答は出来ません。
こちらが参考になるかと思いますけど。。。
[VB] DAO でユーザー定義カウンターを実装する方法
http://support2.microsoft.com/default.aspx?scid=kb;ja;191253

私からは以上です。

#1 の回答は番号フィールドにNull がある複数のレコードが存在する場合の
サンプルです。
※最後に採番テーブルの番号の値を変更するのが抜けてました。
rs.close:set rs =nothing の前に
currentdb.execute("update 採番テーブル set 番号 =" & maxnum)
を追加してください。

1レコードずつ手入力で行っている場合はまた別の話になります。
フォームのレコード移動時イベントに
if me.newrecord then
me!フォームの番号コントロール名 = Nz(DMax("番号", "採番テーブル"), 0) +1
・・・とかになりますが
採番テ...続きを読む

Q伝票番号の自動採番について

伝票番号の採番で、西暦+5桁という仕様です。
これを、年が変わってから入力する際に

新しい年(度)+00001

としたいのですが、どのようにプログラムを組んだらいいのか分かりません。
ちなみに今までのプログラムでは
Format関数や、DMax関数を使って自動採番していました。

Access2000での開発です。
どうぞよろしくお願いします。

Aベストアンサー

パソコンのタイマーから・・・・=システムの日付ですかね?
どちらにしろできると思いますが・・・・

テーブル名:伝票

フィールド:伝票No(数値型/長整数型)
      日付(日付/時刻型)

Dim StrSeireki As String

StrSeireki = Format(Me.日付, "yyyy")

If DCount("伝票No", "伝票", "Left(伝票No,4) = " & StrSeireki) = 0 Then
  Me.伝票No = StrSeireki & "00001"
Else
  Me.伝票No = DMax("伝票No", "伝票") + 1
End If

以上、フォーム上の日付更新時のコードです。
動作確認済み。
システムの時間をご希望であれば
Me.日付 → date()
にご変更を!

日付更新時に変更されないよう新規レコードのCheckは必要になるとは思いますが。
がんばって下さい。

Qアクセス メインフォームの伝票番号(DMax関数で連番)が11番以上自動連番されない。

こんばんは。どうしてなのか、原因がみつけられません。
解決方法をご教示いただけないでしょうか?よろしくお願いいたします。

事象:メインフォームの伝票番号が11番以上は自動連番されない。
(伝票番号10までは、新規追加すれば発番できていたのに、11以降、手入力で対応中。)

仕様:
table:伝票テーブル(伝票番号フィールドはテキスト型)
明細テーブル(明細番号フィールドはオートナンバー型)
※明細テーブルに伝票番号フィールドがあって、伝票テーブルの伝票番号フィールドとリレーションシップがかかっています。
Query:伝票クエリ
明細クエリ
Form:伝票フォーム
(伝票番号のプロパティ\データ\規定値に、=Nz(DMax("[伝票番号]","伝票テーブル")+1,1)と設定)
   明細フォーム

伝票フォームに、明細フォームをサブフォームとして組み込んでいます。
新規追加をすれば、伝票番号が発番されて、サブフォームへ明細情報を入力する。

イメージ画像添付します。

どうすれば、11以降も、自動連番されるのでしょうか?
困っています。どうかよろしくお願いいたします。

こんばんは。どうしてなのか、原因がみつけられません。
解決方法をご教示いただけないでしょうか?よろしくお願いいたします。

事象:メインフォームの伝票番号が11番以上は自動連番されない。
(伝票番号10までは、新規追加すれば発番できていたのに、11以降、手入力で対応中。)

仕様:
table:伝票テーブル(伝票番号フィールドはテキスト型)
明細テーブル(明細番号フィールドはオートナンバー型)
※明細テーブルに伝票番号フィールドがあって、伝票テーブルの伝票番号フィールドとリレ...続きを読む

Aベストアンサー

テキスト型の比較では
"10" < "2" ですからね。

伝票番号フィールド を 数値型にすれば問題ないんですが、
それじゃダメなの?

Qaccess 請求番号の自動採番

まったくわかりません!
よろしくお願いします。
仕様環境
WinXP  access2002

顧客管理のシステムを作っています。

テーブル
顧客テーブル(主キーは顧客番号 テキスト型)
請求テーブル(主キーは請求番号 テキスト型)
明細テーブル(主キーは明細番号でオートナンバー ダミーみたいな感じで使っています。)

そしてリレーションシップで顧客テーブル(1)→(多)請求テーブル(1)→(多)明細テーブルになっています。

顧客情報を入力するフォームを作りました。
主キーは顧客番号(テキスト型,入力モードON,インデックス いいえ)で
他のテキストボックス(例えば名前)に何かしら文字を入力すると自動で顧客番号を採番してくれます。
例:0001 0002 0003~

そしてそのフォームから請求書作成フォームに飛ぶように
「請求書作成ボタン」を作り、顧客情報も一緒にひっぱっていってくれる
請求書作成フォームを作りました。(入力したばかりの情報も最新の情報で更新してくれます。)

・・請求書作成フォームはサブフォームを使い3つのテーブルからなっています。・・
親フォーム:顧客テーブルから。
子フォーム:請求テーブルから。
孫フォーム:明細テーブルから。

主キーは請求番号で(テキスト型,入力モードON,インデックス はい(重複なし))
他のテキストボックス(例えば請求日)に何かしら入力すると自動で請求番号を採番してくれます。
例:A0001

そこで問題なのですが、顧客情報は入力する度、次々自動で採番してくれるんですが、
請求番号は一番最初のレコードの”A0001”だけ採番してくれて、
新しいレコードで請求書を作ろうとテキストボックスに文字を入力すると「型が一致しません」というエラーが出ます。

○ エラー内容
アクションエラーの実行
条件
true
アクション名
値の代入
引数
[請求番号],Format(DMax("請求番号","請求マスタ")+1,"A0001")


マクロは・・(参考書を参考にしています、マクロ名:自動採番マクロ)
-------------------------------------------------
条件 : DCount("請求番号","請求テーブル")=0
アクション : 値の代入
アイテム  : [請求番号]
式     :"A0001"
-------------------------------------------------
条件    : ...
アクション : マクロの中止
-------------------------------------------------
アクション : 値の代入
アイテム  : [請求番号]
式     : Format(DMax("請求番号","請求テーブル")+1,"A0001")
-------------------------------------------------
となっています。

念のため、主キーの入力モードを切り替えたり、式の"A0001"を単純に"1"にしたりしましたが、
請求番号はエラーが発生します。

原因がまったくわかりません。
よろしくお願いします!

まったくわかりません!
よろしくお願いします。
仕様環境
WinXP  access2002

顧客管理のシステムを作っています。

テーブル
顧客テーブル(主キーは顧客番号 テキスト型)
請求テーブル(主キーは請求番号 テキスト型)
明細テーブル(主キーは明細番号でオートナンバー ダミーみたいな感じで使っています。)

そしてリレーションシップで顧客テーブル(1)→(多)請求テーブル(1)→(多)明細テーブルになっています。

顧客情報を入力するフォームを作りました。
主キーは顧客番号(テ...続きを読む

Aベストアンサー

エラーの原因は#1のご回答通りだと思いますが、請求書番号作りなどで苦労しなくても良いような気もします。
単純に請求書番号をオートナンバーにしておき、入力フォームで請求番号を
・書式:\A0000
・使用可能:いいえ
にしておく。後は請求書印刷時などにFormat関数で整形してやればよいのでは?

Qアクセス 項目ごとに自動採番

講座名ごとに受付番号を自動採番したいのですが、出来るのでしょうか?

テーブル名 セミナー受付(講座名、受付番号・・・)
講座名     受付番号
セミナーA   1001、1002、1003のように連番
セミナーB   2001、2002、2003のように連番

他のサイトを見ても解決できなかったので、ご指導をお願いします。

Aベストアンサー

#3です

コンボボックス「セミナー名」のクリック時イベントに以下を記述してみてください。

Private Sub セミナー名_Click()
  Dim iNumS As Long
  Dim vTmp As Variant

  If (IsNull(Me.セミナー名)) Then
    Me.受付番号 = Null
    Exit Sub
  End If

  Select Case Me.セミナー名
    Case "セミナーA": iNumS = 1000
    Case "セミナーB": iNumS = 2000
    Case "セミナーC": iNumS = 3000
  End Select

  Me.受付番号 = Nz(DMax("受付番号", "セミナー受付", "セミナー名 ='" & Me.セミナー名 & "'"), iNumS) + 1
End Sub


※ 
選択したセミナー名の採番初期値を設定しておきます。
セミナー受付テーブルから、登録されているセミナー名の受付番号最大値を求めます。
なかったら、採番初期値+1を、あったら、最大値+1を受付番号に設定します。


※ この書き方になるとセミナー名が変わったとか・・・で修正が必要になります。
そこでコンボボックスに非表示で採番初期値を設定しておきます。

テーブル「T講座一覧」
講座ID 講座名  採番初期値
1   セミナーA  1000
2   セミナーB  2000
3   セミナーC  3000

コンボボックスの値集合ソースは、
SELECT 講座名, 採番初期値 FROM T講座一覧 ORDER BY 講座名;
として、
連結列: 1
列数: 2
列幅:4cm;0cm (2列目を表示しないように0に:4部分は適当に)

としておけば、

  Select Case Me.セミナー名
    Case "セミナーA": iNumS = 1000
    Case "セミナーB": iNumS = 2000
    Case "セミナーC": iNumS = 3000
  End Select

部分は、

  iNumS = Me.セミナー名.Column(1)

で、後々修正が要らなくなります。
(テーブルの内容を書き換えるだけの修正になります)

#3です

コンボボックス「セミナー名」のクリック時イベントに以下を記述してみてください。

Private Sub セミナー名_Click()
  Dim iNumS As Long
  Dim vTmp As Variant

  If (IsNull(Me.セミナー名)) Then
    Me.受付番号 = Null
    Exit Sub
  End If

  Select Case Me.セミナー名
    Case "セミナーA": iNumS = 1000
    Case "セミナーB": iNumS = 2000
    Case "セミナーC": iNumS = 3000
  End Select

  Me.受付番号 = Nz(DMax("受付番号...続きを読む


このカテゴリの人気Q&Aランキング

おすすめ情報