Option Explicit ' System.Data.SqlClient ' Project classification script Const CutomerBTWNumberNotAllowed = "285007815, NL810101683B01" Const InvCreditIndicator = "Credit" Const InvDebitIndicator = "Invoice" '# Create the global variables for the database lookup dialogue '# The variable for the ODBC needs to be global, '# so that the connection to the DNS is only opened once Global g_oODBC As New DatabaseDialog.DBLookupODBC 'Access 'Const cDSN = "Driver={Microsoft Access Driver (*.mdb)};Dbq=D:\Projects\Soest\KTM_Invoice_Soest\Database\cred_decade.mdb;Uid=Admin;Pwd;" 'Const cSupplierTableName = "Amber" 'Const cSupplierVATColumnName = "D" 'Oracle 'Const cDSN = "Driver={Microsoft ODBC for Oracle};Server=USSyntheticCompanyAddresses;Uid=myUsername;Pwd=myPassword;" Const cDSN = "DSN=v_leverancier;Uid=verseon;Pwd=manager;" Const cSupplierTableName = "v_leverancier" Const cSupplierVATColumnName = "NAWBANKREKENING" 'Oracle 'Const cDSN = "Driver={Microsoft ODBC for Oracle};Server=USSyntheticCompanyAddresses;Uid=myUsername;Pwd=myPassword;" 'Const cDSN = "DSN=VerseonLookup;Uid=myUsername;Pwd=myPassword;" 'Const cTableName = "USSyntheticCompanyAddresses" 'MSSql 'Const cDSN = "Provider=SQLOLEDB;Server=server;Database=ERP_Conn;UID=User;PWD=pass;" 'Const cTableName = "Suppliers" ' do we check the invoice values or can we stop now ? Dim CheckFact As String ' extraction script for class Invoice Private Sub GetValidate_VatID(alwayscheck As Boolean,pXDoc As CASCADELib.CscXDocument, pField As CASCADELib.CscXDocField) Dim oResult() As String '# String array to contain the record set result from the Fuzzy and the ODBC lookup selection Dim oRequest(4) As String '# 5 omdat 0..4 Dim pCompCode As CASCADELib.CscXDocField set pCompCode = pXDoc.Fields.ItemByName("CompCode") If pField.Text <> "" Then oRequest(0) = pField.Text '# 0 is dus de 1e kolom uit de DB oRequest(1) = pCompCode.Text '# 1 is dus de 2e kolom uit de DB 'Else ' oRequest(3) = "%" 'End If ' MsgBox CStr(pField.ExtractionConfident) & CStr(pField.Valid) & CStr(pField.Confidence) If (pField.Confidence = 0) Or (alwayscheck = True) Then ' handle field here g_oODBC.VisibleColumns = "0;1;2;3;4" '# de veld nummers die we laten zien g_oODBC.DialogCaption = "Leveranciers" '# titel g_oODBC.GroupBoxCaption = "Resultaat uit leveranciers ( % is joker teken )" '# groep titel g_oODBC.InitialQueryVals = oRequest '# zoekargument g_oODBC.SearchImmediately = True '# direct zoeken 'Access -> g_oODBC.DatabaseType = 0 (Default), Oracle -> g_oODBC.DatabaseType = 1 g_oODBC.DatabaseType = 1 oResult = g_oODBC.ShowDialog (cDSN, cSupplierTableName) If UBound(oResult) <> -1 And UBound(oResult)>0 Then SetVendorFields pXDoc, oResult Else ValidationForm_AfterFieldChanged pXDoc, pField End If End If End If End Sub '# ================================================================================================================ '# Set the fields for the selection from the alternatives list '# ================================================================================================================ Private Sub SetVendorFields (ByVal pXDoc As CASCADELib.CscXDocument, ByRef Recordset() As String) Dim oField As CscXDocField Set oField = pXDoc.Fields.ItemByName("VendorID"): SetVendorField oField, Recordset(1) Set oField = pXDoc.Fields.ItemByName("VendorName"): SetVendorField oField, Recordset(2) Set oField = pXDoc.Fields.ItemByName("VendorClass"): SetVendorField oField, Recordset(4) Set oField = pXDoc.Fields.ItemByName("VatID"): SetVendorField oField, Recordset(0) End Sub Private Function GetProperAlternativeFromDatabase(ByRef pField1 As CASCADELib.CscXDocField, ColumnName1 As String, ByRef pField2 As CASCADELib.CscXDocField, ColumnName2 As String, TableName As String) As String Dim cnn As ADODB.Connection Dim rs As ADODB.Recordset Dim Result As String Dim a As Integer Dim Selectstr As String 'Dim x As Field Result = "" ' pField.Text ' Find out If there are multiple items found otherwise there will be no choice , set value to 1 ' Currently set to 0 to make every result trigger the lookup If pField1.Alternatives.Count > 0 Then Set cnn = New ADODB.Connection ' Open a connection by referencing the ODBC driver. cnn.ConnectionString = cDSN cnn.Open ' Check to see if the default value is allowed, otherwise remove it imediately If InStr(CutomerBTWNumberNotAllowed, pField1.Text) > 0 Then pField1.Text = "" End If ' search the various alternatives For a=0 To pField1.Alternatives.Count-1 ' check if the alternative is allowed, otherwise skip it If InStr(CutomerBTWNumberNotAllowed, pField1.Alternatives(a).Text)=0 Then 'If Len(pField1.Alternatives(a).Text)= 9 Then 'pField1.Alternatives(a).Text = "0" + pField1.Alternatives(a).Text 'End If If Len(pField1.Alternatives(a).Text)= 14 And Left(pField1.Alternatives(a).Text, 2)= "NL" And Mid(pField1.Alternatives(a).Text,12,1) = "8" Then pField1.Alternatives(a).Text = Left(pField1.Alternatives(a).Text,11) + "B" + Right(pField1.Alternatives(a).Text,2) End If ' Get info from the database if ColumnName2 = "" then Selectstr = "Select "+ColumnName1+" from " +TableName+" WHERE " + ColumnName1 +" = '"+ pField1.Alternatives(a).Text+ "'" else Selectstr = "Select "+ColumnName1+" from " +TableName+" WHERE " + ColumnName1 +" = '"+ pField1.Alternatives(a).Text+ "' AND " + ColumnName2 +" = '"+ pField2.Text+ "'" end if Set rs = New ADODB.Recordset ' Set rs = cnn.Execute( Selectstr ) rs.Open(Selectstr,cnn) ' do we have a hit ? If rs.EOF = False Then Result=pField1.Alternatives(a).Text pField1.InitFromAlternative(a, Nothing) rs.Close Exit For End If rs.Close End If Next ' Close the connection. cnn.Close End If If Result = "" Then pField1.Text = "" pField1.Confidence = 0 Else pField1.Confidence = 1 End If GetProperAlternativeFromDatabase = Result End Function Private Sub Documenttype_AfterExtract(ByRef pXDoc As CASCADELib.CscXDocument, ByRef pField As CASCADELib.CscXDocField) If pField.Text = "Invoice" Then pField.Text = "0" Else If pField.Text = "Credit" Then pField.Text = "1" End If End If 'MsgBox CStr(pField.Text) End Sub 'Private Sub Jaar_AfterExtract(ByRef pXDoc As CASCADELib.CscXDocument, ByRef pField As CASCADELib.CscXDocField) ' pField.Text = Left(pField.Text,4) 'End Sub 'Private Sub Periode_AfterExtract(ByRef pXDoc As CASCADELib.CscXDocument, ByRef pField As CASCADELib.CscXDocField) ' pField.Text = Mid(pField.Text,6,2) 'End Sub Private Sub VatID_AfterExtract(ByRef pXDoc As CASCADELib.CscXDocument, ByRef pField As CASCADELib.CscXDocField) '' find out which Field we are currently serving If pField.Name = "VatID" Then GetProperAlternativeFromDatabase(pField, cSupplierVATColumnName, cSupplierTableName) End If End Sub Private Sub ValidationForm_AfterFieldConfirmed(pXDoc As CASCADELib.CscXDocument, pField As CASCADELib.CscXDocField) If pField.Name = "VatID" Then Call GetValidate_VatID(False, pXDoc, pField) End If If pField.Name = "InvoiceType" Then Call CheckInvoiceParameters(pXDoc) End If If pField.Text = "" Then Select Case pField.Name Case "SubTotal", "NetAmount0", "NetAmount1", "TaxAmount1", "TaxRate1", "NetAmount2", "TaxAmount2", "TaxRate2" pField.Text = "0,00" End Select End If End Sub Private Sub ValidationForm_DocumentLoaded(pXDoc As CASCADELib.CscXDocument) Dim pField As CASCADELib.CscXDocField Set pField = pXDoc.Fields.ItemByName("VatID") If pField.Text <> "" Then Call GetValidate_VatID(True, pXDoc, pField) Else SetRed(pField) End If End Sub Private Sub ValidationForm_FieldGotFocus(ByVal pXDoc As CASCADELib.CscXDocument, ByVal pField As CASCADELib.CscXDocField) If pField.Name = "VatID" Then Call GetValidate_VatID(True, pXDoc, pField) End If Call CheckInvoiceParameters(pXDoc) End Sub Private Sub ValidationForm_AfterFieldChanged(ByVal pXDoc As CASCADELib.CscXDocument, ByVal pField As CASCADELib.CscXDocField) Select Case pField.Name Case "VatID", "InvoiceType" SetRed(pField) End Select End Sub Private Sub SetVendorField(ByVal pField As CASCADELib.CscXDocField, ByVal sValue As String) pField.Text = sValue SetGreen(pField) End Sub Function SetGreen(ByVal pField As CASCADELib.CscXDocField) pField.Confidence = 1 pField.ExtractionConfident = True pField.Valid = True End Function Function SetRed(ByVal pField As CASCADELib.CscXDocField) pField.Confidence = 0 pField.Valid = False pField.ExtractionConfident = False End Function Function CheckAmountSign(pDocType As CASCADELib.CscXDocField, pAmount As CASCADELib.CscXDocField, fValue As Currency) As Currency Dim ResultFieldValue As Currency ResultFieldValue = fValue If ((pDocType.Text = InvCreditIndicator) And (fValue > 0)) Or ((pDocType.Text = InvDebitIndicator) And (fValue < 0)) Then ResultFieldValue = fValue * -1 pAmount.Text = CStr(fValue) SetRed(pDocType) End If CheckAmountSign = ResultFieldValue End Function Rem ======================================================================== Rem Rem Check Invoice Parameters, Check invoice totals for all fields and gives individual responce Rem Ivar Snaaijer BMConsultants 20080610 Rem Rem ======================================================================== Function CheckInvoiceParameters(ByVal pXDoc As CASCADELib.CscXDocument) Dim pSubTotal As CASCADELib.CscXDocField Dim pFaktBtw1 As CASCADELib.CscXDocField Dim pFaktBtw2 As CASCADELib.CscXDocField Dim pTaxRate1 As CASCADELib.CscXDocField Dim pTaxRate2 As CASCADELib.CscXDocField Dim pNetto0 As CASCADELib.CscXDocField Dim pNetto1 As CASCADELib.CscXDocField Dim pNetto2 As CASCADELib.CscXDocField Dim pFaktTot As CASCADELib.CscXDocField Dim pSupplierName As CASCADELib.CscXDocField Dim pBarCode As CASCADELib.CscXDocField Dim pBankNr As CASCADELib.CscXDocField Dim pVendID As CASCADELib.CscXDocField Dim pVendCur As CASCADELib.CscXDocField Dim pVendClass As CASCADELib.CscXDocField Dim pComp As CASCADELib.CscXDocField Dim pOrdNr As CASCADELib.CscXDocField Dim pFactNr As CASCADELib.CscXDocField Dim pFaktDt As CASCADELib.CscXDocField Dim pDocType As CASCADELib.CscXDocField Dim pBTWTotaal As CASCADELib.CscXDocField Dim TmpSubTotal As Currency Dim TmpFaktBtw1 As Currency Dim TmpFaktBtw2 As Currency Dim TmpNetto0 As Currency Dim TmpNetto1 As Currency Dim TmpNetto2 As Currency Dim TmpFaktTot As Currency Dim TmpFaktBtwC1 As Currency Dim TmpFaktBtwC2 As Currency Dim TmpBTWTotaal As Currency Dim btw1 As Currency Dim btw2 As Currency Dim btwDeviation As Currency ' System defaults btw1 = 6 btw2 = 19 btwDeviation = 0.0055 ' Get information from the form Set pFaktBtw1 = pXDoc.Fields.ItemByName("TaxAmount1") Set pFaktBtw2 = pXDoc.Fields.ItemByName("TaxAmount2") Set pNetto0 = pXDoc.Fields.ItemByName("NetAmount0") Set pNetto1 = pXDoc.Fields.ItemByName("NetAmount1") Set pNetto2 = pXDoc.Fields.ItemByName("NetAmount2") Set pSubTotal = pXDoc.Fields.ItemByName("SubTotal") Set pFaktTot = pXDoc.Fields.ItemByName("Total") Set pTaxRate1 = pXDoc.Fields.ItemByName("TaxRate1") Set pTaxRate2 = pXDoc.Fields.ItemByName("TaxRate2") Set pSupplierName = pXDoc.Fields.ItemByName("VendorName") Set pBarCode = pXDoc.Fields.ItemByName("Barcode") Set pBankNr = pXDoc.Fields.ItemByName("VatID") Set pVendID = pXDoc.Fields.ItemByName("VendorID") Set pVendCur = pXDoc.Fields.ItemByName("Currency") Set pOrdNr = pXDoc.Fields.ItemByName("OrderNumber") Set pFactNr = pXDoc.Fields.ItemByName("InvoiceNumber") Set pFaktDt = pXDoc.Fields.ItemByName("InvoiceDate") Set pDocType = pXDoc.Fields.ItemByName("Documenttype") Set pBTWTotaal = pXDoc.Fields.ItemByName("BTWTotaal") TmpFaktBtw1 = 0 TmpFaktBtw2 = 0 TmpSubTotal = 0 TmpNetto0 = 0 TmpNetto1 = 0 TmpNetto2 = 0 If pFaktBtw1.Text <> "" Then TmpFaktBtw1 = CDbl(pFaktBtw1.Text) If pFaktBtw2.Text <> "" Then TmpFaktBtw2 = CDbl(pFaktBtw2.Text) If pFaktTot.Text <> "" Then TmpFaktTot = CDbl(pFaktTot.Text) If pSubTotal.Text <> "" Then TmpSubTotal = CDbl(pSubTotal.Text) If pNetto0.Text <> "" Then TmpNetto0 = CDbl(pNetto0.Text) If pNetto1.Text <> "" Then TmpNetto1 = CDbl(pNetto1.Text) If pNetto2.Text <> "" Then TmpNetto2 = CDbl(pNetto2.Text) If pTaxRate1.Text <> "" Then btw1 = CDbl(pTaxRate1.Text) If pTaxRate2.Text <> "" Then btw2 = CDbl(pTaxRate2.Text) ' Default Results TmpFaktBtwC1 = ( TmpNetto1 / 100 ) * btw1 TmpFaktBtwC2 = ( TmpNetto2 / 100 ) * btw2 pBTWTotaal.Text = CStr(CDbl(pFaktBtw1.Text) + CDbl(pFaktBtw2.Text)) TmpBTWTotaal = CDbl(pBTWTotaal.Text) MsgBox pBTWTotaal.Text+" : "+pFaktTot.Text ' Suppliername should be filled If pSupplierName.Text = "" Then SetRed(pSupplierName) End If ' Check Credit or Invoice type If (UCase(Left(pDocType.Text,2)) = "CR") Then pDocType.Text = "1" Else pDocType.Text = "0" End If ' Check totals If ((TmpSubTotal + TmpBTWTotaal) = TmpFaktTot) And TmpFaktTot <> 0 Then SetGreen(pSubTotal) SetGreen(pBTWTotaal) Else SetRed(pSubTotal) SetRed(pBTWTotaal) End If ' If ((TmpNetto0 + TmpNetto1 + TmpNetto2) = TmpSubTotal) Then ' SetGreen(pNetto0) ' SetGreen(pNetto1) ' SetGreen(pNetto2) ' SetGreen(pSubTotal) ' Else ' SetRed(pNetto0) ' SetRed(pNetto1) ' SetRed(pNetto2) ' SetRed(pSubTotal) ' End If ' Check Relation between invoiceTotals and VAT lines (Low VAT) ' If ((TmpFaktBtwC1 > (TmpFaktBtw1 - btwDeviation)) And (TmpFaktBtwC1 < (TmpFaktBtw1 + btwDeviation)) ) Then ' SetGreen(pFaktBtw1) ' SetGreen(pNetto1) ' SetGreen(pTaxRate1) ' Else ' SetRed(pFaktBtw1) ' SetRed(pNetto1) ' SetRed(pTaxRate1) ' End If ' Check Relation between invoiceTotals and VAT lines (High VAT) ' If ((TmpFaktBtwC2 > (TmpFaktBtw2 - btwDeviation)) And (TmpFaktBtwC2 < (TmpFaktBtw2 + btwDeviation)) ) Then ' SetGreen(pFaktBtw2) ' SetGreen(pNetto2) ' SetGreen(pTaxRate2) 'Else ' SetRed(pFaktBtw2) ' SetRed(pNetto2) ' SetRed(pTaxRate2) ' End If ' If needed change value of totals to reflect Credit invoice ' CheckAmountSign(pDocType, pFaktBtw1, TmpFaktBtw1) ' CheckAmountSign(pDocType, pFaktBtw2, TmpFaktBtw2) ' CheckAmountSign(pDocType, pFaktTot, TmpFaktTot) ' CheckAmountSign(pDocType, pSubTotal, TmpSubTotal) ' CheckAmountSign(pDocType, pNetto0, TmpNetto0) ' CheckAmountSign(pDocType, pNetto1, TmpNetto1) ' CheckAmountSign(pDocType, pNetto2, TmpNetto2) If pFaktTot.Text = "" Then SetRed(pFaktTot) CustomerSpecific(pXDoc) End Function Function CustomerSpecific(ByVal pXDoc As CASCADELib.CscXDocument) Dim pFaktDt As CASCADELib.CscXDocField Dim pJaar As CASCADELib.CscXDocField Dim pPeriode As CASCADELib.CscXDocField Dim pBoekdatum As CASCADELib.CscXDocField Set pFaktDt = pXDoc.Fields.ItemByName("InvoiceDate") Set pJaar = pXDoc.Fields.ItemByName("Jaar") Set pPeriode = pXDoc.Fields.ItemByName("Periode") Set pBoekdatum = pXDoc.Fields.ItemByName("Boekdatum") If pFaktDt.Text <> "" Then pJaar.Text = Left(pFaktDt.Text ,4) pPeriode.Text = Mid(pFaktDt.Text ,6,2) End If pBoekdatum.Text = Format(Date,"yyyy-mm-dd") End Function //MsgBox pBTWTotaal.Text+" : "+pFaktTot.Text+" : "+pFaktBtw1.Text+" : "+CStr(CDbl(pFaktBtw1.Text))