アプリ版:「スタンプのみでお礼する」機能のリリースについて

宜しくお願いします。

仕様環境: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)出てきません、これは何か違いがあるのでしょうか?

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

A 回答 (4件)

(1)


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

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

-" & "0000")

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

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

この回答への補足

piroin654 様

回答ありがとうございます。

まず(2)の件の「DBMAX関数」についてはここで見つけました

http://oshiete1.goo.ne.jp/qa4125946.html

というか、恥ずかしながら、僕が去年質問した内容の回答で、
先日、今回の質問を検索していて見つけたものですね(汗)
(去年はさっぱりだったので・・)

(1)の件ですが、VBAで上手くいきました。
マクロでは、
「このオブジェクトには、オートメーションオブジェクト'date'は含まれません。」
というエラーが出て出来ませんでした。
最初の「見積り番号 =」はとったのですが・・

なんかマクロの限界を感じました。。
(VBAがさっぱりなのでマクロでがんばっていたのですが・・)

マクロだと二つのフィールドに分けてごまかしごまかしで
やった方がいいのかも知れません(素人考えですが)。

あと、この質問をする前段階からなのですが、何度もVBAやマクロを
書き換えたりしていると、番号を進まない時があります。
例えば、「AA-0002」だと、次のレコードも、また次のレコードも
「AA-0002」が表示され番号が続かない時が多々ありました。
その場合は、テーブル内のレコードを全て削除して、VBAも削除して
綺麗な状態で検証するとまた番号が増えるようになりました。
同じように今回の「10-AA-0002」も同じ現象が発生しました。
(綺麗にすると番号がちゃんと割り振られるのですが。)

もし何か見解があれば教えてください。
なければ結構ですので、気が向いたら、
ご意見を宜しくお願いします。(数日したら締め切ります)

ありがとうございました。m(_ _)m

補足日時:2010/03/11 22:52
    • good
    • 0

>番号を進まない時があります



ひょっとして「案件テーブル」の
見積り番号の更新、あるいは
レコードの追加がうまく行われなかった
ということが一番の現象の発端で、
これがどこに由来するかは、
プログラムなのか、全体の
イベントの流れなのか、
あるいはファイルの肥大によるもの
なのかはわかりません・・・・、
ということも考えられます。

この回答への補足

piroin654 様

仰るとおりです。

ただ、ファイルの肥大はちょっと考えずらいところもあります。
テストでDBを作ったので、最大でも30件ぐらいレコードの
テーブル(1個)、そしてフォームも一つだけです。
現時点でレコードが大幅に増やすと逆に面倒になるので(笑)。
ある程度レコードが増えたら、一旦テーブルから全削除してますね。
まず、「仕組みをしっかりしてから」って感じですかね。

ありがとうございます。

補足日時:2010/03/13 01:41
    • good
    • 0

式が複雑で計算に矛盾が生じて、という


ことでもないようなのですが、プログラム
の書き換えなどでファイルが大きくなった
ときに、ときたまデータの表示がおかしく
なることは経験したことはあります。
最適化などで対応できるならば、という
ことも提案できます。
見積り番号の取得をコードで、また違う
方法でしてみるというのもこのような
現象を回避できる方法になり得るかも
しれません。
また、質問のマクロを実行するイベント
にマクロをVBAコードとして挿入し、イベントの
流れを確認しながらデバックしていけば
どこがネックになっているかも確認できる
のではとおもいます。
そのときに、質問の見積り番号の取得に関しても
一度に取得しないで、分解して変数に格納し、
改めてセットして取得をするという方法で
滞るポイントを探すということもいいのでは
とおもいます。
いろいろな場面でのデバッグはこのような
ことをしばしば行います。
ときには、
Debug.Print 変数(または関数の戻り値) & ("何とか")
のようにして変数の変化を確認することも
します。

質問欄に提示されたマクロを書けるならば
VBAはそれほどむかしくないと思います。
マクロを作ってはコードに変換し、なるほど
こう書くのかと覚えることも一つの方法
です。VBAでは条件分岐(If、SELECT CASE
など)の制御法、検索などのやりかたを
おぼえると、あとは楽なものです。
プロパティ、オブジェクトの制御などは
その都度ヘルプやオブジェクトブラウザ
で確認すればいいものです。私もオブジェクト
の性質やプロパティはいちいちおぼえていません。
どうしてもマクロのほうが、というものは
一つか二つくらいですし、むしろコードで制御
する方向をめざしたほうが今後にもいいと
思います。VBAは言葉をおぼえるときと
同じで、簡潔なものの集まりと"てにをは"
の使い方です。
肝心なことからずれてしまいました。

この回答への補足

このつながりは一つにまとめました。
宜しくお願いしますm(_ _)m

補足日時:2010/03/13 01:49
    • good
    • 0

たぶん、おそらく、なんとなく、


http://okwave.jp/qa/q3932046.html
ここのことですか? 自作関数ですね。
DMAXが遅いから作ったということですが。
試していないのでわかりません。
DMAXの代替関数はいろいろ作られて
います。
アルゴリズム、検索などで
ググるとさまざまなデータの検索
方法が出てくると思います。それらの
アルゴリズムをAccessで使える手段を
利用して最適な関数を作って実現する
というのも一つの方法です。C言語などを学習
するときには必ず出くわす分野であり、
重要な分野です。
これ以上はやめておきます。興味が
あったら調べてみてください。

この回答への補足

piroin654 様
回答ありがとうございます。
結果はもう一つの方にまとめさせていただきました。

補足日時:2010/03/11 22:57
    • good
    • 0

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

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

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


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