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;
    }

Google を徹底的に検索しましたが、これが発生する理由が見つからないようです。必要に応じて、さらにコード サンプルを投稿できます。

4

2 に答える 2

2

あなたはこれを理解しましたか?

見た目からすると、ここでの問題は検索のコンテキストだと思います。QAS サーバーと QuickAddress クラスはどちらもステートレスです。以前の検索履歴はありません。

このため、現時点では、郵便番号の最初の検索と住所行の 2 番目の検索をリンクするものは何もありません。したがって、 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 に答える