diff --git a/SDL/Fakturierung/cAutomailversand.vb b/SDL/Fakturierung/cAutomailversand.vb index 4e88c395..0a638ea8 100644 --- a/SDL/Fakturierung/cAutomailversand.vb +++ b/SDL/Fakturierung/cAutomailversand.vb @@ -1,10 +1,11 @@ Imports System.IO +Imports com.sun.org.apache.xpath.internal.operations Imports Microsoft.Office.Interop Imports VERAG_PROG_ALLGEMEIN Public Class cAutomailversand - Sub sendMailSammelrechnung(_Rechnungsdatum As Date, SammelrechungArt As Integer, FirmaID As Integer, Optional KundenNr As Integer = -1, Optional mailoeffnen As Boolean = False, Optional faktGruppe As String = "") + Sub sendMailSammelrechnung(_Rechnungsdatum As Date, SammelrechungArt As Integer, FirmaID As Integer, Optional KundenNr As Integer = -1, Optional mailoeffnen As Boolean = False, Optional faktGruppe As String = "", Optional datumBis As Date = Nothing) Try Dim sql As New VERAG_PROG_ALLGEMEIN.SQL @@ -37,7 +38,7 @@ Public Class cAutomailversand LEFT JOIN tblKundenErweitert on tblKundenErweitert.kde_KundenNr = Rechnungsausgang.RechnungsKundenNr INNER JOIN Währungstabelle on LandKz = Rechnungsausgang.RechnungsLandKz WHERE Rechnungsausgang.Status IN (2) and Rechnungsausgang.Automailversand_sent is null And Rechnungsausgang.Firma_ID = '" & FirmaID & "' And Rechnungsausgang.Sammelrechnung = '" & SammelrechungArt & "' And CONVERT(DATE,Rechnungsausgang.Rechnungsdatum,104) = '" & _Rechnungsdatum.ToShortDateString & "' - and isnull(Rechnungsausgang.Automailversand,0) = 1 and RechnungsNr > 0 and FakturierungsGruppe = '" & faktGruppe & "'" & IIf(KundenNr > 0, " AND RechnungsKundenNr = " & KundenNr, "") & " + and isnull(Rechnungsausgang.Automailversand,0) = 1 and RechnungsNr > 0 and FakturierungsGruppe = '" & faktGruppe & "'" & IIf(KundenNr > 0, " AND RechnungsKundenNr = " & KundenNr, "") & IIf(IsDate(datumBis), " AND CONVERT(DATE, Rechnungsausgang.Abfertigungsdatum, 104) <= '" & datumBis.ToShortDateString & "'", "") & " GROUP BY RechnungsNr, RechnungsKundenNr,tblKundenErweitert.kde_SR_IM_EX ORDER BY RechnungsLandKz, RechnungsKundenNr" @@ -158,7 +159,7 @@ Public Class cAutomailversand showError = mailoeffnen 'bei MailÖffnen fehler anzeigen! setEmailText(row, FirmaID, RechnungsNr, Mailsubject, HTMLMail, SammelrechungArt, dt, BelegartenNr) - If do_SR(row.Item("RechnungsKundenNr"), FirmaID, SammelrechungArt, Rechnungsdatum, RechnungsNr, DruckDatumZeit, MDMKopiedrucken, listPDFs,,,, showError, AbfertigungsNr, faktGruppe) Then + If do_SR(row.Item("RechnungsKundenNr"), FirmaID, SammelrechungArt, datumBis, Rechnungsdatum, RechnungsNr, DruckDatumZeit, MDMKopiedrucken, listPDFs,,,, showError, AbfertigungsNr, faktGruppe) Then loadAndSetAnhaenge_new(SR_DT, ATTACHMENTS, listPDFs,,, KDE_ERW.kde_merge_pdf) If VERAG_PROG_ALLGEMEIN.cAllgemein.TESTSYSTEM Then Mailsubject &= " TEST" @@ -475,10 +476,15 @@ Public Class cAutomailversand End Sub - Private Function do_SR(kdNr As Integer, FirmaID As Integer, Sammelrechnungsart As Integer, Rechnungsdatum As Date, lastAktuelle_RgNr As Integer, DruckDatumZeit As Date, Kopie As Boolean, listPDFs As List(Of String), Optional EinzelAnlagen As Boolean = False, Optional Sammelbericht As Boolean = True, Optional saveInThereFore As Boolean = False, Optional showError As Boolean = True, Optional AbfertigungsArt As String = "", Optional faktGruppe As String = "") + Private Function do_SR(kdNr As Integer, FirmaID As Integer, Sammelrechnungsart As Integer, DatumBis As Date, Rechnungsdatum As Date, lastAktuelle_RgNr As Integer, DruckDatumZeit As Date, Kopie As Boolean, listPDFs As List(Of String), Optional EinzelAnlagen As Boolean = False, Optional Sammelbericht As Boolean = True, Optional saveInThereFore As Boolean = False, Optional showError As Boolean = True, Optional AbfertigungsArt As String = "", Optional faktGruppe As String = "") Dim RechnungsNrisSet As Boolean = False - RechnungsNrisSet = cFakturierung.doSAMMELRechnungsDruck(FirmaID, Sammelrechnungsart, Rechnungsdatum, Rechnungsdatum, "", EinzelAnlagen, Sammelbericht, kdNr, 4, listPDFs, "", lastAktuelle_RgNr, DruckDatumZeit,,,,,, faktGruppe, AbfertigungsArt, True, Kopie, True, saveInThereFore, showError) + + If DatumBis = Nothing Then + DatumBis = Rechnungsdatum + End If + + RechnungsNrisSet = cFakturierung.doSAMMELRechnungsDruck(FirmaID, Sammelrechnungsart, DatumBis, Rechnungsdatum, "", EinzelAnlagen, Sammelbericht, kdNr, 4, listPDFs, "", lastAktuelle_RgNr, DruckDatumZeit,,,,,, faktGruppe, AbfertigungsArt, True, Kopie, True, saveInThereFore, showError) Return RechnungsNrisSet End Function diff --git a/SDL/Fakturierung/frmAbrechnungsMaske.vb b/SDL/Fakturierung/frmAbrechnungsMaske.vb index 5d09ace0..e439ad09 100644 --- a/SDL/Fakturierung/frmAbrechnungsMaske.vb +++ b/SDL/Fakturierung/frmAbrechnungsMaske.vb @@ -999,7 +999,14 @@ Public Class frmAbrechnungsMaske Select Case cboSort._value Case "EZ" - selectedRows = selectedRows.OrderBy(Function(r) CDate(r.Cells("ReErfZeitstempel").Value)) + selectedRows = selectedRows.OrderBy( + Function(r) + Dim value = r.Cells("ReErfZeitstempel").Value + Return If(value Is Nothing OrElse IsDBNull(value), + DateTime.MinValue, + Convert.ToDateTime(value)) + End Function + ) Case Else selectedRows = selectedRows _ diff --git a/SDL/Fakturierung/frmFaktSammelRgDrucken.Designer.vb b/SDL/Fakturierung/frmFaktSammelRgDrucken.Designer.vb index 6017197e..c0245d52 100644 --- a/SDL/Fakturierung/frmFaktSammelRgDrucken.Designer.vb +++ b/SDL/Fakturierung/frmFaktSammelRgDrucken.Designer.vb @@ -462,6 +462,7 @@ Partial Class frmFaktSammelRgDrucken 'Button6 ' Me.Button6.Anchor = CType((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) + Me.Button6.Enabled = False Me.Button6.FlatStyle = System.Windows.Forms.FlatStyle.Flat Me.Button6.Image = Global.SDL.My.Resources.Resources.rechnung1 Me.Button6.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft diff --git a/SDL/Fakturierung/frmFaktSammelRgDrucken.vb b/SDL/Fakturierung/frmFaktSammelRgDrucken.vb index a4daa1e8..efb47e24 100644 --- a/SDL/Fakturierung/frmFaktSammelRgDrucken.vb +++ b/SDL/Fakturierung/frmFaktSammelRgDrucken.vb @@ -140,7 +140,7 @@ Public Class frmFaktSammelRgDrucken Dim SQLAUTOMAIL_RECHNUNGSDATuM = "" If cbxAUTOMail.Checked Then - SQLAUTOMAIL_RECHNUNGSDATuM = "AND Rechnungsausgang.Status IN (2) AND CONVERT(DATE, Rechnungsausgang.Rechnungsdatum, 104) = '" & txtRechnungsdatum._value & "'" + SQLAUTOMAIL_RECHNUNGSDATuM = "AND Rechnungsausgang.Status IN (2) AND CONVERT(DATE, Rechnungsausgang.Rechnungsdatum, 104) = '" & txtRechnungsdatum._value & "' AND CONVERT(DATE, Rechnungsausgang.Abfertigungsdatum, 104) <= '" & txtZeitraumBis._value & "'" Else SQLAUTOMAIL_RECHNUNGSDATuM = " AND Rechnungsausgang.Status IN (0,2) AND CONVERT(DATE, Rechnungsausgang.Abfertigungsdatum, 104) <= '" & txtZeitraumBis._value & "'" End If @@ -979,7 +979,7 @@ Public Class frmFaktSammelRgDrucken For Each r In MyDatagridview1.SelectedRows Dim fun As New cAutomailversand - fun.sendMailSammelrechnung(CDate(txtRechnungsdatum.Text), Sammelrechung, Firma, r.Cells("RechnungsKundenNr").Value, cbxMailoeffnen.Checked) + fun.sendMailSammelrechnung(CDate(txtRechnungsdatum.Text), Sammelrechung, Firma, r.Cells("RechnungsKundenNr").Value, cbxMailoeffnen.Checked,, CDate(txtZeitraumBis.Text)) Next initDGV() diff --git a/SDL/Formulare/KDFormulare/frmFormulare.vb b/SDL/Formulare/KDFormulare/frmFormulare.vb index bd4764a4..573396c6 100644 --- a/SDL/Formulare/KDFormulare/frmFormulare.vb +++ b/SDL/Formulare/KDFormulare/frmFormulare.vb @@ -1,12 +1,13 @@ -Imports iTextSharp.text.pdf -Imports System.IO -Imports Microsoft.Office.Interop +Imports System.IO Imports System.Net -Imports GrapeCity.ActiveReports Imports System.Net.Mail Imports System.Reflection Imports System.Text.RegularExpressions Imports System.Windows.Documents +Imports com.sun.tools.internal.ws.wsdl.document.mime +Imports GrapeCity.ActiveReports +Imports itextsharp.text.pdf +Imports Microsoft.Office.Interop Imports VERAG_PROG_ALLGEMEIN @@ -238,7 +239,7 @@ Public Class frmFormulare MyListBox1.Items.Add(New VERAG_PROG_ALLGEMEIN.MyListItem("DE Vollmacht (indirekt)", FormularManagerArten.DE_Vollmacht_indirekt)) MyListBox1.Items.Add(New VERAG_PROG_ALLGEMEIN.MyListItem("DE Fiskal-Vollmacht", FormularManagerArten.DE_Fiskal)) MyListBox1.Items.Add(New VERAG_PROG_ALLGEMEIN.MyListItem("AT Vollmacht", FormularManagerArten.AT_Vollmacht)) - MyListBox1.Items.Add(New VERAG_PROG_ALLGEMEIN.MyListItem("AT Vollmacht 4200 EV", FormularManagerArten.AT_Vollmacht_EV)) + MyListBox1.Items.Add(New VERAG_PROG_ALLGEMEIN.MyListItem("AT Vollmacht EV", FormularManagerArten.AT_Vollmacht_EV)) MyListBox1.Items.Add(New VERAG_PROG_ALLGEMEIN.MyListItem("AT Fiskal-Vollmacht", FormularManagerArten.AT_Fiskal)) MyListBox1.Items.Add(New VERAG_PROG_ALLGEMEIN.MyListItem("Export Vollmacht", FormularManagerArten.VERAG_EXPORT)) @@ -309,7 +310,7 @@ Public Class frmFormulare MyListBox1.Items.Add(New VERAG_PROG_ALLGEMEIN.MyListItem("DE Vollmacht (indirekt)", FormularManagerArten.DE_Vollmacht_indirekt)) MyListBox1.Items.Add(New VERAG_PROG_ALLGEMEIN.MyListItem("DE Fiskal-Vollmacht", FormularManagerArten.DE_Fiskal)) MyListBox1.Items.Add(New VERAG_PROG_ALLGEMEIN.MyListItem("AT Vollmacht", FormularManagerArten.AT_Vollmacht)) - MyListBox1.Items.Add(New VERAG_PROG_ALLGEMEIN.MyListItem("AT Vollmacht 4200 EV", FormularManagerArten.AT_Vollmacht_EV)) + MyListBox1.Items.Add(New VERAG_PROG_ALLGEMEIN.MyListItem("AT Vollmacht EV", FormularManagerArten.AT_Vollmacht_EV)) MyListBox1.Items.Add(New VERAG_PROG_ALLGEMEIN.MyListItem("AT Fiskal-Vollmacht", FormularManagerArten.AT_Fiskal)) MyListBox1.Items.Add(New VERAG_PROG_ALLGEMEIN.MyListItem("GB Vollmacht Import/Export", FormularManagerArten.GB_Vollmacht_IE)) MyListBox1.Items.Add(New VERAG_PROG_ALLGEMEIN.MyListItem("GB Vollmacht indirekt", FormularManagerArten.GB_Vollmacht_indirekt)) @@ -359,7 +360,7 @@ Public Class frmFormulare MyListBox1.Items.Add(New VERAG_PROG_ALLGEMEIN.MyListItem("DE Fiskal-Vollmacht", FormularManagerArten.DE_Fiskal)) MyListBox1.Items.Add(New VERAG_PROG_ALLGEMEIN.MyListItem("DE/AT Vollmacht (indirekt)", FormularManagerArten.DE_Vollmacht_indirekt)) MyListBox1.Items.Add(New VERAG_PROG_ALLGEMEIN.MyListItem("AT Vollmacht", FormularManagerArten.AT_Vollmacht)) - MyListBox1.Items.Add(New VERAG_PROG_ALLGEMEIN.MyListItem("AT Vollmacht 4200 EV", FormularManagerArten.AT_Vollmacht_EV)) + MyListBox1.Items.Add(New VERAG_PROG_ALLGEMEIN.MyListItem("AT Vollmacht EV", FormularManagerArten.AT_Vollmacht_EV)) MyListBox1.Items.Add(New VERAG_PROG_ALLGEMEIN.MyListItem("AT Fiskal-Vollmacht", FormularManagerArten.AT_Fiskal)) MyListBox1.Items.Add(New VERAG_PROG_ALLGEMEIN.MyListItem("GB Vollmacht Import/Export", FormularManagerArten.GB_Vollmacht_IE)) MyListBox1.Items.Add(New VERAG_PROG_ALLGEMEIN.MyListItem("GB Vollmacht indirekt", FormularManagerArten.GB_Vollmacht_indirekt)) @@ -7152,7 +7153,8 @@ Public Class FormularManagerNEU If reader.NumberOfPages > 0 Then document.Open() - addAttachmentToCurrentPDF(reader, pdf) + + addOnlyFirstAttachmentToCurrentPDF(reader, pdf) pdf.AddDocument(reader) reader.Close() @@ -7200,6 +7202,7 @@ Public Class FormularManagerNEU For i As Integer = 0 To filespecs.Size - 1 Step 2 ' Get the attachment's file specification + Dim fileArray As PdfDictionary = filespecs.GetAsDict(i + 1) Dim file As PdfDictionary = fileArray.GetAsDict(PdfName.EF) @@ -7213,12 +7216,77 @@ Public Class FormularManagerNEU ' Add the attachment to the new PDF Dim fileSpec As PdfFileSpecification = PdfFileSpecification.FileEmbedded(copy, Nothing, fileName, fileContent) copy.AddFileAttachment(fileName, fileSpec) + Exit For + Next Next End If End If + End Function + + Public Shared Function addOnlyFirstAttachmentToCurrentPDF(reader As PdfReader, copy As PdfCopy) As Boolean + + Dim catalog As PdfDictionary = reader.Catalog + Dim names As PdfDictionary = CType(PdfReader.GetPdfObject(catalog.Get(PdfName.NAMES)), PdfDictionary) + + If names IsNot Nothing Then + Dim embeddedFiles As PdfDictionary = CType(PdfReader.GetPdfObject(names.Get(PdfName.EMBEDDEDFILES)), PdfDictionary) + + If embeddedFiles IsNot Nothing Then + Dim filespecs As PdfArray = embeddedFiles.GetAsArray(PdfName.NAMES) + + If filespecs Is Nothing Then Return False + + For i As Integer = 0 To filespecs.Size - 1 Step 2 + + Dim fileArray As PdfDictionary = filespecs.GetAsDict(i + 1) + Dim file As PdfDictionary = fileArray.GetAsDict(PdfName.EF) + + For Each key As PdfName In file.Keys + + Dim stream As PRStream = + CType(PdfReader.GetPdfObject(file.GetAsIndirectObject(key)), PRStream) + + Dim fileName As String = fileArray.GetAsString(key).ToString() + Dim fileContent As Byte() = PdfReader.GetStreamBytes(stream) + + Dim fileSpec As PdfFileSpecification = + PdfFileSpecification.FileEmbedded(copy, Nothing, fileName, fileContent) + + copy.AddFileAttachment(fileName, fileSpec) + + Return True ' only one attachment ever gets copied + + Next + Next + End If + End If + + Return False + + End Function + + + + Private Shared Function HasAnyAttachment(reader As PdfReader) As Boolean + + Dim catalog As PdfDictionary = reader.Catalog + + Dim names As PdfDictionary = + TryCast(PdfReader.GetPdfObject(catalog.Get(PdfName.NAMES)), PdfDictionary) + + If names Is Nothing Then Return True + + Dim embeddedFiles As PdfDictionary = + TryCast(PdfReader.GetPdfObject(names.Get(PdfName.EMBEDDEDFILES)), PdfDictionary) + + If embeddedFiles Is Nothing Then Return False + + Dim filespecs As PdfArray = embeddedFiles.GetAsArray(PdfName.NAMES) + + Return filespecs IsNot Nothing AndAlso filespecs.Size > 2 End Function diff --git a/SDL/My Project/Resources.Designer.vb b/SDL/My Project/Resources.Designer.vb index 33ece2bb..067d6a67 100644 --- a/SDL/My Project/Resources.Designer.vb +++ b/SDL/My Project/Resources.Designer.vb @@ -2591,6 +2591,16 @@ Namespace My.Resources End Get End Property + ''' + ''' Sucht eine lokalisierte Ressource vom Typ System.Byte[]. + ''' + Friend ReadOnly Property Ustveu_Rechnungsanlagen_BE() As Byte() + Get + Dim obj As Object = ResourceManager.GetObject("Ustveu_Rechnungsanlagen_BE", resourceCulture) + Return CType(obj,Byte()) + End Get + End Property + ''' ''' Sucht eine lokalisierte Ressource vom Typ System.Byte[]. ''' diff --git a/SDL/My Project/Resources.resx b/SDL/My Project/Resources.resx index 1e835a90..acabd60d 100644 --- a/SDL/My Project/Resources.resx +++ b/SDL/My Project/Resources.resx @@ -994,4 +994,7 @@ ..\Resources\Ustveu-Rechnungsanlagen-DE.xls;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + ..\Resources\Ustveu_Rechnungsanlagen_BE.xlsx;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + \ No newline at end of file diff --git a/SDL/Resources/Ustveu_Rechnungsanlagen_BE.xlsx b/SDL/Resources/Ustveu_Rechnungsanlagen_BE.xlsx new file mode 100644 index 00000000..4638ee60 Binary files /dev/null and b/SDL/Resources/Ustveu_Rechnungsanlagen_BE.xlsx differ diff --git a/SDL/SDL.vbproj b/SDL/SDL.vbproj index cfc0d814..33db9b92 100644 --- a/SDL/SDL.vbproj +++ b/SDL/SDL.vbproj @@ -5065,6 +5065,7 @@ + Always diff --git a/SDL/USTV/frmMDM_USTVAntrag.vb b/SDL/USTV/frmMDM_USTVAntrag.vb index e7a4629f..2c4f98b2 100644 --- a/SDL/USTV/frmMDM_USTVAntrag.vb +++ b/SDL/USTV/frmMDM_USTVAntrag.vb @@ -4,6 +4,7 @@ Imports System.Reflection Imports System.Windows.Documents Imports com.sun.xml.internal.ws.api.pipe Imports itextsharp.text.pdf +Imports java.rmi.server Imports Microsoft.Office.Interop Imports VERAG_PROG_ALLGEMEIN @@ -80,7 +81,7 @@ Public Class frmMDM_USTVAntrag ' left join [tblUStVLeistender] as leist on leist.UStV_Leistender = [tblUStVPositionen].[UStVPo_Leistender] ' where UStVAn_ID='" & UStVAn_ID & "' ORDER BY UStVPo_ID", "FMZOLL") - .SET_SQL("SELECT [UStVAn_ID] ,[UStVPo_ID] " & IIf(cbxInterneNr.Checked, ",[UStVPo_interneNr] as intNr", "") & " ,[UStVPo_ReDat],[UStVPo_ReNr],[UStVPo_Leistungsbezeichnung],[UStVPo_Nettobetrag],[UStVPo_NettobetragEUR],[UStVPo_Leistender],leist.[UstV_Leistender_Strasse] + ' ' + leist.[UstV_Leistender_StrasseNr] as [UstV_Leistender_Strasse],leist.[UstV_Leistender_PLZ],leist.[UstV_Leistender_Stadt],leist.[UstV_Leistender_Land],leist.[UstV_Leistender_UstNr],[UStVPo_USteuerbetrag],[UStVPo_Schnittstelle],[UStVPo_SchnittstellenNr],[UStVPo_Umrechnungskurs],[UStVPo_USteuerbetragEUR],[UStVPo_Sachbearbeiter], [UStVPo_daId], [UStVPo_daId_loeschbar] ,[UStVPo_VZ],[UStVPo_VZ_RKID] ,cast(case when isnull([UStVPo_VZ_RKID],0) = 0 then 0 else 1 end as bit) as VZabrechnet + .SET_SQL("SELECT [UStVAn_ID] ,[UStVPo_ID] " & IIf(cbxInterneNr.Checked, ",[UStVPo_interneNr] as intNr", "") & " ,[UStVPo_ReDat],[UStVPo_ReNr],[UStVPo_Leistungsbezeichnung],[UStVPo_Nettobetrag],[UStVPo_NettobetragEUR],[UStVPo_Leistender],leist.[UstV_Leistender_Strasse] + ' ' + leist.[UstV_Leistender_StrasseNr] as [UstV_Leistender_Strasse],leist.[UstV_Leistender_Strasse] as StrasseOnly,leist.[UstV_Leistender_StrasseNr] as StrassenNrOnly,leist.[UstV_Leistender_PLZ],leist.[UstV_Leistender_Stadt],leist.[UstV_Leistender_Land],leist.[UstV_Leistender_UstNr],[UStVPo_USteuerbetrag],[UStVPo_Schnittstelle],[UStVPo_SchnittstellenNr],[UStVPo_Umrechnungskurs],[UStVPo_USteuerbetragEUR],[UStVPo_Sachbearbeiter], [UStVPo_daId], [UStVPo_daId_loeschbar] ,[UStVPo_VZ],[UStVPo_VZ_RKID] ,cast(case when isnull([UStVPo_VZ_RKID],0) = 0 then 0 else 1 end as bit) as VZabrechnet FROM [tblUStVPositionen] LEFT JOIN [tblUStVLeistender] as leist ON ([tblUStVPositionen].[UStVPo_LeistenderId] > 0 @@ -99,6 +100,10 @@ Public Class frmMDM_USTVAntrag If .Columns.Count > 0 Then .Columns("UStVAn_ID").Visible = False + + .Columns("StrassenNrOnly").Visible = False + .Columns("StrasseOnly").Visible = False + .Columns("UStVPo_ID").HeaderText = "Pos" .Columns("UStVPo_ID").Width = 40 @@ -4149,21 +4154,43 @@ Public Class frmMDM_USTVAntrag Dim BANK_IBAN As String = "" Dim BANK_BIC As String = "" - If IsDBNull(ADR.UstIdNr) OrElse ADR.UstIdNr Is Nothing Then - MsgBox("UID-Nr ist nicht im Kunden hinterlegt!") - End If - Dim filePath As String = "" Dim fileName As String = USTV_ANTRAG.UStVAn_KuNr & "_" & Antrag_LandKz & "_" & CDate(USTV_ANTRAG.UStVAn_ReDatVon).Month & "_" & CDate(USTV_ANTRAG.UStVAn_ReDatBis).Month & "_" & CDate(USTV_ANTRAG.UStVAn_ReDatBis).Year & "_VATRefund" + dTLANDEU = (New SQL).loadDgvBySql("select LandKz, MitgliedslandEU from Währungstabelle where LandKz is not null", "FMZOLL") + Dim isEU As Boolean = dTLANDEU.AsEnumerable().Where(Function(res) res.Field(Of String)("LandKz") = USTV_ANTRAG.UStVAn_LandKz).Select(Function(res) res.Field(Of Boolean)("MitgliedslandEU")).FirstOrDefault() + + If isEU Then + Dim UIDNr As Boolean = True + If IsDBNull(ADR.UstIdNr) OrElse ADR.UstIdNr Is Nothing Then + + Select Case MsgBox("UID-Nr ist nicht im Kunden hinterlegt!" & vbNewLine & "Fortfahren?", vbYesNo) + Case vbYes : UIDNr = False + Case vbNo : Exit Sub + End Select + + + MsgBox("UID-Nr ist nicht im Kunden hinterlegt!") + End If + + + Select Case ADR.LandKz + Case "RO", "R" : fileName = fileName & ".xml" : createXMLforRO(ADR, KUNDE, KUNDE_ERW, FIRMA, BANK_OWNER, BANK_IBAN, BANK_BIC, fileName, filePath) + Case "DE", "D" : fileName = fileName & ".csv" : createCSVforDE(ADR, KUNDE, KUNDE_ERW, FIRMA, BANK_OWNER, BANK_IBAN, BANK_BIC, fileName, filePath) 'ALTERNATIVE: ELMA5-Massendatenschnittstelle allerdings um einiges aufwendiger! + Case "HR" : fileName = fileName & ".xml" : createXMLforHR(ADR, KUNDE, KUNDE_ERW, FIRMA, BANK_OWNER, BANK_IBAN, BANK_BIC, fileName, filePath) + Case Else + MsgBox("Für das Kundenland " & ADR.LandKz & " wurde kein Export definiert") + End Select + + Else + Select Case Antrag_LandKz + Case "BE" : fileName = fileName & ".xlsx" : createCSVforBE(ADR, KUNDE, KUNDE_ERW, FIRMA, BANK_OWNER, BANK_IBAN, BANK_BIC, fileName, filePath) + Case Else + MsgBox("Für das Antragsland " & Antrag_LandKz & " wurde kein Export definiert") + End Select + + End If - Select Case ADR.LandKz - Case "RO", "R" : fileName = fileName & ".xml" : createXMLforRO(ADR, KUNDE, KUNDE_ERW, FIRMA, BANK_OWNER, BANK_IBAN, BANK_BIC, fileName, filePath) - Case "DE", "D" : fileName = fileName & ".csv" : createCSVforDE(ADR, KUNDE, KUNDE_ERW, FIRMA, BANK_OWNER, BANK_IBAN, BANK_BIC, fileName, filePath) 'ALTERNATIVE: ELMA5-Massendatenschnittstelle allerdings um einiges aufwendiger! - Case "HR" : fileName = fileName & ".xml" : createXMLforHR(ADR, KUNDE, KUNDE_ERW, FIRMA, BANK_OWNER, BANK_IBAN, BANK_BIC, fileName, filePath) - Case Else - MsgBox("Für das Land " & ADR.LandKz & " wurde kein Export definiert") - End Select Me.Cursor = Cursors.Default @@ -4726,7 +4753,7 @@ Public Class frmMDM_USTVAntrag list.Add("parkplatz") End If If LeistungsBez.Contains("zubeh") Then - list.Add("zubehzubehör") + list.Add("zubehör") End If If LeistungsBez.Contains("übern") Then list.Add("übernachtung") @@ -4827,7 +4854,7 @@ Public Class frmMDM_USTVAntrag End If If typ = "maut" Then Code = 4 - SubCode = "4" + SubCode = "" End If Case "SI" @@ -4857,7 +4884,7 @@ Public Class frmMDM_USTVAntrag End If If typ = "maut" Then Code = 4 - SubCode = "4" + SubCode = "" End If Case "HU" @@ -4877,7 +4904,7 @@ Public Class frmMDM_USTVAntrag End If If typ = "maut" Then Code = 4 - SubCode = "4" + SubCode = "" End If Case "SE" @@ -5054,7 +5081,7 @@ Public Class frmMDM_USTVAntrag End If - Datei.Save + Datei.Save Blatt = Datei.Worksheets(1) @@ -5078,6 +5105,156 @@ Public Class frmMDM_USTVAntrag Me.Cursor = Cursors.Default + End Function + + + Private Function createCSVforBE(ADR As cAdressen, KUNDE As cKunde, KUNDE_ERW As cKundenErweitert, FIRMA As cFirmen, BANK_OWNER As String, BANK_IBAN As String, BANK_BIC As String, filename As String, filePath As String) + + Try + + + Dim sPath As String = Environment.GetFolderPath(Environment.SpecialFolder.Personal) & "\VERAG\SDL\tmp\" + If Not My.Computer.FileSystem.DirectoryExists(sPath) Then + My.Computer.FileSystem.CreateDirectory(sPath) + End If + + + Dim exclApp As Object 'as Application + Dim Datei As Object 'as WorkBook + Dim Blatt As Object 'Microsoft.Office.Interop.Excel.Worksheet 'As Object 'as Worksheet + exclApp = CreateObject("Excel.Application") + + With exclApp + .Visible = False + + Try + filePath = sPath & filename + + 'If File.Exists(filePath) Then + ' File.Delete(filePath) + 'End If + + My.Computer.FileSystem.WriteAllBytes(filePath, My.Resources.Ustveu_Rechnungsanlagen_BE, False) + + Catch ex As System.Exception + VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name) + Me.Cursor = Cursors.Default + Return False + + End Try + + Datei = .Workbooks.Open(filePath) 'Anpassen + Blatt = Datei.Worksheets(1) 'Anpassen + + + Dim counter As Integer = 1 + Dim zeile As Integer = 3 + Dim counterLeistungen As Integer = 1 + + For Each row As DataGridViewRow In dgvUSTVPositionen.SelectedRows.Cast(Of DataGridViewRow)().OrderBy(Function(dgvr) dgvr.Index) + + Dim UIDNrLeistender = "" + Dim LeistenderName As String = "" + Dim listOfLeistungstyp As New List(Of String) + + Dim Strasse As String = "" + If Not IsDBNull(row.Cells("StrasseOnly").Value) AndAlso row.Cells("StrasseOnly").Value IsNot Nothing AndAlso row.Cells("StrasseOnly").Value <> "" Then Strasse = row.Cells("StrasseOnly").Value + + Dim StrasseNR As String = "" + If Not IsDBNull(row.Cells("StrassenNrOnly").Value) AndAlso row.Cells("StrassenNrOnly").Value IsNot Nothing AndAlso row.Cells("StrassenNrOnly").Value <> "" Then StrasseNR = row.Cells("StrassenNrOnly").Value + + Dim Ort As String = "" + If Not IsDBNull(row.Cells("UstV_Leistender_Stadt").Value) AndAlso row.Cells("UstV_Leistender_Stadt").Value IsNot Nothing AndAlso row.Cells("UstV_Leistender_Stadt").Value <> "" Then Ort = row.Cells("UstV_Leistender_Stadt").Value + + Dim PLZ As String = "" + If Not IsDBNull(row.Cells("UstV_Leistender_PLZ").Value) AndAlso row.Cells("UstV_Leistender_PLZ").Value IsNot Nothing AndAlso row.Cells("UstV_Leistender_PLZ").Value <> "" Then PLZ = row.Cells("UstV_Leistender_PLZ").Value + + If Not IsDBNull(row.Cells("UstV_Leistender_UstNr").Value) AndAlso row.Cells("UstV_Leistender_UstNr").Value IsNot Nothing AndAlso row.Cells("UstV_Leistender_UstNr").Value <> "" Then + UIDNrLeistender = row.Cells("UstV_Leistender_UstNr").Value + 'UIDNrLeistender = UIDNrLeistender.ToString.Replace(Antrag_LandKz, "") DEU wollen das Land dabei! + End If + + LeistenderName = row.Cells("UStVPo_Leistender").Value + LeistenderName = LeistenderName.ToString.Replace(Antrag_LandKz, "") + + Dim Nettobetrag As Double = 0 + If Not IsDBNull(row.Cells("UStVPo_Nettobetrag").Value) AndAlso IsNumeric(row.Cells("UStVPo_Nettobetrag").Value) Then Nettobetrag = CDbl(row.Cells("UStVPo_Nettobetrag").Value) + + Dim Steuerbetrag As Double = 0 + If Not IsDBNull(row.Cells("UStVPo_USteuerbetrag").Value) AndAlso IsNumeric(row.Cells("UStVPo_USteuerbetrag").Value) Then Steuerbetrag = CDbl(row.Cells("UStVPo_USteuerbetrag").Value) + + Dim land = "" + Dim iso2Land = "" + If Not IsDBNull(row.Cells("UstV_Leistender_Land").Value) AndAlso row.Cells("UstV_Leistender_Land").Value IsNot Nothing AndAlso row.Cells("UstV_Leistender_Land").Value <> "" Then land = row.Cells("UstV_Leistender_Land").Value + + If land.Length = 2 Then + iso2Land = land + ElseIf land.Length = 3 Then + iso2Land = VERAG_PROG_ALLGEMEIN.cProgramFunctions.getISO2LandFromISO3Land(land) + ElseIf land.Length = 1 Then + iso2Land = VERAG_PROG_ALLGEMEIN.cProgramFunctions.getISO2LandFromISO1Land(land) + End If + + + Blatt.Range("A" & zeile).Value = counter + Blatt.Range("C" & zeile).Value = VERAG_PROG_ALLGEMEIN.cDATENSERVER.replaceInvalidCahr(LeistenderName) + Blatt.Range("D" & zeile).Value = UIDNrLeistender + Blatt.Range("E" & zeile).Value = VERAG_PROG_ALLGEMEIN.cDATENSERVER.replaceInvalidCahr(Strasse) + Blatt.Range("F" & zeile).Value = VERAG_PROG_ALLGEMEIN.cDATENSERVER.replaceInvalidCahr(StrasseNR) + Blatt.Range("G" & zeile).Value = PLZ + Blatt.Range("H" & zeile).Value = Ort + Blatt.Range("I" & zeile).Value = VERAG_PROG_ALLGEMEIN.cProgramFunctions.getLandEnglFromISO2Land(iso2Land) 'Funktion der das Land auf englisch zurückgibt + Blatt.Range("J" & zeile).Value = "Purchase" + Blatt.Range("K" & zeile).Value = "Normal" + Blatt.Range("L" & zeile).Value = CDate(row.Cells("UStVPo_ReDat").Value).ToString("dd.MM.yyyy") + Blatt.Range("M" & zeile).Value = row.Cells("UStVPo_ReNr").Value + Blatt.Range("N" & zeile).Value = Nettobetrag.ToString("0.00", CultureInfo.InvariantCulture) + Blatt.Range("O" & zeile).Value = Steuerbetrag.ToString("0.00", CultureInfo.InvariantCulture) + Blatt.Range("P" & zeile).Value = Steuerbetrag.ToString("0.00", CultureInfo.InvariantCulture) + + If Not IsDBNull(row.Cells("UStVPo_Leistungsbezeichnung").Value) AndAlso row.Cells("UStVPo_Leistungsbezeichnung").Value IsNot Nothing Then + + listOfLeistungstyp = getLeistungsTyp(row.Cells("UStVPo_Leistungsbezeichnung").Value, row.Cells("UStVPo_SchnittstellenNr").Value) + + Dim typeOfGoodsAndService As String = "" + If listOfLeistungstyp.Count > 0 Then + Select Case listOfLeistungstyp(0) + Case "maut" : typeOfGoodsAndService = "Road tolls and road user charge" + Case "diesel" : typeOfGoodsAndService = "Fuel" + Case "rest" : typeOfGoodsAndService = "Other" + Case "übernachtung" : typeOfGoodsAndService = "Accommodation" + Case "zubehör" : typeOfGoodsAndService = "Other" + Case "parkplatz" : typeOfGoodsAndService = "Travel expenses, such as taxi fares, public transport fares" + End Select + End If + + + Blatt.Range("B" & zeile).Value = typeOfGoodsAndService + + End If + + Datei.Save + + + counter += 1 + zeile += 1 + + Next + + Datei.Save + + .Visible = True + + + End With + + Catch ex As Exception + VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name) + End Try + + Me.Cursor = Cursors.Default + + End Function Private Function PDFInvoicesPath(ByRef posId As String) As String diff --git a/SDL/cProgramFunctions.vb b/SDL/cProgramFunctions.vb index cf69d2da..53243ab7 100644 --- a/SDL/cProgramFunctions.vb +++ b/SDL/cProgramFunctions.vb @@ -1,4 +1,5 @@ Imports System.ComponentModel +Imports System.Data.SqlClient Imports System.Reflection Imports System.Text.RegularExpressions Imports System.Threading @@ -317,7 +318,7 @@ Public Class cProgramFunctions Case 1, 7 : Return openThereforeNavigatorZollvollmachten_DE(KundenNr) Case 2, 8 : Return openThereforeNavigatorFiskalVM_DE(KundenNr) Case 4, 9 : Return openThereforeNavigatorFiskalVM_AT(KundenNr) - Case 12, 13 : Return openThereforeNavigatorVM_AT(KundenNr) + ' Case 12, 13 : Return openThereforeNavigatorVM_AT(KundenNr) End Select Return False End Function @@ -395,28 +396,74 @@ Public Class cProgramFunctions End Function - Shared Function openThereforeNavigatorVM_AT(KundenNr As String) - Try - Dim srch = KundenNr & "%" - Dim docid As String = "" - docid = SQL_VERAG.getValueTxtBySql("SELECT TOP 1 isnull([DocNo],-1) FROM [Therefore].[dbo].[TheCat76] WHERE [String] LIKE '" & srch & "' ORDER BY [Eingabedatum] DESC", "SCANCANON") + Public Shared Function ValidateSQLFieldLengths(parameters As List(Of VERAG_PROG_ALLGEMEIN.SQLVariable), tableName As String, Info As String, Optional conn_art As String = "FMZOLL", Optional showError As Boolean = True) As Boolean + + Try + + Dim sql As String = + "SELECT COLUMN_NAME, CHARACTER_MAXIMUM_LENGTH FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '" & tableName & "' AND DATA_TYPE IN ('varchar','nvarchar','char','nchar')" + + Dim dt As DataTable = + (New SQL).loadDgvBySql(sql, conn_art) + + If dt Is Nothing Then Return False + + Dim fieldLengths As New Dictionary(Of String, Integer)(StringComparer.OrdinalIgnoreCase) + + For Each r As DataRow In dt.Rows + + fieldLengths(r!COLUMN_NAME.ToString) = + CInt(r!CHARACTER_MAXIMUM_LENGTH) + + Next + + Dim errors As New List(Of String) + + For Each p As SQLVariable In parameters + + If p Is Nothing Then Continue For + If p.Value() Is Nothing Then Continue For + If p.Text() Is Nothing Then Continue For + + Dim fieldName As String = p.Text().TrimStart("@"c) + + If Not fieldLengths.ContainsKey(fieldName) Then Continue For + + Dim maxLen As Integer = fieldLengths(fieldName) + + ' varchar(max) / nvarchar(max) + If maxLen = -1 Then Continue For + + Dim value As String = p.Value().ToString + + If value.Length > maxLen Then + + errors.Add(fieldName & " -> " & value.Length & "/" & maxLen) + + End If + + Next + + If errors.Count > 0 Then + Info = "Folgende SQL-Felder sind zu lang:" & vbCrLf & vbCrLf & String.Join(vbCrLf, errors) + If showError Then + MsgBox(Info, MsgBoxStyle.Exclamation) + End If + + Return False + + End If + + Return True - If IsNumeric(docid) AndAlso docid > 0 Then - ' Process.Start("theviewer.exe -" & docid) - ' Process.Start("C:\Program Files (x86)\Therefore\theviewer.exe -" & docid) - Try - Shell("C:\Program Files (x86)\Therefore\theviewer.exe -d" & docid) - Catch ex As Exception - Shell("C:\Program Files\Therefore\theviewer.exe -d" & docid) - End Try - Else - MsgBox("Das Dokument konnte nicht gefunden werden.") - End If - Return True Catch ex As Exception - MsgBox("Fehler beim Öffnen!" & vbNewLine & ex.Message & ex.StackTrace) + + MsgBox("ValidateSQLFieldLengths:" & vbCrLf & ex.Message) + + Return False + End Try - Return False + End Function Shared Function openThereforeNavigatorFiskalVM_AT(KundenNr As String) diff --git a/VERAG_PROG_ALLGEMEIN/Classes/USTV/cUSTVAntrag.vb b/VERAG_PROG_ALLGEMEIN/Classes/USTV/cUSTVAntrag.vb index 817809ed..e8fc63a3 100644 --- a/VERAG_PROG_ALLGEMEIN/Classes/USTV/cUSTVAntrag.vb +++ b/VERAG_PROG_ALLGEMEIN/Classes/USTV/cUSTVAntrag.vb @@ -449,6 +449,12 @@ Public Class cUStVPositionen Public Function SAVE() As Boolean Dim list As List(Of VERAG_PROG_ALLGEMEIN.SQLVariable) = getParameterList() + + If VERAG_PROG_ALLGEMEIN.cProgramFunctions.ValidateSQLFieldLengths(list, "tblUStVPositionen", "", "FMZOLL") Then + Return False + End If + + Dim sqlstr = " BEGIN TRAN IF EXISTS(SELECT * FROM tblUStVPositionen WHERE UStVAn_ID=@UStVAn_ID AND UStVPo_ID=@UStVPo_ID) " & " BEGIN " & getUpdateCmd() & " END " & " Else " & diff --git a/VERAG_PROG_ALLGEMEIN/DATENSERVER/cDATENSERVER.vb b/VERAG_PROG_ALLGEMEIN/DATENSERVER/cDATENSERVER.vb index 3fb34d41..39c8dfb3 100644 --- a/VERAG_PROG_ALLGEMEIN/DATENSERVER/cDATENSERVER.vb +++ b/VERAG_PROG_ALLGEMEIN/DATENSERVER/cDATENSERVER.vb @@ -2458,9 +2458,15 @@ Public Class DATENVERVER_OPTIONS Using pdf As New iText.Kernel.Pdf.PdfDocument(New iText.Kernel.Pdf.PdfReader(pdfPath), New iText.Kernel.Pdf.PdfWriter(tempFile)) + + Dim xmlBytes = File.ReadAllBytes(xmlPath) Dim fileName As String = "factur-x.xml" + If HasAttachment(pdf, fileName) Then + Return pdfPath + End If + Dim fs = PdfFileSpec.CreateEmbeddedFileSpec( pdf, xmlBytes, @@ -2490,6 +2496,32 @@ Public Class DATENVERVER_OPTIONS End Function + Private Shared Function HasAttachment(pdf As iText.Kernel.Pdf.PdfDocument, fileName As String) As Boolean + + Dim catalog = pdf.GetCatalog().GetPdfObject() + Dim afObj = catalog.Get(iText.Kernel.Pdf.PdfName.AF) + + If afObj Is Nothing Then Return False + + Dim afArray = TryCast(afObj, iText.Kernel.Pdf.PdfArray) + If afArray Is Nothing Then Return False + + For i As Integer = 0 To afArray.Size() - 1 + Dim fsObj = afArray.Get(i) + Dim fsDict = TryCast(fsObj, iText.Kernel.Pdf.PdfDictionary) + + If fsDict Is Nothing Then Continue For + + Dim fName = fsDict.GetAsString(iText.Kernel.Pdf.PdfName.F) + + If fName IsNot Nothing AndAlso fName.ToString().Equals(fileName, StringComparison.OrdinalIgnoreCase) Then + Return True + End If + Next + + Return False + End Function + Public Shared Function ConvertToPdfA3(inputPdf As String) As String diff --git a/VERAG_PROG_ALLGEMEIN/cProgramFunktions.vb b/VERAG_PROG_ALLGEMEIN/cProgramFunktions.vb index 76000e23..98c17f2b 100644 --- a/VERAG_PROG_ALLGEMEIN/cProgramFunktions.vb +++ b/VERAG_PROG_ALLGEMEIN/cProgramFunktions.vb @@ -366,6 +366,76 @@ Public Class cProgramFunctions End If End Sub + Public Shared Function ValidateSQLFieldLengths(parameters As List(Of VERAG_PROG_ALLGEMEIN.SQLVariable), tableName As String, Info As String, Optional conn_art As String = "FMZOLL", Optional showError As Boolean = True) As Boolean + + Try + + Dim sql As String = + "SELECT COLUMN_NAME, CHARACTER_MAXIMUM_LENGTH FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '" & tableName & "' AND DATA_TYPE IN ('varchar','nvarchar','char','nchar')" + + Dim dt As DataTable = + (New SQL).loadDgvBySql(sql, conn_art) + + If dt Is Nothing Then Return False + + Dim fieldLengths As New Dictionary(Of String, Integer)(StringComparer.OrdinalIgnoreCase) + + For Each r As DataRow In dt.Rows + + fieldLengths(r!COLUMN_NAME.ToString) = + CInt(r!CHARACTER_MAXIMUM_LENGTH) + + Next + + Dim errors As New List(Of String) + + For Each p As SQLVariable In parameters + + If p Is Nothing Then Continue For + If p.Value() Is Nothing Then Continue For + If p.Text() Is Nothing Then Continue For + + Dim fieldName As String = p.Text().TrimStart("@"c) + + If Not fieldLengths.ContainsKey(fieldName) Then Continue For + + Dim maxLen As Integer = fieldLengths(fieldName) + + ' varchar(max) / nvarchar(max) + If maxLen = -1 Then Continue For + + Dim value As String = p.Value().ToString + + If value.Length > maxLen Then + + errors.Add(fieldName & " -> " & value.Length & "/" & maxLen) + + End If + + Next + + If errors.Count > 0 Then + Info = "Folgende SQL-Felder sind zu lang:" & vbCrLf & vbCrLf & String.Join(vbCrLf, errors) + If showError Then + MsgBox(Info, MsgBoxStyle.Exclamation) + End If + + Return False + + End If + + Return True + + Catch ex As Exception + + MsgBox("ValidateSQLFieldLengths:" & vbCrLf & ex.Message) + + Return False + + End Try + + End Function + Public Shared Function fktEuro(varBetrag As Object, varVonWährung As Object, varNachWährung As Object) As Object '(FixeTaxe, "ATS", RECHNUNG.Währungscode) 'Dim varVonWährung As Object @@ -948,11 +1018,19 @@ BindingFlags.Instance Or BindingFlags.NonPublic, Nothing, [Control], New Object( Return SQL.getValueTxtBySql(sqlstr, "FMZOLL") End Function - Shared Function getISO1Land(LandKz As String) - Dim sqlstr = "SELECT TOP 1 isnull(Währungstabelle.LandKz,'') AS LandKzISO1 FROM [Länderverzeichnis für die Außenhandelsstatistik] LEFT JOIN Währungstabelle ON [Länderverzeichnis für die Außenhandelsstatistik].LandNr = Währungstabelle.Währungsschlüssel WHERE [Länderverzeichnis für die Außenhandelsstatistik].LandKz='" & LandKz & "' " + Shared Function getLandEnglFromISO2Land(Iso2Land As String) + Dim sqlstr = "SELECT TOP 1 isnull(Land_EN,'') AS LandBez FROM [Währungstabelle] LEFT JOIN [Länderverzeichnis für die Außenhandelsstatistik] ON [Länderverzeichnis für die Außenhandelsstatistik].LandNr = Währungstabelle.Währungsschlüssel WHERE [Länderverzeichnis für die Außenhandelsstatistik].LandKz='" & Iso2Land & "' " Dim SQL As New VERAG_PROG_ALLGEMEIN.SQL Return SQL.getValueTxtBySql(sqlstr, "FMZOLL") End Function + + Shared Function getISO1Land(LandKz As String) + Dim sqlstr = "SELECT TOP 1 isnull(Währungstabelle.Land_EN,'') AS LandBez FROM [Länderverzeichnis für die Außenhandelsstatistik] LEFT JOIN Währungstabelle ON [Länderverzeichnis für die Außenhandelsstatistik].LandNr = Währungstabelle.Währungsschlüssel WHERE [Länderverzeichnis für die Außenhandelsstatistik].LandKz='" & LandKz & "' " + Dim SQL As New VERAG_PROG_ALLGEMEIN.SQL + Return SQL.getValueTxtBySql(sqlstr, "FMZOLL") + End Function + + Shared Function convertToIso(s) As String Return s