Создайте веб-сервис (WCF) для интеграции с QuickBooks

Забудьте определение

, Они загрязнят Ваш код.

битовые поля?

struct RecordFlag {
    unsigned isnew:1, isdeleted:1, ismodified:1, isexisting:1;
};

никогда не используют это . Вы более обеспокоены скоростью, чем с экономией 4 ints. Используя битовые поля на самом деле медленнее, чем доступ к любому другому типу.

Однако у разрядных участников в структурах есть практические недостатки. Во-первых, упорядочивание битов в памяти варьируется от компилятора до компилятора. Кроме того, много популярных компиляторов генерируют неэффективный код для чтения, и запись укусила участников , и существует потенциально серьезно проблемы потокобезопасности касающийся битовых полей (особенно в многопроцессорных системах) вследствие того, что большинство машин не может управлять произвольными наборами битов в памяти, но должно вместо этого загрузить и сохранить целые слова. например, следующее не было бы ориентировано на многопотоковое исполнение, несмотря на использование взаимного исключения

Источник: http://en.wikipedia.org/wiki/Bit_field :

И если Вам нужно больше причин для [1 135] не битовые поля использования, возможно , Raymond Chen убедит Вас в его Старая Новая Вещь Сообщение: анализ рентабельности битовых полей для набора булевских переменных в [1 111] http://blogs.msdn.com/oldnewthing/archive/2008/11/26/9143050.aspx

интервал константы?

namespace RecordType {
    static const uint8 xNew = 1;
    static const uint8 xDeleted = 2;
    static const uint8 xModified = 4;
    static const uint8 xExisting = 8;
}

Помещение их в пространстве имен прохладно. Если они будут объявлены в Вашем CPP или заголовочном файле, то их значения будут встроены. Вы сможете использовать, включают те значения, но это немного увеличит связь.

А-ч, да: удаляют статическое ключевое слово . статичный удерживается от использования в C++ при использовании, как Вы делаете, и если uint8 будет типом здания, то Вам не будет нужно это для объявления этого в заголовке, включенном многочисленными источниками того же модуля. В конце код должен быть:

namespace RecordType {
    const uint8 xNew = 1;
    const uint8 xDeleted = 2;
    const uint8 xModified = 4;
    const uint8 xExisting = 8;
}

проблема этого подхода состоит в том, что Ваш код знает значение Ваших констант, которое увеличивает немного связь.

перечисление

то же как интервал константы, с несколько более сильным вводом.

typedef enum { xNew = 1, xDeleted, xModified = 4, xExisting = 8 } RecordType;

Они все еще загрязняют глобальное пространство имен, все же. Между прочим... Удаляют определение типа . Вы работаете в C++. Те определения типов перечислений и структур загрязняют код больше, чем что-либо еще.

результат отчасти:

enum RecordType { xNew = 1, xDeleted, xModified = 4, xExisting = 8 } ;

void doSomething(RecordType p_eMyEnum)
{
   if(p_eMyEnum == xNew)
   {
       // etc.
   }
}

, Как Вы видите, Ваше перечисление загрязняет глобальное пространство имен. При помещении этого перечисления в пространство имен у Вас будет что-то как:

namespace RecordType {
   enum Value { xNew = 1, xDeleted, xModified = 4, xExisting = 8 } ;
}

void doSomething(RecordType::Value p_eMyEnum)
{
   if(p_eMyEnum == RecordType::xNew)
   {
       // etc.
   }
}

интервал константы экстерна?

, Если Вы хотите уменьшить связь (т.е. способность скрыть значения констант, и таким образом, измените их, как желаемый, не нуждаясь в полной перекомпиляции), можно объявить ints как экстерн в заголовке, и столь же постоянный в файле CPP, как в следующем примере:

// Header.hpp
namespace RecordType {
    extern const uint8 xNew ;
    extern const uint8 xDeleted ;
    extern const uint8 xModified ;
    extern const uint8 xExisting ;
}

И:

// Source.hpp
namespace RecordType {
    const uint8 xNew = 1;
    const uint8 xDeleted = 2;
    const uint8 xModified = 4;
    const uint8 xExisting = 8;
}

Вы не сможете использовать, включают те константы, все же. Таким образом в конце, выберите свой яд... :-p

6
задан CodingBytes 12 August 2009 в 16:35
поделиться

1 ответ

Я начну с предупреждения, что QuickBooks, вероятно, не лучший выбор для надежной внутренней базы данных, доступной с удаленного веб-сайта. На самом деле ... это, наверное, действительно очень плохой выбор.

У вас должна быть собственная база данных приложения, а затем, если вам нужно также обмениваться данными с QuickBooks, делайте это вне обычного жизненного цикла вашего приложения, как отдельный процесс синхронизации.

QuickBooks обычно недостаточно надежен для приложений, постоянно работающих в сети, по ряду причин:

  • Нестандартные соединения SDK
  • Обновления и однопользовательский режим будут заблокировать вам доступ к QuickBooks
  • Сложность в установлении соединений SDK из процессов, не связанных с графическим интерфейсом (процессы Windows Services и IIS)

С учетом сказанного ...

Да, вы можете создать веб-службу WCF, разместить ее на машине QuickBooks и сделайте так, чтобы ваш веб-сервис WCF ретранслировал сообщения в / из QuickBooks.

Да, вы также можете создать службу Windows, которая делает то же самое.

НЕ реализовывать его как службу Windows, а НЕ реализовывать его в IIS - вместо этого реализуйте его как приложение с графическим интерфейсом, которое работает вместе с QuickBooks.

Если вы попытаетесь реализовать что-то как служба Windows или в IIS, QuickBooks SDK требует, чтобы у вас был доступный графический интерфейс (он использует насос сообщений COM с графическим интерфейсом для отправки событий или что-то в этом роде ...) для обработки запросов, поэтому вы ' Мне, вероятно, потребуется использовать что-то вроде QBXMLRP2e.exe, чтобы преодолеть границу процесса между QuickBooks и вашей службой Windows / IIS без графического интерфейса. По моему опыту, это огромная боль в заднице, и она также требует исправления с разрешениями DCOM.

У меня есть пример и некоторая документация в моей вики по интеграции QuickBooks .

Форумы IDN - хорошее место, чтобы задать вопросы.

Я вам порекомендую:

  • Используйте Web Connector и QuickBooks и откажитесь от надежды хранить все свои данные в одном месте. Кэшируйте данные в реальной базе данных и обновляйте их, периодически запрашивая QuickBooks. Я почти закончил создание решения для этого прямо сейчас, и оно отлично работает.

ИЛИ

  • Используйте другую систему учетных записей. NetSuite довольно хорош. Я не уверен, что еще есть, но на вашем месте я бы поискал что-нибудь на основе SQL или с сильным API SOAP / REST.
11
ответ дан 9 December 2019 в 22:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: