1

我在一个使用 QAS Pro 近 2 年的呼叫中心工作。我们使用访问数据库中的资源 DLL 与内部托管的 QAS 服务器进行通信。它的唯一用途是根据邮政编码收集地址详细信息。因此,第一个函数从该邮政编码中获取地址列表,将它们插入到访问中的组合框中。在操作员可以选择适当的地址并将其插入正确的字段之后。

这是由不再与我们在一起的开发人员编写的。修复代码是我的工作。通过一些测试,我已经能够验证它是我们使用的 c# 代码而不是地址。由于测试工具工作正常。

资源 DLL 使用来自 QAS 的 c# 测试代码以及​​用于一些功能的额外文件。我是 c# 新手,以前从未做过这样的事情。任何帮助表示赞赏。

这是一位老同事写的代码。

  namespace MangoQAS
{
    using com.qas.proweb;
    using System;
    using System.Runtime.CompilerServices;
    using System.Runtime.InteropServices;

    [ComVisible(true)]
    public class QAS
    {
        public QAS()
        {
            QuickAddress address = new QuickAddress("http://10.10.15.7:2021") {
                Engine = QuickAddress.EngineTypes.Singleline,
                Flatten = true
            };
            this.searchService = address;
        }

        private string GetMoniker(string p)
        {
            return this.searchService.Search("GBR", p, PromptSet.Types.Default, "Database layout").Picklist.Items[0].Moniker;
        }

        public string[] RefinePostcode(string p)
        {
            string moniker = this.GetMoniker(p);
            FormattedAddress formattedAddress = this.searchService.GetFormattedAddress(moniker, "Database Layout");
            return new string[] { formattedAddress.AddressLines[0].Line, formattedAddress.AddressLines[1].Line, formattedAddress.AddressLines[2].Line, formattedAddress.AddressLines[3].Line, formattedAddress.AddressLines[4].Line, formattedAddress.AddressLines[5].Line, formattedAddress.AddressLines[6].Line };
        }

        public string[] SearchPostcodes(string postCode)
        {
            SearchResult result = this.searchService.Search("GBR", postCode, PromptSet.Types.OneLine, "Database layout");
            string[] strArray = new string[result.Picklist.Length];
            for (int i = 0; i < result.Picklist.Length; i++)
            {
                strArray[i] = result.Picklist.Items[i].Text;
            }
            return strArray;
        }

        private QuickAddress searchService { get; set; }
    }
}

SearchPostcodes - 根据邮政编码返回地址列表。RefinePostcode - 获取地址行并发送回格式化的地址。

问题似乎出在 RefinePostcode 上。我尝试格式化地址字符串,因为我的第一个想法是它不喜欢正斜杠。这没有用。

例如,使用邮政编码:PA169AE。
这给了我:位于组合框顶部的 0/1 15 Brachelston Street, GREENOCK, Renfrewshire。
如果我点击这个地址,它会发回:1 Crossgates, Greenock Road, PA7 5JU。
更改所有内容,包括我输入的邮政编码。

我相信问题出在 RefinePostcode 或 GetMoniker 上。下面的 2 个块来自示例代码,未更改,但可能需要进行诊断。

    public FormattedAddress GetFormattedAddress(string sMoniker, string sLayout)
    {
        Debug.Assert((sMoniker != null) && (sLayout != null));
        QAGetAddress qAGetAddress = new QAGetAddress {
            Layout = sLayout,
            Moniker = sMoniker,
            QAConfig = this.m_Config,
            Language = this.m_LanguageString
        };
        FormattedAddress address2 = null;
        try
        {
            address2 = new FormattedAddress(this.SearchService.DoGetAddress(qAGetAddress).QAAddress);
        }
        catch (Exception exception)
        {
            this.MapException(exception);
        }
        return address2;
    }


    public SearchResult Search(string sDataID, string sSearch, PromptSet.Types tPromptSet, string sLayout)
    {
        Debug.Assert(sDataID != null);
        Debug.Assert(sSearch != null);
        QASearch qASearch = new QASearch {
            Country = sDataID,
            Engine = this.m_Engine
        };
        qASearch.Engine.PromptSet = (PromptSetType) tPromptSet;
        qASearch.Engine.PromptSetSpecified = true;
        qASearch.Layout = sLayout;
        qASearch.QAConfig = this.m_Config;
        qASearch.Search = sSearch;
        qASearch.Language = this.m_LanguageString;
        SearchResult result = null;
        try
        {
            result = new SearchResult(this.SearchService.DoSearch(qASearch));
        }
        catch (Exception exception)
        {
            this.MapException(exception);
        }
        return result;
    }

我已经彻底搜索了谷歌,似乎找不到任何会发生这种情况的原因。如果需要,我可以发布更多代码示例。

4

2 回答 2

2

你知道了吗?

从它的外观来看,我认为您在这里遇到的问题是搜索的上下文。QAS 服务器和 QuickAddress 类都是无状态的——它们没有以前的搜索历史。

因此,目前没有任何东西可以将您的第一次邮政编码搜索与您在地址行的第二次搜索联系起来。因此,当您调用 RefinePostcode 时,您根本没有进行精炼。您正在“0/1 15 Brachelston Street, GREENOCK, Renfrewshire”上执行全新的全英国搜索。虽然 QAS pro 可以处理此问题,但此搜索会产生一些可能性,因此您所追求的结果不是返回的第一个结果。

这里有一些可能性可以改善您的工作流程。为避免对您的 VBA 代码进行任何更改并仅将更改限制在上面的示例中,您可以将状态引入此类并更改工作流程,以便您在搜索时传递邮政编码。类似于以下内容:

public class QAS
{
    public QAS()
    {       
        // Create a new soap proxy that can talk to QAS Pro Web   
        QuickAddress address = new QuickAddress("http://10.10.15.7:2021") 
        {
            Engine = QuickAddress.EngineTypes.Singleline,
            Flatten = true
        };

        this.searchService = address;
    }

    /// <summary>
    /// For the supplied search, get the moniker which can then be used to format the address.
    /// </summary>
    private string GetMoniker(string p)
    {
        return this.searchService.Search("GBR", p, PromptSet.Types.Default, "Database layout").Picklist.Items[0].Moniker;
    }

    /// <summary>
    /// Return a formatted address from the supplied search. 
    /// </summary>
    public string[] RefinePostcode(string p)
    {
        // Append the postcode to our address to speed up and improve searches.
        string search = p + "," + Postcode;

        SearchResult result = this.searchService.Search("GBR", 
                                                        postCode,
                                                        PromptSet.Types.OneLine,
                                                        "Database layout");
        if ( result.Picklist.Items.Length > 0 )
        {

        }
        else
        {
            // What is your workflow if an address is not found?
        }
        string moniker = this.GetMoniker(search);
        FormattedAddress formattedAddress = this.searchService.GetFormattedAddress(moniker, "Database Layout");
        return new string[] { formattedAddress.AddressLines[0].Line, formattedAddress.AddressLines[1].Line, formattedAddress.AddressLines[2].Line, formattedAddress.AddressLines[3].Line, formattedAddress.AddressLines[4].Line, formattedAddress.AddressLines[5].Line, formattedAddress.AddressLines[6].Line };
    }

    /// <summary>
    /// Once a postcode is captured by the operator, return a list of potential addresses. 
    /// </summary>
    public string[] SearchPostcodes(string postCode)
    {
        Postcode = postcode;
        SearchResult result = this.searchService.Search("GBR", 
                                                        postCode,
                                                        PromptSet.Types.OneLine,
                                                        "Database layout");

        string[] strArray = new string[result.Picklist.Length];
        for (int i = 0; i < result.Picklist.Length; i++)
        {
            strArray[i] = result.Picklist.Items[i].Text;
        }
        return strArray;
    }

    private QuickAddress searchService { get; set; }

    /// <summary>
    /// Gets or sets the postcode from the initial search.
    /// </summary>
    private string Postcode
    {
        get;
        set;
    }

}

但是,如果您有时间,最好再进一步并正确修复您的工作流程。QAS Pro Web 中搜索之间的上下文是通过名字来处理的。这些是 Pro Web 在与服务器进行所有交互后提供的令牌,您可以使用这些令牌获取格式化地址或执行进一步搜索。提供的文档中有更多详细信息。

在您对邮政编码进行初步搜索后,您会得到一个地址列表,其中每个地址都有一个与之关联的名字对象。如果您能够存储这些名字并将它们与您放入组合框中的列表相关联,那么当操作员选择一个时,您可以将名字直接传递到 GetFormatted 地址,您应该能够更快、更准确地捕获地址,并且花费更少代码!

希望有帮助!铝。

于 2013-12-06T10:25:37.893 回答
0

这是代码访问使用的。

Private Sub cmdSelect_Click()

    Dim thisOne As String
    thisOne = Me.lkupAddressList.Value

    Dim objQAS As MangoQAS.QAS
    Set objQAS = New MangoQAS.QAS
    Dim finalAddress As Variant

    finalAddress = objQAS.RefinePostcode(thisOne)

    Form_Script.txtAddress1 = finalAddress(0)
    Form_Script.txtAddress2 = finalAddress(1)
    Form_Script.txtAddress3 = finalAddress(2)
    Form_Script.txtTown = finalAddress(3)
    Form_Script.txtCounty = finalAddress(4)
    Form_Script.txtPostcode = finalAddress(5)

    Set objQAS = Nothing

    DoCmd.Close acForm, "frmSelectAddress_qas"

End Sub

Private Sub Form_Load()

    Dim postcodeToSearch As String

    postcodeToSearch = Form_Script.txtPostcode

    Dim objQAS As MangoQAS.QAS
    Set objQAS = New MangoQAS.QAS
    Dim results As Variant

    results = objQAS.SearchPostcodes(postcodeToSearch)

    Dim howMany As Integer
    howMany = UBound(results)

    For i = 0 To howMany
        Me.lkupAddressList.AddItem ("'" & results(i) & "'")
    Next

    Set objQAS = Nothing

End Sub
于 2013-08-16T07:49:29.600 回答