[英]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.