que utiliza el SDK QuickBooks porque yo estaba desarrollando una herramienta de importación para un amigo y no tuvimos el lujo de comprar una biblioteca tercera parte.
Comencé a desarrollarlo como un servicio web, pero tuve que retroceder después de darme cuenta de que no solo tenemos que implementar el redistribuido del SDK de Quickbooks en el servidor, sino que también necesitábamos instalar QuickBooks. Y con más frecuencia que nunca, Quickbooks mostró un cuadro de diálogo, que en un servidor es malo.
Mientras ese diálogo esté abierto, Quickbooks SDK rechazará cualquier conexión.
Terminé haciéndolo como una aplicación C# Winform pura. A partir de ahí, es más bien estrecho.
En el corazón del programa fue una clase de sesión quickbook que maneja la sesión y el mensaje
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);
}
}
Después de eso, era simple cuestión de crear una sesión, crear un mensaje y añadiendo la consulta diferente .
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
}
}
Este código está lejos de ser a prueba de balas por la gran trampa de Quickbooks. El Quickbook SDK también es bastante lento.Por ejemplo, recuperar la lista de proveedores lleva aproximadamente 2 minutos para aproximadamente 1000 proveedores.
Para un servicio de Windows, la interoperabilidad COM parece ser la mejor solución. –
A pesar de que puede ser un poco desordenado, ¿qué hay de malo con el uso de COM? –
@JP, lo llamaremos un requisito empresarial – iamkrillin