代码之家  ›  专栏  ›  技术社区  ›  davidvera

更新字段值的Kofax转换VBA脚本

  •  0
  • davidvera  · 技术社区  · 5 年前

    我并没有真正用于Kofax技术,我有一个Kofax转换表单,在两个不同的选项卡上有字段。这是一个表单的摘要,我必须在这个表单上进行验证过程的交互。

    enter image description here

    在这些字段中,我尝试在验证阶段使用验证规则更新其中一些字段的内容。我只是创建了一个多字段验证规则并正确映射了字段。

    enter image description here

    建议使用一个基本脚本来检查字段是否有效。基于这个脚本,我尝试了一些逻辑。目标是根据第二个字段的基本条件设置该字段的内容(为空且是必需的)。 我的目标(稍后)是使用数据库调用根据Siret字段值填充/更新字段。 我的验证规则如下:我检查Siret字符串的长度(应该是14个字符的字符串)。如果这是真的,我将验证设置为真,并将另一个字段设置为值。

    Private Sub Validation_Validate(ByVal ValItems As CASCADELib.CscXDocValidationItems, ByVal pXDoc As CASCADELib.CscXDocument, ByRef ErrDescription As String, ByRef ValidField As Boolean)
       Dim strNAF As String
       Dim strSiret As String
    
       strNAF = ValItems.Item("NAF").Text
       strSiret = ValItems.Item("Siret").Text
    
       ' enter your own validation rule here
       If Len(strSiret) <= 14 Then
          pXDoc.Fields.ItemByName("NAF").Text = "GOOD JOB"
          ValidField = True
       Else
          ValidField = False
          ErrDescription = "Describe the error here"
       End If
    End Sub
    

    当我在Siret输入字段上按enter键时,应该进行此验证。实际上似乎不起作用。我想知道现阶段出了什么问题。

    0 回复  |  直到 5 年前
        1
  •  2
  •   Wolfgang Radl    5 年前

    更改字段值的最佳位置取决于您的用例。Kofax转换模块遵循不同的模式,您应该始终尝试遵循它。例如,当您发现自己将代码放入AfterExtract方法时,您应该重新考虑——几乎总是有更好的方法。对于一个tl;dr跳到

    自然秩序

    当您观察验证中的字段时,以下是幕后发生的情况:

    1. 定位器检测信息(即一个或多个备选方案)。
    2. 字段可能有或没有与之关联的格式化程序。格式化程序可以使字段无效(如果需要,甚至可以使其有效)
    3. 字段可以是一个或多个验证规则的一部分。验证规则可以使字段有效或无效,但它们仅在格式化成功时激发。

    这里有一个例子。假设您想要检测日期,并且希望它们采用数据库格式(yyyyMMdd)。您文档上的日期采用美国格式(MM/dd/yyyy),共有两个,但第一个文档的关键字是“发票日期”。

    1. 您可以配置一个格式定位器来获取日期和一个关键字。定位器产生两种替代方案:1/20/2020(100%)和1/10/2020(0%)。
    2. 由于不考虑第二个选项(低于10%阈值),因此该字段将保留第一个选项。
    3. 由于字段的第一个备选方案是confident(80%),因此将应用格式化。格式化程序将字段值更改为20200120,该字段仍然有效。
    4. 配置日期验证方法,并对字段使用所述方法。你检查一下日期是否在未来,比如说今天的1月19日。该字段现在无效,因为20200120是未来的一天。

    在哪里设置值?

    根据不同的用例,下面是我的建议:

    • 您需要规范化值。例如,一周中的几天应该用字母表示(太阳、周一、周二等)。您仍然希望用户输入数值(1=SUN,2=MON,3=TUE)。创建脚本格式化程序并将其链接到您的字段。这样做的好处是您不必重复自己的操作(例如在脚本定位器中以及稍后的验证中)。
    • 您希望根据用户的交互更改值。您可以在验证中使用任何事件(例如ButtonClicked、AfterFieldChanged或AfterFieldConfirmed),只要记住瘦客户端验证不支持某些事件(例如AfterFieldChanged)。请记住,要更改指针而不是字段本身,因为验证方法可以由任意数量的字段使用。在你的例子中, pXDoc.Fields.ItemByName("NAF").Text = "GOOD JOB" 会违反这一原则(即使验证方法可重用——您的规则现在绑定到NAF字段)。改为更改验证对象;例如。 ValItems.ItemByName("NAF").Text = "GOOD JOB" . 还要记住,此时更改字段不会自动调用与字段关联的格式化程序,因此请确保提供已格式化的值。但是,您可以在脚本中手动调用格式化。

    现在,回到你原来的要求:

    目标是根据第二个字段的基本条件设置该字段的内容(为空且是必需的)。 我(稍后)的目标是/ 打电话来。我的验证规则如下:我检查Siret字符串 验证为true并将另一个字段设置为值。

    这取决于您是否希望用户能够在验证期间更改第二个字段。如果没有,请使用脚本定位器。注意,脚本定位器可以有两个子字段,并且每个子字段可以分配给不同的字段。

    Siret 超过14个字符,发出数据库调用。

    不知道您的确切需求,这里有一些关于可重用性的想法。这么说吧 小牛肉

    另一种选择是使用本地或远程模糊数据库以及数据库定位器(同样,如果 小牛肉 在您的文档中)。

        2
  •  0
  •   davidvera    5 年前

    多亏了沃尔夫冈和我的团队,我终于解决了我的问题。

    Private Sub ValidationForm_AfterFieldConfirmed(ByVal pXDoc As CASCADELib.CscXDocument, ByVal pField As CASCADELib.CscXDocField)
    
       Select Case pField.Name
             Case "FieldNameInForm"
                ' simple check if field empty
                If(pXDoc.Fields.ItemByName("FieldNameInForm").Text <> "") Then
                   completeForm(pXDoc, pXDoc.Fields.ItemByName("FieldNameInForm").Text)
                End If
          End Select
    End Sub
    
    
    Private Sub completeForm(ByVal pXDoc As CASCADELib.CscXDocument, ByVal myString As String)
    
       'define required properties
       Dim rs As ADODB.Recordset
       Dim cn As ADODB.Connection
       Dim sqlRequest As String
       Dim dbHostServer As String
       Dim dbUsername As String
       Dim dbPassword As String
       Dim dbName As String
       Dim dbConnString As String
    
       'Retrieve information for DB Connection (in ScriptVariables.xml)
       dbHostServer = "localhost"
       dbUsername = "root"
       dbPassword = "root"
       dbName = "mydatabase"
    
       'build the connection string and open connection to database
       dbConnString = "Provider=MSDASQL;Driver={MySQL ODBC 5.3 Unicode Driver};
       dbConnString = dbConnString & "Server=" & dbHostServer & ";"
       dbConnString = dbConnString & "UID=" & dbUsername & ";"
       dbConnString = dbConnString & "PWD=" & dbPassword & ";"
       dbConnString = dbConnString & "database=" & dbName
    
       'Create recordset and set connection
       'Prapare the db connection
       Set rs = New ADODB.Recordset : : Set cn=New ADODB.Connection
    
       cn.ConnectionString = dbConnString : cn.Open
    
       'build query with concatenation
       sqlRequest = "SELECT field1, field2, field3 FROM table"
       sqlRequest = sqlRequest & " where fieldN= '" & myString & "'
    
       'Execute the SQL request
       Set rs = cn.Execute(sqlRequest)
    
       ' if the recordset returns a result
       If (rs.EOF Or rs.BOF) Then
          rs.MoveFirst
    
          pXDoc.Fields.ItemByName("formField1").Text = CStr(rs.Fields("field1"))
          Call ValidStrField("formField1", pXDoc.Fields.ItemByName("field1").Text, pXDoc)
    
          pXDoc.Fields.ItemByName("formField2").Text = CStr(rs.Fields("field2"))
          Call ValidStrField("formField2", pXDoc.Fields.ItemByName("field2").Text, pXDoc)
    
          pXDoc.Fields.ItemByName("formField3").Text = CStr(rs.Fields("field3"))
          Call ValidStrField("Commune", pXDoc.Fields.ItemByName("field3").Text, pXDoc)
    
       'ifthe recordset do not return a value, we set to Undefined
       Else
          pXDoc.Fields.ItemByName("formField1").Text = "Undefined"
          pXDoc.Fields.ItemByName("formField2").Text = "Undefined"
          pXDoc.Fields.ItemByName("formField3").Text = "Undefined"
          MsgBox("No result found in database")
       End If
    
       ' Close connection & recordset
       rs.Close : Set rs = Nothing
       cn.Close  : Set cn=Nothing    
    End Sub
    
    ' methods To validate Fields
    Private Sub ValidStrField(ByVal StrItem As String,ByVal StrVal As String,ByVal pXDoc As CASCADELib.CscXDocument)
          pXDoc.Fields.ItemByName(StrItem).Text = StrVal
          pXDoc.Fields.ItemByName(StrItem).ExtractionConfident = True
          pXDoc.Fields.ItemByName(StrItem).Confidence = 100.00
          pXDoc.Fields.ItemByName(StrItem).ForcedValid = False
          pXDoc.Fields.ItemByName(StrItem).Valid = True
    End Sub
    
    Private Sub UnValidStrField(ByVal StrItem As String,ByVal StrVal As String,ByVal pXDoc As CASCADELib.CscXDocument)
          pXDoc.Fields.ItemByName(StrItem).Text = StrVal
          pXDoc.Fields.ItemByName(StrItem).ExtractionConfident = False
          pXDoc.Fields.ItemByName(StrItem).Confidence = 0.00
          pXDoc.Fields.ItemByName(StrItem).ForcedValid = True
          pXDoc.Fields.ItemByName(StrItem).Valid = False
    End Sub
    
    推荐文章