'##################################
'### btn_最新ID取得をクリックした時 ###
'##################################
Private Sub btn_最新ID取得_Click()
Me.btn_最新ID取得.Enabled = True '引続き最新IDを取得するため「btn最新ID取得」は使用可能に
Me.btn_追加.Enabled = True '最新IDを取得後を条件に「btn追加」を使用可能に
Const prefix As String = "L" '「Laminate」の頭文字 "L"
Dim maxID As String
maxID = DMax("fld_依頼ID", "T_依頼") '最終IDを取り出す
Dim lastNum As Long
lastNum = Replace(maxID, prefix, "") '最終IDから頭文字"L"を除き、数値型へ代入する
Dim newID As String
newID = prefix & Format(lastNum + 1, "000000") '+1して桁を揃えて頭文字"L"と結合
Me.txt_依頼ID.DefaultValue = "'" & newID & "'" '既定値へ代入
End Sub
'############################
'### btn_新規をクリックした時 ###
'############################
Private Sub btn_新規_Click()
Const prefix As String = "L" '「Laminate」の頭文字 "L"
Dim maxID As String
maxID = DMax("fld_依頼ID", "T_依頼") '最終IDを取り出す
Dim lastNum As Long
lastNum = Replace(maxID, prefix, "") '最終IDから頭文字"L"を除き、数値型へ代入する
Dim newID As String
newID = prefix & Format(lastNum + 1, "000000") '+1して桁を揃えて頭文字"L"と結合
Me.txt_依頼ID.DefaultValue = "'" & newID & "'" '既定値へ代入
Call initializeForm
End Sub
'######################
'### hatenaさんのコード ###
'######################
Private Sub Form_Open(Cancel As Integer)
Dim fld As DAO.Field
With Forms!F_依頼履歴一覧.Recordset
For Each fld In .Fields
Me.txt_依頼ID.Value = fld_依頼ID.Value
Next
End With
End Sub
'##########################
'### レコード移動時のID採番 ###
'##########################
Private Sub Form_Current()
Me.btn_最新ID取得.Enabled = True '「btn最新ID取得」を使用可能に
Me.btn_追加.Enabled = False '「btn追加」を使用不可に(最新ID取得に導く仕掛け)
Const prefix As String = "L" '「Laminate」の頭文字 "L"
Dim maxID As String
maxID = DMax("fld_依頼ID", "T_依頼") '最終IDを取り出す
Dim lastNum As Long
lastNum = Replace(maxID, prefix, "") '最終IDから頭文字"L"を除き、数値型へ代入する
Dim newID As String
newID = prefix & Format(lastNum + 1, "000000") '+1して桁を揃えて頭文字"L"と結合
Me.txt_依頼ID.DefaultValue = "'" & newID & "'" '既定値へ代入
End Sub
'F_依頼入力 の開くときイベント
Private Sub Form_Open(Cancel As Integer)
Dim fld As DAO.Field
With Forms!F_依頼履歴一覧.RecordSet
For Each fld In .Fields
Me(fld.Name).Value = fld.Value
Next
End With
End Sub
'更新ボタンのクリックイベント
Private Sub 更新_Click()
Dim fld As DAO.Field
With Forms!F_依頼履歴一覧.RecordSet
.Edit
For Each fld In .Fields
fld.Value = Me(fld.Name).Value
Next
.Update
End With
End Sub
リレーションシップの画面のスクショを提示して下さい。リレーションシップの設定が出来なければ諦めましょう。
その上で、操作画面のスクショを提示して下さい。別スレのようにならないために。
hirotonさん、ご回答ありがとうございます。参考にさせていただきます。
おっしゃる通り、「一つの警備案件に複数人が従事するから従事した人数分だけデータ登録したい」ということで合っています。12枠作成しているのは、1つの警備案件で最大12人稼働する可能性があるためです。
このデータは、担当警備員別でデータを溜めて、最終的には個人別で給与計算等行うためのDBになります。なので、仕組みとしては「伝票番号1つで複数商品登録できる注文書/請求書を作りたい」と同じ形になると思います。
もう少しひねった考えをするなら「とにかく12人分登録できればいいが、登録情報から登録したいのでコンボボックスを使いたい」のようなことは考えられます
レコード更新時にマクロ(VBA)でコンボボックスの内容を連結して登録してあげればいいですかね
ただ、このような想定は
のイメージからかけ離れてしまうのでやはり、「やりたいことはこれではないだろう」となります
なんとなくですけど、「本当にやりたいこと」が「質問に反映できていない」のだと思うんですよね
本題は「一つの警備案件に複数人が従事するから従事した人数分だけデータ登録したい」ということではないですか?
バックグラウンドがないので質問に真っ直ぐ答えようとしてそのままあらぬ方向に飛んで行ってしまっている気がします
常に12人固定で登録する必要があるのなら、
担当警備員
フィールドを増やせばいいでしょう。12枠なので「A~L」とか「1~12」とか「01~12」とか適当に添え字をつければいいですこれ、マクロを使わなければなんて思うようなことじゃないですよね?だとすれば・・・となるわけで
「一つの警備案件に複数人が従事するから従事した人数分だけデータ登録したい」
のだろうと思えば、これならよくある「伝票番号1つで複数商品登録できる注文書/請求書を作りたい」と同等の問題になります
ご対応ありがとうございます。
担当警備員と車種は1対1になります。
担当警備員と車種は一対一で対応していますか。つまり担当警備員が1台の車を運転する。
あるいは、1台の車に複数の担当者が乗車する。
あるいは、特に担当者と車を関連付ける必要はない。
など、2つの関係性を説明してください。
知識不足ですみません。
おっしゃる通り、伝票Noは担当者分だけ同じものが複数登録されます。
伝票Noを主キーに設定しないほうがよさそうですね…
多分サブフォームウィザードを使って作ることもできると思いますが、その前にデータベースに関する基本的な知識が必要なようです
T 警備報告書DB
は伝票No
が主キーとなっています。「レコードが分かれるように」とはレコードを複数(人数分)登録したいということだと思っていますが、その場合伝票No
をどのように登録したいと思っていますか?前者、URL直書き
後者、MarkDown記法で記述
どちらもエラーなく貼り付けできました。
掲示板オーナーだけ許可ということだろうか?
リンク貼り付けテスト
https://www.google.com/search?q=ACCESS treeview
ACCESS treeview - Google 検索
コメントありがとうございます。
リンク先のサイトを拝見いたしましたがまだ作り方がよくわかっていません。
ウィザードから作成可能でしょうか?
返信遅くなりました。コメントありがとうございます!
情報不足で申し訳ありません。現在の各データは以下の通りです。
テーブル
M 業者情報
企業ID(主キー) 会社名
M 従業員情報
従業員ID(主キー) 氏名
M 工事長情報
工事長ID(主キー) 氏名/作業番号
M 社用車情報
社用車ID(主キー) 車名
M 業者担当班情報
担当班ID(主キー) 班名
T 警備報告書DB(今回データを登録したいのはこのテーブルです。)
伝票No(主キー) 日付 会社名(企業IDと連結) 工事名(工事長IDと連結)
現場所在地 担当班(担当班IDと連結) 走行距離 始業時間 終了時間 実働時間
担当警備員(従業員IDと連結) 車種(社用車IDと連結)
T 警備報告書DBのフォームを作成するとき、ウィザードで作成すると担当警備員と車種の枠は1枠にずつになってしまいます。この部分をできれば12枠に増やして、テーブルにデータを格納する際に警備員別でレコードが分かれるように登録したいのです。可能でしょうか?
どうしてもやるとするなら自前でオリジナルのフォームを作る感じですかねぇ
https://www.google.com/search?q=ACCESS+treeviewフォルダを追いかけるツリービューとフォルダを選択(ツリービュー上のアイテムをクリック)したときにそのフォルダ内のファイル一覧を表示するリストボックスを組み合わせるとかで実現できると思います
リンクつけようとしたらなんか掲示板に怒られてしまいました。URLコピペしてください
hatena様
お教えいただいた式で問題なく表示されました!
これは難しい式ですね。全く想像もしなかった式でした。
速度はこちらでも全く問題なかったので、この式でいこうと思います。
しかし、Dsumは本当に遅すぎました。
hirotonさん、
暖かいお言葉、ほんとうにありがとうございます。
今回の失敗を糧に、自分を見つめ直してみます。
この掲示板、大いに活用してもらっていいと思いますよ。ただ、ここは業務の請負の場ではないので、質問者には質問に見合ったレベルが求められます。レベル不足が発覚したのなら、まずはもっと低レベルの問題から解決していけばいいです
これについてはすでに「「F_依頼履歴一覧」のつくりから全部見直す」と挙げていますね。もう少し具体的にいえば「「F_依頼履歴一覧」での追加や更新を非連結フォームで行うようにするにはどうすればいいか?(○○までやったが不足はないか?)」というところからやっていけばいいと思います
少なくとも、「現状ではとてもACCESSの改修に手を付けられるレベルではない」ということが分かっただけでもこの掲示板を活用した価値はあるでしょう
個人的には「今からでもゆっくりやっていけばいいですよ」って思うんですけどね。まぁ現実はいろいろ甘くないですよね
外部委託するとどの程度の費用のものなのか、期間の猶予はどのくらいなのか、人材を育成する方向で進められるか、よく相談して蟠りなく解決できるといいですね
hatenaさん、ご回答ありがとうございます。
ユーザーの要望が強い場合は、その方法を提案したいと思います。
ファイル選択ダイアログで、ファイルを選択して、結果からファイル名を取り除くぐらいしかないような気がします。
お二人の推察通りです。
2冊の本を参考に、うち1冊で「F_依頼入力」を。
残る1冊で「F_依頼履歴一覧」を作りました。
ご指摘の採番に関しては、ネットから得たものを使用しました。
仕事とはいえ、身の丈にあっていないものに手を出したのだと後悔しています。
上司に掛け合って、計画の中止・見直しを考えてみます。
この度は、hirotonさん、hatenaさんには貴重の時間を割いていただき
大変申し訳無く思っております。こちらの掲示板を当てにし過ぎていました。
自戒の念を込めて、こちらの掲示板には暫く訪れないようにしたいと思います。
長々とお付き合い頂き、ありがとうございました。
失礼します。
For Eachなど、コードの意味は理解できていますか。というか理解できていないですね。
一覧フォームのダブルクリックしたレコードのデータを転記するコードのサンプルを紹介しましたが、
ちょっと先走りすぎたようです。
前回の回答のコードはスルーしてください。
提示されているコードを見る限り、おそらくいろいろなところのコードを参考にしているのだと思われますが、コードの意味やフォームの仕様をきちんと理解できていない部分が散見されます。(hirotonさんも指摘しているForm_Currentで自動採番しているところとか)
追加 と 更新 はまったく異なる処理になりますが、それはどのように場合分けしてますか。
まず、この目的ですが、どのような処理を目指しいるのでしょうか。
「F_依頼入力」の「txt_依頼ID」が入力できたらそれで終わりですか。
それだけではないですよね。
それだけであるなら、最初の私の回答のコードでできるはずです。
できないということは、コードがどこか間違っているか、他の部分の影響でできないのか、、、、なのだと思います。
それの原因を探すには、デバッグ作業というのが必要になります。
もし、非連結でいくのなら、で、「最大15人が同時操作」という運用なら、それぐらいのことができるスキルは必要です。
それができないなら、いずれ破綻するでしょう。
非連結のフォームでなぜ
Form_Current
を使っているんでしょう?「レコード移動時」とはいったいどのような状態を想定しているのでしょう?
DefaultValue
の使い方についてもなぜそうしているのか疑問に思う使い方です何となくバックグラウンドが透けて見えますが、このままだといずれ破綻しますよ(というかたぶんすでに破綻してる)
主題に絞らず「F_依頼履歴一覧」のつくりから全部見直す必要があると思います
ホントにこんなこと書いてある本あるんですかね。hirotonならそんな本破り捨ててしまえと言いますね
hatenaさん、ありがとうございます。
早速試してみましたが「オブジェクトが必要です」...😅
まず、ダブルクリックするのは「F_依頼履歴一覧」の「fld_依頼ID」。
その「fld_依頼ID」の値の代入先は、
「F_依頼入力」の「txt_依頼ID」です。
追加・更新・削除・読込はなんとか動いております。
非連結の「F_依頼入力」の関連していると思われる記述の全体です。
そうであるなら、非連結も一つの手段だとは思います。
確認ですが、「最大15人が同時操作」ですが、下記はありえますか。
同じテーブルに対して、複数ユーザーが同時に新規レコード入力
同じテーブルの同じレコードに対して、複数ユーザーによる閲覧、更新、削除の各操作が同時に発生する
上記が発生することがあるなら、非連結で行く場合、これらの制御はかなり難易度が高いですよ。
連結でも、危険性は高いです。
SQLサーバーとかの本格的なデータベースの導入を検討する段階かもしれません。こうなるとさらなるスキル、コストが必要にはなりますが。
===
現状の疑問点は、
非連結「F_依頼入力」で、自動採番のコードがあるということは、これは新規レコードを入力する場合の処理ですよね。
また、「F_依頼履歴一覧」フォームのダブルクリックでそのレコードデータを、「F_依頼入力」に表示させて、そこで更新作業をすることですよね。
この異なる2つの処理(新規追加処理、更新処理)の切り替えはどのようにしているのでしょうか。
とりあえず、「F_依頼履歴一覧」でダブルクリックしたレコードデータを「F_依頼入力」に表示させるコードは下記になります。
「F_依頼入力」上のテキストボックスの名前は、「F_依頼履歴一覧」のレコードソースのフィールド名と同じになっていると仮定した場合のコードです。
非連結だと、入力した後、レコード保存するコードも必要になります。「F_依頼履歴一覧」からダイアログモードで開いているなら、「F_依頼履歴一覧」のレコードセットを直接更新するのが手っ取り早いですね。
非連結なので、入力値チェック、リンクテーブルがある場合の整合性のチェック、複数ユーザー同時入力に対する排他制御、すべて自前で処理を構築する必要があります。
hatenaさん、
私のタイプミスです。
正しくは「F_依頼履歴一覧」です。
紛らわしくしてしまい、申し訳ありません。
はい、「F_依頼履歴一覧」のレコードデータを、非連結「F_依頼入力」に入力したいと考えています。
非連結にしたい理由は、このフォームを最大15人が同時操作する可能性があり、
操作する中には、パソコンが苦手な人やAccessを初めて触る人など、多様な方が多い環境の中で、
所有する本で目にした下記の一文とサンプル例が、“まさに”その環境にマッチしていたのです。
ちょうど1年前にも非連結で躓いて、こちらでアドバイスをいただき、結果
連結フォームにする事で解決することが出来ました。その後も、細々とではありますが
VBAやSQLなどを勉強して、今回の設計に至りました。
今回は上記の理由もあって、色々と記述には苦労しましたが、なんとかゴール目前まで辿り着けています。
あとはココだけ解決できれば、昨年躓いた計画もようやく完成するのです。
背伸びし過ぎているかもですが、完成させて自信に繋げたいと考えています!
見積番号 = [見積番号] だと、どちらも見積番号サブクエリ側の同じ見積番号なので常にTrueなるので全体合計になっちゃいますね。別名をつけて区別がつくようにします。
速度的にはこちらの方がはやくなります。
複数のクエリができるのがいやなら、見積番号ごとの見積金額集計のクエリのSQLを「qry見積_分類集計」にサブクエリとして埋め込んでもいいでしょう。
最終手段としては、見積番号ごとの見積金額集計のクエリを別途作成し、
「qry見積_分類集計」と見積番号で結合させて、構成率を出そうかと思っています。
しかしながら、シンプルに「qry見積_分類集計」だけで何とかならないかと思っています。
「F_依頼履歴」って初めて出てきましたが、最初の「F_依頼一覧」というのはタイプミスしたということでしょうか。
あと、
「F_依頼入力」は非連結ということは、「F_依頼入力」のレコードソースは空欄ということですよね。
だとすると、話はまったく違ってきます。
「F_依頼履歴」の特定のレコードのIDをダブルクリックしたら、そのIDのレコードデータを非連結フォームの「F_依頼入力」に入力したいということですか。
非連結にしたい理由はなんでしょうか。
合理的な理由がなければ、連結フォームにするのをお勧めします。
そうすれば、
で解決するはずです。
hatenaさん、まさにそれがしたのです!
レコードソースは「T_依頼」にある「fld_依頼ID」です。
ちなみに、ダブルクリックをする「F_依頼履歴」のレコードソースは
「T_依頼」の選択クエリ「Q_依頼履歴」で、「F_依頼入力」は非連結です。
で、下記を記述して実行したところ
「フォームまたはレポートがテーブルまたはクエリを基に作成されていないため、
このアクションまたはメソッドは無効です」と出現し、黄色くなりました。
OpenFormしたときに他に何もしていなければ、先頭レコードが表示されています。
そこで、
Me.[txt_依頼ID].Value = OpenArgs
としたら、先頭レコードのIDが上書きされてしまいます。
ご希望のことはそれではないですよね。(通常主キーは上書きしないものです)
ご希望のことは、「F_依頼一覧」で選択したレコードと同じIDのレコードを表示したい、ということではないですか。
もし、そうなら、開く時にそのIDでフィルターをかければいいだけです。
依頼ID はレコードソースのフィールド名にしてください。
そうでないなら、もう少しやりたいことを詳細に説明してください。
hirotonさん、
>これは質問の表題からかけ離れた全く別の内容ですね。
あら、そうなんですね😅
私は、それが目的で代入したくていたのですが、
対処方法がまったく別になってしまうとは…。
上手く伝えられず、申し訳ないです💦
「L000004」を表示したいのです!
hirotonさん、その通りです!
とりあえず
これは質問の表題からかけ離れた全く別の内容ですね。これはこれでそれ用の対応が必要でしょう(今やり取りしている対応とは全く別に対応する必要がります)
この結果、実際には「txt_依頼ID」になにが表示されていますか?「L000004」が表示されていないと思ってhirotonは回答してますが合っていますか?
hatenaさん、
Form_Currentの自動採番のコードは「F_依頼入力」に記述してあります。
また、DoCmd.OpenForm "F_依頼入力", , , , , acDialog, Me.fld_依頼ID.Value は
「F_依頼一覧」に掲載されている既存レコードです。
「F_依頼入力」を使って、新規レコードを追加することが出来つつ
既存レコードの内容も表示できるようにしたいのです。
今回は、その既存レコードのIDを代入するにあたり、苦戦しております。
またイベント順は、hatenaさんの書いている通りになっていると思います。
hirotonさん、Form_Currentだけ残したところ、
ダブルクリックしても採番されたIDが代入されました。
それから、hatenaさんから提案して頂いた
のMe.[txt_依頼ID].Value = OpenArgsにブレイクポイントを置き
「L000004」をダブルクリックすると、Me.[txt_依頼ID].Value が最新IDの「L000005」
OpenArgs が「L000004」となっていました。
ちなみに、フォームを開いたとき、
Form_Open → Form_Load → Form_Current の順でイベントが発生することは念頭に置いてコーディングする必要があります。
このForm_Currentの自動採番のコードは、「F_依頼一覧」、「F_依頼入力」のどちらに記述されているものですか。
DoCmd.OpenForm "F_依頼入力", , , , , acDialog, Me.fld_依頼ID.Value
で開いたとき、カレントレコードはどうなってますか。既存レコードですか。新規レコードですか。とりあえず、上記の点を明確にしてください。
hatena様
毎度回答ありがとうございます。助かります。
Sendkeysでまたイベントが発生してしまっていたとは思いませんでした。
また、イベントの解除や割り当てができるなんて知りませんでした。
また勉強になりました。
Me.仕様書.OnKeyDown = ""
Me.仕様書.OnKeyDown = "[イベント プロシージャ]"
テキストボックスの「Enterキー入力時動作」プロパティを「フィールドに行を追加」で、解決なんですね。
今回はこれで対応しようと思います。
(イベントプロシージャ作らなくともよかったんですね。)
ありがとうございました。
TextBox.Value プロパティ (Access)
TextBox.DefaultValue プロパティ (Access)
Microsfot公式でもわざわざ注釈をつけるくらいですが、
value
とdefaultvalue
は別物です提示されたコードを見る限りは表示が変わるようなことは考えられません
それでも
Form_Current
が影響しているということであれば、フォーム読み込み直後にレコード移動が実行され(
Me!txt_依頼ID.Value=OpenArgs
したレコードは保存されて)、実際に表示されているレコードは「新規レコード」になっているとかでしょうか
「F_依頼入力」のすべてのコードを削除して
Form_Current
のコードだけにして試してみて下さい。もしくは、DoCmd.OpenForm
のところからデバッグ作業で実際の動きを確認する必要があるでしょう【超初心者向け】エクセルVBAでデバッグをする方法を解説します(経理・会計事務所向けエクセルスピードアップ講座さん)
hilotonさん、ありがとうございます!
コメントアウトしたら、ダブルクリックで代入は
できましたが、採番が出来なくなりました。
単純に
Form_Current
を削除する(コメントアウトする)とどうなりますか?