Private Sub btn解除_Click()
Dim db As dao.Database 'データベースへの参照を代入する変数を宣言
Dim rs As dao.Recordset 'レコードセットへの参照を代入する変数を宣言
Set db = CurrentDb() 'カレントデータベースを参照
'「Q_依頼履歴」クエリを開きレコードセットを取得
Set rs = db.OpenRecordset("Q_依頼履歴", dbOpenDynaset)
'フォームのレコードセットを再設定
Set Me.Recordset = rs
Me.Requery 'フォームのデータを更新
Me.txt検索文字列.Value = "" '検索文字列を空欄にする
End Sub
Private Sub btn検索_Click()
Dim db As dao.Database 'データベースへの参照を代入する変数を宣言
Dim rs As dao.Recordset 'レコードセットへの参照を代入する変数を宣言
Set db = CurrentDb() 'カレントデータベースを参照
'「Q_依頼履歴」クエリを開きレコードセットを取得
Set rs = db.OpenRecordset("Q_依頼履歴", dbOpenDynaset)
'コンボボックスで選択されたフィールドでテキストボックスに指定された文字を検索
rs.Filter = Me.cmb検索.Value & " Like '*" & Me.txt検索文字列.Value & "*'"
'レコードを再取得
Set rs = rs.OpenRecordset
'フォームのレコードセットを再設定
Set Me.Recordset = rs
Me.Requery 'フォームのデータを更新
End Sub
Private Sub btn並べ替え_Click()
Dim db As dao.Database 'データベースへの参照を代入する変数を宣言
Dim rs As dao.Recordset 'レコードセットへの参照を代入する変数を宣言
Set db = CurrentDb() 'カレントデータベースを参照
'「Q_依頼履歴」クエリを開きレコードセットを取得
Set rs = db.OpenRecordset("Q_依頼履歴", dbOpenDynaset)
'昇順・降順の確認
If Me.frm昇降選択.Value = 1 Then
rs.Sort = Me.cmb並べ替えフィールド.Value
Else
rs.Sort = Me.cmb並べ替えフィールド.Value & " DESC"
End If
Set rs = rs.OpenRecordset 'レコードセットを開く
Set Me.Recordset = rs 'レコードセットを再設定
End Sub
Private Sub Report_Open(Cancel As Integer)
Dim db As DAO.Database
Dim qd As DAO.QueryDef
Dim cnt As Integer
Dim fld As DAO.Field
Dim rs As DAO.Recordset
Set db = CurrentDb()
Set qd = db.QueryDefs(Me.RecordSource)
qd.Parameters(“[Forms]![フォームの名前]![絞り込みの名前]”)=[Forms]![フォームの名前]![絞り込みの名前]
Set rs = qd.OpenRecordset
For cnt = 2 To rs.Fields.Count - 1
Set fld = rs.Fields(cnt)
Me("Label" & cnt).Caption = fld.Name
Me("Field" & cnt).ControlSource = fld.Name
Me("Total" & cnt).ControlSource = "=Sum([" & fld.Name & "])"
Next
End Sub
下記を追加。フォームの名前と絞り込みの名前は適宜変更して下さい。
Dim rs As DAO.Recordset
qd.Parameters(“[Forms]![フォームの名前]![絞り込みの名前]”)=[Forms]![フォームの名前]![絞り込みの名前]
Set rs = qd.OpenRecordset
下記を変更。
For cnt = 2 To rs.Fields.Count - 1
Set fld = rs.Fields(cnt)
メインレポートSQL
TRANSFORM … SELECT … FROM …
GROUP BY T_レジメン名.[レジメンコード], Tレジメンリスト2.番号, T_Rpリスト.Rp名
ORDER BY T_レジメン名.[レジメンコード], Tレジメンリスト2.番号, Format([投与day],"@@")
PIVOT Format([投与day],"@@"
デバッグでは、
daoRs![依頼者]: 齋藤 cmb依頼者.Value: 齋藤
とデータが代入されているのに表示されないのは、ありえない現象ですね。
テキストボックスをもとのコンボボックスに戻すと表示されますか。
あと、
On Error GoTo ErrorHandler
をコメントアウトして実行した場合、エラーはでますか。
コマンドボタンを追加して、下記のように設定してクリックしたときはどうなりますか。
Private Sub CommandButton1_Click()
Me.cmb依頼者.Value = "齋藤"
End Sub
横からすみません.
その状況で、適当な値を手入力するとどうなりますか?もし、入力出来ないなら、プロパティシートのデータタブだったかと思いますが、編集可否を確認してみるとか。
あとは問題があるようには見えないので、何か追加情報を出して誰かが運良く気づくのを期待するしかないかと思います。レイアウトビューのスクリーンショットやプロパティシート(データタブ)のスクリーンショットなど。
読込で値が表示されないのは
依頼者、依頼理由1、依頼理由2、依頼理由3です。
今回読込んだレコードのロット枝、依頼理由2、依頼理由3はブランクになっています。
デバッグ結果
テキストボックスに値が表示されないというのは、
cmbロット枝, cmb依頼理由2, cmb依頼理由3
のことですか。
だとしたら、コードの問題ではなく、テーブルのフィールド自体に値がないのが原因ですね。
それ以外のテキストボックスで値が表示されないのですか。それはどのテキストボックスですか。
イミディエイトウィンドウの結果は以下のようになりました。
前に「フォーム上で検索をかけた…」と書きましたが、
これは、テーブル「T_依頼」からクエリ「Q_依頼履歴」を作り、
レコードソース「Q_依頼履歴」からなるフォーム「F_依頼履歴一覧」の中に、
書籍に掲載されていた検索機能を盛り込んだものです。
書籍の作例は、検索フィールドが全てテキストボックスでしたが、
私の製作したものはコンボボックスが3つ出来てしまっています。
これをテキスト形式に変更すれば...といった素人考えから発展した醜態です。
過去データの読込にはコンボボックスの方が望み通りの結果になりますが、
一方の検索では、、、といった感じです。
ならばと、コンボボックスの値もヒットする方法も調べてみましたが
見つかりませんでした。
「F_依頼履歴一覧」の検索コード
素人考えです。過度な期待はしないで下さい。
取引先テーブル:🔑取引先の名前,…
仕入先テーブル:🔑仕入先の名前,…
得意先テーブル:🔑得意先の名前,…
etc:…
得意先と売上日と売上商品のテーブル:🔑得意先の名前,🔑売上日の日付,🔑売上商品の名前,金額,…
仕入先と仕入日と仕入商品のテーブル:🔑仕入先の名前,🔑仕入日の日付,🔑仕入商品の名前,金額,…
仕入先と仕入日と仕入商品と得意先と売上日のテーブル:
🔑仕入先の名前,🔑仕入日の日付,🔑仕入商品の名前,🔑得意先の名前,🔑売上日の日付,金額,…
仕入先と仕入日と仕入商品と得意先と売上日と売上商品のテーブル:
🔑仕入先の名前,🔑仕入日の日付,🔑仕入商品の名前,🔑得意先の名前,🔑売上日の日付,🔑売上商品の名前,金額,…
etc:…
…
ありがとうございます!
<フォーム上の変更する前のコンボボックスの設定も同じですか。
<表示されていく値と実際に格納されている値は異なるということは理解していますか。
仰るとおり、テキストボックスに変更後、格納された値にズレが生じました。前述の列数と列幅は、値を
コンボボックス = テキストボックスにするために
変更した現在のコンボボックスの設定です。
<非連結フォームに表示したいのは、表示されている値か、格納されている値のどちらですか。
表示したいのは格納されている値です。
そもそも、何故テキストボックスに変更したかと
申しますと、フォーム上で検索をかけた際に
ルックアップがコンボボックスになっていた
フィールドだけ、検索できなかった為に、
テキストボックスにすれば解決できるかと、
安易に考えた末に至った結論です。
<デバック用コードを挿入して実行した結果も教えてください。
明日以降、試した結果をお知らせします。
よろしくお願いします。
それはテーブル「T_依頼」のフィールドのルックアップの設定ですよね。
フォーム上の変更する前のコンボボックスの設定も同じですか。
また、そのルックアップの設定だと、連結列の列幅が0に設定されているので、
そのテーブルをデータシートビューとして開いたとき、表示されていく値と実際に格納されている値は異なるということは理解していますか。
例えば、
フィールド[W_No]
表示コントロール:コンボボックス
値集合ソース:ORDER FILE
連結列:1
列数:8
列幅:0cm;0cm;0cm;0cm;0cm;0cm;0cm;3cm
なら、表示されている値は「ORDER FILE」の8列目の値、格納されている値は1列目の値になります。
格納されている値は、ルックアップの表示コントロールをテキストボックスに変更すると確認できます。
非連結フォームに表示したいのは、表示されている値か、格納されている値のどちらですか。
あと、デバック用コードを挿入して実行した結果も教えてください。
補足
売上テーブル側に仕入IDを設ける形でも同様のクエリは作成できますが、内製品で仕入が発生しない売上のことを考えると「売上のレコードに於いて仕入IDが存在しないのが正しい」状態が起こりえます。
未入力(未処理)なのか、空白で正解なのか、一見してわからないような構造を作ると管理の手間が増えます
フィールドは全てデータで埋まるような構造にするのが基本です
ということで、仕入テーブル側に売上IDフィールドを設ける方法を提示していますが、「仕入れたけど売れなかった」は実務上たいてい起こるので、提示例も最適解とは言えません
「Accessでちょこっとやるだけなら運用で対応するから別にいいかな」とか、
「実務上でそういうデータが省かれた最終データしか扱わない」とか
ホントにこれだけで済む場合もあります
もう少し深く作るなら「受注テーブル」を用意する(売上テーブルとは別に)となります
受注テーブル
↑ここに登録のない売上ID,仕入IDは未処理ということ
それらのデータはクエリで抽出できる(未処理データの管理画面や警告表示を作ったりできる)
さらに掘り下げると「1つの売上に対して複数の仕入れが発生する」場合も考えられます(逆もあり)。この場合は上記「受注テーブル」ではうまくいかなさそうなので、さらに手を加えることになります
「仕入テーブル」に売上IDフィールドを設けてクエリで結合して差額を計算します
売上IDは「売上テーブル」の主キーです(「売上テーブル」には主キーが必要です)
次のようなイメージになります(質問事項に不要な項目は省いています)
売上テーブル
仕入テーブル
受注クエリ
ご回答ありがとうございます。
このフォームは非連結フォームです(「レコードソース」プロパティは空欄)
「T_依頼」のルックアップで、テキストボックスからコンボボックスに変更する前の設定は以下の通り。
フィールド[W_No]
表示コントロール:コンボボックス
値集合ソース:ORDER FILE
連結列:1
列数:8
列幅:0cm;0cm;0cm;0cm;0cm;0cm;0cm;3cm
フィールド[依頼者]
表示コントロール:コンボボックス
値集合ソース:T_着色作業者
連結列:1
列数:3
列幅:0cm;0cm;2cm
フィールド[依頼理由_1][依頼理由_2][依頼理由_3]
表示コントロール:コンボボックス
値集合ソース:T_理由
連結列:1
列数:2
列幅:0cm;4cm
以下の点を提示してください。
そのフォームは非連結フォーム(「レコードソース」プロパティが空欄)ですか。
テキストボックスに変換する前のコンボボックスの下記の設定。
コントロールソース
値集合ソース
連結列
列数
列幅
現状のコードに下記のデバック用コードを挿入して実行した後の、イミディエイトウィンドウの結果
元請と仕事と受注日とグループ名のテーブル:🔑元請の名前,🔑受注した仕事,🔑受注日,🔑グループの名前,金額,…
グループのテーブル:🔑グループの名前,…
グループと下請のテーブル:🔑グループの名前,🔑下請の名前,発注日,金額,…
etc:…
素人考えです。過度な期待はしないで下さい。
元請と仕事と受注日のテーブル:🔑元請の名前,🔑受注した仕事,🔑受注日,金額,グループの名前,…
グループのテーブル:🔑グループの名前,…
グループと下請のテーブル:🔑グループの名前,🔑下請の名前,発注日,金額,…
etc:…
もしくは
元請けAからの複数の仕事を一つにまとめて金額を設定し複数の仕事をつくり、それを複数の下請けにだす、といった具合です
めちゃくちゃ複合的にまざったりはしません
出来る方法があり、支障がないなら、それでいいんじゃないかと思います。
ググッてみましたら、こんな情報もありました。
横持ちデータを縦持ちデータに変換する - もう一度学ぶMS-Access
仕事を組み合わせ、金額を決めて下請けに出すという事でしょうか?それとも、こんな場合もあり得ますか?仕事Aと仕事Bがある。仕事Aのその1、仕事Aのその2、仕事Bのその1、仕事Bのその2、仕事Bのその3と分ける。仕事Aその1と仕事Bその1を下請会社あああ、仕事Aその2と仕事Bその2を下請会社いいい、仕事Bその3を下請会社ううう。
なるほど。双方に必要なフィールドを作っておいて、使わない部分は空欄にしとけばいいと思ってましたがそういうものでもないのですね
視認性や管理の問題でわけたほうがいいということでしょうか?
フィールドをが多いとごちゃごちゃしますしね
「仕事のもととなる元請け」この情報は「下請けデータ」には必要ですが、「元請けから受注した売上」には不要な(存在しない)情報ですよね?
データ構造の異なるデータは一つのテーブルにまとめるべきではありません。つまり別々のテーブルにしましょう
わざわざテーブルを作成する必要はないですね
ユニオン クエリを使って複数のクエリを 1 つの結果に結合する
または、くだもののマスタテーブルがあるならDcount関数を使って、それを合計してもいいでしょう
ありがとうございます!
解決しました!本当にありがとうございました!
取り敢えず、下記に変更すると何か変わりますか?
"[補足説明] = '" & Me.txt補足説明.Value & "' " &
りんご様
できました!!!!
本当に本当にありがとうございます!!
レコードソースのクエリwhere条件とパラメーターは設定したままで、教えていただいたコードを修正したところできました。
本当に本当にありがとうございました!
何度もすみません。試してみてください。
下記を追加。フォームの名前と絞り込みの名前は適宜変更して下さい。
Dim rs As DAO.Recordset
qd.Parameters(“[Forms]![フォームの名前]![絞り込みの名前]”)=[Forms]![フォームの名前]![絞り込みの名前]
Set rs = qd.OpenRecordset
下記を変更。
For cnt = 2 To rs.Fields.Count - 1
Set fld = rs.Fields(cnt)
りんご様
ありがとうございます。
Debug.Print Me.レジメン
で確認したところ、レジメンコードが表示されています。また、レポートをデザインビューにし、レコードソースのデータシートビューでもきちんと表示されています。
また、Tレジメンリスト2.番号を削除してもダメでした。
2のカルセドについても数値が入っているのを確認しています。レジメンコードを指定しないで、すべてのレポートを表示さると表示されるので。。
おっしゃる通り、
クロス集計の前に仕組みを入れないと無理だと思います。
だと思うのですが、どういう順番でデータを読み込んでレコードが作成されているのかですかね。
もし、サブフォームのテキストボックスにセットフォーカスする場合、注意点があるようです。グクってみるといいかも。
そうでない場合、VBAコードを提示すると、回答がつきやすくなるかも。
ありがとうございます。
早速やってみましたが、エラーになりました。フォーカスを移動させることができません。と出ます。
その他のテキストボックスにセットフォーカスするとエラーになりませんでしたので、フォーカスできないことが原因なのでしょうか?
となるとなぜフォーカスできないのか?となるんですが、その理由がわかりません…
なにかヒントあればお願いいたします。
正直よくわかりません。テキストボックスにセットフォーカスすると、代入値が見えるのであれば、代入するコードの前に、セットフォーカスするコードを入れてみたら?フォームAにセットフォーカスしてからテキストボックスにセットフォーカスする感じ。
>> 17
クロス集計の前に仕組みを入れないと無理だと思います。where条件パラメータの問題解決に戻りましょう。"レジメンコード=" & Me.レジメンを削除するのを忘れずに。
>> 16
[Forms]![F_レジメンワークシート]![レジメン]の参照値が直接コードと違う値になっていませんか?意図せずにという事もあります。念の為、もう1度確認してみて下さい。例えば、コマンドボタンを作って、メッセージボックスやデバッグプリントで[Forms]![F_レジメンワークシート]![レジメン]の中身を見てみると何かわかるかもしれません。パラメータ参照値が駄目なら直接コードも駄目になるはず。
>> 5
データがどのように登録されているかわからないので、何とも言えませんが、Tレジメンリスト2.番号を削除してみるのも。クロス集計に必要不可欠、これがないと投与dayがおかしくなるという事であれば無理ですが。
その他に、番号その1のカルセドと番号その2のカルセドがある場合、片方の投与dayと投与量が未入力になっていないか見直してみるのも。
試行錯誤の結果が期待通りか否かは、クロス集計クエリを直接開いたり、選択クエリに戻して確認すると良いと思います。
>> 3
水道光熱費並びに家賃を支払月毎や使用月毎に分類し、売上と対比する、という事に意味があるのかよくわかりませんが、頑張って下さい。
慣れないうちは、名称そのものに主キーを設定し敢えてIDを使わない、とした方が分かり易いと思います。
ありがとうございます。今まではエクセルで支払い月ごとに作っていたものが、今後は経理上は支払い月ごと、営業管理として該当月(使用月)ごとに分類する必要が出てきたため、Accessを…と思いました。
時々過去に作ったものを加工したりする程度で、一から作る方法がわからなかったのですが、とりあえず入力用のテーブルと、ルックアップでリストから選択できるフォームを作り、入力していく事が出来ました。
(そのデータをどのように活用していくかはゆっくり勉強しながら進めていきます。)
データを入れるテーブルをシンプルにしなければ、と考えて混乱していました。
どうもありがとうございました。
りんご様
11で作成したフォームのトグルに以下を設定
DoCmd.OpenReport "R_レジメンワークシート", acViewPreview, , "レジメンコード=" & Me.レジメン
これでひとまず表示させることができました。
レコードソースのクエリwhere条件とパラメータは削除してます。
あとは、添付画像の場合4以降を表示させないようにできれば。。
このときのDebug.Print fld.Nameの結果は
1
2
3
4
5
・・・とすべての数値が出ていました。
りんご様
ありがとうございます。
上段のDebug.Print Me.RecordSource と Debug.Print qd.Nameではレコードソースとなったクエリが表示されましたが。
下段のDebug.Print fld.Nameではなにも表示されませんでした。
レコードソースのクエリwhere条件で直接コードを入れた結果は
1
2
3
や
1
8
15
といった希望の数値が出ました。
基本的にこの回答の通りでいいと思いますが、
ここは、インポートでなくリンクでいいかと思います。
そうすればテーブルは不要ですし、インポート前にテーブルからデータ削除とかの操作も不要になります。
>> 1
売上なのか、受注したのか、出荷したのか?伝票テーブルに締め日と請求日を持たせるべきか?という点が気になります。
セオリーはわかりませんが、こんな感じで出来るのかもしれません。
取り敢えず、同じ構造のテーブルを用意して振り分けずにそのままインポート
テーブル1: 日付,取引先,商品ID,個数,締め日,請求日
テーブル1の選択クエリを作る。伝票テーブルに関係するフィールドを選ぶ。
クエリ1:日付,取引先,締め日,請求日
集計ボタンを押してグループ化したら、追加ボタンを押して追加クエリに変更し、実行ボタンを押して伝票テーブルに追加。
伝票テーブル:🔑伝票ID,日付,取引先,締め日,請求日
クエリ2を作る。テーブルの追加ボタンを押して伝票テーブルとテーブル1を表示。共通するフィールドを結合。詳細テーブルに関係するフィールドを選ぶ。
クエリ2:伝票ID,商品ID,個数
追加ボタンを押して追加クエリに変更し、実行ボタンを押して詳細テーブルに追加。
詳細テーブル:🔑詳細ID,伝票ID,商品ID,個数
EXCELでの運用の問題点はリスト化されていますか?
ACCESS(データベース化)で問題点が解決される見込みは立っていますか?
数年後、そのままACCESSを使っていける環境(特に人員の入れ替え・教育など)ですか?
という段階であればACCESSに移行してもメリットを感じないと思います(データベース化自体にはメリットはあります)
簡単なのは「
ID
も名称
も登録する」です入力フォームではコンボボックスで、登録(連結列)を
ID
にして表示は名称
にします。さらに、コンボボックスの更新後処理イベントで名称
を登録するようにしますりんご様
今までご回答ありがとうございました。
とりあえず、本質問は終了させていただきます。
ちょっとよくわからないです。念の為、Debug.Printの結果をイミディエイトウィンドウで確認してみるとか。
ご返答が遅くなりまして、失礼いたしました。
ご回答いただいた内容を基に対処を行おうと、本日ファイルを開いたところ、
今まで発生したエラーが(何もしていないのに)発生しなくなりました。
私の端末以外からも同様でした。
よって、何らかの365関連のトラブルにかかっていたのかもしれません。
そのような、状況ではありますが、いただいたコードを試しましたので
ご確認願います。
>下記コードを追加すると、どんなメッセージが出ますか?
1
False
False
です。
>F27 台帳を開いた直後や何か操作した直後に、コマンドボタンを押すと、どんなメッセージが出ますか?
どのような作業をした場合も、同様の結果でした。