Я пытаюсь синхронизировать базу данных Sage Line 50 Access с Mysql через ODBC
Я пытаюсь получить структуру и данные из базы данных sage line 50, но у меня проблемы с моим скриптом update / create.
По сути, я пишу инструмент для того, чтобы локальный сайт внутренней сети мог отображать данные, полученные от мудреца, обычным сотрудникам без использования логина мудреца (количество заказов на уровне / запасов и т. Д.). У меня проблемы с этим, потому что кажется, что база данных Sage50 была разработана полными дебилами. В этой базе данных нет уникальных ключей или, точнее, очень очень мало. Структура действительно старой школы, вы можете найти ее на пастбине ЗДЕСЬ ( здесь она слишком большая). Вы заметите, что есть несколько таблиц с 300+ столбцами, которые я считаю немного глупыми. Тем не менее, я должен работать с этим, и поэтому мне нужно решение.
Есть несколько проблем с синхронизацией, с которыми я столкнулся. Во-первых, это тот факт, что ODBC не может ограничить операторы одной строкой, поэтому я могу проверить тип данных, и, во-вторых, при отсутствии идентификаторов я не могу проверить, является ли он дубликатом при выполнении вставки. На данный момент вот что у меня есть:
$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 не будет работать. Я, очевидно, реализую auto inc первичные идентификаторы для каждой новой таблицы в базе данных ccl_sagedata. Но мне нужно иметь возможность ссылаться на что-то статическое в каждой таблице, которое я могу идентифицировать через ODBC (надеюсь, это имеет смысл). В моей текущей функции он должен вызывать базу данных mysql для каждой строки в базе данных sage и проверять, есть ли соответствующая строка.
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
}
}
Единственное, на что я могу обратить внимание, это то, что класс 'new Database' - это просто функционализированный стандартный класс базы данных mysqli. У меня нет проблем с этим.
Так что перефразировать.
- Я пытаюсь создать сценарий синхронизации, который создает (если не существует) таблицы в базе данных MySQL, а затем импортирует / синхронизирует данные.
- ODBC Не могу ограничить вывод, поэтому я не могу определить типы данных в столбцах автоматически (не могу сделать это вручную, потому что это массивная БД с таблицами более 80+
- Я не могу понять, как остановить скрипт, создающий дубликаты, потому что в исходной базе данных sage нет идентификаторов.
- Для тех из вас, кто не находится в Великобритании, Sage - бесполезный бухгалтерский пакет, работающий на воде и угле.
- База данных Sage предоставляет только данные, она не позволяет вводить данные вне файлов CSV в реальной программе.
2 ответа
Я знаю, что это немного поздно, но я уже делаю то же самое, но с MS SQL.
Я использовал пакет DTS, который усекает известные копии таблиц (т.е. AUDIT_JOURNAL
), а затем копирует все в день.
Я также натолкнулся на небольшую стену, пытаясь обработать обновления этих таблиц, отсюда усечение и повторное создание. Время синхронизации составляет секунды, так что это неплохой вариант. Это может быть немного болит, но я говорю, проектируйте свои таблицы синхронизации вручную.
Как вы правильно заметили, мудрец не очень дружелюбен к тому, чтобы его тыкали, поэтому я скажу, что не пытайтесь синхронизировать все это.
Предположительно, вам понадобятся отчеты для представления пользователям, но вам не нужно так много для этого. Я синхронизирую 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, которое вы можете установить локально, но синхронизация - это сочетание ODBC и DTS.
ОК, вам не нужно создавать скрипт синхронизации, вы можете запрашивать ODBC в режиме реального времени, вы даже можете делать соединения, как вы делаете это в SQL, для извлечения данных из нескольких таблиц. Единственное, что вы не можете сделать, это записать данные обратно в sage.