SELECT D.*, DateDiff("s", D.START, D.END) as DURATION
FROM ( SELECT s1.EVENT, s1.E_Time as START
, ( SELECT TOP 1 e1.E_Time
FROM 表1 e1
WHERE e1.EVENT = s1.EVENT
and e1.E_Time > s1.E_Time
and e1.E_Cond = "END" ) as END
FROM 表1 s1
WHERE s1.E_Cond="START"
) D
ORDER BY D.START, D.EVENT
リンク先では、方法1 と 方法2 の2つの方法を紹介していますが、どちらの方法でしていますか。
方法1なら、[印刷設定]の[レイアウト]の[幅]で2列目の表示位置を調整できますので、それで合わせてください。
方法2ならずれることは考えられません。
レコードソースをバラメータクエリにする方法もありますが、フォーム経由にした方が自由度は高いです。
開くときに設定する条件を都度任意のものにしたいときは
フォームを経由させることになりますか?
レポートをデザインビューで開いて、「レコードソース」プロパティをクエリ名に変更すればいいでしょう。
フィルタリングするだけなら、マクロかVBAでレポートを開くときに抽出条件を設定できますので、レコードソースはテーブルのままにしておけば、レポートは一つですみます。
VBAの場合のコード例
DoCmd.OpenReport メソッド (Access) | Microsoft Docs
まずは問題を切り分けましょう。
問題のファイルの「閉じる時に最適化」をオフにしたときは、バックグラウンドプロセスが残りませんか。
残るなら、「閉じる時に最適化」が原因ではないので、別の部分に原因があることになります。
残らないなら「閉じる時に最適化」をオフにして運用する方法を検討しましょう。
方法としてはタスクスケジューラでWindowsの起動時または終了時に問題のファイルを最適化するプログラムを実行するようにすればいいでしょう。
Accessの最適化をバッチファイルで行う方法 – 外資系SEパパのブログ
Accessデータベースファイルを最適化する関数 - hatena chips
⇒ です。確認がイマイチでした。申し訳ありませんでした。
⇒ 記載しませんでしたがエラーが出て困っておりました。
⇒ 一旦は15列での出力を試みましたが画像が粗く埋め込みにしようかとその為のワークテーブル作りでした。
他に策があればご教授下さいますようお願い致します。
と言うか、新たにトピックを起こします。
hatena様ありがとうございました。
朱色様、
なるほどです。これもやってみます。
こういったデータの並び替えって、需要が結構ありそうだと思っていたんですが、以外に少ないみたいですね。
ありがとうございました。
こんばんは。
色々試してみましたが、結局解決しませんでした…。
とりあえずは、下記の対応で当分は対応しようと思います。
①起動用のaccessの起動
(フォームを表示せず、単体の起動でバックグラウンドプロセスが残らないようにします)
②本体のaccessの使用(最適化はそのままの設定)
③本体を終了(バックグラウンドプロセスが残る)
accessのバックグラウンドプロセスが残っていても、起動用accessから開くと通常通り使用できました。
ただし、起動→本体終了を繰り返した分だけバックグラウンドプロセスは残ります。
私以外のPCは退社時に電源をオフにしますので、
タスクキルもせず、そのままにしようかと思います。
(本当はよくないかと思いますが…)
私のPCは夜間自動更新がありますので、タスクキルのバッチファイルでも作成して、しばらく運用してみようと思います。
「閉じる時に最適化」が原因なのか、とも思いましたが、単体運用しているmdbでは同じ設定でもバックグラウンドプロセスが一度も残らなかったので、違ったようです。
何かご存知の情報などありましたら、ご教示頂ければ幸いです。
コードには
rs.Fields("file_image")
とあるのですが、file_image というフィールドは t_filedetaにあるのですよね。あと、内側の Do Loop の最後でも rs.EOF でチェックしないとエラーになると思います。
蛇足
コードを見た感じ、印刷用ワークテーブルで15列に出力しているのだと思いますが、
レポートの印刷設定で列数を設定できますのでそれでいいように思いますか、
なにか特別なレイアウトになっているのでしょうか。
回答するのに情報が不足しているということです。
実際のテーブルのデータ例と欲しい出力結果を提示してもらえませんか。
お試しクロス集計クエリを作ってみたけれど、過去1年間の絞り込み条件式が難しいという事でしょうか?
それと、過去1年間とは、いつからと考えていますか?
テーブル[T-取引]のデータ例を提示してもらえますか。
在庫量の計算は一般的に、期首在庫量+入庫量-出庫量 という計算になりますが、期首在庫量をどこにどのように格納しているのでしょうか。
こんばんは。
タブ・スペース・改行の違いがよく分かりました。ありがとうございます!
タブ文字が文字化けしていたのですね。アプリケーション依存で表示されるとは知りませんでした。
クエリに式を入れていたのですが、テキストボックスの更新後処理の方がスマートですね、変更してみます!
返信遅くなりました。
うまくいかない理由が分かりました。ありがとうございました。
Chr(9)
はタブ文字ですね247 タブとスペースの違いは何ですか?どちらを使えばいいですか?(FELLOWS Inc. さん)
コピーした文章をメモ帳に張り付けてみてください。謎の□が出る位置に1カーソル分の空白が存在することがわかると思います。タブ文字はどう表現するかがアプリケーション依存なので今回の現象が発生しているのでしょう
また、文字として「タブ」がなくてもコピペすると「タブ」になる場合があります。(多分今回もそう)
EXCELで
のようなデータを作り、A1~B2セルをコピーしてメモ帳に張り付けてみましょう
このように貼り付けされます。「AとBの間」、および、「CとDの間」はタブ文字になっています。また、行の切り替わり「Bの後ろ」と「Dの後ろ」には改行が入ります
これが確認できたら、こんどはメモ帳の内容をコピーしてEXCELに張り付けてみましょう。メモ帳の内容はただのテキストデータなのに、きちんと2x2のセルに分かれてデータが貼り付けできると思います
このように、表形式の表示を異なるアプリケーション間でコピペするため、テキストのデータ加えて、制御用にタブ文字や改行が追加されることがあります
今回の問題はコピーした元のテキストデータに不要なデータがくっついてきたのが原因でしょうから、データ登録時に修正するのがいいです
なので、テキストボックスの更新後処理で
Replace(Me![項目名],Chr(9),"")
するといいと思います速度のほうはさっぱりわからないのですが、クエリくみくみするのは好きなので一例。
考え方としては、STARTだけの抽出結果(Sテーブル)に対し、
「同じEVENT、より遅いTime、CondがEND」の条件で最初にHITする抽出結果(Eテーブル)を
くっつけるというものです。
こんにちは。クエリに下記の式を入れたところ□を消すことが出来ました!!
項目名: Replace([テーブル]![項目名],Chr(9)," ")
試行錯誤でやっており、なぜ消せたのか理屈はよく理解出来ていないのですが💦(;^_^A
すみません、説明に不足がありました。
レポートは、テーブルにフィルタ条件(項目:募集終了フラグ=false)を付けたクエリ(q1)より作成しております。
検索フォームにはそのレポートのPDF出力のボタンが付いているだけです。
PDF出力はhatenaさんの下の記事を参考に作成させていただいています。
https://hatenachips.blog.fc2.com/blog-entry-380.html
入力用フォームと検索用フォームに分けており、PDFは「検索用フォーム」からPDF出力するようにしています。
■入力用フォーム:入力専用、テーブルを更新します。PDF出力ボタンは作っていません。
■検索用フォーム:テーブルにフィルタ条件(項目:募集終了フラグ=false)を付けたクエリ(q1))を閲覧・PDF出力出来るようにしています。
レポートからPDFへの出力はどのようにしてますか。
私の説明が分かり辛く申し訳ございません。
添付の画像にて補足させて頂きます。
ご確認ありがとうございます。
下記のサイトでやってみているのですが、募集要項の「左側の大きい分類項目」と「右側の詳細文」との間に□が入ってしまうようです。「右側の詳細文」だけを選択・コピーしても、頭に□が入ってしまいます。
フォーム・印刷前のレポートでは表示されないのですが、PDF出力すると□が入っています。テキストだけを貼り付けたいのですが、、
サイト
https://doda.jp/DodaFront/View/JobSearchDetail/j_jid__3004882290/
「空白の改行」ってなんのことだろう。
画像の四角の中にバツ印のものことでしょうか。
問題の「WEBサイトから文章コピー」の文章をここに貼り付けてもらえますか。
当方のAccessファイルで「閉じる時に最適化する」を設定して試してみましたが、「バックグラウンドプロセスが残るという現象は発生しませんでした。
WEB検索してもおっしゃる通り解決法は見つかりませんね。
とりあえずAccessファイルが破損している可能性がありますので、
新規Accessファイルを作成して、現状のファイルからすべてのオブジェクトをインポートして、新規Accessファイルでも試してみてください。
それで解決しないようなら、「閉じる時に最適化する」は使わずに、タスクマネージャーでPC起動時か終了時に外部から最適化を実行するようにしてはどうでしょうか。
VBAを使って最適化する方法は下記で紹介しています。
Accessデータベースファイルを最適化する関数 - hatena chips
hatena様、
hatena様のサイトはいつも参考にさせていただいております。ご紹介いただいた記事を参考にやってみます。ご回答ありがとうございました。
ご返答ありがとうございます。
テーブル、かなりの行数を保持しています。
月に一回バックエンドから一定期間のデータをコピーし、各人で保持させています。
通常はそのデータを検索したり、一部のテキストをコピーして別のシステムに貼り付けたりして使っています。
バックエンドも月に一回更新前にバックアップをとり、更新後に最適化する様にしています。
教えていただいた起動用のaccessでもバックグラウンドプロセスが残っていました。こちらは「起動しています」と表示するだけのフォームを開いていたのですが、フォームの表示をやめるとバックグラウンドプロセスは残らなくなりました。
他のaccessでもフォームを開く時に色々処理を書いていたのですが、変更したところ残らなくなりました。
ランタイム環境でもテストしてみたのですが、バックグラウンドプロセスが残るPCと残らないPCがあるようです。
Microsoftコミュニティでも似たような現象がありましたが、これといった解決策も見つけられませんでした。
下記のような手順でクエリを作成したらいいでしょう。
まずは EVENT と E_Cond でグループ化した連番を作成する。
方法としては下記を参考にしてください。
グループ毎連番を自動入力する関数 - hatena chips
上記ではクエリで生成する方法と、VBAでテーブルに書き込む方法(関数)を紹介しています。
クエリの方法は重い処理になりがちなのでデータ数が多い場合は、VBAの方法をお勧めします。
連番が生成出来たら、それから、
E_Cond="START"を抽出するクエリを作成する。→ Q_START
E_Cond="END"を抽出するクエリを作成する。→ Q_END
Q_START と Q_END を含むクエリを作成して、EVENT、E_Cond、連番 で結合する。
あとは、必要なフィールドを表示させて、
Datediff("s", Q_START.E_Time, Q_END.E_Time)
で経過時間(秒)を計算すればいいでしょう。「accessのオプションで閉じる時に最適化するにチェック」で最適化しているということは、フロントエンドを最適化していることになりますが、分割している場合は、フロントエンドの最適化は通常は必要ないです。
フロントエンド側にワークテーブルがある場合は必要ですか、フロントエンド側でワークテーブルを使っているのてしょうか。
また、バックエンドは定期的な最適化が必要ですが、フロントエンド側から接続している間は最適化は実行できません。
ユーザーが使用していない深夜などに自動で最適化を実行するようにする必要があります。
私の場合は、
最適化する前にバックアップもとっておいた方かいいので、タスクスケジューラなどで、バックエンドのバックアップと最適化を深夜に実行するよう設定します。
ということで、私自身は、「accessのオプションで閉じる時に最適化する」を使ったことがないのでそのような現象を経験したことがありません。
本当にフロントエンド側の最適化が必要ですか。
バックエンド側のバックアップと最適化は定期的に実行してますか。
上記の2点をよくよく検討してみてください。
ご返答、ありがとうございます。
以前もお話ししたのと同じaccessですので、
フロントエンドとバックエンドに分割しています。そして起動用のaccessもあります。
「最適化して終了」では以下を試しました。
①終了ボタンのvbaに
Documd.Quit
accessのオプションで閉じる時に最適化するにチェック
②終了ボタンのvbaに
Documd.Runmacro マクロ
accessのオプションで閉じる時に最適化するにチェック
です。
私以外はランタイム環境ですので、必ずオプションで設定しています。
最適化しているとは思いますが、
(Windows7まではしていた)
バックグラウンドプロセスが残ってしまいます。
別の単独のaccessやaccdbのaccessも開くと何個も残っています。
バックグラウンドプロセスが残らない場合もあり、何が原因なのか打つ手がない状態です。
テキストボックスをリッチテキスト形式にするのが原因と書かれているサイトも拝見しましたが、リッチテキスト形式にした事もありませんし、普通のテキスト形式である事も確認しました。
vbは勉強中ですが、できればこのままaccessを使い続けたいので、ご存知でしたらご教示下さい。
宜しくお願い致します。
フォーム(Me)を再クエリするのではなく、コンボボックスを再クエリしてください。
クロス集計テーブルとクロス集計入力フォームは、個人的には、NGです。
クロス集計ありきで、ExcelライクなAccessを目指すと、横にフィールドを伸ばしたくなったり、縦横のイメージが抜けなくなったりしませんか?
縦横のAccessは、たぶん、複雑なSQLを都度都度要求されるので、まず完成しません。神アニメや神ゲームをExcelで再現するくらい大変でしょう。
これも、複雑なSQLが必要になるアンチパターンでしょう。
ある共通点を持つものを、横に並べない、これがAccessの基本だと思います。
こんなのはどうでしょう?
・製造計画フォーム
製造日:6/1、製品名:製品X、製造数:10
材料明細
ロット明細(古いバージョンから使う事)
次のように、ユーザーが選んで打ち込みます。
在庫数がなくなるかマイナスになると、表示されなくなったり、打ち込めなくなったりするのは、どうでしょう?
あとは、在庫数をどうやって処理するかの問題は、残りますが。
クロス集計クエリは、Access完成後、しばらく運用してから、見やすさのために、リリーフ登板する感じになるのではないでしょうか。
データベースを複数のユーザーで共有しているということでしょうか。
データベースはフロントエンドデータベースとバックエンドデータベースに分割していますか。
「accessを最適化して終了した」とは具体的にどのようにしていますか。
お世話になります。
以下のような感じになります。
ユーザが入力するのは 以下のフォーム
D1 D2
X:2021:06: 10 10
上記データを
↓ 構成マスタと合わせ展開して 消費テーブルに追加
6/1 あいうA 10
6/1 あいうB 10
Excelライクに入力する範囲 を常に一定 にするため上記方法を考えております。
お世話になります。 はい、
D1~ のテーブルは入力用の一時テーブルで、入力後、縦に展開する正規化されたデータに変換してテーブルに格納するということですね。
上記の通りになります。
hatena様の 累計値をテーブルに自動入力する関数 を使用させていただき
画像のような 所要量計算テーブルで所要量を計算し、累計残高としています。
製品のマスタとしては、 カレー・肉じゃがに使う じゃがいもは 代替品でOKとした マスタテーブルを持ち、
変更順をデータとして持たせるとします。
このとき、消費計画のテーブルでは
メークイン が0になったら 男爵イモ の在庫を使う ・・ のようにしたいと考えております。
累計処理で計算すると、 まだ 男爵イモを使用しなくても良い 時でも 引いてしまうため
この処理について良い案がないか というご相談になりました。
イメージばかりですみません・・。
hirotonさん、どちらの方法も本文最後にページが入りました。
完璧です!!
もしくは改ページプロパティは弄らずに
If FormatCount = 2 Then Me!ページ数表示.Visible = False
にするとか
レポートフッターの改ページプロパティを「カレント セクションの前」にしてください
今の表示は同一ページ印刷「はい」の設定で、「本文の最後のページに収まらないから次のページから開始」という処理になってると思います。この場合だと本文最後のページで
レポートフッター_Format
が呼び出されます同一ページ印刷プロパティで制御
表示内容がないだけで、本文最後のページと索引最初のページ(レポートフッター)が同じページになっている
→本文の最後のページからページ数表示が非表示
改ページプロパティで制御
本文のページと索引のページは明確に分かれる
→索引だけページ数表示が非表示
D1~ のテーブルは入力用の一時テーブルで、入力後、縦に展開する正規化されたデータに変換してテーブルに格納するということですね。
レコード間を順に集計していく処理(連番とか累計)はクエリは苦手です。複雑かつ重い処理になりがちです。特に今回の安形だとバージョンがあったりとより複雑になります。
VBAでレコード移動しながら処理していくのが高速かつシンプルにできます。
下記に、連番をクエリまたはVBAでする場合のサンプルがありますので、参考になると思います。
グループ毎連番を自動入力する関数 - hatena chips
hiroton さん、↑の通りやってみたところ、索引にページがのらなくなりましたが、本文のページ数に索引ページ分をカウントしているようです。
全体のページは必要ないので、 =[Page] & " ページ" としてみました。
ちなみに本文最後のページだけページ数が入らないのは何故でしょうか?
これは、下のような感じですか?
日付,子部品あいうA,子部品あいうB,テープ,ネジ,…
6/1,
6/2.
6/3,