簡體   English   中英

我正在嘗試通過ODBC將Sage Line 50 Access數據庫與Mysql同步

[英]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數據庫類。 這不是我遇到的問題。

所以要重新封頂。

  1. 我正在嘗試創建一個同步腳本,該腳本在mysql數據庫中創建(如果不存在)表,然后導入/同步數據。
  2. ODBC無法限制輸出,因此我無法自動找出列中的數據類型(無法手動完成,因為這是一個擁有80多個表的龐大數據庫
  3. 我無法弄清楚如何停止腳本創建重復的腳本,因為賢哲源數據庫中沒有ID。
  4. 對於不在英國的人來說,Sage是一種無用的會計程序,可用於水和煤。
  5. Sage數據庫僅提供數據,它不允許您在實際程序中的csv文件之外輸入數據。

我知道這有點晚了,但是我已經在做同樣的事情,但是使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM