Для этого я использую набор хранимых процедур eConnect для интеграции GP. Возможно, это не самое элегантное решение, но оно работает довольно хорошо. eConnect также хорошо документирована Microsoft.
Если вы решите использовать этот вид интеграции, имеет смысл ознакомиться с Приложением Ловкости. Изучение Приложения Ловкости очень помогает при сопоставлении объектов и таблиц, и его следует бесплатно загрузить из Customer Source.
Вот пример хранимой процедуры eConnect для создания записи клиента:
$sql = "declare @p115 int
set @p115=0
declare @p116 varchar(255)
set @p116=''
exec dbo.taUpdateCreateCustomerRcd
@I_vCUSTNMBR = '123456',
@I_vCUSTNAME = 'Company Name',
@O_iErrorState = @p115 OUTPUT,
@oErrString = @p116 OUTPUT
select @p115, @p116";
Чтобы выполнить это, просто сделайте что-то вроде следующего (используя PHP ADODB в этом примере):
gp_execute_sp($sql);
function gp_execute_sp($sql, $transactions = true) {
global $DBGP;
if($transactions)
$DBGP->StartTrans();
$rs = $DBGP->Execute($sql);
if(is_object($rs) && !$rs->EOF) {
if($rs->fields['computed'] != 0) {
if($transactions)
$DBGP->FailTrans();
throw new Exception(get_error_desc($rs->fields['computed']));
}
} elseif(!is_object($rs)) {
if($transactions)
$DBGP->FailTrans();
throw new Exception("Database Connection Error.");
} else {
if($transactions)
$DBGP->FailTrans();
throw new Exception("Stored proceedure did not return a result.");
}
if($transactions)
$DBGP->CompleteTrans();
}
function get_error_desc($value) {
global $DBGP;
if(is_numeric($value)) {
$result = "No Error Available";
$sql = "SELECT ErrorDesc FROM DYNAMICS..taErrorCode WHERE ErrorCode=?";
$rs = $DBGP->execute($sql, array($value));
if(!$rs->EOF) {
$result = $rs->fields['ErrorDesc'];
}
} else {
$result = $value;
}
return $result;
}