QAS Pro.某些地址的问题
本文关键字:问题 地址 Pro QAS | 更新日期: 2023-09-27 18:27:54
我在一家呼叫中心工作,该中心已经使用QAS Pro近两年了。我们使用访问数据库中的资源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,在combobox的顶部
如果我点击这个地址,它会发回: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;
}
我已经彻底搜索了谷歌,似乎找不到发生这种情况的任何原因。如果需要,我可以发布更多的代码样本。
你想明白了吗?
从外观上看,我认为你在这里遇到的问题是搜索的上下文。QAS服务器和QuickAddress类都是无状态的——它们没有以前搜索的历史记录。
正因为如此,目前没有任何东西将你的第一次邮政编码搜索和第二次地址行搜索联系起来。因此,当您调用RefinePostcode时,您根本没有进行优化。相反,您正在全英国范围内执行一项全新的搜索,搜索地点为"0/1 15 Brachelston Street,GREENOCK,Renfrewshire"。虽然QAS专业版可以处理这个问题,但这次搜索会产生一些可能性,所以你想要的结果不是第一个返回的结果。
这里有一些改进工作流程的可能性。为了避免对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地址中,你应该能够更快地捕获地址,更准确,代码更少!
希望能有所帮助!铝
这是访问所使用的代码。
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