2011-02-02 15 views
0

アクセスレポートをPDF形式にエクスポートする際に問題があります。基本的には、フォームをユーザーインターフェイスとして使用する古い(2001年に建てられた)Accessデータベースに取り組んでいます。現在、「ジョブ」フォームから「請求書」フォームにジョブを送信できます。すべてのジョブが完了したら、「Invoice All」をクリックして日付と部数を指定し、アクセスレポートをテンプレートとして印刷します。アクセスレポートからPDFファイルを生成する方法は?

私はPDFで保存機能を追加することになっていましたが、Webデザイナーとして、AccessとVBの知識は非常に限られていましたが、(非常に) NetとC#(私がこの仕事を与えられたのは、別の時間の話です)

私は、アクセスフォームに新しいPDFボタンを作成して、請求書を印刷することでこれにアプローチしました。私の考えは、単に印刷と更新のコードをPDFファイルに出力するために複製することができるということです。私はこの仕事を得ることができますが、どのようにしたいのですか。

印刷機能のためのコードは以下の通りです:上記で概説した私の当初の計画では

Private Sub cmdOpenGroupInvoice_Click() 
Dim db As DAO.Database 
Dim rsGetCustomerInvoice As DAO.Recordset 
Dim rsInvoice As DAO.Recordset 
Dim rsInvoiceAll As DAO.Recordset 
Dim lngCusID As Long 
Dim lngJobNo As Long 
Dim iCountInvoice 
Dim lngInvoiceNo As Long 
Dim iNumberCopies As Integer 
Dim sSQLGetInv As String 
Dim sSQLInv As String 
Dim datInvoiceDate As Date 

sSQLGetInv = "SELECT tblJobs.JobNo,tblJobs.NetDespatchRef, tblLoads.Sales, tblLoads.PODName, tblLoads.TotalSales, tblLoads.Cost, tblLoads.Profit, tblJobs.SendToInvoice, tblJobs.Invoiced, tblJobs.MarkForHistory, tblJobs.CustomerID" & vbCrLf _ 
& "FROM tblJobs INNER JOIN tblLoads ON tblJobs.JobNo = tblLoads.JobNo" & vbCrLf _ 
& "WHERE (((tblJobs.SendToInvoice)=Yes) AND ((tblJobs.Invoiced)=No) AND ((tblJobs.MarkForHistory)=No));" 


Set db = CurrentDb 
Set rsGetCustomerInvoice = db.OpenRecordset(sSQLGetInv, dbOpenDynaset) 
If rsGetCustomerInvoice.EOF Then 
Beep 
If MsgBox("There are no jobs to invoice", _ 
    vbCritical + vbOKOnly, _ 
    "No Jobs To Invoice") = vbOK Then 
    Exit Sub 
End If 
End If 
rsGetCustomerInvoice.MoveLast 
Debug.Print rsGetCustomerInvoice.RecordCount 
rsGetCustomerInvoice.MoveFirst 
Do Until rsGetCustomerInvoice.EOF = True 
Set rsGetCustomerInvoice = db.OpenRecordset(sSQLGetInv, dbOpenDynaset) 
If rsGetCustomerInvoice.EOF Then 
    rsGetCustomerInvoice.Close 
    db.Close 
Set rsGetCustomerInvoice = Nothing 
Set db = Nothing 
    DoCmd.Close acForm, "frmInvoiceDate" 
Exit Sub 
End If 
Debug.Print rsGetCustomerInvoice.RecordCount 
datInvoiceDate = CVDate(txtInvoiceDate) 
lngInvoiceNo = GiveMeAnInvoiceNo() 
lngCusID = rsGetCustomerInvoice.Fields!CustomerID 
Call AddNewInvoice(lngInvoiceNo, datInvoiceDate, True) 

Debug.Print iCountInvoice 
lngJobNo = rsGetCustomerInvoice![JobNo] 
Call SendThisJobToSageAll(lngCusID, datInvoiceDate, lngInvoiceNo) 
Call InvoiceAll(lngCusID, lngInvoiceNo) 
Dim strPODName As String 
If Not IsNull(rsGetCustomerInvoice!NetDespatchRef) Then 
If IsNull(rsGetCustomerInvoice![PODName]) Then 
strPODName = " " 
Else 
strPODName = rsGetCustomerInvoice![PODName] 
End If 
'Call NetDesTrackingJobCompleate(rsGetCustomerInvoice![NetDespatchRef], rsGetCustomerInvoice![JobNo], strPODName) 
End If 
iCountInvoice = iCountInvoice - 1 
'Debug.Print I 
iNumberCopies = txtNumberOfCopies 
Do Until iNumberCopies = 0 

    DoCmd.OpenReport "rptInvoice2", acViewNormal, , "[Invoice No]= " & lngInvoiceNo 
iNumberCopies = iNumberCopies - 1 
Loop 
Form_frmInvoicing.Requery 
rsGetCustomerInvoice.MoveNext 
Loop 
DoCmd.Close acForm, "frmInvoiceDate" 
rsGetCustomerInvoice.Close 

db.Close 
Set rsGetCustomerInvoice = Nothing 

Set db = Nothing 


End Sub 

、私はPDFに出力するセクションの下に、更新:

Do Until iNumberCopies = 0 

     DoCmd.OpenReport "rptInvoice2", acViewNormal, , "[Invoice No]= " & lngInvoiceNo 
     DoCmd.OutputTo acOutputReport, "", acFormatPDF, MyPath & MyFilename, True 
    iNumberCopies = iNumberCopies - 1 
    Loop 

は今、この作品とそれはありませんPDFファイルを出力しようとしました。問題は、レポートを実行し、請求書に記されたジョブをレポートに適用するのではなく、システム内のすべてのジョブに対して請求書を作成することです。

私は間違った場所にコードを入れてしまったのでこれが起こっていることを期待していますが、それよりも複雑だと感じています。

これは、ここに掲載するのはちょっと長いですが、この時点では本当に助けていただきありがとうございます。私はこれも可能な限り短くしています。明確でない詳細があれば、私は手伝っていきます。

答えて

4

これはかなり複雑なので、最も簡単なことは、レポートに基づいてクエリを変更することです。

Dim qdf As QueryDef 
Set qdf = CurrentDb.QueryDefs("MyReportQuery") 
sSQL = "SELECT Whatever FROM MyTable WHERE [Invoice No]= " & lngInvoiceNo 
qdf.SQL = sSQL 

DoCmd.OutputTo acOutputReport, "rptInvoice2", acFormatPDF, _ 
    MyPath & MyFilename, True 

あなたがSave as PDF Add-onまたは2010アクセス2007を持っていない限り、あなたが最良の発言インストールすることができる、cutePDF、およびDoCmd.PrintOut

+0

に役立ちます。私はそれを使用して2つのクライアントを持って、アップグレードのナグを除いて、それは本当にうまくいった。 –

+0

私はかつてPDFCreatorとVBAのオートメーションを使用していましたが、異なるオペレーティングシステム/アクセスバージョンの組み合わせでいくつかの問題に遭遇しました。最後に、プリンタとして選択する必要があるより簡単なCutePDFが選択されました。それ以来、より安定版のPDFCreatorが利用可能になった可能性があります。 – Fionnuala

+0

しかし、PDF出力用のプリンタドライバを使用する場合、PDFのファイル名を自動生成および割り当てすることはできません。ユーザは手動で入力する必要があります。私は、WinXPとWin7の両方でPDFCreatorを動作させても問題はありませんでした。私は最初に2009年6月にWinXPで、そして次に昨秋にWin7で使用しました。両方とも正常です。どのような問題がありましたか? –

0

を使用してPDFプリンタに印刷私は同じ質問に数年を尋ね前UtterAccess ..

にあなたがここに必要な正確に何をすべきか自由なライブラリがあります:UAでhttp://www.lebans.com/reporttopdf.htm

私の元のスレッドはここにある:http://www.utteraccess.com/forum/Automatically-PDF-send-t1353547.html

私は数年間、いくつかのプロジェクトでライブラリをうまく使いました。主に引用符と請求書を生成しました。

希望は、これは別のオプションは、VBAを通じて、実際に自動化されPDFCreatorを、ある PG

関連する問題