Я пытаюсь синхронизировать базу данных 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. У меня нет проблем с этим.

Так что перефразировать.

  1. Я пытаюсь создать сценарий синхронизации, который создает (если не существует) таблицы в базе данных MySQL, а затем импортирует / синхронизирует данные.
  2. ODBC Не могу ограничить вывод, поэтому я не могу определить типы данных в столбцах автоматически (не могу сделать это вручную, потому что это массивная БД с таблицами более 80+
  3. Я не могу понять, как остановить скрипт, создающий дубликаты, потому что в исходной базе данных sage нет идентификаторов.
  4. Для тех из вас, кто не находится в Великобритании, Sage - бесполезный бухгалтерский пакет, работающий на воде и угле.
  5. База данных 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.

Другие вопросы по тегам