Private Sub ユーザー情報削除_Click()
Dim strSQL As String
MsgBox "登録情報を削除します"
strSQL = "DELETE * FROM 基礎情報マスタ where 基礎情報マスタ.個人ID=" & UC_個人ID & ";"
DoCmd.RunSQL (strSQL)
Me.Requery
Forms!ポップアップ入力.Requery
DoCmd.Close acForm, "ユーザー情報編集フォーム", acSaveNo
End Sub
(ポップアップ入力がメインフォームの名前です)
Private Sub cmdプレビュー_Click()
Dim strFilter As String
If Me.txtChkList <> "" Then
strFilter = "得意先コード In(" & Mid(Me.txtChkList, 2) & ")"
Else
MsgBox "選択されたデータはありません。"
Exit Sub
End If
If Me.Filter <> "" And Me.FilterOn Then
strFilter = strFilter & " AND (" & Me.Filter & ")"
End If
DoCmd.OpenReport "R_得意先", acViewPreview, , strFilter
End Sub
'予定表示プロシージャ
Public Sub SetSchedule()
Dim i As integer, rs As DAO.Recordset
For i = 1 To 42
Me("T" & i).Caption = ""
Next
Set rs = CurrentDb.OpenRecordset( _
"SELECT 日付, 件名 FROM Q_予定件数 WHERE " & _
"日付>#" & FirstDay & "# AND 日付<=#" & FirstDay + 42 & "#", _
dbOpenForwardOnly, dbReadOnly)
Do Until rs.EOF
With Me("T" & rs!日付 - FirstDay)
.Caption = rs!件数
End With
rs.MoveNext
Loop
rs.Close: Set rs = Nothing
End Sub
2つのVBSで異なるデータベースファイルを開くという運用がしたことがなかったので、簡単なデータベースファイルを2つ、それぞれようのVBAを作成して、実験してみました。
一つ目のデータベースファイルをVBSから開いて、別のアプリをアクティブにしてから、2つ目のデータベースファイルをVBSから開いても特に問題なく起動できました。
現状の2つのVBSファイルの名前とコードを提示してもらえますか。原因がわかるかも知れません。
フォームに対して Requery してしまっているのでしょう。
コンボボックスに対してRequeryしてください。そうすれば移動しません。
Me.コンボボックス名.Requery
確認してみたところ、以前教えていただいた帳票の、各データに紐づくコンボボックス(テキストボックスと重ねている)の選択肢部分で「Requery」を使っていました。
この機能を使うと先頭レコードへの移動は防げない、ということになりますでしょうか。
わがままな願望ですかね・・申し訳ありません。
追加の質問が発生しました。すみません。
条件式を全部入れたら長すぎて、コントロールソースに入りきれませんでした。(長すぎる、とのエラーが出て、途中で切れていた。)VBAに組み込もうかと思いましたが、きっかけのアクションを判断できず、式が作れません…どのような序文にすればよいでしょうか。
hatena様
回答ありがとうございます。
出来ました。感激です。
このようなやり方があるのですね。勉強になりました。
望み通りの結果を得ることができました。ありがとうございました!
なるほど、そういうことですね…ご確認ありがとうございます。お手数をおかけしました。ご指摘の件を確認してみます。
おはようございます。
説明不足ですみません。
全くその通りです。
IEやメールソフトなどを開いたり、
accessをタスクバーにしまうと、
別のaccessは起動しません。
タスクマネージャー上に表示されない状態です。
そして元々開いていたaccessも操作できなくなります。
タスクマネージャーから元々のaccessを最大化すると再度表示され、使用できます(最小化では表示されません)
そこで一旦元々のaccessを終了し、再度どちらかのVBSを使用して起動すると、最大化して起動しますが、最小化すると極小サイズになります。そこから以前使用していたサイズに戻しました。そのまま別のVBSから別のaccessを起動もできました。
原因がわからず色々テストしてみたのですが、続けて2つのVBSを使用して別々のaccessを起動する事はできます。また単体でも、もちろん起動します。
大変申し訳ありませんが、ご教授お願い致します。
問題ないようですね
インポートのときにtrueを置き換えたりする必要があるかと思いました
ソフトはmementoというスマホとPC版のある半有料ソフトです。ほぼスマホ用ですね
スマホで出先で入力するのにスマホ版ACCESSがないので仕方なく使っています
別のDBソフトとはなんでしょうか。
Accessでは、TRUEかFALSEの値をもつフィールドのデータ型は Yes/No型になりますので、たぶんYes/No型になるでしょう。
インポートするときの設定で、データ型を指定できるのでなんとでもなると思います。
Yes/No型のフィールドはデフォルトではチェックボックス表示になります。設定によって、コンボボックスやテキストボックスにすることもできます。
フォーム上なら、トグルボタンやオプションボタンにもできます。
文章では状況かよくわからないので、右カラムのファイル送信フォームから現状のフォームを送信してもらえますか。
たぶん、連結フォームの使い方が理解できていないのが原因だと思います。
早々のご回答どうもありがとうございます。
ただ、この削除フォームは「ポップアップ」フォームで行っており、リンク親フィールド、凝フィールドの設定自体がなかったことから、仕方なく(?)以下のような形で削除フォームを組んでいます。
まず、親フォームの「個人ID」コンボボックスで個人ID選択すると、親フォームの4つのテキストボックスに
氏名・郵便番号・住所・年齢
が入るようにしています。
そして、その親フォーム上に「ユーザー情報変更」ボタンがあり、これにイベントプロシージャを割り当てて、ポップアップのフォームを上げています。
そして、そのポップアップフォームのロード時に
Me.UC_個人ID = DLookup("個人ID", "基礎情報マスタ", "個人ID=" & [CMB_個人ID])
Me.UC_氏名 = [Forms]![ポップアップ入力]![PF_氏名]
Me.UC_郵便番号 = [Forms]![ポップアップ入力]![PF_郵便番号]
Me.UC_住所 = [Forms]![ポップアップ入力]![PF_住所]
Me.UC_年齢 = [Forms]![ポップアップ入力]![PF_年齢]
Application.SetOption "Move After Enter", 0
End Sub
(「CMB_個人ID」は、メインフォームで入れている個人IDのコンボボックスの値をグローバル変数として代入したものです。Me.UC_氏名・・・等は、このポップアップフォームのテキストボックスのコントロール名です)
というように、メインフォームから値を代入しています。
つまり、メインフォームで
「現在選択している個人IDのユーザー情報をポップアップのサブフォームのテキストのコントロールに代入している」
ということになります。
そして、以下のような削除プロシージャ―を作りました。
Private Sub ユーザー情報削除_Click()
Dim strSQL As String
MsgBox "登録情報を削除します"
strSQL = "DELETE * FROM 基礎情報マスタ where 基礎情報マスタ.個人ID=" & UC_個人ID & ";"
DoCmd.RunSQL (strSQL)
Me.Requery
Forms!ポップアップ入力.Requery
DoCmd.Close acForm, "ユーザー情報編集フォーム", acSaveNo
End Sub
(ポップアップ入力がメインフォームの名前です)
ですので、カレントレコードは1つしかないような形です(レコードセレクタでは1つしかありませんでした)。
ですので、DoCmd.RunCommand acCmdDeleteRecordを実行すると、必ず1レコード目が削除されてしました。
また、ポップアップ型のフォームだと無理なのか、メインフォームにも、ポップアップをしたサブフォームにもRequery、Refreshをかけても、♯DELETEDは消えませんでした。
また、多分根本的な間違いを犯しているんでしょうね・・・。
長々と失礼いたしました。
すいません、読んでいただいてご教授いただけましたら助かります。
テーブルやフォームのデータシートビューでレコードを表示した状態で、別の場所、VBAとか削除クエリとか、、、で削除すると、削除されたレコードが「#DELETED」と表示されるのは、仕様です。
通常は、運用中にテーブルは開かないようにすべきですので、問題は、フォームでの表示の場合ですよね。
フォームでカレントレコードを削除したい場合は、DoCmd.RunCommand acCmdDeleteRecord で削除すればそのようなことにはなりません。
VBAや削除クエリから削除した場合は、その直後にそのフォームをRequeryするか、Refreshすれば「#DELETED」は消えます。
できますよ。
サブクエリを含むSQLでも、SQLに変わりはないので、普通にレコードセットとして開けます。
当方の環境でサンプルファイルで確認してみましたが、質問の症状は再現できませんでした。
サンプルファイルになにか追加してませんか。
例えば、再クエリをすると先頭レコードへ移動しますが、どこかで再クエリをするような処理をしてませんか。
状況がよく分かりませんが、
前に作成したVBSでデータベースファイルを開いて、それが開いた状態で、
新規に作成したVBSで別のデータベースファイルを開こうとしている、という状況でしょうか。
そして、前に開いたデータベースファイルがアクティブの時だけしか、別のデータベースファイルが開かないということでしょうか。
このソフトは特定のソフトでしょうか。それともどのソフトを開いていても起動しないのでしょうか。
そんなことはないはずです。現に、前に作成したVBSではaccessがアクティブでなくても開きますよね。
これは条件に合致すれば「完了」という赤字を表示させたいということでいいでしょうか。
だとしたら、コントロールソースに下記のように設定すればいいでしょう。
=IIf(IsDate([テキストボックス]) AND [チェックボックス] AND [コンボボックス] Like "済","完了","")
前景色は赤に設定します。
テキストボックス、チェックボックス、コンボボックスは実際のコントロール名にしてください。
AND条件という前提です。OR条件の場合は、ANDをORに変更してください。
せっかくなので一般的な方法を提示しておきましょう。
テーブル設計は下記のようにします。
M_商品
商品ID 主キー
商品名
MT_単価
商品ID 複合主キー
Max個数 複合主キー
単価
M_商品のデータ例
MT_単価のデータ例
フォームのレコードソースのテーブルのフィールドは ID(主キー)、商品ID、単価、個数
個数の更新後処理に下記のコードを設定。
以上です。
hiroton様
返信おくれて申し訳ありません。
詳しい回答ありがとうございました。
hiroton様 hatena様
返信おくれました。
回答ありがとうございます。
現実的な方法ではないので、テーブルの設計を見直すことにしました。
回答をいただきありがとうございました。
要件次第。必要ないなら、エクスポートしたデータは削除すればいいし、そのソフトで後で必要になるなら残しておくことになるでしょう。
残しておく場合は、DBのテーブルにエクスポート済みかどうかを格納するフィールドを用意しておくのて一般的に方法ではないでしょうか。エクスポートするときは、エクスポート済みでないデータのみエクスポートしてエクスポート後に済に更新しておけばいいでしょう。
ACCESS側で重複を省く仕組みは、ソフト側の想定外のエラーなどで重複が発生した場合やACCESS側のミスで重複取り込みした場合の保険という考え方です。
この条件抽出をどのようにしているかによりますが、もし、Filterプロパティに条件を設定して抽出しているのなら、レポートを開くときのWhere条件式引数にFilterの条件を追加すればいいでしょう。
コード例
こんなやり方があるんですね!!勉強になりました。
思った通りの処理になりました。ありがとうございました。
確かにACCESS側でファイルの移動をさせれば間違いがないですね
ところで、これは別ソフト(スマホDB)の問題なのかもしれませんが
エクスポートした後のスマホDBの中のデータはどうするものでしょうか?
エクスポート毎にファイルを分けると、複数のファイルに同じレコードが含まれていることになります
それは仕方ないこととしてhatenaさんのアドバイスのようにACCESS側で重複を省くものでしょうか?
それで、問題ないと思います。
あるいは、
PC_ID、収支履歴ID というような2つのフィールドで複数フィールド主キーにするという方法もあります。
ならば、それをAccessのテーブルでは主キーにするか、重複を許可しないインデックスを設定しておくいいでしょう。
取りこんだ順番を保持しておく必要があるなら、オートナンバー型のフィールドを追加してそれを主キーに、シリアルキーには重複を許可しないインデックスを設定しておくといいでしょう。
そうすると万が一のミスにも自動対処できます。
あとは、hirotonさんの回答のような運用が楽だと私も思います。
並べ替えはレコードソース(のフィールド)に対して行います
レコードソースをクエリにして
というフィールドをつくると条件に一致するレコードには「-1」、そうでないレコードには「0」が入るので、この日付チェックフィールドに対して並べ替えを設定すれば望みの結果になります
別ソフトの要求次第ですがエクスポートごとに別ファイルになっていたほうが楽だとは思います
1つのファイルにしてしまうと同時にアクセスする可能性の処理が手間だし、ACCESS側でインポート後に「処理済み」等別フォルダに移動するように組んでおけば2重取込が防止できます
目的としては車の運転日報のようなものをAndroidで入力してもらい
それをPCのACCESSで管理したいです
Android側では一度PCに取り込まれたデータはなくてもいいです(あってもいい)
ちなみにAndroidのアプリでは+1していくような主キーが設定できず、自動で1レコードごとにシリアルキー用のような半角英数がランダムで記録されるようです
目的、運用次第、ですので、これだけの情報ではなんとも。
一応、Accessのテーブルにインデックスを適切に設定しておけば、ミスで重複してインポートした場合は、重複データは自動ではじいてくれます。
まずは、このメインフォーム/サブフォームの目的、したいことを明確にすることが先決のような気がします。
一見、解決したようにみえても、本当に目的に合致している動作になっているのか、よくよく検証してみてください。
連結フォーム(レコードソースが設定してあるフォーム)、連結コントロール(コントロールソースか設定してあるコントロール)の場合は、テーブルのデータと直結してますので、フォームでの入力がそのままテーブルに反映されます。
連結フォーム、連結コントロールでは当然の動作です。
今回のメインフォームの目的は何かを明確にしましょう。
サブフォームのデータを抽出する(フィルターをかける)だけが目的なら、非連結フォーム、非連結コントロールにすればいいでしょう。
逆にサブフォームの目的はなんでしょうか。「参照元入力ソースのコンボボックスを非連結にして」で本当に目的がかなってますか。
すいません、自己解決しました!(この方法が正しいのかどうかは分かりません。手探りです)
まず、親フォームのコンボボックスの規定値を「=Null」にしました。
その後、リンクフィールドで、親と子でキーIDをリンクさせてやればうまくいきました。
お騒がせしてすいません。
すいません、自己解決しました。
フォーム・サブフォームとも参照元入力ソースのコンボボックスを非連結にして、教えていただいたフィルターをかけたところ、うまく動作してくれました。
なんで、コントロールソースを入れると値が書き換わってしまうのかは不明なままですが・・・
こんばんわ、ろでますです。
先般はありがとうございました。
以降、色々触っているのですが、不可解な事象に遭遇しました。
色々設定を触りはしているのですが、あと一歩(?)のところでうまく動きません。
事象ですがテーブルが以下の様になっています
基礎情報_T - 個人別障害状況_T - 障害種別_T
│
- 等級_T
となっています。
この状態で以前と違い、フォームにレコードソースをセットして、コントロールソースも設定しています。
フォームには、基礎情報_より「個人ID」「名前」、障害種別_Tより「障害種別」、等級_Tより「等級」を表示させて、シンクさせています。(個人IDを変えれば、他も連動して変わります)
個人別障害状況_Tには、個人ID、障害種別ID、障等級IDが格納されて、これが各個人の実データテーブルになっています。
この状態で、フォームを起動して、例えば、個人ID1を参照します。
連動して、個人ID1の人の障害種別・等級が表示されます・・・といった具合にすべて正常に見えます。
ところが、参照後フォームを閉じた瞬間に、個人別障害状況_T内の「個人ID」の値が1レコード、必ず書き換わってしまいます。
何も命令を出していないのに書き換わってしまい、かなり困っています。
すいません、原因など分かればご教授いただけないでしょうか。
よろしくお願い申し上げます。
こんにちわ、ろでますです。
そんな方法があったんですか。
強にでも早速試そうとおもいます。
正直、サブフォームの作成って結構手間がかかってしまって、若干困っていたところです。😄
うまく行ったようで何よりです。
そういえばですが、現状の内容だとメイン・サブにフォームを分ける必要がないですね。
「F_個人別」フォームのフォームヘッダーに「M_CMB」を設置して、フォームのフィルターをいじる部分は自分自身(のフォーム)でいいので
で出来ます。
または、データ(テーブル)は正規化の観点から「T_個人」「T_障害」のように分かれていると思うので、
メインフォーム
既定のビュー:単票フォーム
レコードソース:T_個人
サブフォーム
既定のビュー:帳票フォーム
レコードソース:T_障害
サブフォームコントロール
リンク親フィールド:ID
リンク子フィールド:個人ID
のように、リンク関係を持ったメイン・サブフォームを作成すれば、メインフォーム側のレコード移動に伴って自動でサブフォーム側のレコードを変更することができます。
フォームの表示はたとえば
氏名:Aさん
住所:
電話番号:
<障害一覧>
○○障害
××障害
△△障害
のように作ることができ、共通するAさん(とその個人情報)は単票フォーム部分に1つだけ、Aさんに関連する障害情報は障害の情報だけを帳票フォーム部分に表示するといったようなことができ、Excelとは差別化されたACCESSらしい画面を作ることができます。
サブフォームの基本的な使い方でもあるので、一度調べてみることをオススメします。
なお、この場合の「M_CMB」はメインフォーム側に設置し、メインフォームのレコードを操作することになります。
ありがとうございます。 集計クエリを作るのがコツだったのですね。御指南ありがとうございます。
カレンダー形式のスケジュール管理フォーム作成 その3 - hatena chips
上記のページのテーブル設計、フォーム設計として回答します。
予定テーブル(T_予定)から集計クエリを作成して、件数を表示させます。デザインビューで下記のように設定します。
名前を Q_予定件数 とします。
フォームモジュールの予定表示プロシージャを下記のように修正します。
以上です。
おはようございます、ろでますです。
サブフォームの調整を考えて、きっちりすれば行けました!
というより、サブフォームのレコードソースをきっちりして、連結にすると、わざわざDlookup関数を用いないでも、きっちり連動してくれました。
その後、ご教授いただきましたフィルターをかけると思うように動作してくれました。
ありがとうございました。