友人のためにインポート ツールを開発していたので、Quickbooks SDK を使用しましたが、サード パーティのライブラリを購入する余裕はありませんでした。
Web サービスとして開発を開始しましたが、Quickbooks SDK の再配布可能ファイルをサーバーにデプロイする必要があるだけでなく、Quickbooks 自体もインストールする必要があることに気付き、フォールバックする必要がありました。また、Quickbooks がダイアログを表示することがよくありましたが、これはサーバー上では問題です。
そのダイアログが開いている限り、Quickbooks SDK はそのダイアログへの接続を拒否します。
最終的には、純粋な C# Winform アプリケーションとして実行しました。そこからは、かなりストレートです。
プログラムの中心には、セッションとメッセージを処理するクイックブック セッション クラスがありました。
public static class Quickbooks
{
public static QuickbookSession CreateSession()
{
return new QuickbookSession();
}
}
public class QuickbookSession : IDisposable
{
/// <summary>
/// Initializes a new instance of the <see cref="QuickbookSession"/> class.
/// </summary>
internal QuickbookSession()
{
this.SessionManager = new QBSessionManager();
this.SessionManager.OpenConnection2(
ConfigurationManager.AppSettings["QuickbooksApplicationId"],
ConfigurationManager.AppSettings["QuickbooksApplicationName"],
Utils.GetEnumValue<ENConnectionType>(ConfigurationManager.AppSettings["QuickbooksConnectionType"]));
var file = Quickbook.QuickbookDatabaseFilePath;
if (string.IsNullOrEmpty(file))
{
file = ConfigurationManager.AppSettings["QuickbooksDatabaseLocalPath"];
}
this.SessionManager.BeginSession(file, Utils.GetEnumValue<ENOpenMode>(ConfigurationManager.AppSettings["QuickbooksSessionOpenMode"]));
}
/// <summary>
/// Gets the Quickbook session manager that is owning this message.
/// </summary>
public QBSessionManager SessionManager { get; private set; }
public QuickbookMessage CreateMessage()
{
return new QuickbookMessage(this.SessionManager);
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
// get rid of managed resources
}
this.SessionManager.EndSession();
this.SessionManager.CloseConnection();
System.Runtime.InteropServices.Marshal.ReleaseComObject(this.SessionManager);
}
}
その後、セッションを作成し、メッセージを作成して、別のクエリを追加するだけの簡単なことでした。
using(var session = Quickbooks.CreateSession())
{
// Check if the job already exist
using (var message = session.CreateMessage())
{
var jobQuery = message.AppendCustomerQueryRq();
jobQuery.ORCustomerListQuery.CustomerListFilter.ORNameFilter.NameFilter.Name.SetValue("something");
jobQuery.ORCustomerListQuery.CustomerListFilter.ORNameFilter.NameFilter.MatchCriterion.SetValue(ENMatchCriterion.mcContains);
var result = message.Send();
// do stuff here with the result
}
}
このコードは、Quickbooks の多くの落とし穴を完全に防げるとは言えません。Quickbooks SDK もかなり遅いです。たとえば、サプライヤーのリストを取得するには、約 1000 のサプライヤーの場合、約 2 分かかります。