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>