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 데이터베이스 클래스라는 것입니다. 내가 문제가있는 것은 아닙니다.
다시 캡핑하십시오.
- mysql 데이터베이스 내에 (존재하지 않는 경우) 테이블을 만든 다음 데이터를 가져 오거나 동기화하는 동기화 스크립트를 만들려고합니다.
- ODBC 데이터 열을 자동으로 계산할 수 없으므로 출력을 제한 할 수 없습니다. 수동으로 수행 할 수 없습니다. 80 개 이상의 테이블이있는 대규모 db이기 때문에 수동으로 수행 할 수 없습니다.
- sage 원본 데이터베이스에 ID가 없기 때문에 복제본을 만드는 스크립트를 중지하십시오.
- 영국에 거주하지 않은 분들을 위해 Sage는 물과 석탄에서 실행되는 쓸모없는 회계 패키지입니다
- Sage 데이터베이스는 데이터의 경우 실제 프로그램에서 CSV 파일 외부의 데이터를 입력 할 수 없습니다.
왜 이런 질문을 할 수 있습니까? 그것은 단지 당신이 원하는 것을 성취 할 수있는 더 좋은 방법이라고 생각합니다. – ashga
상단에 있습니다. 나는 지역 인트라넷 사이트가 현자에서 일반 직원에게 공급되는 데이터를 표시 할 수 있도록 도구를 작성하고 있습니다. 이것은 위의 요구 사항이며, 그들이 원하는 것입니다. 또한 sage 내에서 또는 ODBC를 사용하여 데이터를 조작하거나 올바르게 쿼리 할 수 없습니다. Sage는 자신의 데이터베이스에 대한 많은 정보를 게시하지 않습니다. 여기서 수집 한 사용자가 보고서를 실행하는 데 Excel을 사용할 수는 없지만 제한적입니다. 인트라넷 사이트를 통해 사용자는 관련없는 데이터가없는 멋진 사이트에서 데이터를 볼 수 있습니다. 이것은 또한 학위를 온라인으로 사용됩니다. –