SELECT
T.商品名, SUM(T.A数量) AS A数量, SUM(T.B数量) AS B数量, (A数量 - B数量) AS 差異
FROM
(SELECT 商品名, 数量 AS A数量, 0 AS B数量
FROM Aテーブル
UNION ALL
SELECT 商品名, 0 AS A数量,数量 AS B数量
FROM Bテーブル) AS T
GROUP BY 商品名;
strWhere = "([請求締日]='" & Me![締日] & "')" & _
" AND ([請求先カナ] BETWEEN '" & Me![開始請求先] & "' AND '" & Me![終了請求先] & "')" & _
" AND ([施工者コード] BETWEEN '" & Me![開始施工者] & "' AND '" & Me![終了施工者] & "')" & _
" AND ([工事コード] BETWEEN '" & Me![開始工事] & "' AND '" & Me![終了工事] & "')" & _
" AND ([試験工場コード] BETWEEN '" & Me![開始試験] & "' AND '" & Me![終了試験] & "')"
If in_kbn = "w" Then
If PrinterGRP.Value = 1 Then
DoCmd.OpenReport "R_請求書10", , , strWhere
'//R_請求書10を印刷したときならここ
ElseIf PrinterGRP.Value = 2 Then
'//R_請求書控を印刷したときならここ
DoCmd.OpenReport "R_請求書控", , , strWhere
End If
'//どちらでもいいので印刷したときならここ
Else
If PrinterGRP.Value = 1 Then
DoCmd.OpenReport "R_請求書10", acPreview, , strWhere 'プレビュー
ElseIf PrinterGRP.Value = 2 Then
DoCmd.OpenReport "R_請求書控", acPreview, , strWhere
End If
End If
また、コードの書き方を工夫すると理解しやすくなります
strwhere = "(省略)"
'//印刷・プレビューに使うレポートを決める
Dim reportName As String
Select Case PrinterGRP.Value
Case 1
reportName = "R_請求書10"
Case 2
reportName = "R_請求書控"
End Select
'//印刷またはプレビューを行う
If in_kbn = "w" Then
DoCmd.OpenReport reportName, , , strwhere
'//印刷したときだけCSV出力をするならここにコードを追加する
Else
DoCmd.OpenReport reportName, acPreview, , strwhere 'プレビュー
End If
strwhere = "(省略)"
'//出力設定
Dim reportName As String
Dim queryName As String
Select Case PrinterGRP.Value
Case 1
reportName = "R_請求書10"
queryName = "(R_請求書10に対応したクエリ)"
Case 2
reportName = "R_請求書控"
queryName = "(R_請求書控に対応したクエリ)"
End Select
'//CSV出力先設定
Dim filePath As String
filePath = "C:\foo.csv"
'//処理実行
If in_kbn = "w" Then
'//印刷
DoCmd.OpenReport reportName, , , strwhere
'//CSV出力
DoCmd.TransferText acExportDelim, , queryName, filePath
Else
'//プレビュー
DoCmd.OpenReport reportName, acPreview, , strwhere
End If
Private Sub Form_Open(Cancel As Integer)
Me.TimerInterval = 1000
End Sub
Private Sub Form_Timer()
If Me!納期 < Date Then
If Me!納期.ForeColor = RED Then
Me!納期.ForeColor = DARKYELLOW
Else
Me!納期.ForeColor = RED
End If
End If
End Sub
そのフォームは連結フォームでですか。非連結フォームですか。
非連結フォームなら、VBAでテーブル登録することになります。
連結フォームなら、現状のテーブル構成はなるべく実態に近い形で提示してください。
そもそもテーブル設計から間違っている可能性大です。
値を入力する場合、入力先のテーブルに加えて、そのテーブルのどのフィールドなのかの情報が必要です。「あ」はテーブル名ですか?フィールド名ですか?残りの不明な情報はどこにありますか?
また、Aに対する「あ」やBに対する「い」はどのように決まっていますか?(何を見たらわかりますか?)
全く同じ環境ではないので、断言できませんが、2箇所の顧客のところでこの問題が解決したように思えるので、報告します。ただし、この幻象は突然起こるので本当に解決したかを判断するのはもっと先になると思います。ただ、なにか参考になればと思い報告します。
サーバーのデータベースはSQLサーバー2017でODBCでクライアントと接続しています。
クライアントの環境は、Windows10で、アクセスは、2019開発版のクライアントと2013実行版の方が使用しています。元のアクセスアプリは、2003で作成したMDBです。
まず、2019で新規のデータベースMDBを作成しますが、このとき、フォルダ指定とファイル名指定のボタンを押して、ファイル種類を2000-2003のMDBを選択します。このとき重要なのが、ファイル名はすべてアルファベットにすることです。漢字が入ってると、作成しても同じ不具合が残ってしまいます。
この空のMDBに、元のMDBのテーブルからフォーム等すべてのオブジェクトをインポートします。タブ表示かウィンドウ表示かはオプションであとで選んで下さい。
それと、実行版ですが、2016の実行版ではやはり同じ不具合が残ります。2013の実行版ですとうまく行きました。
この方法で、まだ1週間しか経っていないので、本当にこれで治ったか確信できませんが、今の所2箇所の顧客で正常に動作しています。
この情報がお役に立てば喜ばしいです。
ご連絡ありがとうございます。
内容を書き込んだところ、こちらがイメージした通りのものが表示されました。
有難うございました。助かりました。
追加クエリを準備しておき、プルダウン操作で値Aが確定したら、追加クエリ1を実行、値Bが確定したら、追加クエリ2を実行。(追加クエリ1: テーブル「あ」に値Aを追加。追加クエリ2: テーブル「い」に値Bを追加。)
試していませんが、こんな感じの方向性でコードを考えるのはどうでしょう?
SQLビューに下記のように記述してください。
hatena様ご連絡ありがとうございます。
ご質問についてですが、
・各テーブル内での商品名の重複について → ありません
・Aテーブルのみ、あるいはBテーブルのみに存在する商品名 → 存在します
以上宜しくお願いします。
各テーブル内で商品名は重複している場合があるということでしょうか。
重複している場合は合計値を表示するということでしょうか。
Aテーブルのみ、あるいはBテーブルのみに存在する商品名はありますか。
ありがとうございます。できました。
ググっただけですが、取り敢えず、これはあれこれ確認出来そうです。
Setを使わずに変数にオブジェクトを設定していませんか?
変数にNothingを設定したあとに、使おうとしていませんか?
次に思い付くとすればこんな事でした。既に確認済みだと思いますが。
Set rst = Nothingは出来ていますか?
dbs.CloseとSet dbs = Nothingは出来ていますか?
最後に、かもしれない回答であれですが、アップデート不具合でしょうか。
正直、力になれませんでした。どなたかのヘルプを待って下さい。
余談ですが、レコードセットを上限まで開く実験では、カウント数には数え方があるみたいなものもヒットしました。真偽はわかりません。
フォーム:2or4。(サブフォームあり:+2or4×個数。リストボックスやコンボボックス:+0or2×個数)。
ありがとうございます。
hatena様
調べてみましたが、rst.closeは見た限りできていました。
仰るように、248個もレコードセットはしていないのですが、
お手上げ状態になっております。
りんご様
簡単に言うとデーター入力し(この時テーブルは8個開いている状態の時に、1から2件程打ち込んだ後に出てくるような状態です。あやふやな表現ですが、出てくる場面もまちまちなので申し訳ありません。
その後請求書発行の為に集計をかけるとエラー”3037これ以上データーベースはクエリを開くことができません”
となり、終了すると、閉じることはできるのですが、メッセージで、プログラム名xxxx.accdbは既に使用されているので
使用できません”出てくるのです。そのプログラムが入っているフォルダーには、xxx.laccdbが残っている状態です。
取り留めない状態です。
[ファイル]-[オプション]-[現在のデータベース]-[ドキュメントウィンドウオプション]で
「ドキュメントタブの表示」のチェックを外すか、「ウィンドウを重ねて表示する」を選択する、かのどちらかにしたらどうでしょう。
ようするに、フォームの上部(標題のところ)=「ドキュメントタブ」を表示しないようにする。
一例です。
請求書テーブル
請求書番号 主キー
請求日
請求年月
顧客コード
売上テーブル
売上ID 主キー
売上日
商品コード
単価
数量
請求書番号 ※売上入力時は入力しない
請求書テーブルをレコードソースとするメインフォームで、
請求書番号を発行、請求年月、顧客などを入力、
それをもとに売上テーブルから該当売上データをクエリで抽出する、この更新クエリで発行した請求書番号を売上テーブルに入力。
サブフォームのソースは売上テーブルでリンクフィールドは請求書番号。
請求書テーブルと売上テーブルを請求書番号で結合したクエリをレポートのレコードソースにして、請求書番号で抽出してレポート出力。
請求書メインフォームで、請求書番号発行、請求日、顧客などの必要事項を入力、
サブフォームで、今発生した売上を入力、
リンクフィールドは請求書番号なので、売上テーブルに請求書番号は自動で入力される。
レポートを請求書番号で抽出して出力。
自分がするなら上記のような設計になりそうです。
リンク先の実験ではレコードセットを248開くとエラーになっているようです。
通常、そんなにレコードセットを開く必要はないはずです。
VBAでレコードセットを開いて、使用後に閉じていないものがないか確認してみてはどうでしょう。
セオリーはわかりませんが、どうでしょう。
毎日、売上テーブルに売上データを登録。月末などになったら請求テーブルに請求データを登録。売上テーブルを絞り込んで請求テーブルに紐付けて更新。
請求テーブルに請求データを登録。売上テーブルに売上データ登録&請求テーブルに紐付けする。
わざわざとか、複数になるのでとか、気にしたほうがいいのでしょうか。悩むならデータモデルを悩みたいですよね。
迂回出来るか、作り直すしかないのか、という事ですけれど、テーブル構造やVBAで何をやろうとしていたかなど追加情報が出てきたほうが、誰か回答するかも。
説明が下手ですみません
普段は売上テーブルにフォームで入力して月末にまとめて抽出して請求書にしています
たまに、今発生した売上をすぐに請求書にする、ということがあり、
そのときは一度上記の売上テーブルに入力して、抽出条件を設定して請求書を発行しています
すぐに請求書を発行する場合に、わざわざ抽出をしなくていいように
いま入力したものだけを請求書にして、その売上データも売上テーブルにいれる仕組みにしたいです
一般的にはそのようなわざわざそのような仕組みにせず(複雑になるので)ワンクッションおいてやるものでしょうか?
ありがとうございます。
多分このブログに当てはまるようです。
ということは、作り直すしかないということになるのでしょうか?
他に解決策はないでしょうか?
下記が参考になりませんか。
これ以上データベースを開くことはできません。: yamaV1.02βのブログ
下記の動画などが参考になりませんか。
上手く汲み取れたかわからないけれど、手順の自動化、サブフォームの作り方、レポートの作り方を聞きたいのでしょうか?
皆様 返信ありがとうございます。
hirotonさまに提示していただいた
の方法がうまくいきそうです。
ありがとうございました。
みなさんいろいろアドバイスありがとうございます。がんばってみます。
ありがとうございます。
大変勉強になります。
ご指導いただいた内容に沿って頑張って見ます。
通常はそのような線は出ないので、何か特別なことをしているはずです。
アドインを入れてるとかないですか。
思い当たることがない、ということなら、Officeをアンインストールしてから、再度インストールしてみてください。
この掲示板でコードを表記する場合はコードブロックの記述を使うとわかりやすくなります
また、コードの書き方を工夫すると理解しやすくなります
CSV出力の方法はいくつかあります。メリット・デメリット(使える・使えない)があるので組み込みながら調整が必要ですが、一番簡単と思われるのは
TransferText
を使った方法でしょうDoCmd.TransferText メソッド (Access)
事前に出力用のクエリを作成しておく必要があります。(上記コードでは(R_請求書10に対応したクエリ)と(R_請求書控に対応したクエリ)。実際にはシステムに合わせたわかりやすい名前にします)
hatenaさま 返信ありがとうございます。
背景色は条件付き書式で設定しています。
帳票フォームの最背面にテキストボックス(非連結)を作り
ルールの内容を式にして
[工程]="A工程" のとき 背景色を青 のようにして7工程設定してあります。
改めて考えてみたら条件付き書式を弄るのは大変ですが、条件を弄るのは簡単でした
チェックボックスを配置する(名前:点滅用)
条件付き書式の条件を調整する
ex)
これでタイマーごとに条件付き書式が反映される/されないを繰り返すので点滅してるように見えると思います
コントロールがチェックボックス一つで済む(位置・表示不問)なのでこっちのほうが楽そうです。点滅させたいコントロールが多いなら断然ですね
hirotonが条件付き書式を好きでないのはスクロールバーを掴んでいると反映されないからという理由があったりします
メインフォームの検索条件を増やせば済むようにも見えますが。話題作りとしては、導出フィールドを作って何か出来ないか、なんてどうでしょう。
工程別に色を変え失敗したものを強調したら、次はどうしますか。例えば、期限間近のものに音を鳴らしたり、数量が大きいものを立体的にしたり、手間と時間を見た目に費やすのでしょうか?
そういえば、期限を過ぎたものって、データベースでどういう扱いになるのでしょうか。それから、工程フィールドは別に切り出さないの?
タイマーイベントは単純に時間ごとにイベントを実行するだけ。その挙動(すべてのレコードのコントロールが同時に変更される)は帳票フォームの仕様ですね
基本事項の確認ですが、コントロールの「見た目」はいくつかの要素からなっています
・背景色
・前景色
・枠線(スタイル/色)
hatenaさん指摘の通り、背景色・前景色であれば条件付き書式を切り替えれば実現できるでしょう。枠線もやりたいとなると案がないこともないですが、そこまでする?って感じです
さて、条件付き書式を変更すれば点滅できそうだ、となりましたが、hirotonは条件付き書式が好きではありませんし、VBAでいじるのは大変です。条件付き書式を使わずにレコードごとに書式を設定する方法を使うと楽ができそうです
カレント行の背景色の変更 その3(hatena chipsさん)
hatenaさんのブログですね。記事では背景色ですが、前景色も同じ考え方で実装できます
背景色に適用したい場合
メインのコントロール>背景色:透明、コントロールの配置:前面
書式設定用コントロール>背景色:本来の背景色、コントロールの配置:背面
前景色に適用したい場合
メインのコントロール>背景色:本来の背景色、コントロールの配置:背面
書式設定用コントロール>背景色:透明、コントロールの配置:前面
納期コントロールにぴったり重なる点滅用納期テキストボックスを配置します
コントロールソース:
=IIf([納期]<Date,[納期])
背景色:透明
前景色:本来の背景色(※1)
このコントロールを表示したり消したりすれば特定のレコードのコントロールだけ点滅しているように見えます
注意事項として、前面のコントロールなので普通に触れます。フォーカスがあるときにコントロールを消そうとするとエラーになります。触れないコントロールにするか、即座に
納期.Setfocus
するような仕掛けが必要でしょう※1
本来の背景色と同じ色のテキストを前面に配置する≒背景と同化して見えなくなる。です。「文字を消す」ことが目的なら背景色のテクニックで完全にかぶせてしまってもいいですね。前景色でやると、調整によって薄めの文字との点滅とかができたりします
価格などはみなさんのアイデアでやるのがいいのかもしれませんね
・商品名の変更
・取引先の社名などの変更
・婚姻などで従業員の名字の変更
などはどのようにやるものでしょうか?
考えていたらありとあらゆるものが変更の可能性があるな、と
同じIDは登録出来ないので、確かにこれは無理ですよね。
1❌最初にざっくり思い浮かべたのはこんな感じのでした。
商品名や社名も何とかならないか考えたんですけど、力不足でまとまらなかったです。見た目の履歴は残すとして、中身が変わらないのに見た目を参照する必要ってあるのかな、従来通り中身を参照出来ないかしら?
プロに任せれば、マスタ全部に開始年月を組み込んで、複雑なデータベースを作ることが出来るのかもしれません。
ググったり本を読んだりするとだいたいそんな感じなので自然にそうなっちゃいますよね。主キーはIDの泥沼から抜け出すなら早い方が良いですよ。頭を柔らかくしないと無理なので大変苦労します。
頻繁に変更があるものなら、トランザクションテーブルの方にデータを持たせるというのもありだと思います。
例えば、生鮮食品の価格とかは、売上履歴テーブルに価格も格納してしまえばいいと思います。
マスターには常に最新の価格を入力して、売上テーブルに入力するときに、VBAでマスターの価格を売上テーブルの価格に代入します。
あるいは、マスターとは別に価格変更履歴テーブルを作成するという方法もあります。
届いています。ちょっと忙しかったので今、SQLを確認しました。
かなり複雑なSQLなので、それだけで原因を特定するのは難しいです。
症状の発生するファイルを送ってもらえたら、原因を特定できるかもしれません。(できないかもしれませんが)
これはどのように実現していますか?
帳票フォームでレコード毎に背景色を変更するのは、条件付き書式しかないですが。
点滅させるなら、その条件式を変更することになります。
現状の条件付き書式の設定を提示してもらえますか。
こうですね
https://dbconcept.hatenablog.com/entry/2021/07/24/123217
hirotonさま 返信ありがとうございます。
サブフォームのモジュールに
と記述しましたが、サブフォームの1件目の納期を参照しているようで
全ての納期のコントロールが同じ動きをしてしまいます。
どのように記述すればよいのでしょうか?
サブフォームもフォームです。適切にプロパティを設定すればその通り動作します
親フォームのタイマーイベントでサブフォームのコントロールを弄るということもできますが、今回の例ではそうすることもないでしょう
どのようにやるということですか?
有効期限をつけて同じ内容で一部を変更したレコードを追加するということでしょうか?
リレーションするときの主キーはIDにすることが多いですが同じIDは登録できませんよね?
先日こちらのフォームからお送りしておりました。届いておりましたでしょうか。
ご回答はメールでいただけそうでしょうか。特に急ぎという訳ではありません、
届いたか不安だったため…ご連絡お待ちしておりますね!