SELECT Max( IIf( q.勘定科目コード < 5000, q.勘定科目コード ) ) As ex1
, Max( IIf( q.勘定科目コード < 5000, q.勘定科目 ) ) As ex2
, Max( IIf( q.勘定科目コード < 5000, q.cost ) ) As 金額_費用
, Max( IIf( q.勘定科目コード > 4999, q.勘定科目コード ) ) As 勘定科目コード
, Max( IIf( q.勘定科目コード > 4999, q.勘定科目 ) ) As 勘定科目
, Max( IIf( q.勘定科目コード > 4999, q.revenue ) ) As 金額_収益
FROM
(
SELECT x.勘定科目コード
, x.勘定科目
, x.[金額(費用)] As cost
, x.[金額(収益)] As revenue
, Count(1) As gnum
FROM 損益計算書 x
, 損益計算書 y
WHERE x.勘定科目コード Between 4000 And 5999
AND y.勘定科目コード Between 4000 And 5999
AND x.勘定科目コード \ 1000 = y.勘定科目コード \ 1000
AND x.勘定科目コード >= y.勘定科目コード
AND Abs( x.[金額(費用)] ) > 0
AND Abs( y.[金額(費用)] ) > 0
GROUP BY x.勘定科目コード
, x.勘定科目
, x.[金額(費用)]
, x.[金額(収益)]
) q
GROUP BY gnum
ORDER BY gnum ;
一応、標準モジュールに
Public Function F_出庫数(int製品ID As Integer, str年月 As String, Optional bln集計区分 As Integer = 0) As Double
Dim strQuery As String
If bln集計区分 = 0 Then
strQuery = "SELECT SUM(S.出庫数量) AS 出庫数量 FROM 出庫詳細 S LEFT JOIN 出庫 SH ON S.出庫ID=SH.出庫ID WHERE S.製品ID=" & int製品ID & " AND Format(SH.出庫日,'YYYYMM')='" & str年月 & "'"
Else
strQuery = "SELECT SUM(S.出庫数量) AS 出庫数量 FROM 出庫詳細 S LEFT JOIN 出庫 SH ON S.出庫ID=SH.出庫ID WHERE S.製品ID=" & int製品ID & " AND Format(SH.出庫日,'YYYYMM')<'" & str年月 & "'"
End If
Dim cn As New ADODB.Connection
Dim rec As New ADODB.Recordset
Set cn = CurrentProject.Connection
Set rec = cn.Execute(strQuery)
If rec.EOF = False Then
F_出庫数 = Nz(rec.Fields("出庫数量"), 0)
Else
F_出庫数 = 0
End If
rec.Close: Set rec = Nothing
cn.Close: Set cn = Nothing
End Function
Public Function F_入庫数(int製品ID As Integer, str年月 As String, Optional bln集計区分 As Integer = 0) As Double
SELECT Max( IIf( q.勘定科目コード < 5000, q.勘定科目コード ) ) As ex1
, Max( IIf( q.勘定科目コード < 5000, q.勘定科目 ) ) As ex2
, Max( IIf( q.勘定科目コード < 5000, q.cost ) ) As 金額_費用
, Max( IIf( q.勘定科目コード > 4999, q.勘定科目コード ) ) As 勘定科目コード
, Max( IIf( q.勘定科目コード > 4999, q.勘定科目 ) ) As 勘定科目
, Max( IIf( q.勘定科目コード > 4999, q.revenue ) ) As 金額_収益
FROM
(
SELECT x.勘定科目コード
, x.勘定科目
, x.[金額(費用)] As cost
, x.[金額(収益)] As revenue
, Count(1) As gnum
FROM 損益計算書 x
, 損益計算書 y
WHERE x.勘定科目コード Between 4000 And 5999
AND y.勘定科目コード Between 4000 And 5999
AND x.勘定科目コード \ 1000 = y.勘定科目コード \ 1000
AND x.勘定科目コード >= y.勘定科目コード
GROUP BY x.勘定科目コード
, x.勘定科目
, x.[金額(費用)]
, x.[金額(収益)]
) q
GROUP BY gnum
ORDER BY gnum ;
SELECT Max( IIf( q.勘定科目コード < 5000, q.勘定科目コード ) ) As ex1
, Max( IIf( q.勘定科目コード < 5000, q.勘定科目 ) ) As ex2
, Max( IIf( q.勘定科目コード < 5000, q.[金額(費用)] ) ) As 金額_費用
, Max( IIf( q.勘定科目コード > 4999, q.勘定科目コード ) ) As 勘定科目コード
, Max( IIf( q.勘定科目コード > 4999, q.勘定科目 ) ) As 勘定科目
, Max( IIf( q.勘定科目コード > 4999, q.[金額(収益)] ) ) As 金額_収益
FROM 損益計算書 q
WHERE q.勘定科目コード Between 4000 And 5999
GROUP BY q.勘定科目コード - IIf( q.勘定科目コード < 5000, 0, 1000 )
ORDER BY q.勘定科目コード - IIf( q.勘定科目コード < 5000, 0, 1000 ) ;
■ 自己結合
SELECT x.勘定科目コード As ex1
, x.勘定科目 As ex2
, x.[金額(費用)] As 金額_費用
, y.勘定科目コード
, y.勘定科目
, y.[金額(収益)] As 金額_収益
FROM 損益計算書 x
LEFT JOIN 損益計算書 y
ON
(
( x.勘定科目コード Between 4000 And 4999 )
AND
x.勘定科目コード = y.勘定科目コード - 1000
)
ORDER BY x.勘定科目コード ;
■ 完全外部結合
SELECT y.勘定科目コード As ex1
, y.勘定科目 As ex2
, y.[金額(費用)] As 金額_費用
, z.勘定科目コード
, z.勘定科目
, z.[金額(収益)] As 金額_収益
FROM
(
(
SELECT 勘定科目コード
FROM 損益計算書
WHERE 勘定科目コード Between 4000 And 4999
UNION
SELECT 勘定科目コード - 1000
FROM 損益計算書
WHERE 勘定科目コード Between 5000 And 5999
) x
LEFT JOIN 損益計算書 y
ON x.勘定科目コード = y.勘定科目コード
)
LEFT JOIN 損益計算書 z
ON x.勘定科目コード = z.勘定科目コード - 1000
ORDER BY x.勘定科目コード ;
Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)
Dim ImgPath As String
Select Case Me.資格コード
Case 1
ImgPath = "C:\test\image\pic1.bmp"
Case 2
ImgPath = "C:\test\image\pic2.bmp"
Case 3
ImgPath = "C:\test\image\pic3.bmp"
End Select
Me.イメージコントロール.Picture = ImgPath
End Sub
mayu様
前回に引き続きありあとうございます。
前回はmayu様の教えて頂いた集約関数のやり方で解決させて頂きましたので、
こちらの方はをあまり見ずに申し訳なく思っています。
上記について教えて頂きたく。
q=テーブルorクエリ名
x.yは何のテーブルorクエリに該当するのでしょうか?(自己結合というもの?)
それにちなんでfrom句の損益計算書 x,損益計算書 yは損益計算書 As x,損益計算書 As yを単純に省略してるだけ?
もしくは最初のx yと関係してる?
お手数ですが宜しくお願い致します。
前回の回答、2020/01/25 (土) 09:05:50 に記述した SQL へ
金額が 0 ではない科目が表示対象になるよう 抽出条件を加えれば
ご希望の結果になるでしょう。
下記と同じ内容の質問ですね。下記で回答が付いていますのでそちらで続けてください。
Access - Accessのショートカット配布可否について|teratail
アドバイスありがとうございます。
確かに2003はセキュリティ面でも厳しいので、さっそく2019を購入しました。
OutputメソッドでPDFは簡単にできました。
あとは、メール添付の方を、いろいろと試してみたいと思います。
ありがとうございます。
初歩的なミスでお手数をお掛けしました。
何度もすみせんでした。
原因は、ウィンドウモードを「ダイアログ」に設定していることですね。
ダイアログで開くとそのウィンドウ以外は操作できなくなります。
ウィンドウモードを「標準」に変更してください。
【レポートBを開く】ボタンは埋込マクロにしています。
回答ありがとうございます。
まさか回答頂けると思わなかったので驚きました。
でも教えて頂いたおかげで理解が出来ました。
gEXはグループ化のために作った計算式をフィールドに表示してみるとってことです
↓
これで理解が出来ました。
group byの列は2つ同じ勘定科目コードを作成し、それをグループ化することで一行にできる。
それと同時にこのような事をすぐにわかる事が出来るのが本当にすごいと思いました。
自分もこのような難しい内容をすぐに出来る様になってみたいです。
本当に感謝しかありませんが、改めてありがとうございます。
このボタンのクリック時のイベントプロシージャのコードを提示して下さい。
レポートA・レポートB 共に「いいえ」にしています。
集計直前の状態をイメージできるとわかると思いますよ
SQLからGROUP BY句を消し、集計関数のMAXもなくすと
こんな感じになります
gEXはグループ化のために作った計算式をフィールドに表示してみるとってことです
gEXでグループ化し、各列MAXをとれば、MAXといっても2レコードの内片方にしか値がないので必ずその値を拾ってきます
並べたいレコードがちょうどセットになるようなgEXを作ればいいので
q.勘定科目コード - IIf( q.勘定科目コード < 5000, 0, 1000 )
はGROUP BY
だから何か特別なことをしているということはありませんついでに
ORDER BY
も同じ式を使っているので4001からきれいに並んでいるわけですね度重なる質問に対して誠にありがとうございます。
正直なところ力不足でまだ理解が追い付いていない部分もありますが、理解が出来る様に頑張っていきます。
また何かありましたら力を貸して頂ければ幸いです。
フック船長さんのテーブル構成だと、棚卸をおこなった時点で
のどちらかで実現可能でしょうし、
テーブル設計が きちんと出来ていることから
フック船長さんは こういった業務知識や手法を身につけている可能性が高いのではないか
というのが、私の見解です。
N + 1 問題
に該当しています、とだけ。
レポートBの作業ウィンドウ固定が、はいになってませんか。なっていたら、いいえにしてください。
お返事いただきありがとうございます。
言葉不足で本当に申し訳ございません。
レポート上のテキストボックスをクリックするのですか。
⇒はい。レポート上のテキストボックスをクリックして、入力フォームを立ち上げています。
レポートはレポートビューで開いているということですか。
⇒はい。レポートビューで開いています。
これは無理です。アクティブなオブジェクトは一つだけですので。
⇒勉強不足で申し訳ございません。
レポートAに【レポートBを開く】ボタンを作成しています。
レポートAを開いて(レポートA上にある)【レポートBを開く】ボタンをクリックすることで、レポートBを開いています。
この場合、レポートBがアクティブになっているのですが、各々の詳細セクションをクリックするなどして、
レポートAをアクティブにしたり、レポートBをアクティブにしたりしたいのです。(クリック動作でアクティブを切り替えたい)
教えていただいたコードをレポートAの詳細セクション⇒イベント⇒クリック時に入力してみましたが、レポートAをアクティブにすることができませんでした。
すみません…
あまりにも基礎が理解できていませんでしょうか…
申し訳ございません。
レポート上のテキストボックスをクリックするのですか。
レポートはレポートビューで開いているということですか。
いつ、どこでというのが不明確ですが、「レポートA」をアクティブにする(フォーカスを移動させる)のは、下記のコードになります。
これは無理です。アクティブなオブジェクトは一つだけですので。
横から失礼。
はじめまして、スナフキンと申します。
少し気になって、期首在庫は必要ないのでしょうか?
それによってはすべてアウトになりそうで^^;;
一応、標準モジュールに
Public Function F_出庫数(int製品ID As Integer, str年月 As String, Optional bln集計区分 As Integer = 0) As Double
Dim strQuery As String
If bln集計区分 = 0 Then
strQuery = "SELECT SUM(S.出庫数量) AS 出庫数量 FROM 出庫詳細 S LEFT JOIN 出庫 SH ON S.出庫ID=SH.出庫ID WHERE S.製品ID=" & int製品ID & " AND Format(SH.出庫日,'YYYYMM')='" & str年月 & "'"
Else
strQuery = "SELECT SUM(S.出庫数量) AS 出庫数量 FROM 出庫詳細 S LEFT JOIN 出庫 SH ON S.出庫ID=SH.出庫ID WHERE S.製品ID=" & int製品ID & " AND Format(SH.出庫日,'YYYYMM')<'" & str年月 & "'"
End If
Dim cn As New ADODB.Connection
Dim rec As New ADODB.Recordset
Set cn = CurrentProject.Connection
Set rec = cn.Execute(strQuery)
If rec.EOF = False Then
F_出庫数 = Nz(rec.Fields("出庫数量"), 0)
Else
F_出庫数 = 0
End If
rec.Close: Set rec = Nothing
cn.Close: Set cn = Nothing
End Function
Public Function F_入庫数(int製品ID As Integer, str年月 As String, Optional bln集計区分 As Integer = 0) As Double
(出庫と同じなので省略)
End Function
上記参照設定でADOにチェックです^^/
を用意したとして
製品IDを1
2020年1月の場合
前月在庫数=F_入庫数(1,"202001",1)-F_出庫数(1,"202001",1)
当月入庫数=F_入庫数(1,"202001")、当月出庫数=F_出庫数(1,"202001")
当月在庫数=F_入庫数(1,"202001",1)-F_出庫数(1,"202001",1)+F_入庫数(1,"202001")-F_出庫数(1,"202001")
上記でどうでしょうか?
クエリーでも使用できると思いますし、少し工夫すれば、期首在庫にも対応できるはず^^;;
かな??
x や y は、 エイリアス と言って
SQL文の中で、一時的に テーブルやクエリに 別の名前をつけています。
x ---> 製品 ( 実在のテーブル )のこと
y ---> ユニオンクエリ ( SELECT 入庫詳細.製品ID ... DateSerial( ... , 0 ) ) のこと
私がエイリアスを付与する理由は、主に以下のようなものになります。
ですから、単一のテーブルのみを使用している SQL では
エイリアスの付与も、オブジェクト名の修飾も不要です。
mayu様
返信が遅くなり申し訳ありません。レポートを作成できました。ありがとうございます。
質問ですが作成していただいたSQL文にx.~やy.~と記載されていますがどのような意味があるのでしょうか。(IIF関数に必要な条件のようなものでしょうか)
見当違いで意味がないのであれば申し訳ありません。
勘定科目コードの 4000番台と5000番台の下3桁同士を
同じグループ( 母集団 )に所属させるための演算になります。
例えば
・ 4000 と 5000 が同じグループ ( 4000 - 0 = 4000, 5000 - 1000 = 4000 )
・ 4011 と 5011 が同じグループ ( 4011 - 0 = 4011, 5011 - 1000 = 4011 )
・ 4999 と 5999 が同じグループ ( 4999 - 0 = 4999, 5999 - 1000 = 4999 )
になります。
( 並び替えも演算結果の数値順になるよう、ORDER BY句に同様の式を記述しています )
したがって、
は
と記述しても 同様の結果を得ることが可能です。
mayu様
回答ありがとうございます。
正に思う通りの内容を記載して頂いた上に、様々教えて頂き大変恐縮です。
SQLはわずかながらに読める程度なので後学の為に教えて頂きたいです。
教えて頂いた3つのうちの1つ、集計クエリでのGROUP BY句の部分です。
GROUP BY q.勘定科目コード - IIf( q.勘定科目コード < 5000, 0, 1000 )
並びの肝の部分だと思うのですが、この条件式でなぜこんなきれいな並びになるかわかりません。
色々と調べてみてもわからないので教えて頂きたくお願い致します。
hatenaさん、こんにちは。
各方面でのご活躍、いつも拝見させていただいております。
管理者権限での表の編集、承知いたしました。わざわざのご連絡、ありがとうございます。
mayuさん、いつも回答ありがとうございます。
質問の編集は私が管理者権限で行いました。見やすくする為にテーブルをマークダウン書式にしました。
2020/01/24 (金) 15:00:34 に私が回答した後
2020/01/24 (金) 19:11:55 に投稿内容が編集されているようですが
その上で未解決ということは、もしかすると SQLの扱いが初めて なのでしょうか。
SQLは、フォームやレポートのレコードソースへも直に記述できるため
記述場所としては、色々あるわけですが
クエリを作るという状況において
SQLをどこに記述すればいいのか わからない
ということでしたら、以下をご覧になるといいでしょう。
なお、
損益計算書
上記のように、勘定科目コードの属性毎に欠番がある場合、
下3桁で完全外部結合するのではなく
同属の科目を昇順に並べるだけの場合は、SQLのロジックにもう一工夫必要になります。
ただし、データベースというのは 本来
第三者が見ても「 行単位でデータ構造を把握できる形 」になっている必要があり、
関連のない複数のデータが同じ行に並んでいるのは、不自然と言っていいでしょう。
投稿文のタグに クエリ・フォーム・レポート の3つが付与されていることから
どのオブジェクトにおいても段組で表示したい のだと想像しますが
コードの体系別に2列表示したいだけなら、レポートのみで行うことをお薦めします。
3パターンの SQL を載せておきます。
■ 集計クエリ
■ 自己結合
■ 完全外部結合
テーブルに書き込もうかと思います。サーバにテキストファイルとして一括出力を考えていたのですが
無理そうですので。。
スナフキン様
ご連絡ありがとうございます。
ご指摘の件、実際のフィールド名を変えて質問していたため誤記です。
RS![名前] = Me![名前] となります。
このコードの前に、
RS![check] = Me![check] ←チェックボックスがあるんですが、じつはここが問題だったようです。
フォームを開いた時に、チェックボックスがfalseになっていませんでした。
フォームロード時にチェックボックスを、
Me.check.Value = Falseにすることで解決できました。
ありがとうございました。
meibo_Tのデザインはどうなってますか?
RS.Find "名前 LIKE '" & Me![検索用名前] & "'"
と
RS![氏名] = Me![氏名]
で名前なのですか?
氏名なのですか?
後はどんなフォームを作成されているのでしょうか?
ログって「一括出力」するようなものでしたっけ?
どのような場合においても不可能であり、可能です
・「ログデータ(ファイル)」はアクセス可能な場所か
・「ログデータ(ファイル)」が存在するか
・「ログデータ(ファイル)」が上書き可能な状態で開けるか
・「ログデータ(ファイル)」がロックできるか
等、根本的な出力場所の環境や同時にアクセスする可能性、その場合の処理を適切に組むことによって「1つのファイルに複数人が同時に書き込める」ような仕組みは作れるでしょう
ログ出力先がデータベースであればこの辺の考え方は標準機能なのでデータベースを扱う技術だけで実現できると思います
それこそ構築中のACCESS自身に出力するだけでいいのであれば追加クエリ1つ実行するだけです
ログ出力に何が必要か(タイミング、内容、データ形式)とログをどのように閲覧したいかを考えてみるといいと思います
「Webシステム(Java)の場合はログ出力用のモジュール」というのがどのようなもので、どのようなログを出力するのか分からないので具体的に回答が難しいです。
テキストファイルですか。
Accessのテーブルとか、他のデータベースなら複数人の書き込みは可能だと思います。
hatena様
ご連絡ありがとうございます。
アクセスのアンインストールやってみます。
それでもダメな場合の、Microsoft DAO 3.6 Object Liblaryの参照設定 ですが、
これは旧バージョンで使っていましたが、2010ではこれも「DLL読み込み時のエラーです」とエラー表示されます。
ご連絡待っている間、2010でDAO⇒ADOに変更しておりました。
そんなに複雑なプログラムではないのでADOに作り替えたほうが楽な気がしてきました。
昨日ご教授いただいた、AC2007以降の帳票フォームで画像表示も通常設定でできましたし。
とりあえずADOで進めてみたいと思います。
また何かありましたらよろしくお願いします。
Access(Office)をインストールするとき、Microsoft office 16.0 Access Database・・・ も同時にインストールされるはずなんですが、失敗しているのかもしれません。
Access(Office)をいったんアンインストールして、もう一度インストールしてみたら解決するかもしれません。
それでダメなら、Microsoft DAO 3.6 Object Liblary を参照設定してみてください。
DAOの古いバージョンですが、機能に差はないので問題なく使えるはずです。
hatena様
ご丁寧にありがとうございます。
ご連絡を待っている間、2010形式で作り替えてみたところ、
2000で作っていたDAOが機能しませんでした。
ネットで調べたところ、Win10 64ビットのためかDAOの参照設定が無効になっていたため
Microsoft office 16.0 Access Database・・・を参照設定するようにと記載がありましたのでチェックを入れたところ、「DLL読み込み時のエラーです」とエラーがでます。
これはどうしたらよろしいでしょうか?
今後のために教えていただきたくお願い致します。
詳細セクションにイメージコントロールを配置して、VBAでイメージコントロールのPictureプロパティに画像のパスを設定します。レコード毎に変更したいので、フォーマット時のイベントプロシージャに記述します。
下記のような感じのコードになります。(フィールド名などは適当ですので適宜変更してください。)
hatena様
お返事ありがとうございます。
アクセスのバージョンは2000です。
レポート印刷のイメージは画像のとおりです。
(資格3種類、1名×2種類の場合)
バージョン替えて作り替えるよりこのまま進めたいのですが
何か良い方法がありましたらアドバイスいただけましたら幸いです。
Accessのバージョンは何でしょうか。
AC2007以降なら、イメージコントロールのコントロールソースプロパティに画像パスを設定することで簡単に表示させることができます。
下記の「画像ファイル名のみ格納してイメージコントロールで表示する方法」の項目を参照ください。
帳票フォームでの説明になってますが、レポートでもまったく同じ方法で使用できます。
とりあえず週単位の場合の集計を作成する方向でいましょう。
それができたら、月単位に応用するのは簡単ですね。
すべての日付に対して、直近7日間での合計ということでしょうか。
例えば下記のような感じでしょうか。
表示させるとして、どこに、どのタイミングで表示さようと考えてますか。
入力フォームで 勤務開始時間 勤務終了時間 を入力したときに、規定時間をオーバーしていたらテキストボックスにそれを表示させる。
あるいは、入力完了後、レポートに一覧を表示させてそのときに規定時間オーバーを表示させるとか。
やろうとしていることを具体的かつ詳細に説明してもらえませんか。
まだ作成していませんが単純に
勤務id(主キー) 氏名 勤務日 勤務開始時間 勤務終了時間
適当です
週単位は7日の間に、という意味です
週単位というのが...
今年初めの場合、12/29(日)~1/4(土)を週単位とみなすのですか?
それとも、1/1(水)~~1/4(土)を週単位とみなすのですか?
こんにちは!
https://tsware.jp/tips/tips_522.htm
この形で保存して、
BASP21で送信するのがいいかと思います