Access2003で受注伝票に自動的に伝票番号を付ける方法

このQ&Aのポイント
  • Access2003の受注テーブルにある伝票番号を自動的に付ける方法を教えてください。
  • 受注伝票フォームには日付+自動的に2桁の番号を付けたいですが、具体的な方法がわかりません。
  • 受注伝票の伝票番号テキストボックスプロパティの規定値設定を使用して、自動的に伝票番号を作成する方法を教えてください。
回答を見る
  • ベストアンサー

Access2003 伝票番号を自動的につけるには

お世話になっております。 受注テーブルに[伝票番号]があって、番号を自動的につけたいと思っています。 入力用の[受注伝票]フォームがあります。 3月17日最初の入力 2006031701 3月17日の3番目の入力(最初、2番目は入力済み) 2006031703 このように日付+自動的に2桁の番号をつけたいのですが方法がわかりません。 参考になるページがあってこのように書いてみましたがエラーになりました。 [受注伝票]フォームの[伝票番号]テキストボックスプロパティの規定値 =IIf(DMax("伝票番号","受注伝票","伝票番号 Is Not Null") Is Null,CLng(Format$(Now(),"yyyymmdd"))*100+1,IIf(Left(CStr(DMax("伝票番号","受注伝票","伝票番号 Is Not Null")),8)=Format$(Now(),"yyyymmdd"),DMax("伝票番号","受注伝票","伝票番号 Is Not Null")+1,CLng(Format$(Now(),"yyyymmdd"))*100+1)) ご教授いただけると幸いです。よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
noname#22222
noname#22222
回答No.6

s_husky です。 やっぱ、プロパティのセットでの管理には限界があるようです。 そこで、最終案を示します。 1、受注伝票フォームのコピーを作成し、 2、伝票番号.規定値を消して、 3、以下のコードを全てコピーしてみて下さい。 <ただ、コピーすれば動作する筈です> 30分ばかりで、なぐり書きしたのでバグがあればお許し下さい。 一応の、伝票入力と伝票番号管理の基本が判ると思います。 なお、あくまでも Husky 流ですので、それなりに自分の作法を確立することが重要です。 ' ------------------------------------------------------------------------------------------------------- ' GetNewNumber("伝票番号", "受注伝票", 条件文) ' ------------------------------------------------------------------------------------------------------- Private Function GetNewNumber(ByVal fldName As String, _                ByVal tblName As String, _                ByVal Hiduke As Date) As Long   Dim lngMaxPlus As Long      lngMaxPlus = Nz(DMax(fldName, tblName, "受注日=#" & Hiduke & "#"))   GetNewNumber = IIf(lngMaxPlus = 0, Val(Format(Hiduke, "yyyymmdd01")), lngMaxPlus + 1) End Function ' ------------------------------------------------------------------------------------------------------- ' 新規伝票発生時の処理: Me.伝票番号を更新 ' ------------------------------------------------------------------------------------------------------- Private Sub Form_BeforeInsert(Cancel As Integer)   If Len([受注日] & "") = 0 Then     Me.受注日 = Date ' 新規で [受注日]=Null はDate に   End If   Me.伝票番号 = GetNewNumber("伝票番号", "受注伝票", [受注日]) End Sub ' ------------------------------------------------------------------------------------------------------- ' フォームを閉じる時の処理: 不具合伝票の削除 ' ------------------------------------------------------------------------------------------------------- Private Sub Form_Close()   Dim dbs As DAO.Database   Set dbs = CurrentDb   dbs.Execute "DELETE FROM 受注伝票 WHERE 伝票番号=0 OR 受注日 IS NULL"   dbs.Close End Sub ' ------------------------------------------------------------------------------------------------------- ' 受注日更新後の処理: Me.伝票番号を更新 ' ------------------------------------------------------------------------------------------------------- Private Sub 受注日_AfterUpdate()   Form_BeforeInsert True End Sub ' ------------------------------------------------------------------------------------------------------- ' 受注日Exit後の処理: [受注日 ' ------------------------------------------------------------------------------------------------------- Private Sub 受注日_Exit(Cancel As Integer)   If Len([受注日] & "") = 0 Then     MsgBox "[受注日] が空(ヌル)の伝票は、フォームを閉じると削除されます。", vbExclamation, " 警告"   End If End Sub

kami21
質問者

お礼

できました! このとおりにやりましたら問題なく動作しました。 空番号の処理もできていますので大変ありがたいです。 流れもよくわかりましたので、これからいろいろと勉強して自分なりに活用していきたいと思います。 お忙しい中、本当にありがとうございました。

その他の回答 (5)

noname#22222
noname#22222
回答No.5

s_husky です。 ウィスキー飲んでガーッ、ガーッ寝て起きたら「動かない」とのこと。 我が Test.mdb では快適に動いているのに!うーん! ※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※ 「受注伝票フォームに受注日のテキストボックスを作り・・・」が原因か? ※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※ =IIF(式, 式が真の時の値, 式が偽の時の値) <<<<<<式の確認手順>>>>>> ? DMax("伝票番号", "受注伝票", "受注日=#2006/03/17#") 2006031701 と、イミディエイトを開いて、表<受注伝票>の列<伝票番号>の最大値を DMAX関数で取得することに成功しているか否かを確認。 この時、条件は、列<受注日>が一致しているということです。 実態としては、SELECT MAX(伝票番号) FROM 受注伝票 WHERE 受注日=#2006/03/17# というSQL文を実行しているだけです。 *表に列’受注日’が無ければ当然にエラー!! *受注日が yyyy/mm/dd 形式でなければ検索不可! ? DMax("伝票番号", "受注伝票", "受注日=#2006/03/18#") Null 次に、新しい日付だと DMAX関数が Null を返すことも確認。 ・2006031701 <--- IIF関数では、真(True) と判定されます! ・Null <---------- IIF関数では、偽(False) と判定されます! このことから、 式=DMax("伝票番号", "受注伝票", "受注日=#" & [受注日] & "#") が正しいことが判ります。 ? Date 2006/03/18 ? Now 2006/03/18 4:29:54 とイミディエイトウィンドウで確認し、[受注日]の規定値=Date()で宜しいことも確認。 <<<<<<真の時の確認手順>>>>>> ? DMax("伝票番号", "受注伝票", "受注日=#2006/03/17#") + 1 2006031702 式の値に+1 しているので確認するまでもないことです。 よって、ここもOK! <<<<<<偽の時の確認手順>>>>>> ? CLng(Format$("2006/03/19", "yyyymmdd01")) 2006031901 ? CLng(Format("2006/03/19", "yyyymmdd01")) 2006031901 ちゃんと、伝票番号初期値が作成されているのでOK! <<<<<<フォームに組み込んで確認>>>>>> 後は、テストフォームに組み込んで確認するだけです。 ※つまり、表に<受注日>を追加していないことがエラーの原因です。 **************************** [受注日]が訂正された時の対策を追加すれば何とかOKかと! ****************************

kami21
質問者

お礼

何度もありがとうございます。 テーブルに受注日を追加してフォームと連動させたら表示されました。 初歩的なミスで申し訳ございませんでした。 確認手順は大変参考になりました。 ありがとうございました。

noname#22222
noname#22222
回答No.4

s_husky です。 コピペは、伝票番号にしたんですよね!

kami21
質問者

補足

何度もありがとうございます。 受注日の規定値を=Date()にすれば今日の日付は表示されますが、やはりエラーが出ます。 コピペは伝票番号の規定値にしました。 この方法はネットで検索してたまたま見つけたのでやってみました。 知識が乏しいのでご指摘の問題についてはまったく考えていませんでした。 関数についてはまったくわかりませんので、ほかに良い方法がありましたら教えていただければありがたいです。 すみませんがよろしくお願いいたします。

noname#22222
noname#22222
回答No.3

エラーは、想定内です。 [受注日]がヌル値だからです。 規定値を=Date() にすればエラーは回避されます。 ***************** もう一つ問題が... ***************** 質問者が採用されている手法ですと、新規レコードに誤って移動しても伝票番号が生成されます。 通常は、受注伝票がインサートされた直後に伝票番号を生成させます。 この空レコードをフォームを閉じた時にどう削除するかが問題ですよ! ※'様'は止めて下さいね!当方、還暦まじかのスーツのデザーナーに過ぎません!

noname#22222
noname#22222
回答No.2

s_husky です。 質問そのものに答えるならば... =IIf(DMax("伝票番号", "受注伝票", "受注日=#" & [受注日] & "#"), DMax("伝票番号", "受注伝票", "受注日=#" & [受注日] & "#") + 1, CLng(Format$([受注日], "yyyymmdd01"))) 修正点1、Now()->[受注日] 伝票は、当日に当日分を入力するとは限らないので[受注日]が必要な訳です。 修正点2、CLng(Format$([受注日], "yyyymmdd01")) Format$関数で 01 を発生させています。

kami21
質問者

補足

s_husky 様 何度もありがとうございます。 ご指示のとおりにやってみましたが、新規入力でエラーが出ます。 受注日を入力し始めるとエラーが消えますが、番号が表示されません。 受注伝票フォームに受注日のテキストボックスを作り、コードをそのままコピー・ペーストしました。 何かわかりましたらお願いしたいと思います。 受注日はそのとおりです。ご指摘ありがとうございました。

noname#22222
noname#22222
回答No.1

お勧めのやり方は、 GetNewNumber("受注テーブル", "伝票番号", [受注日]) とい関数を作成することです。 Public Function GetNewNumber(ByVal tblName As String, ByVal fldName As String, ByVal Hiduke As Date) As Long   Dim lngMaxPlus As Long   lngMaxPlus = Nz(DMax(fldName, tblName, "受注日=#" & Hiduke & "#"))   GetNewNumber = IIf(lngMaxPlus = 0, Val(Format(Hiduke, "yyyymmdd01")), lngMaxPlus + 1) End Function ? GetNewNumber("受注", "伝票番号", cdate("2006/03/17")) 2006031702 表<受注>に伝票番号= 2006031701 があれば 2006031702を戻します。 新しい日付であれば 2006031801を戻します。 ? GetNewNumber("受注", "伝票番号", cdate("2006/03/18")) 2006031801

kami21
質問者

お礼

ご回答ありがとうございます。 初心者ですので意味がよくわかりませんでした。 また関数の勉強をしてみようと思います。 ありがとうございました。

関連するQ&A

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

    伝票番号の採番で、西暦+5桁という仕様です。 これを、年が変わってから入力する際に 新しい年(度)+00001 としたいのですが、どのようにプログラムを組んだらいいのか分かりません。 ちなみに今までのプログラムでは Format関数や、DMax関数を使って自動採番していました。 Access2000での開発です。 どうぞよろしくお願いします。

  • access 数字が増えないのはなぜでしょう?

    accessはほとんどやったことがありません。 無茶を承知でお聞きしますが、 J9Y-001 という番号が 001→002→003 というように自動で増えていっていたのが、001のままで動かなくなってしまいました。 そこでフォームでそこのプロパティを見てみると、以下のような文がありました。どこかがおかしいのでしょうか? =IIf(Right(DMax("Mid([工事番号],6,3)","工事データ","Mid([工事番号],2,2)='" & [期] & "'")+1,3) Is Null,"001",Right("0" & "0" & DMax("Mid([工事番号],6,3)","工事データ","Mid([工事番号],2,2)='" & [期] & "'")+1,3)) 本来なら作ってくれた人に直接聞いて直してもらえるといいのですが、連絡がとれません。手で一つ一つ入力していくことは可能なのですが、これからずっと使うものなので、できたら直したいと思っています。 どなたかアドバイスお願いします!

  • アクセスで新規にレコードを追加する際自動的に番号を付けたい。

    アクセス2000で売上の管理をしています。 「管理番号」を使って伝票の処理をしているのですが、 フォームに新規に伝票を入力するとき、自動的に番号を付けたいんです。 できたら、フォーム上に「伝票新規」のボタンを作って、そのボタンを押したら テキストボックスに番号を表示させるようにしたいのですが、 どうしたらよいのかわからないんです! どなたか教えていただけませんか? よろしくお願いします。

  • アクセス2000で番号をふりたいです。

    アクセス2000の質問です。よろしくお願いします。 VBAが初めてなので、本を見ながらやってるんですけど なかなか理解できずに困ってます。 今、フォームで番号をふりたいんですけど、連番で 2007001でもH19001でもいいんですが、年&3桁の番号にしたいです。 現状はテーブルが「sheet5」、フォームの番号を出すテキストボックス の所が「連番」にしてあります。ボタン式にしました。 んで自分で考えて打ち込んだのが Private Sub コマンド77_Click() If "連番" / 1000 Is Date Then Me!連番 = DMax("連番", "sheet5") + 1 Else Me!連番 = Format(Date * 1000, "yyyy" & "001") End If End Sub こんな感じでいれたのですが、さっぱり動きません。 きっと見てる方は笑ってると思いますが、私の実力じゃ こんなのしか出来ません。 同じような質問もあったのですが、理解不能でした。 詳しい方、教えてください。

  • access 請求番号の自動採番

    まったくわかりません! よろしくお願いします。 仕様環境 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"にしたりしましたが、 請求番号はエラーが発生します。 原因がまったくわかりません。 よろしくお願いします!

  • ACCESSのメインフォームとサブフォームについて

    ACCESSで、受注伝票のようなものを作成したいと思っています。受注伝票フォームに受注明細のサブフォームを埋め込んだようなフォームを作ろうとしています。その際、受注伝票と明細に受注コードのフィールドを設け関連づけたいのですが、メインフォームに受注コードを入力したらサブにも同じコードが自動的に振られるようなことはできるのでしょうか。 出来ないのであれば、どのように作ればよいのでしょうか。

  • Access 2003 iif [日付フィールド] is null のあとで<>がうまく働かない

    Access 2003です。 [Start Date], [End Date]を入力するフォームで日付が入力されていなければ、 iif([Start Date] is null,<[End Date],>[Start Date]) のようにクエリ条件を設定したいのですが、 iif [Start Date] is null を使うと、続く条件の中で<>がうまく働かないという現象が起きます。 (クエリでなにも抽出されない) iif([Start Date] is nullの条件を入れなければ(つまり[Start Date],[End Date]はブランクにならないという前提ならば) 1. >[Start Date] 2. <[End Date] 3. Between [Start Date] And [End Date] などどれも問題なく動きますし、 iif([Start Date] is null~の条件を入れても続く条件の中で<>を使わなければ iif([Start Date] is null,[End Date],[Start Date]) はちゃんと動きます。 どうしてこのような現象が起こるのか、また回避する方法をご存知のかたがいらっしゃいましたら、どうぞご教示ください。 よろしくお願いします。

  • ACCESS条件により自動に連番付与させるには

    処理月   |処理日 |値 |番号付与 2010/12/01|2010/12/01|Is Not Null|1 2010/12/01|2010/12/01|Is Not Null|1 2010/12/01|2010/12/02|Is Not Null|2 2010/12/01|2010/12/02|Null | 2010/12/01|2010/12/02|Is Not Null|2 2010/12/01|2010/12/01|Is Not Null|1 2010/12/01|2010/12/05|Is Not Null|3 2010/12/01|2010/12/05|Is Not Null|3 2010/12/01|2010/12/05|Null | 2010/12/01|2010/12/10|Is Not Null|4 2010/12/01|2010/12/10|Null |4 2010/12/01|2010/12/10|Is Not Null|4 2011/01/01|2010/01/05|Is Not Null|1 2011/01/01|2010/01/05|Null | 2011/01/01|2010/01/05|Is Not Null|1 2011/01/01|2010/01/05|Is Not Null|1 処理月に対してスタート 処理日にたいして値があれば番号を自動付与 *処理月の値が変更されれば番号は1から自動付与 分かる方願います

  • アクセスで値を参照したい

    Win2000,Access2000を使用しています。 AB二つのテーブルに「仮番号」というフィールドがあり、同じ「仮番号」のレコードに同じ「伝票番号」をつけたいんです。 Aテーブル(お客様情報) Bテーブル(注文履歴) Aテーブルの「伝票番号」フィールドに番号を入力したら、BテーブルのAと同じ「仮番号」のレコードの「伝票番号」フィールドに番号が入力されるようにしたいのですが、どのようにVBまたは、フォーム上のテキストボックスのプロパティで組んだらよいのかわかりません。 Bテーブルには、過去の注文データもあるのですでに入力されているレコードには過去に受注した時の伝票番号入力されています。 新規入力したレコードに対してだけAと同じ伝票番号をつけたいのです。 Bテーブルで、         |商品名|価格  |伝票番号| 過去の受注データ|電卓 |¥500|1000  | 今回の受注データ|名刺 |¥800|2500  | と、こんな感じにしたいんですが うまく説明できず申し訳ありませんが、どうぞよろしくお願い致します。

  • Access フォームコンボボックス空白をクエリで抽出したい

    現在access2000を使って、 フォーム1内にコンボボックスを作って コンボボックス内に1,2,3 と項目を入れています。 一方、クエリを使って、上記フォーム内のコンボボックスをつなげて1,2,3をそれぞれ抽出することはできるのですが、 1から3まで全てをiif関数などで 抽出したいと考えてします。 僕が考えた関数は iif(isnull([フォーム1][コンボ1]),is not null ,[フォーム1][コンボ1]) とクエリ抽出条件内に入力すると、結果は、 1、2、3をそれぞれフォームコンボボックスで選択すれば、クエリに反映されるのですが、コンボボックス内を「空白」の状態にすると、1,2,3すべてがクエリで抽出されるのではなく、何も抽出されないという結果になってしまいます。 どうすれば、クエリで1から3すべてを抽出することができるのでしょうか?多分、iif関数内の「空白」は空白として処理されないような気がします。 よろしくお願いします。