[英]I am trying to synchronise a Sage Line 50 Accounting Software with Trackvia through API
[英]I am trying to synchronise a Sage Line 50 Access database with Mysql via ODBC
我試圖從Sage第50行數據庫中獲取結構和數據,但是我的更新/創建腳本遇到了麻煩。
基本上,我正在寫一個工具,以便本地Intranet站點可以顯示從賢哲到普通員工的數據,而無需占用賢哲的登錄信息(由於庫存/庫存水平等導致的訂單)。 我對此感到麻煩,因為似乎Sage50數據庫是由白痴開發的。 此數據庫中沒有唯一鍵,或更准確地說,很少。 該結構的確是老派,您可以在pastebin上找到該結構( 此處太大了)。 您會注意到有些表包含300多個列,我認為這有點愚蠢。 但是,我必須處理這個問題,因此我需要一個解決方案。
我遇到了一些同步問題。 首先,這是ODBC無法將語句限制為1行的事實,因此我可以檢查數據類型,其次,由於沒有ID,因此在插入時無法檢查它是否重復。 目前,這是我所擁有的:
$rConn = odbc_connect("SageLine50", "user", "password");
if ($rConn == 0) {
die('Unable to connect to the Sage Line 50 V12 ODBC datasource.');
}
$result = odbc_tables($rConn);
$tables = array();
while (odbc_fetch_row($result)){
if(odbc_result($result,"TABLE_TYPE")=="TABLE") {
$tables[odbc_result($result,"TABLE_NAME")] = array();
}
}
這將產生您在pastebin上看到的列表的第一級。
然后運行一個foreach語句以產生表中各列的下一個層次
foreach($tables as $k=> $v) {
$query = "SELECT * FROM ".$k;
$rRes = odbc_exec($rConn,$query);
$rFields = odbc_num_fields ($rRes);
$i = 1;
while($i <= $rFields) {
$tables[$k][] = odbc_field_name($rRes, $i);
$i++;
}
CreateTableandRows($k,$tables[$k]);
}
此刻,我有了一個合並在一起的函數來創建每個表(不是我喜歡它的方式)。
因為我無法自動獲取一行(或幾行),所以要使用get_type()檢查數據類型然后自動設置行類型,這意味着我唯一可以確定的方法是設置該行類型為文本,然后根據Mysql查詢進行追溯更改。
在上面的foreach之后,這是用於創建表的函數。
function CreateTableandRows($table,$rows) {
$db = array(
"host" => '10.0.0.200',
"user" => 'user',
"pass" => 'password',
"table" => 'ccl_sagedata'
);
$DB = new Database($db);
$LocSQL = "CREATE TABLE IF NOT EXISTS `".$table."` (
`id` int(11) unsigned NOT NULL auto_increment,
PRIMARY KEY (`id`),";
foreach($rows as $k=>$v) {
$LocSQL .= "
".$v." TEXT NOT NULL default '',";
}
$LocSQL = rtrim($LocSQL, ',');
$LocSQL .= "
) ENGINE=MyISAM DEFAULT CHARSET=utf8";
echo '<pre>'.$LocSQL.'</pre>';
$DB->query($LocSQL);
}
然后,我需要/想要一個函數,一次獲取每個表並將數據同步到ccl_sagedata數據庫。 但是,它需要確保沒有插入重復項,即,該腳本將在每天的開始或結束時運行以同步sage數據庫,並且沒有ID號INSERT REPLACE將不起作用。 我顯然在為ccl_sagedata db中的每個新表實現auto inc主ID。 但是我需要能夠在我可以通過ODBC識別的每個表中引用靜態內容(我希望這是有道理的)。 在我當前的函數中,它必須為sage數據庫的每一行調用mysql數據庫,並查看是否有匹配的行。
function InsertDataFromSage($ODBCTable) {
$rConn = odbc_connect("SageLine50", "user", "pass");
$query = "SELECT * FROM ".$ODBCTable;
$rRes = odbc_exec($rConn,$query);
$rFields = odbc_num_fields ($rRes);
while( $row = odbc_fetch_array($rRes) ) {
$result[] = $row;
}
$DB = new Database($db);
foreach($result as $k => $v) {
$CHECKEXISTS = "SELECT * FROM ".$ODBCTable." WHERE";
$DB->query($CHECKEXISTS);
// HERE WOULD BE A PART THAT PUTS DATA INTO THE DATABASE IF IT DOESN'T ALREADY EXIST
}
}
我能想到要注意的唯一另一件事是,“新數據庫”類僅僅是功能化的標准mysqli數據庫類。 這不是我遇到的問題。
所以要重新封頂。
我知道這有點晚了,但是我已經在做同樣的事情,但是使用MS SQL。
Ive使用了DTS包,該包會截斷表的已知副本(即AUDIT_JOURNAL
),然后每天復制所有內容。
我也碰壁了一下,試圖處理這些表的更新,因此進行了截斷並重新創建。 同步時間是幾秒鍾,因此它不是一個壞選擇。 可能會有點痛,但是我說要手動設計同步表。
正如您正確指出的那樣,鼠尾草對戳戳不是很友好,因此id表示也不要嘗試全部同步。
大概您需要將報告呈現給用戶,但是您不需要那么多操作。 我同步了COMPANY,AUDIT_JOURNAL, AUDIT_USAGE, CAT_TITLE,CAT_TITLE_CUS, CHART_LIST,CHART_LIST_CUS, BANK,CATEGORY,CATEGORY_CUS,DEPARTMENT, NOMINAL_LEDGER,PURCHASE_LEDGER,SALES_LEDGER
。
這樣就可以重新瀏覽所有主要報表(資產負債表,試算表,供應商余額等),並進行深入分析。 如果您需要更多幫助,請稍后告訴我。 我有一個名為MIS的Web應用程序,您可以在本地安裝它,但是同步是ODBC和DTS的組合。
好的,您不需要創建同步腳本,您可以實時查詢ODBC,甚至可以像在SQL中一樣執行聯接以從多個表中檢索數據。 您唯一不能做的就是將數據寫回到賢者。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.