繁体   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