プロが教える店舗&オフィスのセキュリティ対策術

MDEファイルからレポート印刷できません。
下記構文の下から4行目「acViewDesign」を開けないからだと思います。
回避しようと「acViewDesign」を省くようにいろいろ試みているのですが、
レポート印刷はできるようになっても、
レポート内容(詳細セクション)が空になってしまいます。

どなたかご教授くだされば幸いです。
よろしくお願いいたします。

----------------------------------------------------------------------
Dim strDate As String
strDate = "#" & Month(Me.txt日付) & "/" & Day(Me.txt日付) & "/" & Year(Me.txt日付) & "#"

Sql = "SELECT * FROM q棚卸_結果表示 WHERE 日付 = " & strDate & " " & strWhere & "ORDER BY メーカー名, カナ"

DoCmd.OpenReport "r棚卸_結果表示", acViewDesign
[Reports]![r棚卸_結果表示].[RecordSource] = Sql
DoCmd.OpenReport "r棚卸_結果表示", acViewPreview

End Sub
----------------------------------------------------------------------

A 回答 (8件)

MDEファイルにするとデザインビューには


どう転んでもできませんから、
どうしても、レポートを開くときにレコードソースを
設定しなければならない理由がないのなら、
Month(Me.txt日付)の部分を
Month(Forms!フォーム名!txt日付)などのように
他の部分も同じように変更して、レポートの
レコードソースに最初から設定しておけば
いいのでは、と思いますが。 strWhereの
内容はわかりませんが、このようなところです。

この回答への補足

>
> strWhereの内容はわかりませんが、
>
このような内容です。よい方法はありますでしょうか。。。


'WHERE条件の作成-------------------------------------
If Me.txtSchコード <> "" Then
strWhere = strWhere & " AND 商品コード = '" & Me.txtSchコード & "'"
End If

If Me.txtSchSyouhinName <> "" Then
strWhere = strWhere & " AND (商品名 LIKE '*" & Me.txtSchSyouhinName & "*' OR カナ LIKE '*" & Me.txtSchSyouhinName & "*')"
End If

If Me.cmbSchMaker <> "" Then
strWhere = strWhere & " AND メーカー名 = '" & Me.cmbSchMaker & "'"
End If

If Me.cmbSchBunrui <> "" Then
strWhere = strWhere & " AND 大分類 = '" & Me.cmbSchBunrui & "'"
End If


Dim strDate As String
strDate = "#" & Month(Me.txt日付) & "/" & Day(Me.txt日付) & "/" & Year(Me.txt日付) & "#"

Sql = "SELECT * FROM q棚卸_結果表示 WHERE 日付 = " & strDate & " " & strWhere & "ORDER BY メーカー名, カナ"

DoCmd.OpenReport "r棚卸_結果表示", acViewDesign
[Reports]![r棚卸_結果表示].[RecordSource] = Sql
DoCmd.OpenReport "r棚卸_結果表示", acViewPreview

補足日時:2011/08/30 22:38
    • good
    • 0
この回答へのお礼

piroin654様、ありがとうございます。
> Month(Me.txt日付)の部分を
> Month(Forms!フォーム名!txt日付)
をやってみましたが構文のエラーになってしまいました。
きっとそれだけではだめなのでしょうね。
もう少し勉強してみます。

お礼日時:2011/08/30 22:33

ORDER BY ・・・が無ければ、Docmd.OpenReport・・・にWhere条件を付ければ済む問題なのですけど。


q棚卸_結果表示クエリのSQL文を書き換えてしまうとか、
(過去ログで、QueryDef について調べてみてください)
もっとシンプルな方法があったような気もします。

でも、その前に
Sql = "SELECT * FROM q棚卸_結果表示 WHERE 日付 = " & strDate & " " & strWhere & "ORDER BY メーカー名, カナ"
Debug.print Sql でSQL文の確認をするとか
新規クエリのSQLビューに貼り付けて、希望した結果が得られるか確認する方が先決です。
    • good
    • 0
この回答へのお礼

nicotinism様、ありがとうございます。
私の方が素人すぎてせっかく戴いたアドバイスを有効活用できないのが
残念です。
もう少し勉強してみます。

お礼日時:2011/08/30 22:30

一つ気になるのは


Sql = "SELECT * FROM q棚卸_結果表示 WHERE 日付 = " & strDate & " " & strWhere & "□ORDER BY メーカー名, カナ"
で、ORDER BY 句の前にスペースが無いことです。(でもこの場合はエラーで止まるはず?)
Sql = "SELECT * FROM q棚卸_結果表示 WH・・・の次の行で
Debug.print Sql
Exit Sub
としてイミディエイトウィンドウ(出してなければ、Ctrl + G で出ます)に
Sqlの内容が出力されてます。
このSQL文を新規クエリのSQLビューに貼り付けてみたらということです。
あるいはここにでも。
問題の切り分けのためにWhere条件を少しずつ増やして動作確認してみてもよいですね。
なお、今回の問題とは関係ないと思いますが、「SQL」はAccessの予約語です。
http://office.microsoft.com/ja-jp/access-help/HA …
私も変数名に結構長いこと知らずに使ってましたがエラーになった事はありませんけど一応。
    • good
    • 0

いろいろ検索条件がある場合に、無理にデータをレポートに


突っ込む方法を考えるよりも、レポートのレコードソースとして
必要なフィールド(もちろん型の設定も)をもった空のテーブルを
作成し、それをレポートのレコードソースにし、
q棚卸_結果表示の抽出条件でレコードを取り出し、それを
作業用テーブルにいれることを考えれば、フォームをデザインビュー
にして、レコードソースを設定して・・・などのような
ことは考える必要はなくなります。
作業用テーブルをTレポート用とします。
フィールドは上記の通りです。

一応概略を言いますと、

(1)
q棚卸_結果表示で帳票フォームを作成
(2)
出来たフォームにテキストボックス、コンボボックス、コマンドボタン設定
(3)
ボタンクリックでフォームにフィルタをかけ、抽出したデータを
テーブルにエクスポート。このときのフィルタ条件は補足の条件を
そのままフォームに適用。
(4)
レポートを開く
(5)
必要に応じて次のレポート作成のために
テーブルを初期化。


このような感じです。コードは書いていませんが、
ちょっとサンプルを作って確認してみます。
    • good
    • 0

No4の説明で、



>q棚卸_結果表示の抽出条件でレコードを取り出し、

は、

q棚卸_結果表示を抽出条件でフィルタかけレコードを抽出し

です。ちょっと言い方が変でした。
    • good
    • 0

一応、確認したので作成手順とコードを載せます。



【作成手順】
(1) レポートのレコードソース用テーブルの作成
q棚卸_結果表示で表示される全フィールドを新しい
テーブルに設定し、その名前を「Tレポート用」とします。
フィールドの型はq棚卸_結果表示の基になる
テーブルのフィールドの型を設定してください。

(2) レポートの作成
(1)で作成した「Tレポート用」を基に新規作成から表形式
を選択し、出来たレポートを「r棚卸_結果表示」とします。
レポートをデザインビューで開き、プロパティから、
レコードソースの右端をクリックしてクエリビルダを
開き、フィールドをすべて設定し、メーカー名とカナの
並び替えを設定します。

(3) フォームの作成
新規作成から「q棚卸_結果表示」を基にして表形式
のフォームを作成します。名前を一応「F棚卸」とします。
出来たフォームをデザインビューにし、詳細のところに
マウスを当て、十字になったら詳細を適当に押し下げ、
残りのラベルも詳細のところにもっていきます。
次に、以下のテキストボックス、コンボボックス、
ボタンを設定します。

txt日付
txtSchコード    (テキストボックス)
txtSchSyouhinName  (テキストボックス)
cmbSchMaker    (コンボボックス)
cmbSchBunrui    (コンボボックス)
cmd抽出      (ボタン)
cmdレポート    (ボタン)

(4) フォームのボタンクリック時の設定


Private Sub cmd抽出_Click()
Dim db As Database
Dim rs1 As Recordset
Dim rs2 As Recordset
Dim strWhere As String
Dim strQry As String

'Tレポート用の初期化のSQL文
strQry = "DELETE * FROM Tレポート用;"

'日付が必ず入力されているものとします
'日付が未入力ならプロシージャを終了
If IsNull(Me!txt日付) Then
MsgBox ("日付が設定されていません")
Exit Sub
End If

'strWhereを日付から設定
strWhere = strWhere & "#" & Month(Me.txt日付) & "/" & Day(Me.txt日付) & "/" & Year(Me.txt

日付) & "#"

If Me.txtSchコード <> "" Then
strWhere = strWhere & " AND 商品コード = '" & Me.txtSchコード & "'"
End If

If Me.txtSchSyouhinName <> "" Then
strWhere = strWhere & " AND (商品名 LIKE '*" & Me.txtSchSyouhinName & "*' OR カナ LIKE

'*" & Me.txtSchSyouhinName & "*')"
End If

If Me.cmbSchMaker <> "" Then
strWhere = strWhere & " AND メーカー名 = '" & Me.cmbSchMaker & "'"
End If

If Me.cmbSchBunrui <> "" Then
strWhere = strWhere & " AND 大分類 = '" & Me.cmbSchBunrui & "'"
End If

Me.Filter = strWhere
Me.FilterOn = True

Set db = CurrentDb
Set rs1 = Me.RecordsetClone
Set rs2 = db.OpenRecordset("Tレポート用", dbOpenDynaset)

'Tレポート用の初期化
db.Execute strQry1

'Tレポート用への抽出レコードの書き込み
If rs1.RecordCount > 0 Then
rs1.MoveFirst
Do Until rs1.EOF
rs2.AddNew
rs2!日付 = rs1!日付
rs2!商品コード = rs1!商品コード
rs2!商品名 = rs1!商品名
rs2!カナ = rs1!カナ
rs2!メーカー名 = rs1!メーカー名
rs2!大分類 = rs1!大分類
rs2.Update
rs1.MoveNext
Loop
End If

rs1.Close: Set rs1 = Nothing
rs2.Close: Set rs2 = Nothing
db.Close: Set db = Nothing
End Sub

Private Sub cmdレポート_Click()
DoCmd.OpenReport "r棚卸_結果表示", acViewPreview
End Sub



以上です。(4)のテーブルへの書き込みのところでは
フィールドはこちらで推定して並べました。実際に
合わせて変更してください。
    • good
    • 0

No6の(4)のコードの途中が崩れて表示されたので


(4)のところをもう一回。

(4) フォームのボタンクリック時の設定


Private Sub cmd抽出_Click()
Dim db As Database
Dim rs1 As Recordset
Dim rs2 As Recordset
Dim strWhere As String
Dim strQry As String

'Tレポート用の初期化のSQL文
strQry = "DELETE * FROM Tレポート用;"

'日付が必ず入力されているものとします
'日付が未入力ならプロシージャを終了
If IsNull(Me!txt日付) Then
MsgBox ("日付が設定されていません")
Exit Sub
End If

'strWhereを日付から設定
strWhere = strWhere & "#" & Month(Me.txt日付) & "/" & Day(Me.txt日付) & "/" & Year(Me.txt日付) & "#"

If Me.txtSchコード <> "" Then
strWhere = strWhere & " AND 商品コード = '" & Me.txtSchコード & "'"
End If

If Me.txtSchSyouhinName <> "" Then
strWhere = strWhere & " AND (商品名 LIKE '*" & Me.txtSchSyouhinName & "*' OR カナ LIKE '*" & Me.txtSchSyouhinName & "*')"
End If

If Me.cmbSchMaker <> "" Then
strWhere = strWhere & " AND メーカー名 = '" & Me.cmbSchMaker & "'"
End If

If Me.cmbSchBunrui <> "" Then
strWhere = strWhere & " AND 大分類 = '" & Me.cmbSchBunrui & "'"
End If

Me.Filter = strWhere
Me.FilterOn = True

Set db = CurrentDb
Set rs1 = Me.RecordsetClone
Set rs2 = db.OpenRecordset("Tレポート用", dbOpenDynaset)

'Tレポート用の初期化
db.Execute strQry1

'Tレポート用への抽出レコードの書き込み
If rs1.RecordCount > 0 Then
rs1.MoveFirst
Do Until rs1.EOF
rs2.AddNew
rs2!日付 = rs1!日付
rs2!商品コード = rs1!商品コード
rs2!商品名 = rs1!商品名
rs2!カナ = rs1!カナ
rs2!メーカー名 = rs1!メーカー名
rs2!大分類 = rs1!大分類
rs2.Update
rs1.MoveNext
Loop
End If

rs1.Close: Set rs1 = Nothing
rs2.Close: Set rs2 = Nothing
db.Close: Set db = Nothing
End Sub

Private Sub cmdレポート_Click()
DoCmd.OpenReport "r棚卸_結果表示", acViewPreview
End Sub
    • good
    • 0

No6、No7と作成しておいて、何ですが。


q棚卸_結果表示を開けばそのままデータが
表示できないものであるかもしれない
という前提でつくっています。いくつかの
フォームなどのデータによるフィルタ
がかかっているかもしれない、という
ことです。

しかし、q棚卸_結果表示を単独で開けばそのまま
データが表示できるものであるとするならば、
簡易な方法で言えば、やはりフィルタをレポートの
レコードソースにそのままかけるのが一番ですが。


No1の考えをフィルタにするならば、

(1) レポートの作成
r棚卸_結果表示のレコードソースをq棚卸_結果表示
として、レポートをデザインビューで開き、プロパティから、
レコードソースの右端をクリックしてクエリビルダを
開き、フィールドをすべて設定し、メーカー名とカナの
並び替えを設定します。


(2) フォームの作成その(1)
新規作成から「q棚卸_結果表示」を基にして表形式
のフォームを作成します。名前を一応「F棚卸」とします。
出来たフォームをデザインビューにし、詳細のところに
マウスを当て、十字になったら詳細を適当に押し下げ、
残りのラベルも詳細のところにもっていきます。
次に、以下のテキストボックス、コンボボックス、
ボタンを設定します。

txt日付
txtSchコード    (テキストボックス)
txtSchSyouhinName  (テキストボックス)
cmbSchMaker    (コンボボックス)
cmbSchBunrui    (コンボボックス)
cmd抽出      (ボタン)


Private Sub コマンド20_Click()
Dim strWhere As String
Dim strQry1 As String

'Tレポート用の初期化のSQL文
strQry1 = "DELETE * FROM Tレポート用;"

'日付が必ず入力されているものとします
If IsNull(Me!txt日付) Then
MsgBox ("日付が設定されていません")
Exit Sub
End If

'strWhereを日付から設定
'strWhere = strWhere & "#" & Month(Me.txt日付) & "/" & Day(Me.txt日付) & "/" & Year(Me.txt日付) & "#"

strWhere = strWhere & "#" & Year(Me.txt日付) & "/" & Month(Me.txt日付) & "/" & Day(Me.txt日付) & "#"

If Me.txtSchコード <> "" Then
strWhere = strWhere & " AND 商品コード = '" & Me.txtSchコード & "'"
End If

If Me.txtSchSyouhinName <> "" Then
strWhere = strWhere & " AND (商品名 LIKE '*" & Me.txtSchSyouhinName & "*' OR カナ LIKE '*" & Me.txtSchSyouhinName & "*')"
End If

If Me.cmbSchMaker <> "" Then
strWhere = strWhere & " AND メーカー名 = '" & Me.cmbSchMaker & "'"
End If

If Me.cmbSchBunrui <> "" Then
strWhere = strWhere & " AND 大分類 = '" & Me.cmbSchBunrui & "'"
End If

Me.Filter = strWhere
Me.FilterOn = True

DoCmd.OpenReport "r棚卸_結果表示", acViewPreview, strWhere

End Sub



(3) フォームの作成その(2)
(2)とは違い、単なる単票形式では、フォームの
レコードソースを設定せずに、
txt日付
txtSchコード    (テキストボックス)
txtSchSyouhinName  (テキストボックス)
cmbSchMaker    (コンボボックス)
cmbSchBunrui    (コンボボックス)
cmd抽出      (ボタン)
を設定し、
(2)から
Me.Filter = strWhere
Me.FilterOn = True
を除けば出来てしまいます。


何だかだんだん簡易になっていくような感じですが、
だいたいこのようなところです。
    • good
    • 0
この回答へのお礼

No.7を元に対策し、MDEで試して不具合が無い事が確認できました。
無事、目的を達成する事ができました。たいへん助かりました。
(No.8も、勉強のために後日試してみます。)

piroin654さんの大切なお時間をいただいたこと、とても感謝しています。
本当にありがとうございました。

お礼日時:2011/08/31 08:57

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!