Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

AusgabeIn -> PDF in einer Access-Runtime funktioniert nicht

287 views
Skip to first unread message

Ahmed Martens

unread,
Jan 13, 2015, 4:49:09 AM1/13/15
to
Hallo Leute,

ich möchte in einer Access-Runtime ein Bericht mit 2 Unterberichten als
PDF-Datei exportieren. Ich laufe aber immer auf den Fehler 2046.

Code:
DoCmd.OutputTo acOutputReport, "rptAfaReport", acFormatPDF, sTarget,
False

Ich hatte sogar testweise den Bericht in der Runtim versteckt geöffnet
und dann versucht diesen zu exportieren.

Kann in einer Runtime berichte nicht als PDF exportieren?
Ich möchte gerne auf einen PDF-Drucker verzichten, da der Export hier
doch erheblich schneller ist.

Ich bin für jede Info dankbar.
Vielen Dank im Voraus.



Gruß Ahmed
--
Antworten bitte nur in der Newsgroup.

Ulrich Möller

unread,
Jan 13, 2015, 6:52:43 AM1/13/15
to
Hallo Ahmed,

in diesem Forumsbeitrag wurde schon einmal über das selbe Problem
berichtet: http://www.ms-office-forum.net/forum/showthread.php?t=274178.
Vielleicht ist dort eine Anregung dabei, die weiter hilft.

Ulrich

Karl Donaubauer

unread,
Jan 13, 2015, 6:56:45 AM1/13/15
to
Hallo, Ahmed!

Ahmed Martens ha scritto:
>
> ich möchte in einer Access-Runtime ein Bericht mit 2 Unterberichten als
> PDF-Datei exportieren. Ich laufe aber immer auf den Fehler 2046.
>
> Code:
> DoCmd.OutputTo acOutputReport, "rptAfaReport", acFormatPDF, sTarget,
> False
>
> Ich hatte sogar testweise den Bericht in der Runtim versteckt geöffnet
> und dann versucht diesen zu exportieren.
> ...

In div. Diskussionen las ich von 2 "seltsamen" Lösungen:

1. Bericht vorher öffnen. Hast du ja versucht, aber vielleicht nochmal
sichtbar.

2. Fokus vor dem OutputTo auf das öffnende Formular setzen, also:

Me.SetFocus
oder
Forms!frmSowieso.Setfocus
und danach erst
DoCmd.OutputTo acOutputReport, ...

--
Servus
Karl
*********
Access FAQ: http://www.donkarl.com
Access Lobby: http://www.AccessDevelopers.org

Ahmed Martens

unread,
Jan 13, 2015, 7:00:48 AM1/13/15
to
Hallo Ulrich,

den Artikel hatte ich auch gefunden. Es geht aber dabei um ein Formular
und bei mir um einen Bericht.

Ahmed Martens

unread,
Jan 13, 2015, 7:06:20 AM1/13/15
to
Am Tue, 13 Jan 2015 12:56:43 +0100 schrieb Karl Donaubauer:

> Hallo, Ahmed!
>
> Ahmed Martens ha scritto:
>>
>> ich möchte in einer Access-Runtime ein Bericht mit 2 Unterberichten als
>> PDF-Datei exportieren. Ich laufe aber immer auf den Fehler 2046.
>>
>> Code:
>> DoCmd.OutputTo acOutputReport, "rptAfaReport", acFormatPDF, sTarget,
>> False
>>
>> Ich hatte sogar testweise den Bericht in der Runtim versteckt geöffnet
>> und dann versucht diesen zu exportieren.
>> ...
>
> In div. Diskussionen las ich von 2 "seltsamen" Lösungen:
>
> 1. Bericht vorher öffnen. Hast du ja versucht, aber vielleicht nochmal
> sichtbar.
>
> 2. Fokus vor dem OutputTo auf das öffnende Formular setzen, also:
>
> Me.SetFocus
> oder
> Forms!frmSowieso.Setfocus
> und danach erst
> DoCmd.OutputTo acOutputReport, ...

Hallo Karl,

zu 1) mit dem sichtbaren Aufruf werde ich es noch einmal versuchen.
Ansonsten bliebe wohl tatsächlich nur der Ausdruck. :-(

zu 2) Es gibt kein Formular, sondern nur eine VBA-Prozedur.

Hier einmal vollständig:

<Code>

Public Function Main()
Dim sParameter() As String
'Dim Command$

'Command$ = "/Afa-Protokoll /11126 /V:\111\11126\14 =
Jahresabschluss\2013\Afa-Protokoll.pdf"

If Len(Command$) = 0 Then Exit Function

sParameter() = Split(Command$, "/", , vbTextCompare)

ProgId = Trim(sParameter(1))

Select Case ProgId

Case "Afa-Protokoll"
lMdNr = Trim(sParameter(2))
sTarget = Trim(sParameter(3))
Call ImportAfa
Case Else

End Select

End Function


Private Sub ImportAfa()
Dim blnDATEV As Boolean
Dim recKto As Recordset
Dim recAfa As Recordset
Dim sPrüfValue() As String, sql As String
Dim stmp As String, vafa As Afa
Dim Result As String

10 Dim lColAfa As Long: Dim lRowAfa As Long
20 Dim i As Long: Dim Q As Long

30 On Error GoTo ImportAfa_Error



Dim sArr() As String


40 If FileExists(Environ("TEMP") & "\pdftotext\Afa-Protokoll DATEV.txt") = False Then
50 MsgBox "Die Ascii-Exportdatei '" & Environ("TEMP") & "\pdftotext\Afa-Protokoll DATEV.txt" & "' konnte nicht gefunden werden." & _
vbNewLine & vbNewLine & "Der Vorgang wird abgebrochen.", vbCritical, "Konvertieren Afa-Protokoll"
GoTo Finaly:

60 End If

70 sArr() = Split(ReadFile(Environ("TEMP") & "\pdftotext\Afa-Protokoll DATEV.txt"), vbNewLine)


80 Set objNetwork = CreateObject("WScript.Network")
90 sUser = objNetwork.UserName


100 Set recKto = CurrentDb.OpenRecordset("SELECT tblKontenbezeichnung.* FROM tblKontenbezeichnung WHERE (((tblKontenbezeichnung.User)='" & sUser & "'));", dbOpenDynaset)
110 Set recAfa = CurrentDb.OpenRecordset("SELECT tblAfa.* FROM tblAfa WHERE (((tblAfa.User)='" & sUser & "'));", dbOpenDynaset)

'Löschen alte Buchungssätze
120 CurrentDb.Execute "DELETE tblKontenbezeichnung.User FROM tblKontenbezeichnung WHERE (((tblKontenbezeichnung.User)='" & sUser & "'));", dbFailOnError
130 CurrentDb.Execute "DELETE tblAfa.User FROM tblAfa WHERE (((tblAfa.User)='" & sUser & "'));", dbFailOnError


'*****Erstellen Berichtsabfragen
140 sql = "SELECT tblKontenbezeichnung.AVKto, tblKontenbezeichnung.KtoBez, tblAfa.AfaKto, tblAfa.Buchungstext, " & _
"Sum(tblAfa.Betrag) AS SummevonBetrag, tblAfa.User, tblAfa.MdNr FROM tblAfa INNER JOIN tblKontenbezeichnung " & _
"ON (tblAfa.MdNr = tblKontenbezeichnung.MdNr) AND (tblAfa.AVKto = tblKontenbezeichnung.[AVKto]) " & _
"GROUP BY tblKontenbezeichnung.AVKto, tblKontenbezeichnung.KtoBez, tblAfa.AfaKto, tblAfa.Buchungstext, tblAfa.User, " & _
"tblAfa.MdNr HAVING (((Sum(tblAfa.Betrag))<>0) AND ((tblAfa.User)='" & sUser & "') AND ((tblAfa.MdNr)=" & lMdNr & "));"
150 CurrentDb.QueryDefs("qryAfaReport").sql = sql

160 sql = "SELECT tblAfa.AfaKto, tblAfa.Buchungstext, Sum(tblAfa.Betrag) AS Betrag FROM tblAfa GROUP BY tblAfa.AfaKto, tblAfa.Buchungstext, tblAfa.User, tblAfa.MdNr HAVING " & _
"(((tblAfa.AfaKto)<9000) AND ((Sum(tblAfa.Betrag))<>0) AND ((tblAfa.User)='" & sUser & "') AND ((tblAfa.MdNr)=" & lMdNr & "));"
170 CurrentDb.QueryDefs("qrySummeAfaKto").sql = sql

180 sql = "SELECT tblAfa.AfaKto, tblAfa.Buchungstext, Sum(tblAfa.Betrag) AS Betrag FROM tblAfa GROUP BY tblAfa.AfaKto, tblAfa.Buchungstext, tblAfa.User, tblAfa.MdNr HAVING " & _
"(((tblAfa.AfaKto)>9000) AND ((Sum(tblAfa.Betrag))<>0) AND ((tblAfa.User)='" & sUser & "') AND ((tblAfa.MdNr)=" & lMdNr & "));"
190 CurrentDb.QueryDefs("qrySummeIABKto").sql = sql
'*****Ende Berichtsabfragen


200 If InStr(1, sArr(2), "Protokoll Buchungssätze", vbTextCompare) <> 0 Then
210 blnDATEV = True
220 End If

230 If InStr(1, sArr(2), "Handelsrecht", vbTextCompare) > 0 Then
240 iDATEVBereich = enDATEV_Bereich.HandelsR
250 ElseIf InStr(1, sArr(2), "Steuerrecht", vbTextCompare) > 0 Then
260 iDATEVBereich = enDATEV_Bereich.SteuerR
270 End If

280 If blnDATEV = True Then

'1. Step alle Konten mit Bezeichnung einlesen
290 For i = 0 To UBound(sArr()) - 1
300 sPrüfValue() = Split(sArr(i), " ", 2)


310 If UBound(sPrüfValue()) > -1 Then 'KtoNor

320 If IsNumeric(sPrüfValue(0)) Then

330 recKto.FindFirst ("AVKto=" & sPrüfValue(0))
340 If recKto.NoMatch = True Then
350 With recKto
360 .AddNew
370 !User = sUser
380 !MdNr = lMdNr
390 !AVKto = sPrüfValue(0)
400 !KtoBez = Trim(sPrüfValue(1))
410 .Update
420 End With
430 End If

440 sPrüfValue(0) = ""


450 Do While IsNumeric(sPrüfValue(0)) = False
460 If Q > UBound(sArr()) - 1 Then Exit Do
470 For Q = (i + 1) To UBound(sArr()) - 1
'
480 stmp = Trim(sArr(Q))
490 If Len(stmp) = 0 Then
500 i = Q
510 Exit For
520 End If

530 sPrüfValue() = Split(Trim(sArr(Q)), " ", 2)

540 Result = GetValue(stmp)
550 vafa.Buchungstext = Result
560 stmp = Trim(Right(stmp, Len(stmp) - Len(vafa.Buchungstext)))

570 Result = GetValue(stmp, " ")
580 If IsNumeric(Result) = False Then GoTo Ausgang1
590 vafa.Betrag = CCur("0" & Result)
600 If vafa.Betrag = 0 Then GoTo Ausgang1
610 stmp = Trim(Right(stmp, Len(stmp) - Len(CStr(Result))))
620

630 Result = GetValue(stmp, " ")
640 vafa.AVKto = CLng(Right(Result, 4)) 'Storno extrahieren
650 stmp = Trim(Right(stmp, Len(stmp) - Len(Result)))


660 Result = GetValue(stmp)
670 vafa.Buchungsdatum = GetValue(stmp)
680 stmp = Trim(Right(stmp, Len(stmp) - Len(Result)))

690 Result = GetValue(stmp)
700 vafa.AfaKto = CLng(Result)
710 stmp = Trim(Right(stmp, Len(stmp) - Len(Result)))

720 If vafa.Betrag <> 0 Then
730 With recAfa
740 .AddNew
750 !User = sUser
760 !MdNr = lMdNr
770 !AVKto = vafa.AVKto
780 !AfaKto = vafa.AfaKto
790 !Buchungstext = vafa.Buchungstext
800 !Betrag = vafa.Betrag
810 .Update
820 End With
830 End If

Ausgang1:
840 If IsNumeric(sPrüfValue(0)) = True Or vafa.Betrag = 0 Then
850 Exit For
860 End If
870 Next
880 Loop

890 End If

900 End If
910 Next


920 If FileExists(sTarget) Then Kill sTarget
930 Select Case iDATEVBereich
Case enDATEV_Bereich.HandelsR
940 sTarget = Left(sTarget, Len(sTarget) - 4) & " (HR).pdf"
950 Case enDATEV_Bereich.SteuerR
960 sTarget = Left(sTarget, Len(sTarget) - 4) & " (StR).pdf"
970 Case enDATEV_Bereich.ohne

980 End Select

990 DoCmd.OpenReport "rptAfaReport", acViewPreview, , , acHidden
1000 DoCmd.OutputTo acOutputReport, "rptAfaReport", acFormatPDF, sTarget, False

1010 DoCmd.Close acReport, "rptAfaReport", acSaveNo
Finaly:

1020 If FileExists(Environ("TEMP") & "\pdftotext\Afa-Protokoll DATEV.txt") Then Kill Environ("TEMP") & "\pdftotext\Afa-Protokoll DATEV.txt"

1030 Else

1040 End If

1050 StartDoc sTarget
1060 Application.Quit acQuitSaveNone


1070 On Error GoTo 0
1080 Exit Sub

ImportAfa_Error:


1090 MsgBox "Fehlernr. " & Err.Number & " (" & Err.Description & ") in Prozedur ImportAfaExcel von Modul Modul mdlAfaImport", , "Fehler in Zeile:" & Erl()
1100 Err.Clear
1110 GoTo Finaly

End Sub


Private Function GetValue(sValue As String, Optional sSplit As String = " ") As String
GetValue = Trim(Mid(sValue, 1, InStr(1, sValue, sSplit, vbTextCompare)))
End Function

</Code>

Karl Donaubauer

unread,
Jan 13, 2015, 7:21:50 AM1/13/15
to
Hallo!

Ahmed Martens schrieb:
> schrieb Karl Donaubauer:
>>>
>>> ich möchte in einer Access-Runtime ein Bericht mit 2 Unterberichten als
>>> PDF-Datei exportieren. Ich laufe aber immer auf den Fehler 2046.
>>>
>>> Code:
>>> DoCmd.OutputTo acOutputReport, "rptAfaReport", acFormatPDF, sTarget,
>>> False
>> ...
>> 2. Fokus vor dem OutputTo auf das öffnende Formular setzen, also:
>>
>> Me.SetFocus
>> oder
>> Forms!frmSowieso.Setfocus
>> und danach erst
>> DoCmd.OutputTo acOutputReport, ...
> ...
> zu 2) Es gibt kein Formular, sondern nur eine VBA-Prozedur.
> ...

Von wo bzw. wie wird die denn aufgerufen?
Ich würde es auch mit einem nicht-aufrufenden, aber aktuell sicher
geöffneten Formular testen. Gibt's sowas auch nicht?

Das findet man nicht nur in dem Office-Lösungen-Thread (dort geht's
übrigens schon um das PDFen von Berichten, nur halt aus einem Formular
gestartet) sondern auch in englischen Diskussionen.

Ahmed Martens

unread,
Jan 13, 2015, 7:27:26 AM1/13/15
to
Hallo Karl,

Am Tue, 13 Jan 2015 13:21:50 +0100 schrieb Karl Donaubauer:

[...]

>> zu 2) Es gibt kein Formular, sondern nur eine VBA-Prozedur.
> > ...
>
> Von wo bzw. wie wird die denn aufgerufen?
> Ich würde es auch mit einem nicht-aufrufenden, aber aktuell sicher
> geöffneten Formular testen. Gibt's sowas auch nicht?
>
> Das findet man nicht nur in dem Office-Lösungen-Thread (dort geht's
> übrigens schon um das PDFen von Berichten, nur halt aus einem Formular
> gestartet) sondern auch in englischen Diskussionen.

gestartet wird das alles über ein VBSript:

<Code>

Dim objFSO : Set objFSO = CreateObject("Scripting.FileSystemObject")
Dim WSHShell : Set WSHShell = CreateObject("WScript.Shell")
Dim objShell : Set objShell = CreateObject("Shell.Application")
Dim Ag, RunDir
Dim ProgID, TargetFile, MdNr
Dim DBPfad

Const TemporaryFolder = 2

'Über diese Hilfsfunktionen kann man Funktionen und Prozeduren global verwenden
'***************
RunDir = WScript.ScriptFullName
RunDir = Left(RunDir,InStr(RunDir,WScript.ScriptName)-2)
RunDir = objFSO.GetParentFolderName(RunDir)
RunDir = objFSO.BuildPath(RunDir,"Global")
Include Rundir & "\Global_Func.vbs"
Include Rundir & "\Global_Proz.vbs"
'***************

Ag = Split(WScript.Arguments.Item(0),"/",-1,vbTextCompare)

ProgID = Trim(Ag(1)) ': WScript.Echo ProgID
MdNr = Trim(Ag(2)) ': WScript.Echo MdNr
TargetFile = Trim(Ag(3)) ': WScript.Echo TargetFile

DBPfad = WSHShell.RegRead("HKEY_CURRENT_USER\Software\VB and VBA Program Settings\Kanzlei\Standardwerte\Programmpfad")
DBPfad = objFSO.BuildPath(DBPfad, WSHShell.RegRead("HKEY_CURRENT_USER\Software\VB and VBA Program Settings\Kanzlei\Standardwerte\Databasepfad"))
DBPfad = objFSO.BuildPath(DBPfad,"DATEV_Tools.accdb")


Call ConvertPDF2Text(TargetFile,"Afa-Protokoll DATEV.txt")

If ProgID = "Afa-Protokoll" Then
objShell.ShellExecute Add_Qouted(DBPfad,-1) , "/cmd" & " /" & ProgID & " /" & MdNr & " /" & TargetFile, "", "open", 1
Else
objShell.ShellExecute Add_Qouted(TargetFile,True), "", "", "open", 1
End If


Sub Include( cNameScript )
Dim oFS, oFile
Set oFS = CreateObject("Scripting.FileSystemObject")
Set oFile = oFS.OpenTextFile( cNameScript )
ExecuteGlobal oFile.ReadAll()
oFile.Close
End Sub

</Code>

Ich benötige in der Datenbank kein Formular, da ich lediglich etwas
auswerten möchte.

Ulrich Möller

unread,
Jan 13, 2015, 7:34:05 AM1/13/15
to
Hallo Ahmed,

na ja, irgendwo muß es ein Formular geben, das den Focus erhalten
könnte, sonst ist es keine Access-Anwendung, selbst wenn es ein
Bibliotheksroutine sein sollte.

Ulrich

PS: Von welcher Access-Version reden wir den hier?

Karl Donaubauer

unread,
Jan 13, 2015, 7:44:28 AM1/13/15
to
Hallo, Ahmed!

Ahmed Martens schrieb:
> schrieb Karl Donaubauer:
>> ...
>> Von wo bzw. wie wird die denn aufgerufen?
>> Ich würde es auch mit einem nicht-aufrufenden, aber aktuell sicher
>> geöffneten Formular testen. Gibt's sowas auch nicht?
> ...
> gestartet wird das alles über ein VBSript:
> ...
> Ich benötige in der Datenbank kein Formular, da ich lediglich etwas
> auswerten möchte.

Du bist ja hartnäckig. ;-)
Bastle halt trotzdem mal eines rein und setze den Fokus drauf, um zu
sehen, ob das hilft. Wäre doch vermutlich besser, die Leute sähen einen
unglaublich informativen Wartetext oder dergl. als viele fade
Buchhaltungsseiten, die aus dem Drucker quellen.

Ahmed Martens

unread,
Jan 13, 2015, 7:49:53 AM1/13/15
to
Hallo Karl,

Am Tue, 13 Jan 2015 13:44:28 +0100 schrieb Karl Donaubauer:

> Du bist ja hartnäckig. ;-)
> Bastle halt trotzdem mal eines rein und setze den Fokus drauf, um zu
> sehen, ob das hilft. Wäre doch vermutlich besser, die Leute sähen einen
> unglaublich informativen Wartetext oder dergl. als viele fade
> Buchhaltungsseiten, die aus dem Drucker quellen.

ja das bin ich.
Ich kann das aber erst später testen, da ich ja eine Vollversion
besitze.

Ahmed Martens

unread,
Jan 13, 2015, 7:51:26 AM1/13/15
to
Hallo Ulrich,

Am Tue, 13 Jan 2015 13:34:01 +0100 schrieb Ulrich Möller:

[...]

> na ja, irgendwo muß es ein Formular geben, das den Focus erhalten
> könnte, sonst ist es keine Access-Anwendung, selbst wenn es ein
> Bibliotheksroutine sein sollte.
>
> Ulrich
>
> PS: Von welcher Access-Version reden wir den hier?

ich werde das noch einmal testen. Ich komme aber erst später dazu, da
ich hierfür einen anderen Rechner muss.

Wir reden von Access 2010.

Ahmed Martens

unread,
Jan 13, 2015, 9:10:54 AM1/13/15
to
Hallo Ulrich,
Hallo Karl,

also ein Formular ist nicht nötig.
Der Bericht muss aber zwingend in der Preview-Ansicht geöffnet werden,
da nur dann auch der DoCmd.OutPut-Befehl ausgeführt werden kann.
Ein Hidden-Aufruf führt nicht zum Erfolg.

Vielen Dank noch einmal für Eure Hilfe.
Jetzt klappt alles so wie ich mir das vorgestellt habe. :-)

Gruß Ahmed
--
Antworten bitte nur in der Newsgroup.
Win7 Prof. 64bit / MS-Office 2010 Prof. 32bit
0 new messages