会計年度に基づいてレコード番号を生成するマクロを作成するにはどうすればよいですか? (Access 2013)

会計年度に基づいてレコード番号を生成するマクロを作成するにはどうすればよいですか? (Access 2013)

会計年度に基づいて自動的に進むレコード番号を作成したいと思います。たとえば、2015001、2015002、2015003、2015004、2016001、2016002 などです。

テーブル [Projects] には、次の式に基づいた [FiscalYr] フィールド (計算データ型) が既にあります。

IIf(Month([EntryDate])>=10,Year([EntryDate])+1,Year([EntryDate])).  

[EntryDate] フィールドは、デフォルト値が Date() である日付/時刻フィールドです。これは期待どおりに動作しています。

[FiscalYr] 番号を、001 から始まり、前の記録に基づいて 1 ずつ増加し、新しい会計年度の開始時に番号が 001 にリセットされる 3 桁の番号の前に付ける方法はありますか? 当社の会計年度は 10 月 1 日に始まり、9 月 30 日に終わります。

情報がテーブル [プロジェクト] に入力されるか、フォーム [プロジェクト フォーム] に入力されるかに関係なく、番号が生成されるようにしたいです。フォームに情報が入力された場合にのみ生成されるようにはしたくありません。オンラインで、このようなことを実行するには Before Change マクロを使用するのが最善の方法であると示唆する投稿をいくつか見ましたが、私が見つけたほとんどの例では、マクロ コードのかなりの部分が日付に基づいており、日付の問題はすでに解決しています (と思います)。

既存の [FiscalYr] フィールドで作業するよりも簡単な場合は、[EntryDate] から会計年度を作成し、同時に数値を作成するマクロでもかまいません。私は Access をたまにしか使用しないので、意味不明なことを言っていたら申し訳ありません。危険なほどの知識は持っていると思います。

ありがとう、アンドレア


2015年12月9日更新:

私はマクロのアイデアをあきらめました。

Scottgemのブログのヒントを活用する(https://scottgem.wordpress.com/2009/11/25/sequential-numbering/)、連続番号システムを立ち上げて実行することはできましたが、新しい会計年度の開始時に番号を 1 にリセットするのにまだ苦労しています。問題が会計年度の値の生成方法にあるか、それともまったく別の何かにあるかはわかりません。

私が得たものは次のとおりです:

テーブル名: プロジェクト

プロジェクト内には、この問題に関連する次のフィールドがあります。

  • プロジェクト番号: 数値 - 長整数
  • シーケンス: 数値 - 長整数
  • EntryFiscalYr: 計算値 - 長整数。式は次のようになります。IIf(Month([EntryDate])>=10,Year([EntryDate])+1,Year([EntryDate]))
  • EntryDate: 日付/時刻; デフォルト値: Date()

フォーム名: プロジェクトフォーム

プロジェクト フォーム内には、次のコントロールがあります。

  • シーケンス: テキスト ボックス、コントロール ソースはプロジェクト テーブルのシーケンス フィールド、非表示に設定
  • CreateProjNo: ボタン、クリック時のイベント:

     Private Sub CreateProjNo_Click()
        Me.Sequence = Nz(DMax("[Sequence]", "Projects"), 0) + 1
        DoCmd.RunCommand acCmdSaveRecord
     End Sub
    
  • プロジェクト番号: テキスト ボックス、データ コントロール ソース:

     =[EntryFiscalYr] & Format([Sequence],"000")
    

希望どおりに表示されています: 2016001、2016002 など。

Scottgem のブログのコードにさまざまな反復を試して、EntryFiscalYr フィールドを DMax ステートメントに取り込み、シーケンス番号が現在の会計年度で増加し続けるか、新しい会計年度で最初からやり直すかを確認しましたが、どの試みも機能しません。

私が試してみました:

 Me.Sequence = Nz(DMax(“[Sequence]”, ”Projects”,”[EntryFiscalYr]) = “ &(Me.[EntryFiscalYr])),0)+1

 Me.Sequence = Nz(DMax(“[Sequence]”, ”Projects”, ” [EntryFiscalYr] = ‘“ & Me.[EntryFiscalYr] & “’”),0)+1

Me.[txtEntryFiscalYr]の代わりにも試してみましたがMe.[EntryFiscalYr]、いずれもうまくいきませんでした。

私の問題は、EntryFiscalYr が各レコードに対してどのように生成されるかに起因しているのではないかと考えていますが、これをどう解決すればよいのかわかりません。EntryDate によって生成された日付を試してみましたが、暦年についてはうまく機能しています。ただし、これを会計年度に基づいて取得し、新しい会計年度の開始時にリセットすることが重要です。

また、プロジェクト フォームで生成された ProjectNo は、プロジェクト テーブルの ProjectNo フ​​ィールドに更新されませんが、これが問題だと私は理解しています。これは正しいですか?

これを会計年度に合わせて正しく動作させるための支援をいただければ幸いです。

ありがとう!

答え1

これが私が最終的に決めたコードです。フォーム内のボタンを使用します。同じ問題に苦しんでいる他の人たちのお役に立てれば幸いです。

Private Sub CreateProjNo_Click()
Me.EntryFiscalYr = IIf(Month([EntryDate]) >= 10, Year([EntryDate]) + 1, Year([EntryDate]))
Me.Dirty = False

If IsNull(Me.Sequence) Then
Me.Sequence = Nz(DMax("[Sequence]", "Projects", "[EntryFiscalYr] = " & Me.[EntryFiscalYr]), 0) + 1
Me.Dirty = False
End If

End Sub

この解決策に至った経緯の詳細については、次のリンクを参照することをお勧めします。 http://answers.microsoft.com/en-us/office/forum/office_2013_release-access/access-2013-how-do-i-generate-a-record-number/22fa42e1-dd89-4683-b1d0-72b112281c1c

関連情報