65.9K
CodeProject 正在变化。 阅读更多。
Home

数据调优系统

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.98/5 (36投票s)

2012 年 9 月 25 日

CPOL

18分钟阅读

viewsIcon

45468

DataTune 系统是最早的数据清理系统之一。

引言

1998 年,我开发了 DataTune 软件的第一个版本,它是“TargetData”项目的一部分。

深入阅读

其目的是不同的,重点是展示关于以色列国情的统计和人口数据。

在 2001-2003 年期间,我以 TargetData 品牌开发了 DataTune,一个数据清理系统,TargetData 是 Target Eye Limited 的一部分。

我们的客户包括政府机构、大型企业,例如 以色列标准协会以色列出口与国际合作协会 (IEICI)微软以色列Bezeq CallPeople and Computers。这是 TargetData 网站的历史视图(2002 年)

目标数据服务包括

  • 数据增强
  • 过滤冗余(重复项)
  • 数据转换
  • 记录的统一和过滤(包括不同数据库之间)
  • 潜在客户定位(用于数据库营销)。
  • 集成各种信息系统
  • 自动报告生成
  • 系统分析
  • 开发高效工具用于新数据正常且正确输入
  • 查找个人和公司的最新信息(包括调查、外勤人员等,即在没有最新信息的情况下)
  • 开发定制软件,在客户现场执行当前活动,无需外部帮助。
  • 提高信息系统性能
  • 开发基于 Excel 的软件和工具
  • 培训和集成

信息系统及其维护其服务性的重要性

组织最重要的资产之一,如果不是最重要的,就是信息系统。目前组织的大部分信息都存储在其计算机网络中。在大多数情况下,会使用多个信息系统,这些系统彼此之间经常不同,从而产生了不同数据库之间信息项的相互同步和更新的需求。

此外,由于大部分信息是手动输入的,因此会产生大量错误,导致信息丢失和重复。因此,在后期很难找到信息项,会产生过载,邮件被退回,以及与客户或供应商相关的故障。

当前更新信息部分而不影响整体信息系统非常重要。构成信息系统的多数信息项需要以一定的频率进行更新。

事实上,更新频率因项目而异,也构成了问题的一部分。某些信息项与组织的业务相关

  • 产品
  • 价格
  • 报价
  • 发票
  • 客户数据库。

另一部分,控制起来更少,包括更新

  • 地址。例如:街道名称已更改。
  • 电话号码。例如:区号更改或电话号码前几位数字的更改。

所有这些主题都需要复杂的流程来持续增强信息系统。在大多数情况下,需要偶尔或定期刷新所有信息系统,并制定程序来保持信息系统的持续可用性。

这是 DataTune 主屏幕的屏幕截图

通用数据增强

数据增强的概念是指一系列旨在显著提高组织信息系统的质量和效率的操作。以下是对这些操作的描述

  • 字段分隔
  • 在某些信息系统中,将多个字段保留为单个字段。这使得更新、检索和持续维护变得困难。
    例如,将客户地址保存为单个字段(即“1020 Main St. Appt #5”),将导致难以查找所有居住在合适街道(即Main St)的客户,或者,如果街道名称更改,将难以更新所有居住在该街道的客户记录中的街道名称。

    Target Data 开发了一种独特的方法,将字段分解为其组成部分。该方法包括分离完整的地址、街道地址、人名和公司名称。此外,根据客户的要求,该方法还可用于对各种数据结构进行进一步的操纵。

  • 更新地址
  • 街道名称会不时更改。此外,大多数信息系统包含不同版本的街道和城镇名称,以及不同的地址格式语法。

    使用 Target Data 的独有方法,开发了一个流程,为每个地址附加一个唯一的标识符,该标识符基于内政部在每个国家/地区使用的编码系统,为每个城镇和每条街道分配其唯一的数字代码。

    该过程包括解释信息系统中的地址,并将其转换为城镇代码、街道代码、房屋号码、门牌号码、公寓号码和楼层号码。

    这些数据允许在任何城镇的街道名称更改时,立即附加准确的官方地址:城镇名称、街道名称、邮政编码等。此过程允许轻松有效地将邮政编码附加到每个地址

  • 定位包含著名地点名称而非街道名称的地址
  • 在许多情况下,地址字段包含一个著名地点而不是街道名称。例如,一家名为 DATATECH 的公司,位于中央巴士总站,可能会错误地给出其官方地址如下:DATATECH,中央巴士总站,5 楼。

    我们将识别欧洲主要城镇的各种地点,如公交和火车站、机场、文化中心、广场、海滩(在某些情况下构成酒店的地址),以及不属于城镇或地方当局的地点(如公路项目)。我们还可以识别购物中心、商业中心、工业区等。

  • 解释房屋号码
  • 在地址未分隔的情况下,系统能够使用多种方法解释和定位地址中的房屋号码。通常,地址可能包含几种形式的房屋号码:房屋号码/公寓号码、公寓号码/房屋号码,以及其他组合,如楼层号码和门牌号码。数据中最重要(出错可能导致邮件退回)的是房屋号码。我们将此号码与该街道已知的号码范围进行交叉检查。例如,*柏林的 Barnauer St* 的房屋号码不应大于 200。此外,我们还会检查公寓号码,并通过与该地区通常的楼层数进行比较来验证其是否合乎逻辑。例如,在以平房为主的社区中,不可能找到第十层的地址。

  • 使用错误库进行数据增强
  • 错误库是 TargetData 使用的一个概念,用于收集数据库中的常见错误和拼写错误,这些错误是在我们开展这项业务多年中积累的。此库允许 DataTune 识别常见的拼写错误,并将它们与正确的名称关联起来,这些名称可能是

    • 街道名称
    • 公司名称
    • 城镇名称

    这一切都基于错误经常重复出现的假设。

  • 使用基于 Soundex 的算法进行数据增强
  • 为了识别不熟悉的拼写错误,我们使用基于 Soundex 的算法,帮助 DataTune 根据名称的语言根源来识别拼写错误。根据此方法,*Den Haag* 的 *Meerdevoor* 街道可能拼写为 *Merdevur*、*Mardevoor* 等,但仍具有相同的根源。此方法有助于快速、高质量地自动定位和更正公司、街道、城镇以及人名的困难和奇怪的拼写错误,并增强数据。

  • 附加邮政(邮政)代码和其他代码
  • DataTune 会根据每个国家/地区的邮政当局最新的邮政编码表,为客户数据库中的每个地址附加/验证更新的邮政编码。DataTune 还会根据每个国家/地区的内政部最新的代码表附加街道和城镇的代码。这使得 DataTune 能够更新内政部不时发布的街道名称更改。

  • 增强公司和/或个人姓名
  • 此过程基于 Target Data 开发的字段分离技术。在过程结束时,将创建一个更新的数据库,允许访问客户姓名(个人或公司)的每个元素。此过程允许查找重复项,查找客户数据库中的家庭关系,并在必要时合并家庭。该过程允许为每个公司创建一个单一记录,并将组织接触的所有联系人合并到主记录中。这样,就不需要单独更新公司共有的信息(地址、传真号码、互联网网站)的详细信息,同时仍然可以访问每个联系人特有的信息(分机号码、直拨电话号码、电子邮件地址等)的详细信息。

  • 定位公司和个人的最新地址和电话号码
  • 根据我们的经验,查找客户最新地址和电话号码的最佳方法是使用 Bezeq 的记录。居民记录文件只有在公民告知内政部后才会被更新,而且并不总是最新的。相比之下,由于如今大多数人都拥有电话(即使他们是租房者),因为电话线路价格降低,在主要为以色列公司和机构进行的项目中,我们发现 Bezeq(以色列本地电话公司)的记录是最新的。

    DataTune 可以使用此方法更新和验证个人和公司的地址和电话号码,通过查询多个信息源,直到 DataTune 定位到最新的地址和电话号码。

  • 过滤冗余(重复项)
  • 作为数据增强服务的一部分,Target Data 提供了标记服务,然后过滤冗余记录。此服务在数据增强后执行,因为只有在此阶段才能识别最初包含明显不同数据的重复记录(由于错误)。只有增强过程才能在后续阶段识别和纠正冗余。

    以下源自 DataTune 项目的源代码过滤了数据库给定表中的重复项

    Private Sub FilterDuplicates_Click()
        Dim rr As Recordset
        Dim Ignore() As Long
        Dim IgnoreCount As Long
        If Combo1.Text = "Choose" Then
            MsgBox "Please select " + Label1
            Exit Sub
        End If
        If Combo2.Text = "Choose" Then
            MsgBox "Please select " + Label2
            Exit Sub
        End If
        Open Text1.Text For Output As #1
        Print #1, "Target Data Duplicates Report"
        Print #1, Date$
        Print #1, ""
        Print #1, ""
        Set CustRS = CustDB.OpenRecordset("select * from  " + CurrentTable)
        CustRS.MoveLast
        CustRS.MoveFirst
        RecsTotal = CustRS.RecordCount
        ProgressBar1.Max = CustRS.RecordCount
        ReDim Ignore(1)
        While Not CustRS.EOF
            RecsRead = Val(RecsRead) + 1
            ProgressBar1.Value = Val(RecsRead)
            
            DoEvents
            If IsNull(CustRS(Combo1.Text)) Or IsNull(CustRS(Combo1.Text)) Then GoTo 2
            For i = 1 To IgnoreCount
                If CustRS(Combo2.Text) = Ignore(i) Then GoTo 2
            Next
            q$ = "select * from " + CurrentTable + " where " + Combo1.Text + " = " + _
                 GetRightDelim(CustRS(Combo1.Text)) + " and not(" + Combo2.Text + _
                 " = " + GetRightDelim(CustRS(Combo2.Text)) + ")"
            Set rr = CustDB.OpenRecordset(q$)
            If rr.RecordCount > 0 Then
                RecsFound = Val(RecsFound + 1)
                rr.MoveLast
                rr.MoveFirst
                ReDim Preserve Ignore(UBound(Ignore) + rr.RecordCount)
                While Not rr.EOF
                    IgnoreCount = IgnoreCount + 1
                    Ignore(IgnoreCount) = rr(Combo2.Text)
                    rr.MoveNext
                Wend
                RecsUpdated = Val(RecsUpdated) + rr.RecordCount + 1
                Print #1, "Customer: "; CustRS(Combo2.Text)
                Print #1, Chr(9); CustRS(Combo1.Text)
                Print #1, Chr(9); "Appears "; rr.RecordCount + 1; " times in your database"
                rr.MoveFirst
                Print #1, "Records are:"
                While Not rr.EOF
                    Print #1, rr(Combo2.Text),
                    rr.MoveNext
                Wend
                Print #1, ""
                Print #1, " ----------------------- "
                Print #1, ""
                'Debug.Print "Found "; rr.RecordCount; " "; CustRS(Combo1.Text)
            End If
    2:
            CustRS.MoveNext
        Wend
        Close #1
    End Sub
    Private Sub Form_Load()
        Combo1.Text = "Choose"
        Combo2.Text = "Choose"
        For i = 0 To CustRS.Fields.Count - 1
            Combo1.AddItem CustRS(i).Name
            Combo2.AddItem CustRS(i).Name
        Next
    End Sub

    例如,“NewCo”公司在数据库中由于数据输入错误而显示为“New Co”,并且也以其正确名称显示。只有在增强公司名称后,即在将“New Co”更正为“NewCo”后,才会识别出冗余。

    识别冗余记录后,会将报告发送给客户,其中包含几个选项:将每个冗余记录中的信息合并到一个记录中(即发送出现在单独冗余记录中的信息详情,以免丢失重要信息)。

    另一个选项是忽略和删除一个或多个冗余记录条目。

    第三个选项是保持记录不变。(此选项适用于希望稍后自行删除这些记录的客户。)应注意的是,即使如此,数据增强也能让客户自己通过简单的查询快速轻松地识别冗余。

  • 定位和增强公司分支机构的名称
  • 数据增强中最常见的问题之一是增强包含公司分支机构名称和地址的记录。在大多数情况下,官方出版物和大多数数据库仅包含公司管理层和/或总部的记录。另一方面,客户数据库中可能会出现提供某个分支机构详细信息的记录。

    例如,在“美国银行”标题下,实际上会列出一个分支机构,因为该分支机构是公司的客户。但是,如果另一个分支机构添加到客户数据库中,我们不希望将其识别为冗余,而是识别为附加记录,最好链接到该分支机构的主要名称“Bank Leumi”。

    DataTune 已准备好处理与以下机构分支机构相关的数据:

    • 银行
    • DataTune 可以附加每个欧洲国家的银行和分支机构编号、地址、电话号码和传真号码。DataTune 还会为每个分支机构提供唯一的排序代码。

    • 学校
    • DataTune 将附加学校网络名称(例如,Ort)、分类(例如,小学)、地址、电话号码和传真号码。

    • 健康基金分支机构
    • DataTune 将附加基金名称、分支机构名称、经理姓名、地址、电话号码和传真号码。

    • 所得税分支机构
    • DataTune 将附加分支机构名称、地址、电话号码和传真号码。

    • 国家保险分支机构
    • DataTune 将附加分支机构名称、地址、电话号码和传真号码。

    • 政府部委
    • DataTune 将附加大多数政府部委分支机构的详细信息,例如内政部、许可办公室等。

    • 大型公司
    • 对于包含一家或多家大型公司分支机构信息的记录,DataTune 将为每条记录附加公司的官方名称,但会存储每个分支机构的信息。

    • 营销连锁店
    • DataTune 将识别分支机构及其所属的连锁店。

  • 提高信息系统性能
  • Target Data 拥有独特的自动大规模信息系统性能提升方法。DataTune 可以改进检索、报告生成、查询以及将数据从一个数据库传输到另一个数据库的过程。所有这些过程都可以变得更高效、更快速。这通过分析组织中最频繁和最不频繁的过程,并通过在以下标准之间进行权衡来确定优先级来实现

    • 存储区域和速度。(通过构建所需的搜索键或删除不再需要的键来实现。)
    • 单独保存信息项的副本,以便快速访问它们,与保存指向这些信息项的指针相比,后者可以节省存储空间,但会牺牲检索它们所需的响应时间。

    Target Data 项目专门为刚刚开始或正在进行 CRM 系统集成过程的公司和组织提供支持。

  • 数据转换
  • 通常需要一次性或持续性地将一个数据库的内容转换为另一个数据库的格式。在许多情况下,公司会从客户或其他来源接收数据文件,需要将这些数据导入组织数据库。在其他情况下,会使用多个应用程序或数据库,并且需要在不同格式之间导入或导出。

    Target Data 提供不同系统之间数据转换的一次性服务,支持大多数信息系统,包括数据库、现成的应用程序(如 Access、Excel、Office)、专用应用程序(如 WinFax),以及支持个人助理的应用程序(如 Palm、Visor 等)。

  • 持续同步和更新
  • 此外,DataTune 还为组织提供应用程序,用于在不同系统和平台之间进行当前同步。这是一个更复杂的过程,需要初步的资源投入,但结果是消除了未来进行转换以及导入导出过程的需要。例如 Target Data 的 MultiSync™ 系统这样的同步系统被安装在公司的计算机中,并持续检查哪些数据已被更新以及在哪个信息系统中。如有必要,会在所需信息系统或软件产品中的相关数据上执行自动更新和转换。例如,在安装了 MultiSync 系统的计算机中,链接 Palm 和 WinFax 应用程序,系统将识别到新的客户添加到 WinFax 地址簿,并相应地自动更新 Palm 地址簿,反之亦然。

  • Excel 应用程序
  • TargetData 项目专门提供的一种独特的应用程序类型是 MS Excel 的插件和工具。这些工具用于自动执行各种操作,例如在各种格式之间转换账户(例如,客户需要一个应用程序将客户提交的账户转换为他的一位主要客户最近指定的某个新格式)。结果是,需要将数百个账户从旧格式转换为新格式。这些工具有助于执行自动格式转换。

    以下源代码是 DataTune 使用的 Excel 类

    VERSION 1.0 CLASS
    BEGIN
      MultiUse = -1  'True
      Persistable = 0  'NotPersistable
      DataBindingBehavior = 0  'vbNone
      DataSourceBehavior  = 0  'vbNone
      MTSTransactionMode  = 0  'NotAnMTSObject
    END
    Attribute VB_Name = "cExcel"
    Attribute VB_GlobalNameSpace = False
    Attribute VB_Creatable = True
    Attribute VB_PredeclaredId = False
    Attribute VB_Exposed = False
    ' Class       : cExcel
    ' Description : Class for working with Microsoft Excel through Automation
    ' Usage       : Instantiate an object of the class, use the class methods and
                  ': vairables to access the object of excel
                
    
    'Set m_objExcel = new Excel.Application
    'In the StartExcel Method
    Private m_objExcel As New Excel.Application
    Private m_objWorkbook As Excel.Workbook
    Public Property Get AppExcel() As Excel.Application
      ' Returns: A handle to the current instance of Excel
      Set AppExcel = m_objExcel
    
    End Property
    Public Property Get CurWorkbook() As Excel.Workbook
      ' Returns: A handle to the currently open workbook
    
      Set CurWorkbook = m_objWorkbook
    
    End Property
    Public Sub CloseExcel()
      ' Comments  : Closes Excel
      ' Parameters: None
      ' Returns   : Nothing
    '
      On Error GoTo PROC_ERR
    
      m_objExcel.Quit
    
      Set m_objExcel = Nothing
    
    PROC_EXIT:
      Exit Sub
    
    PROC_ERR:
      MsgBox "Error: " & Err.Number & ". " & Err.Description, , _
        "CloseExcel"
      Resume PROC_EXIT
    
    End Sub
    Public Sub CloseWorkbook( _
      fSave As Boolean)
      ' Comments  : Closes the current workbook
      ' Parameters: fSave - True to save changes, False to discard changes
      ' Returns   : Nothing
    '
      On Error GoTo PROC_ERR
    
      m_objWorkbook.Close SaveChanges:=fSave
    
    PROC_EXIT:
      Exit Sub
    
    PROC_ERR:
      MsgBox "Error: " & Err.Number & ". " & Err.Description, , _
        "CloseWorkbook"
      Resume PROC_EXIT
    
    End Sub
    Public Sub CreateTableFromAccess( _
      strDatabase As String, _
      strDataSource As String, _
      fFieldNames As Boolean, _
      Optional varMaxRecs As Variant)
      ' Comments  : Gets the contents of an Access table or query into
      '             the current document
      ' Parameters: strDatabse - full path and name of the Access database
      '             you want to read from
      '             strDataSource - name of a table or query in the database
      '             to read records from
      '             fFieldNames - True to put the field names in the first
      '             row, false otherwise.
      '             varMaxRecs - optional: set to the maximum number of
      '             records you want to retrieve. To include all records,
      '             don't specify this argument.
      ' Returns   : Nothing
    '
      Dim dbs As DAO.Database
      Dim rst As DAO.Recordset
      Dim intCounter As Integer
      Dim intFieldCount As Integer
      Dim lngRowCount As Long
      Dim varField As Variant
      Dim intRow As Integer
      Dim intCol As Integer
    
      On Error GoTo PROC_ERR
    
      ' Open the database objects
      Set dbs = DAO.DBEngine.OpenDatabase(strDatabase)
      Set rst = dbs.OpenRecordset(strDataSource)
      intFieldCount = rst.Fields.Count
    
      intRow = 1
      intCol = 1
    
      ' Add the field names if specified
      If fFieldNames Then
        For intCounter = 1 To intFieldCount
          m_objWorkbook.ActiveSheet.Cells(1, intCounter).Value = _
            rst.Fields(intCounter - 1).Name
        Next intCounter
      End If
    
      ' Start inserting data on the second row of the table
      lngRowCount = 2
    
      With rst
        ' Loop through all records
        Do Until .EOF
      
          For intCounter = 1 To intFieldCount
            ' Add each fields value
            varField = .Fields(intCounter - 1).Value
          
            ' Handle null field values
            If IsNull(varField) Then
              varField = "<null>"
            End If
          
            m_objWorkbook.ActiveSheet.Cells(lngRowCount, intCounter).Value = _
              varField
            
          Next intCounter
    
          lngRowCount = lngRowCount + 1
        
          ' See if we are still in range
          If Not IsMissing(varMaxRecs) Then
            If lngRowCount > varMaxRecs Then
              Exit Do
            End If
          End If
        
          ' Move to the next record
          .MoveNext
    
        Loop
      End With
    
      ' Cleanup
      rst.Close
      dbs.Close
    
    PROC_EXIT:
      Exit Sub
    
    PROC_ERR:
      MsgBox "Error: " & Err.Number & ". " & Err.Description, , _
        "CreateTableFromAccess"
      Resume PROC_EXIT
    
    End Sub
    Public Sub CreateWorkbook( _
      strName As String, _
      fSave As Boolean)
      ' Comments  : Creates a new workbook and saves it
      ' Parameters: strName - name for the new workbook
      '             fSave - True to save, False to leave unsaved
      ' Returns   : Nothing
    '
      On Error GoTo PROC_ERR
    
      Set m_objWorkbook = m_objExcel.Workbooks.Add
      m_objWorkbook.SaveAs FileName:=strName
    
    PROC_EXIT:
      Exit Sub
    
    PROC_ERR:
      MsgBox "Error: " & Err.Number & ". " & Err.Description, , _
        "CreateWorkbook"
      Resume PROC_EXIT
    
    End Sub
    Public Sub InsertValue( _
      strRange As String, _
      varValue As Variant)
      ' Comments  : Inserts values into cells
      ' Parameters: strRange - string defining the range to insert into
      '             varValue - value to insert
      ' Returns   : Nothing
    '
      On Error GoTo PROC_ERR
    
      m_objWorkbook.ActiveSheet.Range(strRange).Value = varValue
    
    PROC_EXIT:
      Exit Sub
    
    PROC_ERR:
      MsgBox "Error: " & Err.Number & ". " & Err.Description, , _
        "InsertValue"
      Resume PROC_EXIT
    
    End Sub
    Public Function OpenWorkbook( _
      strFileName As String, _
      fReadOnly As Boolean, _
      Optional varPassword As Variant) As Excel.Worksheet
      ' Comments  : Opens the named file and associates it with the class
      ' Parameters: strFileName - full path and name of the file to open
      '             fReadOnly - True to open readonly
      '             varPassword - Optional: specify the password if the
      '             workbook file is password protected.
      ' Returns   : Nothing
    '
      On Error GoTo PROC_ERR
    
      If Not IsMissing(varPassword) Then
        Set m_objWorkbook = m_objExcel.Workbooks.Open( _
          strFileName, _
          , _
          fReadOnly, _
          , _
          varPassword)
      Else
        Set m_objWorkbook = m_objExcel.Workbooks.Open( _
          strFileName, _
          , _
          fReadOnly)
      End If
    
    PROC_EXIT:
      Exit Function
    
    PROC_ERR:
      MsgBox "Error: " & Err.Number & ". " & Err.Description, , _
        "OpenWorkbook"
      Resume PROC_EXIT
    
    End Function
    Public Sub OpenWorkbookFromLib( _
      strFileName As String, _
      fReadOnly As Boolean, _
      Optional varPassword As Variant)
      ' Comments  : Opens the named file and associates it with the class.
      '             This version looks in the Excel library folder.
      ' Parameters: strFileName - name of the file to open
      '             fReadOnly - True to open readonly
      '             varPassword - Optional: specify the password if the
      '             workbook file is password protected.
      ' Returns   : Nothing
    '
      Dim strLibPath As String
    
      On Error GoTo PROC_ERR
    
      strLibPath = m_objExcel.LibraryPath & _
        m_objExcel.PathSeparator & _
        strFileName
      
      If Not IsMissing(varPassword) Then
        Set m_objWorkbook = m_objExcel.Workbooks.Open( _
          strLibPath, _
          , _
          fReadOnly, _
          , _
          varPassword)
      Else
        Set m_objWorkbook = m_objExcel.Workbooks.Open( _
          strLibPath, _
          , _
          fReadOnly)
      End If
    
    PROC_EXIT:
      Exit Sub
    
    PROC_ERR:
      MsgBox "Error: " & Err.Number & ". " & Err.Description, , _
        "OpenWorkbookFromLib"
      Resume PROC_EXIT
    
    End Sub
    Public Sub PrintSheet( _
      intFrom As Integer, _
      intTo As Integer, _
      intCopies As Integer, _
      fPreview As Boolean, _
      fPrintToFile As Boolean, _
      fCollate As Boolean)
      ' Comments  : Prints the active workbook
      ' Parameters: intFrom - starting page number
      '             intTo - ending page number
      '             intCopies - number of copies
      '             fPreview - True for print preview
      '             fPrintToFile - True to print to a file. Excel will prompt
      '             for the filename when this is set to True.
      '             fCollate - True to collate copies
      ' Returns   : Nothing
    '
      On Error GoTo PROC_ERR
    
      m_objWorkbook.PrintOut _
        intFrom, _
        intTo, _
        intCopies, _
        fPreview, _
        , _
        fPrintToFile, _
        fCollate
    
    PROC_EXIT:
      Exit Sub
    
    PROC_ERR:
      MsgBox "Error: " & Err.Number & ". " & Err.Description, , _
        "PrintSheet"
      Resume PROC_EXIT
      
    End Sub
    Public Sub SortRange( _
      strRange As String, _
      strKey As String, _
      Optional fAscending As Boolean = False)
      ' Comments  : Sorts the specified range
      ' Parameters: strRange - range to sort
      '             strKey - range to use as the key for sorting
      '             fAscending - True for ascending, False for descending
      ' Returns   : Nothing
    '
      Dim lngSort As Integer
    
      If fAscending Then
        lngSort = xlAscending
      Else
        lngSort = xlDescending
      End If
    
      m_objWorkbook.ActiveSheet.Range(strRange).Sort _
        Key1:=ActiveSheet.Range(strKey), order1:=lngSort
    
    PROC_EXIT:
      Exit Sub
    
    PROC_ERR:
      MsgBox "Error: " & Err.Number & ". " & Err.Description, , _
        "SortRange"
      Resume PROC_EXIT
      
    End Sub
    Public Function ReadRange(strRange As String) As Variant
      ' Parameters: strRange - range to sort
      '             strKey - range to use as the key for sorting
      '             fAscending - True for ascending, False for descending
      ' Returns   : Nothing
    '
      Dim lngSort As Integer
    
      ReadRange = m_objWorkbook.ActiveSheet.Range(strRange)
    
    PROC_EXIT:
      Exit Function
    
    PROC_ERR:
      MsgBox "Error: " & Err.Number & ". " & Err.Description, , _
        "SortRange"
      Resume PROC_EXIT
      
    End Function
    Public Sub StartExcel(fVisible As Boolean)
      ' Comments  : Starts an instance of Excel
      ' Parameters: fVisible - True to make Excel visible
      ' Returns   : Nothing
      On Error GoTo PROC_ERR
    
     'SEE COMMENTS IN DECLARATIONS FOR REASONS THIS IS COMMENTED OUT
     'AND WHY YOU MIGHT WANT TO UNCOMMENT IT
    
     'Set m_objExcel = New Excel.Application
      m_objExcel.Visible = fVisible
    
    PROC_EXIT:
      Exit Sub
    
    PROC_ERR:
      MsgBox "Error: " & Err.Number & ". " & Err.Description, , _
        "StartExcel"
      Resume PROC_EXIT
    End Sub

特殊项目

使用 DataTune 技术创建的类似屏幕截图中的项目,是为特定客户提供的交钥匙解决方案。图中:为 Del Engineering 开发的项目。

附加公司详细信息

可以为公司名称附加广泛的详细信息,包括私营公司编号、员工人数、成立日期、销售额、联系人姓名、业务范围。

定位潜在客户

TargetData 项目提供了根据员工人数、销售额、地理区域等标准,在公司和授权交易商中定位潜在客户的选项,其中提议的公司数据库仅包含那些尚不存在于您组织数据库中的公司。TargetData 项目将此服务作为项目完成后的一项附加服务,以便在增强后才将有关潜在客户的数据集成到现有数据中。换句话说,如果公司名称不正确,应首先进行增强,以将其识别为潜在客户数据库中的一个已识别名称,从而可以从此数据库中过滤掉。

  • 开发用户界面和搜索键

DataTune 允许以客户选择的任何格式定义其工作输出。但是,也可以在工作输出中包含 Access 或 Excel 应用程序,包括以下内容:

  • 用户友好的界面,包含用于数据检索、报告生成和数据更新的按钮和菜单。
  • 允许极快数据检索的搜索键。
  • 构造现成的查询,用于执行已知检索操作(例如,检索兵役日期在给定日期范围内的所有客户数据)。
  • 根据用户的特征生成报告。
  • 从单个窗口控制多个数据库。

系统分析

该项目可能包括全面的系统分析。这在以下情况下是必需的:

  • 需要转换现有系统。
  • 需要开发与现有系统接口的系统。
  • 需要开发定制软件。

系统分析允许 TargetData 员工深入了解当前的工作流程,以便开发一个能够采用工作流程及其背后的逻辑,从而能够集成到计算机化系统中的系统。系统分析大约需要三周时间,并包含以下要素:

  • 书面问卷:在此阶段,您将收到一份关于现有工作流程、专业人员、角色、时间长度和产品的各种主题的问题清单。
  • 口头问卷:在此阶段,TargetData 员工访谈组织中的关键人员,以深入了解工作流程,找到瓶颈,并构建工作流程图。信息系统分析包括当前和未来系统的分析。

TargetData 分配给客户的项目经理将深入调查客户需要哪些信息项,收集了哪些信息项,收集了但未保存哪些信息项,稍后可以检索哪些信息项(例如,用于向客户营销额外项目),哪些信息项是不必要的,等等。

技术和基础设施

方法论

Target Data 使用其为大规模自动数据处理开发的一些独有工具。

自动处理完成后,将生成一份需要手动检查和增强的数据列表。

手动增强

开发工具

独有的地址增强系统

DataTune 是在以下平台下开发的:

  • Microsoft Visual C++ 6.0
  • Microsoft Visual Basic 6.0
  • Microsoft Access
  • VBA(Visual Basic for Application)— Office 和其他 Microsoft 工具的自动化和宏程序。

DataTune Scrambler

DataTune 具有一个混淆功能,可用于在项目开始前提供“试用版”。“试用版”的优点在于能够随机选择一定数量的记录(通常是 500 条)并对这些记录执行数据清理。TargetData 已免费提供此类试用版。DataTune 应用程序中执行此操作的部分是此子例程

Private Sub DoScramble()
    Dim rs1, rs2 As Recordset
    Dim NumRecs As Long
  
    Randomize Timer
    Status = "Create temp table"
    DoEvents
    CreateTDTable "td_temp1"
    Status = "Create Table " + Text2.Text
    DoEvents
    CreateTDTable Text2.Text
    Status = "Copy data to temp table"
    DoEvents
    CopyAllData CurrentTable, "td_temp1"
    Status = "Start scrambling"
    DoEvents
    Set rs2 = CustDB.OpenRecordset(Text2.Text)
    Set rs1 = CustDB.OpenRecordset("td_temp1")
    rs1.MoveLast
    rs1.MoveFirst
    NumRecs = rs1.RecordCount
    ProgressBar1.Max = Val(Text1.Text)
    For k = 1 To Val(Text1.Text)
        ProgressBar1.Value = k
        DoEvents
        jump = Int(Rnd(1) * (NumRecs - 1))
        Status = "Sampling record #" + Trim(Str(jump))
        rs1.Move jump
        rs2.AddNew
        For i = 0 To rs1.Fields.Count - 1
            rs2(i) = rs1(i)
        Next
        rs2.Update
        rs1.Delete
        Set rs1 = CustDB.OpenRecordset("td_temp1")
        rs1.MoveLast
        rs1.MoveFirst
        NumRecs = rs1.RecordCount
    Next
    rs1.Close
    CustDB.TableDefs.Delete "td_temp1"
    Status = "Completed"
    rTables.FindFirst "TableName = '" + Text2.Text + "'"
    If rTables.NoMatch Then
        rTables.AddNew
        rTables("TABLENAME") = Text2.Text
        rTables("PROJECTID") = ProjectID
        rTables.Update
    End If
    DoEvents
End Sub

测试和优化工具

  • Numega — Bounds Check 用于源代码测试。

支持的平台

DataTune 支持以下操作系统:

  • Windows
  • DOS
  • UNIX
  • 大型机系统
  • AS 400
  • Mac OS
  • LINUX

学习陌生文件结构的独特机制

DataTune 的输出可以作为 EXE 文件提供。在某些情况下,可以从 TargetData 购买源代码。

Target Data 向客户提供的通用工作流程实施如下:

不支持。Activity 所需时间
0 在客户办公室会面。或者可以启动一个试点方案。
1 执行 500 条记录的试点方案(如果客户对此感兴趣)。 通常在 4 个工作日内
2准备提案。 通常在 3 个工作日内
3 执行工作并安装产品。 通常在 10 个工作日内
4在客户办公室进行培训,或根据需要通过电话进行培训。 在安装工作产品时,或在客户要求时在其他时间
5集成和陪同。 项目完成后一年内
6根据需要接收反馈并对软件进行改进。 自项目完成之日起最多一年
Michael Haephrati 2013 年度 CodeProject MVP  
© . All rights reserved.