自分のお店を開く時の心構えとは? >>

Accessは全くの初心者です。
プログラマーさんのサイトや質問サイトを参考に、初めてデータベースを作っているのですが、
どうしても文字+年ごとの自動採番がうまくいきません。

挿入前処理で「営250001」のように漢字1文字+和暦2桁+4桁連番にして、
年が変わるごとに4桁連番を0001に戻したいのです。

今入力してあるコードは以下の通りです。

-----------------------------------------------------------------------------
Private Sub Form_BeforeInsert(Cancel As Integer)

 Dim vDt As Variant

 vDt = DMax("番号", "営テーブル", "番号 Like '" & Format(Date, "ee") & "*'")
 If (IsNull(vDt)) Then
  番号 = "営" & Format(Date, "ee") & "0001"
 Else
  番号 = "営" & Left(vDt, 2) & Format(Val(Right(vDt, 4)) + 1, "0000")
 End If

End Sub
-----------------------------------------------------------------------------
この状態では、0001のまま採番が進まず、行き詰ってしまいました。

他の質問者さんが(Date,"ee")を(Now,"nn")に置き換えて、分ごとの採番を試していたのを参考に、
「"営"&」を取って、採番が進むところまでは確認できました。

使っているのはAccess2003です。

どうか、よろしくお願いします。

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

A 回答 (3件)

> vDt = DMax("番号", "営テーブル", "番号 Like '" & Format(Date, "ee") & "*'")



これでは、先頭の 「漢字1文字」 が無視されていますね。

vDt = DMax("番号", "営テーブル", "番号 Like '営" & Format(Date, "ee") & "*'")

とか、

vDt = DMax("番号", "営テーブル", "番号 Like '?" & Format(Date, "ee") & "*'")

さらに
> 番号 = "営" & Left(vDt, 2) & Format(Val(Right(vDt, 4)) + 1, "0000")


番号 = Left(vDt, 3) & Format(Val(Right(vDt, 4)) + 1, "0000")


上記は
"営テーブル"の "番号"フィールドには , 「営250001」 のように保存されているものとします。
1桁目は"営"固定の場合です。
そうでない場合は、また変わってきます。
    • good
    • 0
この回答へのお礼

できました!
vDtで定義した中にも1桁目の漢字が入らなければいけなかったんですね…
「"番号 Like '"」の部分が理解できていなかったので、
どこに1桁目の漢字を定義していいのかがわかっていませんでした。
教えていただいたとおりに直し、あらためてヘルプ等でLike演算子を調べ、
なんとなくですが、理解できた気がします。
テーブルごとに1桁目の漢字決め、固定して使うので教えていただいたコードで
進めたいと思います。

ありがとうございました。

お礼日時:2013/08/26 23:18

主キーに複数の意味を持たせるな


http://hatenachips.blog34.fc2.com/blog-entry-201 …

絶対に・・・というわけではないと考えますが
人間にとって分かりやすい ≒ データベースの処理に適切
だと思います。
    • good
    • 0
この回答へのお礼

作成中、いろいろ検索した中で、リンクしていただいたページも見てました。
たしかに、このままでは主キーとしては不安定ですよね。
この自動採番は、以前から使用していた番号の形式を使い、
何かの時にはこの番号で検索もしたいとのことだったので、
この番号以外に、オートナンバーの主キーを設定しています。
教えていただき、ありがとうございました。

お礼日時:2013/08/27 00:14

以下でどうなりますか



Private Sub Form_BeforeInsert(Cancel As Integer)
  Dim vDt As Variant
  Dim sS As String

  sS = "営" & Format(Date, "ee")
  vDt = DMax("番号", "営テーブル", "番号 Like '" & sS & "*'")
  If (IsNull(vDt)) Then
    番号 = sS & "0001"
  Else
    番号 = sS & Format(Val(Right(vDt, 4)) + 1, "0000")
  End If
End Sub

※ "営25*" で探すので、"事250123" とかあったら、
 "営" / "事" それぞれでの採番になると思います。

※ "営25" を作るところは1箇所にします。
 ほぼないと思いますが、前後で年を越したら・・・・
 もしかして http://oshiete.goo.ne.jp/qa/5749336.html とかを見られました?
 そこでは2箇所に記述していましたが・・・


なお、以下のような書き方もあるかも(未検証)
(DMax の戻り値の時に数値にしておく)

Private Sub Form_BeforeInsert(Cancel As Integer)
  Dim sS As String

  sS = "営" & Format(Date, "ee")
  番号 = sS & Format( _
          Nz( _
            DMax("Val(Right(番号, 4))" _
              , "営テーブル" _
              , "番号 Like '" & sS & "*'") _
          ) + 1 _
        , "0000")
End Sub


余談)

挿入前処理での採番ですが、更新前処理で採番する事もあると思います。
タイミング的にどちらが良いのか、それは判断してください。
その時には、新規レコードか判別して・・・・以下雰囲気で

Private Sub Form_BeforeUpdate(Cancel As Integer)
  Dim vDt As Variant
  Dim sS As String

  If (Me.NewRecord) Then
    sS = "営" & Format(Date, "ee")
    vDt = DMax("番号", "営テーブル", "番号 Like '" & sS & "*'")
    If (IsNull(vDt)) Then
      番号 = sS & "0001"
    Else
      番号 = sS & Format(Val(Right(vDt, 4)) + 1, "0000")
    End If
  End If
End Sub


不都合あれば修正してください。
    • good
    • 0
この回答へのお礼

そうです!
その質問ページを参考に、今の自動採番を作っていました。
30246kiku様が丁寧に回答されていたので、全くの初心者の私にも
だいぶ理解できるものでした。
私の質問にも回答いただけて、なんかちょっと嬉しい気が…(^^)

本題ですが、
「漢字+年」と「連番」で分けるという方法もあるんですね。
見た目がシンプルで、わかりやすいかも…
肝心の動作確認ですが、実はまだできてません^^;
職場へのデータの持込・持出厳禁なのと、自宅PCにAccessが入っていないのとで、
仕事の合間に作っている現状なのです。
とりあえずなお礼で申し訳ありませんが、この方法の動作確認ができたら、
最初の方法とどちらがいいか、検討したいと思います。

ちなみに、未検証で書いていただいたコードは、
すいません!Nz関数を調べてみても、初心者すぎる私には理解が難しく。。。
処理のタイミングも、どこか入力し始めたら番号が出るようにしたいので、
挿入前処理で進めたいと思います。

たくさんの回答例をいただき、ありがとうございました。

お礼日時:2013/08/27 00:00

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

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

このQ&Aを見た人が検索しているワード

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

Qaccess 自動採番 年が変わるごとに0001に戻る仕組み。

宜しくお願いします。

使用環境:access(2002-2007)

前回の続きでもありますが、自動で番号を採番する仕組みを作りました。
(一応、前回分も・・)http://oshiete1.goo.ne.jp/qa5742518.html
「10AA0001」から始まり、あとは後ろの数字が0002,0003~と増えていく仕様で出来ました。
最初の「10」というのは2010年のうしろ二桁の「10」です。(date関数)

(相談)
これを2011年になったら、後ろの数字を0001に自動的にセットし直す仕様にしたいのです、
そこから0002,0003~と増えるようにして、また年が変わるごとに0001にセットされるような仕組みにしたいです。

検索サイトで調べるとやり方が出てくるのですが、
まだVBAの理解力がないので、まったくもってわかりません。
たぶんIfで示されるDcount関数に関係があるのかなー、という気はします。
(前置きの部分なので)
僕にはちょっとレベルが高いかも知れませんが、理解できるよう努力します。

以下に、構文を書きます。
また来年になるまで「実際、変わるか検証ができない」というのもアレなので、
テスト環境ではnow関数を使い「hhnn」でやってます。
「分」が変わるごとに0001に戻れば自分なりにOKだと思っています。
(now関数で連番動作することは確認できました)


・・・・・・・・・

'------------------------------------------------------------
' Form_BeforeInsert
'
'------------------------------------------------------------
Private Sub Form_BeforeInsert(Cancel As Integer)
On Error GoTo Form_BeforeInsert_Err

If (DCount("見積り番号", "案件") = 0) Then
見積り番号 = "00AA0001"
Exit Sub
End If
見積り番号 = Right(Format(Date, "yyyy", 2), 2) & Format(DMax("Right(見積り番号,4)", "案件") + 1, "AA" & "0000")


Form_BeforeInsert_Exit:
Exit Sub

Form_BeforeInsert_Err:
MsgBox Error$
Resume Form_BeforeInsert_Exit

End Sub

・・・・・・・・・


○ now関数の場合 ※一文のみ抜粋
・・・・・
見積り番号 = Right(Format(Now, "hhnn", 2), 2) & Format(DMax("Right(見積り番号,4)", "案件") + 1, "AA" & "0000")
・・・・・

教えてください、宜しくお願いします。

宜しくお願いします。

使用環境:access(2002-2007)

前回の続きでもありますが、自動で番号を採番する仕組みを作りました。
(一応、前回分も・・)http://oshiete1.goo.ne.jp/qa5742518.html
「10AA0001」から始まり、あとは後ろの数字が0002,0003~と増えていく仕様で出来ました。
最初の「10」というのは2010年のうしろ二桁の「10」です。(date関数)

(相談)
これを2011年になったら、後ろの数字を0001に自動的にセットし直す仕様にしたいのです、
そこから0002,0003~と増えるようにして、...続きを読む

Aベストアンサー

年が変わったというのは、操作している日付で判別して良いのでしょうか。

その条件で、
以下ではどうでしょうか。

 Dim vDt As Variant

 vDt = DMax("見積り番号", "案件", "見積り番号 Like '" & Format(Date, "yy") & "*'")
 If (IsNull(vDt)) Then
  見積り番号 = Format(Date, "yy") & "AA0001"
 Else
  見積り番号 = Left(vDt, 4) & Format(Val(Right(vDt, 4)) + 1, "0000")
 End If


※ 西暦下2桁で始まる最大を求めます。
なければ、その年の初期値を設定し、あれば、右4桁部分の数値を+1します。

この際、今日の西暦下2桁を使用します。

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
・・・とかになりますが
採番テ...続きを読む

QACCESS 複雑な自動採番

ACCESS2007

どなたかよろしくお願いします。
工事台帳をACCESSにて作成しようとしております。
工事管理の為、一つ工事に工事CDを作成します。
得意先CD+401~499までの数字の組み合わせです。

例)AX工務店 得意先CD=AX AX401、AX402...AX499
  BX建設   得意先CD=BX BX401、BX402...BX499

上記のように、得意先CDごとに401~499の工事CDを持たせたいのです。
入力フォームにて得意先CD入力後、工事CDが取得できるように

Private Sub 得意先CD_AfterUpdate()
Me![工事CD] = Me![得意先CD] & Format(DCount("工事CD", "T工事台帳") + 1, "400")
End Sub

と記述しましたが、得意先CDにかかわらず番号のみが+1され続けるため、
望む形ではありません。
どのようにしたらよいでしょうか?

また、現在3つの事業部があり一つの現場に最大3つの工事CDができることもあります。
その場合、"D"または"S"をつけます(事業部の頭文字です)
AX401、DAX402、SAX403など、同一の現場であっても数字部分は重複させません。
その場合、2段階で採番(まどろっこしいですが)させようかと思ってますが、
良い方法がありますでしょうか?

なにとぞよろしくお願いします。

ACCESS2007

どなたかよろしくお願いします。
工事台帳をACCESSにて作成しようとしております。
工事管理の為、一つ工事に工事CDを作成します。
得意先CD+401~499までの数字の組み合わせです。

例)AX工務店 得意先CD=AX AX401、AX402...AX499
  BX建設   得意先CD=BX BX401、BX402...BX499

上記のように、得意先CDごとに401~499の工事CDを持たせたいのです。
入力フォームにて得意先CD入力後、工事CDが取得できるように

Private Sub 得意先CD_AfterUpd...続きを読む

Aベストアンサー

得意先CD は、2文字と仮定します。

以下でどうなりますか。(見難かったらすみません)

Me![工事CD] = Me![得意先CD] _
      & Format( _
        Nz( _
          DMax("Val(Right(工事CD,3))" _
            , "T工事台帳" _
            , "工事CD Like '*" & Right(Me![得意先CD], 2) & "*'") _
        , 400) + 1 _
      , "000")

やっている事は、
DMax で、Me![得意先CD] の右側2文字の 工事CD を「T工事台帳」で探して・・・
あったら 工事CD の右側3文字を数値にした最大を求めておきます。
対象のものが無かったら初期値の 400 にするように Nz を使っておきます。
その値を +1 して、3桁表示に Format を使い、元々の Me![得意先CD] に付ける。

Me![得意先CD] が、AX、DAX、SAX なら、 '*AX*' で探します。
右側3文字を数値にした最大を求めるので、AX、DAX、SAX の区別はありません。

Me![得意先CD] は2文字以上等、チェックが必要になると思います。
また、上記では 499 を超える判別はしていないので・・・


以下は雰囲気で
事業部の「D」「S」を、別途「txt事業部」に設けたとすると

Me![工事CD] = Me![txt事業部] & Me![得意先CD] _
      & Format( _
        Nz( _
          DMax("Val(Right(工事CD,3))" _
            , "T工事台帳" _
            , "工事CD Like '*" & Me![得意先CD] & "*'") _
        , 400) + 1 _
      , "000")

これであれば、得意先CD は2文字・・・という制限はなくなるかと

得意先CD は、2文字と仮定します。

以下でどうなりますか。(見難かったらすみません)

Me![工事CD] = Me![得意先CD] _
      & Format( _
        Nz( _
          DMax("Val(Right(工事CD,3))" _
            , "T工事台帳" _
            , "工事CD Like '*" & Right(Me![得意先CD], 2) & "*'") _
        , 400) + 1 _
      , "000")

やっている事は、
DMax で、Me![得意先CD] の右側2文字の 工事CD を「T工事台帳」で探して・・・
あ...続きを読む

QACCESSで日付ごとに自動連番(日付+連番)する方法

ACCESSで日付ごとに自動連番(日付+連番)する方法

ACCESSとvba、共に初心者です。

ACCESS2003を使用しています。日付ごとに自動連番する方法が知りたくいろいろ調べていたところ過去ログ(http://oshiete.goo.ne.jp/qa/726921.html)のベストアンサーさんの回答にたどりつきました。
とりあえず勉強と思い紹介されている通りにテーブル作成からフォームのレコード移動時へのコード貼り付けまで一通り行ってみましたが、自動連番とならず同じ番号のままとなってしまいます。(日付はパソコンの日付更新時にちゃんと反映されています。)
自動連番されないのは何が原因なのでしょうか。どなたかご教授の程よろしくお願いします。


例)DATEが5月5日の場合のIDへの記載値
 0505001
 0505001←ここが001のまま0505002にしたい。
 0506001←日付が変われば0506(5月6日)に変わる。

以上、よろしくお願いいたします。

Aベストアンサー

No4 です。

すみません。もう1カ所、テキスト型の書き方に変えなければいけないところがありました。

> If IsNull(MaxID) Then
>   Me.ID.DefaultValue = AutoID & "001"
> Else
>   Me.ID.DefaultValue = AutoID & Format(Right(MaxID, 3) + 1, "000")
> End If

If IsNull(MaxID) Then
  Me.ID.DefaultValue = "'" & AutoID & "001" & "'"
Else
  Me.ID.DefaultValue = "'" & AutoID & Format(Right(MaxID, 3) + 1, "000") & "'"
End If

既定値に数値型で書き込んでいますから
結局、頭のゼロが失われています。

なお、No2 さんへの補足で

> 6.[自動採番月日TBLF]の[ID]プロパティの書式に0000000を記入(一桁月の場合、頭の0が消えて6桁表示となるため。)

とありますが、
書式は、見せる形だけで、実際の値は変わりません。
書式は削除してください。
問題を分かりにくくするだけです。

No4 です。

すみません。もう1カ所、テキスト型の書き方に変えなければいけないところがありました。

> If IsNull(MaxID) Then
>   Me.ID.DefaultValue = AutoID & "001"
> Else
>   Me.ID.DefaultValue = AutoID & Format(Right(MaxID, 3) + 1, "000")
> End If

If IsNull(MaxID) Then
  Me.ID.DefaultValue = "'" & AutoID & "001" & "'"
Else
  Me.ID.DefaultValue = "'" & AutoID & Format(Right(MaxID, 3) + 1, "000") & "'"
End If

既定値に数値型で書き込んでいますから
結局、頭のゼロ...続きを読む

Qaccess 自動採番 「10-AA-0001」にするには。

宜しくお願いします。

仕様環境:access(2002-2007)

自動で番号を割り振る機能を作っています。
(以前に似た質問をしたのですが、前より理解度が上がったので、ご了承くださいm(__)m)

・・・
まずテストDBなので、テーブルは「案件」一つだけです。
フォームも簡易的な単票形式で簡単なものです。
番号は他のテキストボックスに何か挿入する前の
「挿入前」のイベントを遣っています。

そこで、ご相談です、

まず自動採番で「AA-0001」というものが作れました。
また別フォームに移動し、他のテキストボックスを入力しようとすると
「AA-0002」になりました、以降も~0003、~0004となり成功しました。

そこで更に付け加えたいと思っています。
それは、
「2010-AA-0001」にしたいと思っています。
ご覧の通り、「2010」は「年」です。
更には完成系として「10-AA-0001」と言う風に「年」にあたる、2010の「10」だけ、
抜き出したいと思っており、来年には自動的に2011の「11」にしたいと思っております。
date関数なのかなー、とは何となく思っているのですが、いろいろ工夫してみたのですが、
うまくいきません。

これはマクロでは無理でしょうか?

フォームをVBAに変換したものとマクロを記載させて頂きます。
よろしくお願いします。

'------------------------------------------------------------
' Form_BeforeInsert
'
'------------------------------------------------------------
Private Sub Form_BeforeInsert(Cancel As Integer)
On Error GoTo Form_BeforeInsert_Err

If (DCount("見積り番号", "案件") = 0) Then
見積り番号 = "AA-0001"
Exit Sub
End If
見積り番号 = Format(DMax("Right(見積り番号,4)", "案件") + 1, "AA-" & "0000")


Form_BeforeInsert_Exit:
Exit Sub

Form_BeforeInsert_Err:
MsgBox Error$
Resume Form_BeforeInsert_Exit

End Sub

・・・・
マクロの場合

    条件                     アクション
----------------------------------------------------------
1行目 DCount("見積り番号","案件")=0   値の代入
   アイテム: [見積り番号]
   式:    "AA-0001"
----------------------------------------------------------
2行目 ...                      マクロの中止
----------------------------------------------------------
3行目                       値の代入
   アイテム: [見積り番号] 
   式:    Format(DMax("Right(見積り番号,4)","案件")+1,"AA-" & "0000")
----------------------------------------------------------

・・・・   

こんな感じです、
(単体のテーブルを作り、他のテーブルと組み合わせるつもりです)

また余談ですが、DMAX関数とDBMAX関数の違いがわかりません、
調べても(google)出てきません、これは何か違いがあるのでしょうか?

教えてください、宜しくお願いします。

宜しくお願いします。

仕様環境:access(2002-2007)

自動で番号を割り振る機能を作っています。
(以前に似た質問をしたのですが、前より理解度が上がったので、ご了承くださいm(__)m)

・・・
まずテストDBなので、テーブルは「案件」一つだけです。
フォームも簡易的な単票形式で簡単なものです。
番号は他のテキストボックスに何か挿入する前の
「挿入前」のイベントを遣っています。

そこで、ご相談です、

まず自動採番で「AA-0001」というものが作れました。
また別フォームに移動し、...続きを読む

Aベストアンサー

(1)
はずしていたらごめんです。

見積り番号 = Right(Format(Date, "yyyy", 2), 2) & "-" & Format(DMax("Right(見積り番号,4)", "案件") + 1, "AA

-" & "0000")

(2)
>また余談ですが、DMAX関数とDBMAX関数の違いがわかりません、

私も知りません。ヘルプにも出てきません。
逆にどこにあります?

QAccessで指示書番号の自動採番

入力フォームで指示書番号が自動採番され、テーブルにも保存されるようにするための方法を教えていただけないでしょうか。

テーブル:T_指示書
フィールド:指示書番号
フィールドはテキスト型で、番号の構成は8桁の番号で
"年(二桁)" + "月(二桁)" +"部署番号(一桁、固定の数字)"+ "連番(三桁)"
(例:09091001)
という感じで、
年月が変われば、連番が001になるようにしたいです。

どなたか、ご教授いただければありがたいです。
よろしくおねがいします。

Access2002
winXP

Aベストアンサー

#2です

> >現在部署番号は "1" 固定ですが、パラメータ渡し、グローバル変数化は自由です。
> 固定ではなく、任意の番号を入力する方法


1)パラメータ渡し

既に部署番号を参照できる構成になっていた場合
(フォームに部署番号の入力/選択欄がある場合など)

変更するのは以下2行
Public Function GetNewNum() As String
  sD = Format(Date, "yymm") & "1"

↓ 整数で受け渡す場合

Public Function GetNewNum(iBuNum As Integer) As String
  sD = Format(Date, "yymm") & iBuNum

↓ 長整数で受け渡す場合

Public Function GetNewNum(iBuNum As Long) As String
  sD = Format(Date, "yymm") & iBuNum

↓ 文字で受け渡す場合

Public Function GetNewNum(sBuNum As String) As String
  sD = Format(Date, "yymm") & sBuNum

↓ NULL を渡す可能性がある場合

Public Function GetNewNum(vBuNum As Variant) As String
  sD = Format(Date, "yymm") & vBuNum

※ NULL なら部署番号を 1 にするなど処理の追加が必要


1-1)呼び出し方

Me.指示書番号 = GetNewNum(Me.txt_部署番号)

とか(部署番号が入っているテキストボックス名を txt_部署番号 とした場合)



2)グローバル変数利用 その1

操作を始めた時、その人が扱える部署番号を固定した作りになっている場合や、複数のフォームにまたがって同じ部署番号を使いたい場合など

標準モジュールに以下を宣言(整数として扱う場合:型については上記同様に)

Public iPubBuNum As Integer

この変数を  sD = Format(Date, "yymm") & iPubBuNum  部分で参照します。

iPubBuNum には、部署番号を得た時点で代入しておきます。


2-1)呼び出し方

変更ありません


2-2)コメントは書いておきましょう(同じ標準モジュールに書いた時の例)

' 処理中部署番号
' 設定:XXXXのタイミング
' 参照:指示書番号生成(GetNewNum)/ YYYY
'
Public iPubBuNum As Integer

・・・

' 指示書番号生成
' iPubBuNum は部署番号(グローバル変数)
'
Public Function GetNewNum() As String
  ・・・・
  sD = Format(Date, "yymm") & iPubBuNum
  ・・・・
  GetNewNum = sRet
End Function

とか、



3)グローバル変数利用 その2(複合)

処理中部署番号をグローバル変数で持って置き、GetNewNum を呼ぶ時にパラメータにする

' 処理中部署番号
' 設定:XXXXのタイミング
'
Public iPubBuNum As Integer

・・・

' 指示書番号生成
'
Public Function GetNewNum(iBuNum As Integer) As String
  ・・・・
  sD = Format(Date, "yymm") & iBuNum
  ・・・・
  GetNewNum = sRet
End Function


3-1)呼び出し方

Me.指示書番号 = GetNewNum(iPubBuNum)



※ この辺の書き方/内容については、会社なり、部、課、チームなどにルールがあると思いますので、それに従ってください
※ 関数(モジュール)の結合度等ルールがあれば、それに従ってください。


※ 変数/関数名は適宜変更してください

※ 説明になってたでしょうか

#2です

> >現在部署番号は "1" 固定ですが、パラメータ渡し、グローバル変数化は自由です。
> 固定ではなく、任意の番号を入力する方法


1)パラメータ渡し

既に部署番号を参照できる構成になっていた場合
(フォームに部署番号の入力/選択欄がある場合など)

変更するのは以下2行
Public Function GetNewNum() As String
  sD = Format(Date, "yymm") & "1"

↓ 整数で受け渡す場合

Public Function GetNewNum(iBuNum As Integer) As String
  sD = Format(Date, "yymm") & iBuN...続きを読む

QACCESSの自動連番について

ACCESS2000を使っています。
自動連番を通常すると1・2・3・・・と自動で連番を作成してくれますが、それを日付+連番というものに出来ますでしょうか?
例)1210001
  1210002
  |
  1210100
日付は月と日にちで、連番は3桁です。
数字の連番の方は、日付が変わるとまた1に戻るようにしたいです。
何か良い方法があったら教えてください。

Aベストアンサー

入力フォームのデザインで、メニューら[表示]-->[プロパティ]で「レコード移動時」欄を
クリックし、右端の ... をクリックして、「コードビルダ」で開いたウィンドウに下記
コードを貼り付けます。

レコードソースになっているテーブル名を「自動採番月日TBL」とし、自動採番する
フィールドは、数値型で名前を「ID」とした場合です。

これで、ご希望通りの動作になると思いますが、年が入っていないのが気になります。
このままでは、1年以上使っていると、昨年の番号の連番を取得します。
年を考慮することをお勧めします。

Private Sub Form_Current()
If Me.NewRecord = False Then Exit Sub
Dim AutoID As String
Dim MaxID As Variant
AutoID = Format(Date, "mmdd")
MaxID = DMax("ID", "自動採番月日TBL", "Left(ID,4)=" & AutoID)
If IsNull(MaxID) Then
  Me.ID.DefaultValue = AutoID & "001"
Else
  Me.ID.DefaultValue = AutoID & Format(Right(MaxID, 3) + 1, "000")
End If
End Sub

入力フォームのデザインで、メニューら[表示]-->[プロパティ]で「レコード移動時」欄を
クリックし、右端の ... をクリックして、「コードビルダ」で開いたウィンドウに下記
コードを貼り付けます。

レコードソースになっているテーブル名を「自動採番月日TBL」とし、自動採番する
フィールドは、数値型で名前を「ID」とした場合です。

これで、ご希望通りの動作になると思いますが、年が入っていないのが気になります。
このままでは、1年以上使っていると、昨年の番号の連番を取得します。
年を考慮...続きを読む

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関数で整形してやればよいのでは?

QAccess コンボボックスで選択し、自動でテキストボックスに該当のデータを抽出する方法

こんにちわ。現在仕事の関係でどうしても必要になり、Accessを初めて勉強している者です。
先日もAccess関連の質問をさせて頂きましたが(ご回答頂いた方ありがとうございました)、
また難問にぶつかってしまいました。

絶対にありそうなのに、色々検索しても良いサイトが見つからず、へこんでおります…。
どなたか、わかりやすく説明されているサイトをご存知であれば教えて頂きたいのです。

・コンボボックスで選択した時に、自動で隣にあるテキストボックスに該当のデータを出す。

ということをしたいのですが…。
具体的にいいますと、

コンボボックスにて、会社名を選択すると、隣のテキストボックスにその該当する会社のドメイン名を自動で表示させたいのです。


コンボボックス                テキストボックス
  会社名                     ドメイン名

   A社  →A社を選択すると、        A.co.jp ←自動でA社のドメイン表示
   B社  →B社を選択すると、        B.com ←自動でB社のドメイン表示
   C社
   ・
   ・
   ・

こんなカンジです。(尚、図の作成はMSPゴシックでの作成なのでその他のフォントだとずれると思います。すみません)

テーブルで会社名の一覧と、ドメインの一覧の二つを作って、うまく連動させれば出来そうな気がするのですが
その方法そのものがわからないために、良い説明のあるサイトがないか、朝から調べまくっています(@_@;)
色々自分でも勉強したいというのがあるので、もし上記のような事をやる方法について書いてあるようなサイトがありましたら、
ぜひ教えて頂けると幸いです。よろしくお願いします。

こんにちわ。現在仕事の関係でどうしても必要になり、Accessを初めて勉強している者です。
先日もAccess関連の質問をさせて頂きましたが(ご回答頂いた方ありがとうございました)、
また難問にぶつかってしまいました。

絶対にありそうなのに、色々検索しても良いサイトが見つからず、へこんでおります…。
どなたか、わかりやすく説明されているサイトをご存知であれば教えて頂きたいのです。

・コンボボックスで選択した時に、自動で隣にあるテキストボックスに該当のデータを出す。

ということをし...続きを読む

Aベストアンサー

>テーブルで会社名の一覧と、ドメインの一覧の二つを作って、うまく連動させれば出来そうな気がするのですが
勘違いでないためにも
テーブルはひとつで、フィールド 会社名  テキスト型
                ドメイン ハイパーリンク型
で準備しておきます。
色々と方法はありますが
​http://ag5.net/~nino/access-19.html​
こんな方法はいかがですか。

QACCESS IIF関数 複数条件の設定について

 選択クエリにおいて、あるフィールド「 X」 のレコード数値が
 
  0<[X]<=50   であれば A 
  50<[X]<=100  であれば B 
  100<[X]<=150  であれば C

 と表記させるフィールド「Y」を追加したいと考えています。
 この場合、Yのフィールド設定で指定する数式についてご教授願います。

 一応、
  IIf(0<[X]<=50,"A","") Or IIf(50<[X]<=100,"B","") Or IIf(100<[X]<=150,"C","")

  としましたが、実行すると、Yの列がすべて「-1」と表記されてしまいます。

 何卒よろしくお願いいたします。

Aベストアンサー

a)IIF関数で対応する場合:
 IIF関数の第2引数または第3引数に、IIF関数を入れ子とする必要があります。

式: IIF([X]<=0, "", IIF([X]<=50, "A", IIF([X]<=100, "B", IIF([X]<=150, "C", ""))))


b)別の組込関数を使用する場合:
 IIF関数は二択ですので入れ子にする必要がありますが、Accessのクエリで
 使用できる、似た機能の関数に、Switch関数というものもあります。
 これであれば、入れ子にする必要がなくなります。
 (詳しくは、Accessのヘルプを参照下さい)

式: Switch([X]<=0, "", [X]<=50, "A", [X]<=100, "B", [X]<=150, "C", True, "")


なお、数学あるいは一般生活では確かに「0<[X]<=50」という表記をしますが、
Accessの関数などではこれだと正しい結果が得られません。
正しく認識させるためには、等号・不等号を挟んだ式は、「左辺」と「右辺」の
2つの要素からなる形にする必要があります。
(「0<[X]<=50」は「[X]>0 And [X]>=50」と分割してやる、と)

但し、今回のご質問のような『連続した範囲』であれば、前(左)で既出となる
式の要素で「[X]<=0」が「真(=-1)」とならなかった時点で、「[X]>0」が保証
されますので、上記のように、「[X]>0」を省略して「[X]<=50」だけを条件として
指定すればOk、ということになります。
(「0<[X]<=50」の次が「80<[X]<120」などのように、「50~80」が欠けた
 場合は、省略ができない、と)


【参考】
「0<[X]<=50」は、このままだと「0 < ([X]<=50)」という式と解釈されます。
この場合、「[X]<=50」は、「真(=-1)」か「偽(=0)」か「Null」のいずれかに
なります。
何にせよ、「0<[X]<=50」全体として「正(=-1)」となることがないため、
ご質問の式では、IIF関数は常に第3引数に指定された値「""」を返す
ことになります。

この結果、式全体としては「"" Or "" Or ""」という形となり、「0かNull」
以外なので、「真(=-1)」という値が返された、ということです。

なお、Nullについては、以前、他の方の質問につけた回答も、併せて参考までに:
http://oshiete.goo.ne.jp/qa/4850675.html

a)IIF関数で対応する場合:
 IIF関数の第2引数または第3引数に、IIF関数を入れ子とする必要があります。

式: IIF([X]<=0, "", IIF([X]<=50, "A", IIF([X]<=100, "B", IIF([X]<=150, "C", ""))))


b)別の組込関数を使用する場合:
 IIF関数は二択ですので入れ子にする必要がありますが、Accessのクエリで
 使用できる、似た機能の関数に、Switch関数というものもあります。
 これであれば、入れ子にする必要がなくなります。
 (詳しくは、Accessのヘルプを参照下さい)

式: Switch([X]<=0, "", [X]<=50, "A"...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報