2017-04-17 4 views
0

私は叔父さんが配備中に私たちにする退屈なプロセスを自動化する作業に取り組んでいます。私はテーブルにデプロイされる毎日の日付を入力するデータベースを持っています。たとえば、私は2010年4月10日から2011年7月11日までリストされています。 毎日、日付と場所が表示されている必要があり、6つの結果を縦に積み重ね、次に右に移動して次の6つをさらに3回実行する必要があります。複数の列グループを使用したアクセスレポート

私は適切な場所に4つのsubLocation [1-4]を持つマスターレポートである2282reportというレポートを1つ持っています。もともと私はそれがトップ6をしていたが、次の人はトップ6をするだろうが、ID> 6だがその後、私は日付を作るために移動したが、日付としてのIDはとにかく複製できない。私はそれらをリンクさせるための適切な方法が不明なので、次のサブレポートは残りの部分を表示するようにします。

実行されたレポートは次のようになります。私はまた、通常はリストに90日以上かかるので、私はメインレポートに2番目のページを作成する必要があります。私は全体の場所のブロックのための新しいサブレポートを作成されて行う必要があるでしょうと思っていますが、それは6を示していたら、私はreport_detailsが新しい列に移動させる方法がわからない何

Print Preview

結果。

私が考えたもう1つのオプションは、サブレポートを空白のままにしておき、マスターレポートがvba経由で各自のcontrolsourceを設定することです。私はこれが働くかもしれないと思うのですが、それは、それが新しいページを作り続けることができるように、より多くの日があるかどうかを調べることができるからです。しかし、次のページに進む方法を理解する必要があります。また、最下部の24と対比して16日しかないボトムセクションもあります。

Design View

+0

あなたの例が20170408 - 20170413を2回表示するのはなぜですか?例を構築する上での見落としですか?なぜ6行だけ?シートに未使用の空白が残っていませんか?分析とテストのためにデータベースを提供できますか?私はBox.comファイル共有サイトを推奨し、ファイルへのリンクを投稿します。 – June7

+0

1つの提案:複数の列のレポートを作成して、少なくとも4つの列を処理することができます。これにより、ページ間でレポートを継続することはできますが、少なくとも列の作業量は削減されます。 Access 2013の場合、レポートデザインに進み、ページ設定リボンに移動し、列アイコンをクリックしてさまざまなオプションを選択します。 –

+0

Cross-posted at http://www.accessforums.net/showthread.php?t=65580 – June7

答えて

0

あなたは、さまざまなレポートイベントハンドラでVBAを使用するように誘惑されるかもしれないが、これはうまくいくかもしれない場合でも、私の経験からのみ適切にフォーマットするために、すべてを取得しようと頭痛につながるという。代わりに、各行にページ番号の新しいレポート表を作成することをおすすめします。並べ替えられたページ番号リストからメインレポートを取得し、ページ番号フィールドで複数列のサブレポートをバインドします。使用しているスキームに従って行を正しくページ設定する単純なVBAプロシージャを使用して、レポート表を作成します。

まず、レポートの表(あなたが必要見つけると制約を追加):サブレポートを

CREATE TABLE SubReportTable (PageNum LONG, PageOrdinal LONG, _ 
    Ordinal LONG, LastPage BIT, [Date of Service] DATE, [Location] TEXT) 

  • RecordSoucre設定しプロパティ:SubReportTable(代わりにソートするクエリを指定
  • 他の列設定(パディング、方向など)と共に列数を4に設定します。
  • セット詳細セクションのNoへのCanGrowプロパティとその他のコントロールが適切です。
  • ページのすべての列に正しく収まるように列と詳細のサイズを変更します。 (これは、印刷プレビューとメインフォームのデザインの間を行き来する必要があります。

    • レコードプロパティ:SELECT SubReportTable.PageNum FROM SubReportTable WHERE (((SubReportTable.LastPage)=False)) GROUP BY SubReportTable.PageNum ORDER BY SubReportTable.PageNum
    • 詳細セクションのプロパティフォース新しいページAfter Sectionに)メインレポートで

    、次のプロパティを設定します。 PageNum

  • リサイズサブレポートオブジェクトにサブレポートオブジェクトのリンクマスタフィールドリンク子供フィールド両方
  • は適切にすべての列を合わせて。

メインレポートの動作を別の「最終ページ」レポートに複製します。このレポートを設定して、レポート表のページネーションデータ(つまり、LastPage = True)に基づいて適切なレコードのサブセットを選択します。 16レコードの最後のページがどのようにフォーマットされているかによって、16レコード分だけ別のSubReportを作成する必要があるかもしれませんが、メインレポートと同じSubReportを使用すると、決定する。

  • レコードプロパティ:SELECT SubReportTable.PageNum FROM SubReportTable WHERE ((SubReportTable.LastPage = True)) GROUP BY SubReportTable.PageNum ORDER BY SubReportTable.PageNum

最後にいくつかのコードは、報告表を移入します。このプロシージャは、VBAイミディエイトウィンドウから直接実行することも、ボタンのクリックイベントハンドラに入れることもできます。最後のページで正しい量のレコードを取得するために、ページ区切りロジックを調整することができます。

Public Sub PrepareSubReporTable() 
    On Error GoTo Catch_PrepareSubReporTable 

    Dim db As Database 
    Dim rs As Recordset2 
    Dim rows As Long, pgs24 As Long, rowsLast24 As Long, rows16 As Long 
    Dim i As Long, p As Long, pi As Long 

    Set db = CurrentDb 

    db.Execute "DELETE * FROM [SubReportTable]", dbFailOnError 

    db.Execute _ 
    "INSERT INTO SubReportTable (PageNum, PageOrdinal, Ordinal, LastPage, [Date of Service], [Location])" & _ 
    " SELECT Null AS PageNum, Null AS PageOrdinal, Null AS Ordinal, False as LastPage," & _ 
     " [Data].[Date of Service], [Data].[Location]" & _ 
    " FROM [Data]" & _ 
    " ORDER BY [Data].[Date of Service], [Data].[Location];", _ 
    dbFailOnError 

    rows = db.OpenRecordset("SELECT Count(*) FROM SubReportTable").Fields(0) 
    pgs24 = rows \ 24 
    rows16 = rows - 24 * pgs24 
    If rows16 > 16 Then 
    rowsLast24 = rows16 
    pgs24 = pgs24 + 1 
    rows16 = 0 
    Else 
    rowsLast24 = 24 
    End If 

    Set rs = db.OpenRecordset(_ 
     "SELECT * FROM SubReportTable" & _ 
     " ORDER BY [Date of Service], [Location];") 
    i = 0 
    Do Until rs.EOF 
    p = i \ 24 + 1 

    rs.Edit 
    rs![PageNum] = p 
    If p > pgs24 Then 
     rs![lastPage] = True 
     pi = (i - pgs24 * 24) Mod 16 + 1 
    Else 
     pi = i Mod 24 + 1 
    End If 
    rs![PageOrdinal] = pi 
    i = i + 1 
    rs![Ordinal] = i 
    rs.Update 

    rs.MoveNext 
    Loop 
    rs.Close 

    Exit Sub 
Catch_PrepareSubReporTable: 
    MsgBox Err.Number & ": " & Err.Description, _ 
     vbOKOnly Or vbExclamation, "Error in PrepareSubReporTable" 
End Sub 

メインレポートと最終ページレポートを、手動で、またはどこかのVBAコードで生成します。

注:ページの代わりにフィールド名PageNumを使用しました。これは、印刷プレビュー中にSubReportバインディングに問題が発生したように思われるためです。ページはレポートの既存の変数/関数の名前である可能性が高いためです。

+0

この返答は素晴らしいです。非常に詳細で有益です。私がこれを投稿したとき、私は16ブロックセクションが24ページと同じページになることを伝えていないかもしれないことに気づきました。私は本質的にフォーム[リンク]を作成しています(http://matthewenderle.com/scratch/af2282。 pdf)を使用して、乗組員全員に一貫性を持たせることができます。私はあなたが今までに何を得たかを通知することなく、私があなたの回答を読む前に、私がアップロードしたものもアップロードしました。私のウェブサーバー(http://matthewenderle.com/scratch/Database2.accdb)からサンプル1をダウンロードできます。 – MatthewEnderle

+0

ちょうど私が今あなたにビールを借りているこれで周りの猿の数時間後に更新を投稿したい!ありがとう! – MatthewEnderle

+0

私はそれが助けてうれしい!私は「それが何であるか」を認識してアクセスを批判することを躊躇していますが、最初は他のより優れたツールと同じように動作することを期待しています。レポートの場合は、Accessがイベントとフォーマットを愚かなやり方で処理するのを見つけるために正しい書式設定を試みることに夢中になりました。このようなことをするためのすべてのプロパティとメソッドを既に知っていたときに、ゆっくりとすべてを描画することに意味がないので、すべての詳細を含めました。 –

関連する問題