2014-02-26 2 views
1

Sage line 50 데이터베이스에서 구조와 데이터를 가져 오려고하지만 내 업데이트/작성 스크립트에 문제가 있습니다.Sage Line 50 Access 데이터베이스와 ODBC를 통해 MySQL을 동기화하려고합니다.

기본적으로 로컬 인트라넷 사이트가 현자 로그인 (주문 재고/재고 수준 주문 등)을 사용하지 않고 sage에서 일반 직원까지의 데이터를 표시 할 수 있도록 도구를 작성하고 있습니다. Sage50 데이터베이스가 완전히 바보에 의해 개발 된 것 같아서이 문제가 발생했습니다. 이 데이터베이스에는 고유 키가 없으며, 더 정확하게는 매우 거의 없습니다. 구조는 실제로 당신이 pastebin HERE (비트가 너무 큼)에 구조를 찾을 수있는 오래된 학교입니다. 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]); 
} 

내에서 열 다음 단계를 생산하기 위해 실행, 나는 다음 함께 bodged 내가 길을 좋아하지 않는 것이 (각 테이블을 생성하는 기능을 가지고 그것은 그것을한다).

하나의 행 (또는 몇 개의 행)을 자동으로 다시 가져올 수 없기 때문에 행 유형을 자동으로 설정하기 위해 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 데이터베이스와 동기화하는 기능이 필요합니다. 그러나 복제본을 삽입하지 않도록해야합니다. 즉,이 스크립트는 ID 번호없이 매일 시작 또는 끝날 때 sage 데이터베이스를 동기화하도록 실행됩니다. INSERT REPLACE가 작동하지 않습니다. 분명히 ccl_sagedata db의 각 새 테이블에 대해 자동 inc 기본 ID를 구현하고 있습니다. 하지만 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 
    } 
} 

내가 생각할 수있는 유일한 또 다른 사실은 '새로운 데이터베이스'클래스가 단순히 기능화 된 표준 mysqli 데이터베이스 클래스라는 것입니다. 내가 문제가있는 것은 아닙니다.

다시 캡핑하십시오.

  1. mysql 데이터베이스 내에 (존재하지 않는 경우) 테이블을 만든 다음 데이터를 가져 오거나 동기화하는 동기화 스크립트를 만들려고합니다.
  2. ODBC 데이터 열을 자동으로 계산할 수 없으므로 출력을 제한 할 수 없습니다. 수동으로 수행 할 수 없습니다. 80 개 이상의 테이블이있는 대규모 db이기 때문에 수동으로 수행 할 수 없습니다.
  3. sage 원본 데이터베이스에 ID가 없기 때문에 복제본을 만드는 스크립트를 중지하십시오.
  4. 영국에 거주하지 않은 분들을 위해 Sage는 물과 석탄에서 실행되는 쓸모없는 회계 패키지입니다
  5. Sage 데이터베이스는 데이터의 경우 실제 프로그램에서 CSV 파일 외부의 데이터를 입력 할 수 없습니다.
+0

왜 이런 질문을 할 수 있습니까? 그것은 단지 당신이 원하는 것을 성취 할 수있는 더 좋은 방법이라고 생각합니다. – ashga

+0

상단에 있습니다. 나는 지역 인트라넷 사이트가 현자에서 일반 직원에게 공급되는 데이터를 표시 할 수 있도록 도구를 작성하고 있습니다. 이것은 위의 요구 사항이며, 그들이 원하는 것입니다. 또한 sage 내에서 또는 ODBC를 사용하여 데이터를 조작하거나 올바르게 쿼리 할 수 ​​없습니다. Sage는 자신의 데이터베이스에 대한 많은 정보를 게시하지 않습니다. 여기서 수집 한 사용자가 보고서를 실행하는 데 Excel을 사용할 수는 없지만 제한적입니다. 인트라넷 사이트를 통해 사용자는 관련없는 데이터가없는 멋진 사이트에서 데이터를 볼 수 있습니다. 이것은 또한 학위를 온라인으로 사용됩니다. –

답변

0

확인 y 실시간으로 ODBC를 쿼리 할 수있는 동기화 스크립트를 만들 필요가 없습니다. SQL 에서처럼 여러 테이블에서 데이터를 검색하는 것처럼 조인을 할 수도 있습니다. 당신이 할 수없는 유일한 일은 현자에게 다시 데이터를 쓰는 것입니다.

+0

ODBC를 쿼리 할 수 ​​있다는 것을 알고 있습니다. ODBC는 제한적이므로 LIMIT와 같은 작업을 수행하거나 보고서를 작성하기 위해 데이터에 대해 필요한 다양한 SQL 문을 수행 할 수 없습니다. 페이지 매김과 같은 것에는 한계가 있습니다. 또한 이러한 레코드에 대한 다른 정보를 MySQL 데이터베이스에 기록해야합니다. 나는 그저 나 자신을 해결할 것이다. –

+0

시도해 보셨습니까 : SELECT * FROM tablename FIRST (1000); 행운을 빈다. – ashga

+0

FIRST (100)는 실제로 작동하지 않습니다. Sage는 자체 ODBC 드라이버를 가지고 있기 때문에 ODBC는 예상보다 기능이 적습니다. –

1

나는 이것이 조금 늦었다는 것을 알고 있지만 이미 MS SQL을 사용하여 같은 일을하고있다.

Ive는 테이블의 알려진 사본 (즉, AUDIT_JOURNAL)을 절단하고 매일 모든 것을 복사하는 DTS 패키지를 사용했습니다.

나는 또한이 테이블의 업데이트를 처리하려고하는 벽을 때리고, 잘라 버리고 다시 만듭니다. 동기화 시간은 몇 초이므로 잘못된 옵션이 아닙니다. 그것은 공허증이 될 수도 있지만 수동으로 동기화 테이블을 디자인한다고합니다.

세이지는 찌르는 것에 매우 친절하지 않으므로 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라는 웹 앱이 있지만 동기화는 ODBC와 DTS의 조합입니다.

+0

안녕하세요, DB 서버와의 GUI 기반 동기화에 가장 적합하다고 여겨 졌던 선반 소프트웨어 솔루션으로 끝을 맺었습니다. WebXEL Sage Exporter라고하며 데이터베이스뿐만 아니라 다른 유형의 파일로도 내보낼 수 있습니다. –