1 Востаннє редагувалося Replace (16.01.2014 14:14:47)

Тема: Експорт з Tecdoc в Mysql (TecDoc Online)

Я близько року займаюсь розробкою інтернет магазину з продажу автозапчастин, у вільний час, тому що роблю для свого брата. Сайт використовує базу з Tecdoc. Вирішив написати статтю як робити експорт даних з Tecdoc в MySQL або TecDoc Online (для пошуку).

Tecdoc - це програма, яка містить базу неоригінальних запчастин для авто (картинки, опис, привязки до оригіналів та можливість підбору по авто). Tecdoc використовує СУБД Transbase для зберігання даних. Програма має кілька мінусів: 1) йде лише під Windows; 2) з x64 великі проблеми, особливо під 7 та 8; 3) зберігає картинки прямо в СУБД; 4) дуже заплутані назви таблиць та полей (принаймі це мінуси для мене)
Є також і плюси:
1) Структура бази не міняється по кілька років (інколи додаються нові таблички).
2) Дуже легко отримати доступ до бази, але вона набаго повільніше ніж MySQL та є багато проблем зі структурою :)

Для доступу до бази використовуємо наступні дані:
- Схема або бд: TECDOC_CD_2_2013 (залежить від версії, 2013 - рік випуску, 2 - квартал)
- Користувач: tecdoc
- Пароль: tcd_error_0
- Таблиці, які нас цікавлять починаються з TOF_
- JDBC-драйвер: transbase.jdbc.Driver (дивіться трохи нижче в прикріплених файлах)
- Регіон (id): 210 (210 - Україна)
- Мова (id): 16 (16 - російська)

Перейдемо безпосердньо до прикладу. Для експорту даних я використовую мову програмування Java.

Наступний клас виконує підключення до Transbase та просто друкує таблиці Tecdoc:
[code]/**
Author: Leonid Yaremchuk
Date: 2012-09-10
Company: http://leonid.pro/
*/

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class ExportHelper {
   
    private static final String dbDriver = "transbase.jdbc.Driver";
    private static final String dbUrl = "jdbc:transbase://192.168.1.106/";
    private static final String dbDatabase = "TECDOC_CD_2_2013";
    private static final String dbUser = "tecdoc";
    private static final String dbPassword = "tcd_error_0";
    private Connection connection = null;
    private static final int ukraineCode = 210;
    private static final int russianId = 16;
   
    public ExportHelper() {
        try {
            Class.forName(dbDriver);
            connection = DriverManager.getConnection(dbUrl + dbDatabase, dbUser, dbPassword);
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();   
        }
       
    }
   
    public void printSysTable() {
        Statement st;
        try {
            st = connection.createStatement();
            ResultSet result = st.executeQuery("SELECT * FROM systable");
            while (result.next()) {
                String tableName = result.getString(1);
   
                // Just TecDoc
                if (tableName.indexOf("TOF_") != -1) {
                    System.out.println(tableName);
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

}[/code]

Приведу більш практичний приклад з використання коду України. Наступний код створює таблицю в MySQL з виробниками авто і за допомогою методу exportTableData виконує експорт з Tecdoc в Mysql. Знаю, що можна було використовувати PreparedStatement, але так експортує швидше.
[code]public void exportManufacturers() {
       
        final String tableName = "TOF_MANUFACTURERS";
        final String mysqlTable = "tof_manufacturers";
       
        final String sqlDropTable = "DROP TABLE IF EXISTS " + mysqlTable;
        final String sqlCreateTable = " CREATE TABLE IF NOT EXISTS " + mysqlTable + " (" +
                "id int(11) PRIMARY KEY, " +
                "passenger_car TINYINT, " +
                "commercial_vehicle TINYINT, " +
                "axle TINYINT, " +
                "engine TINYINT, " +
                "engine_type TINYINT, " +
                "code VARCHAR(20), " +
                "brand VARCHAR(100), " +
                "number SMALLINT" +
                ")";
       
       
        Statement st;
        Statement mysqlSt;
        try {
           
            System.out.println("Export manufacturers");
           
            st = connection.createStatement();
            ResultSet result = st.executeQuery("SELECT MFA_ID, MFA_PC_MFC, MFA_CV_MFC," +
                    " MFA_AXL_MFC, MFA_ENG_MFC, MFA_ENG_TYP, MFA_MFC_CODE, MFA_BRAND," +
                    " MFA_MF_NR FROM " + tableName + " WHERE " +
                    " MFA_CV_CTM SUBRANGE (" + ukraineCode + " CAST INTEGER) = 1 OR" +
                    " MFA_PC_CTM SUBRANGE (" + ukraineCode + " CAST INTEGER) = 1");
           
            ResultSetMetaData metaResult = result.getMetaData();
            int numberOfColumns = metaResult.getColumnCount();
           
            mysqlSt = mysqlConnection.createStatement();
            mysqlSt.executeUpdate(sqlDropTable);
            mysqlSt = mysqlConnection.createStatement();
            mysqlSt.executeUpdate(sqlCreateTable);
           
            exportTableData(result, numberOfColumns, mysqlTable);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

private void exportTableData(ResultSet result, int numberOfColumns, String table) {
        try {
            int count = 0;
            int counter = 0;
            result.setFetchSize(2000);
            while (true) {
                String sql = "INSERT INTO " + table + " VALUES";
                while (count != 2000 && result.next()) {
                   
                    if (count != 0) {
                        sql += ',';
                    }
                    sql += "(";
                    for (int i = 1; i <= numberOfColumns; i++) {
                        if (result.getObject(i) == null) {
                            sql += "NULL";
                        } else {
                            sql += "'" + cleanString(result.getString(i)) + "'";
                        }
                        if (i != numberOfColumns) {
                            sql += ", ";
                        } else {
                            sql += " ";
                        }
                    }
                    sql += ")";
                    count++;
                    counter++;
                }
                if (count > 0) {
                    Statement st = mysqlConnection.createStatement();
                    st.executeUpdate(sql);
                    st.close();
                    System.out.println(counter);
                    count = 0;   
                } else {
                    break;
                }
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
   
[/code]

Більше прикладів:

Експорт моделей

[code]public void exportModels() {
       
        final String tableName = "TOF_MODELS";
        final String tableCountry = "TOF_COUNTRY_DESIGNATIONS";
        final String tableDescriptions = "TOF_DES_TEXTS";
        final String mysqlTable = "tof_models";
       
        final String sqlDropTable = "DROP TABLE IF EXISTS " + mysqlTable;
        final String sqlCreateTable = " CREATE TABLE IF NOT EXISTS " + mysqlTable + " (" +
                "id INT(11) PRIMARY KEY, " +
                "manufacturer_id int(11), " +
                "description_id int(11), " +
                "start_date int(6), " +
                "end_date int(6), " +
                "passenger_car TINYINT, " +
                "commercial_vehicle TINYINT, " +
                "axle TINYINT, " +
                "description VARCHAR(255)" +
                ")";

        final String[] sqlIndexes = {
                "ALTER TABLE " + mysqlTable + " ADD INDEX (manufacturer_id)"
        };
       
       
        Statement st;
        Statement mysqlSt;
        try {
           
            System.out.println("Export models");
           
            st = connection.createStatement();
            ResultSet result = st.executeQuery("SELECT MOD_ID, MOD_MFA_ID, MOD_CDS_ID," +
                    " MOD_PCON_START, MOD_PCON_END, MOD_PC, MOD_CV, MOD_AXL, TEX_TEXT " +
                    " FROM " + tableName + ", " + tableCountry + ", " + tableDescriptions + " WHERE" +
                    " (MOD_PC_CTM SUBRANGE (" + ukraineCode + " CAST INTEGER) = 1 OR" +
                    " MOD_CV_CTM SUBRANGE (" + ukraineCode + " CAST INTEGER) = 1) AND" +
                    " CDS_LNG_ID = " + russianId + " AND CDS_TEX_ID = TEX_ID AND MOD_CDS_ID = CDS_ID" +
                    " AND  CDS_CTM SUBRANGE (" + ukraineCode + " CAST INTEGER) = 1");
           
            ResultSetMetaData metaResult = result.getMetaData();
            int numberOfColumns = metaResult.getColumnCount();
           
            mysqlSt = mysqlConnection.createStatement();
            mysqlSt.executeUpdate(sqlDropTable);
           
            mysqlSt = mysqlConnection.createStatement();
            mysqlSt.executeUpdate(sqlCreateTable);
           
            for (String sql : sqlIndexes) {
                mysqlSt = mysqlConnection.createStatement();
                mysqlSt.executeUpdate(sql);
            }
           
            exportTableData(result, numberOfColumns, mysqlTable);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
[/code]


Експорт модифікацій

[code]   
    public void exportTypes() {
       
        final String tableName = "TOF_TYPES";
        final String tableCountry = "TOF_COUNTRY_DESIGNATIONS";
        final String tableDescriptions = "TOF_DES_TEXTS";
        final String mysqlTable = "tof_types";
       
        final String sqlDropTable = "DROP TABLE IF EXISTS " + mysqlTable;
        final String sqlCreateTable = " CREATE TABLE IF NOT EXISTS " + mysqlTable + " (" +
                "id int(11) PRIMARY KEY," +
                "model_id int(11)," +
                "start_date int(6)," +
                "end_date int(6)," +
                "description varchar(100)," +
                "capacity float(5,1), " +
                "capacity_hp_from int(5)," +
                "capacity_kw_from int(5)" +
            ")";
       
        final String[] sqlIndexes = {
                "ALTER TABLE " + mysqlTable + " ADD INDEX (model_id)"
        };
       
        Statement st;
        Statement mysqlSt;
        try {
           
            System.out.println("Export types");
           
            st = connection.createStatement();
            ResultSet result = st.executeQuery("SELECT TYP_ID, TYP_MOD_ID,  TYP_PCON_START, TYP_PCON_END, TEX_TEXT, TYP_LITRES, TYP_HP_FROM, TYP_KW_FROM" +
                    " FROM " + tableName + ", " + tableCountry + ", " + tableDescriptions + " WHERE" +
                    " (TYP_CTM SUBRANGE (" + ukraineCode + " CAST INTEGER) = 1 OR" +
                    " TYP_LA_CTM SUBRANGE (" + ukraineCode + " CAST INTEGER) = 1) AND" +
                    " CDS_LNG_ID = " + russianId + " AND CDS_TEX_ID = TEX_ID AND TYP_CDS_ID = CDS_ID" +
                    " AND  CDS_CTM SUBRANGE (" + ukraineCode + " CAST INTEGER) = 1");
           
            ResultSetMetaData metaResult = result.getMetaData();
            int numberOfColumns = metaResult.getColumnCount();
           
            mysqlSt = mysqlConnection.createStatement();
            mysqlSt.executeUpdate(sqlDropTable);
           
            mysqlSt = mysqlConnection.createStatement();
            mysqlSt.executeUpdate(sqlCreateTable);
           
            for (String sql : sqlIndexes) {
                mysqlSt = mysqlConnection.createStatement();
                mysqlSt.executeUpdate(sql);
            }
           
            exportTableData(result, numberOfColumns, mysqlTable);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }[/code]


Експорт запчастин

[code]
    public void exportArticles() {
       
        final String tableName = "TOF_ARTICLES";
        final String tableCountry = "TOF_DESIGNATIONS";
        final String tableDescriptions = "TOF_DES_TEXTS";
        final String mysqlTable = "tof_articles_new";
       
        final String sqlDropTable = "DROP TABLE IF EXISTS " + mysqlTable;
        final String sqlCreateTable = " CREATE TABLE IF NOT EXISTS " + mysqlTable + " (" +
                "id int(11), " +
                "article_nr VARCHAR(80), " +
                "supplier_id int(11), " +
                "description VARCHAR(1024), " +
                "PRIMARY KEY (id)" +
                ")";
       
        final String[] sqlIndexes = {
                "ALTER TABLE " + mysqlTable + " ADD INDEX (supplier_id)",
                "ALTER TABLE " + mysqlTable + " ADD INDEX (article_nr)"
        };
       
               
        Statement st;
        Statement mysqlSt;
        try {
           

            mysqlSt = mysqlConnection.createStatement();
            mysqlSt.executeUpdate(sqlDropTable);
           
            mysqlSt = mysqlConnection.createStatement();
            mysqlSt.executeUpdate(sqlCreateTable);
           
            for (String sql : sqlIndexes) {
                mysqlSt = mysqlConnection.createStatement();
                mysqlSt.executeUpdate(sql);
            }
       
            st = connection.createStatement();
            ResultSet result = st.executeQuery("SELECT ART_ID, ART_ARTICLE_NR, ART_SUP_ID, TEX_TEXT" +
                    " FROM " + tableName + ", " + tableCountry + ", " + tableDescriptions + " " +
                    " WHERE ART_CTM SUBRANGE (" + ukraineCode + " CAST INTEGER) = 1 AND " +
                    " DES_LNG_ID = " + russianId + " AND DES_TEX_ID = TEX_ID AND " +
                    " ART_COMPLETE_DES_ID = DES_ID");
            ResultSetMetaData metaResult = result.getMetaData();
            int numberOfColumns = metaResult.getColumnCount();

            exportTableData(result, numberOfColumns, mysqlTable);
            result.close();
            st.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
[/code]


Експорт постачальників

[code]
public void exportSuppliers() {
       
        final String tableName = "TOF_SUPPLIERS";
        final String mysqlTable = "tof_suppliers";
       
        final String sqlDropTable = "DROP TABLE IF EXISTS " + mysqlTable;
        final String sqlCreateTable = " CREATE TABLE IF NOT EXISTS " + mysqlTable + " (" +
                "id int(11), " +
                "brand VARCHAR(100), " +
                "alias VARCHAR(100), " +
                "supplier_nr int(11), " +
                "PRIMARY KEY (id)" +
                ")";
       
        final String[] sqlIndexes = {
                "ALTER TABLE " + mysqlTable + " ADD INDEX (brand)",
                "ALTER TABLE " + mysqlTable + " ADD INDEX (supplier_nr)"
        };
   
               
        Statement st;
        Statement mysqlSt;
        try {


            mysqlSt = mysqlConnection.createStatement();
            mysqlSt.executeUpdate(sqlDropTable);

            mysqlSt = mysqlConnection.createStatement();
            mysqlSt.executeUpdate(sqlCreateTable);
           
            for (String sql : sqlIndexes) {
                mysqlSt = mysqlConnection.createStatement();
                mysqlSt.executeUpdate(sql);
            }
           
            st = connection.createStatement();
            ResultSet result = st.executeQuery("SELECT DISTINCT SUP_ID, SUP_BRAND, SUP_BRAND, SUP_SUPPLIER_NR" +
                    " FROM " + tableName);
            ResultSetMetaData metaResult = result.getMetaData();
            int numberOfColumns = metaResult.getColumnCount();

            exportTableData(result, numberOfColumns, mysqlTable);
            result.close();
            st.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
[/code]


Експорт пошукової таблиці

[code]
    public void exportArticlesLookup() {
        final String tableName = "TOF_ART_LOOKUP";
        final String mysqlTable = "tof_articles_lookup_new";
       
        final String sqlDropTable = "DROP TABLE IF EXISTS " + mysqlTable;
        final String sqlCreateTable = " CREATE TABLE IF NOT EXISTS " + mysqlTable + " (" +
                "article_id int(11), " +
                "search varchar(105), " +
                "display varchar(105), " +
                "article_type smallint(11), " +
                "brand_id int(11) " +
                ")";
       
        final String[] sqlIndexes = {
                "ALTER TABLE " + mysqlTable + " ADD INDEX (article_id)",
                "ALTER TABLE " + mysqlTable + " ADD INDEX (search)",
                "ALTER TABLE " + mysqlTable + " ADD INDEX (article_type)",
                "ALTER TABLE " + mysqlTable + " ADD INDEX (brand_id)"
        };
       
        Statement st;
        Statement mysqlSt;
        try {
            st = connection.createStatement();
            ResultSet result = st.executeQuery("SELECT ARL_ART_ID, ARL_SEARCH_NUMBER, ARL_DISPLAY_NR, ARL_KIND, ARL_BRA_ID" +
                    " FROM " + tableName + " ORDER BY ARL_ART_ID");
           
            ResultSetMetaData metaResult = result.getMetaData();
            int numberOfColumns = metaResult.getColumnCount();
           
            mysqlSt = mysqlConnection.createStatement();
            mysqlSt.executeUpdate(sqlDropTable);
            mysqlSt = mysqlConnection.createStatement();
            mysqlSt.executeUpdate(sqlCreateTable);
           
            for (String sql : sqlIndexes) {
                mysqlSt = mysqlConnection.createStatement();
                mysqlSt.executeUpdate(sql);
            }
           
            exportTableData(result, numberOfColumns, mysqlTable);
            result.close();
            st.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }       
    }
[/code]


Експорт дерева груп запчастин та допоміжні таблиці

[code]
    public void exportSearchTree() {
        final String tableName = "TOF_SEARCH_TREE";
        final String mysqlTable = "tof_search_tree";
        final String tableCountry = "TOF_DESIGNATIONS";
        final String tableDescriptions = "TOF_DES_TEXTS";
       
        final String sqlDropTable = "DROP TABLE IF EXISTS " + mysqlTable;
        final String sqlCreateTable = " CREATE TABLE IF NOT EXISTS " + mysqlTable + " (" +
                "id INT(11), " +
                "parent_id INT(11), " +
                "type SMALLINT(2), " +
                "level SMALLINT(2), " +
                "node_number INT(11), " +
                "sort INT(11), " +
                "text VARCHAR(255), " +
                "PRIMARY KEY (id)" +
                ")";
        final String[] sqlIndexes = {
                "ALTER TABLE " + mysqlTable + " ADD INDEX (level)",
                "ALTER TABLE " + mysqlTable + " ADD INDEX (sort)",
                "ALTER TABLE " + mysqlTable + " ADD INDEX (type)",
                "ALTER TABLE " + mysqlTable + " ADD INDEX (parent_id)"
        };
       
        Statement st;
        Statement mysqlSt;
        try {
            st = connection.createStatement();
            ResultSet result = st.executeQuery("SELECT DISTINCT STR_ID, STR_ID_PARENT, STR_TYPE, STR_LEVEL, STR_SORT, STR_NODE_NR, TEX_TEXT" +
                    " FROM " + tableName + ", " + tableCountry + ", " + tableDescriptions + " " +
                    " WHERE DES_LNG_ID = " + russianId + " AND DES_TEX_ID = TEX_ID AND " +
                    " DES_ID=STR_DES_ID");
            ResultSetMetaData metaResult = result.getMetaData();
            int numberOfColumns = metaResult.getColumnCount();
           
            mysqlSt = mysqlConnection.createStatement();
            mysqlSt.executeUpdate(sqlDropTable);
            mysqlSt = mysqlConnection.createStatement();
            mysqlSt.executeUpdate(sqlCreateTable);
           
            for (String sql : sqlIndexes) {
                mysqlSt = mysqlConnection.createStatement();
                mysqlSt.executeUpdate(sql);
            }
           
            exportTableData(result, numberOfColumns, mysqlTable);
            result.close();
            st.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }       
    }
   
    public void exportLinkGenericArticleSearchTree() {
        final String tableName = "TOF_LINK_GA_STR";
        final String mysqlTable = "tof_link_generic_article_search_tree";
       
        final String sqlDropTable = "DROP TABLE IF EXISTS " + mysqlTable;
        final String sqlCreateTable = " CREATE TABLE IF NOT EXISTS " + mysqlTable + " (" +
                "search_tree_id INT(11), " +
                "generic_article_id INT(11)" +
                ")";
        final String[] sqlIndexes = {
                "ALTER TABLE " + mysqlTable + " ADD INDEX (search_tree_id)",
                "ALTER TABLE " + mysqlTable + " ADD INDEX (generic_article_id)"
        };
       
        Statement st;
        Statement mysqlSt;
        try {
            st = connection.createStatement();
            ResultSet result = st.executeQuery("SELECT DISTINCT LGS_STR_ID, LGS_GA_ID" +
                    " FROM " + tableName);
            ResultSetMetaData metaResult = result.getMetaData();
            int numberOfColumns = metaResult.getColumnCount();
           
            mysqlSt = mysqlConnection.createStatement();
            mysqlSt.executeUpdate(sqlDropTable);
            mysqlSt = mysqlConnection.createStatement();
            mysqlSt.executeUpdate(sqlCreateTable);
           
            for (String sql : sqlIndexes) {
                mysqlSt = mysqlConnection.createStatement();
                mysqlSt.executeUpdate(sql);
            }
           
            exportTableData(result, numberOfColumns, mysqlTable);
            result.close();
            st.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }       
    }

[/code]


Експорт параметрів запчастин

[code]
public void exportCriteria() {
       
        final String tableName = "TOF_CRITERIA";
        final String tableCountry = "TOF_DESIGNATIONS";
        final String tableDescriptions = "TOF_DES_TEXTS";
        final String mysqlTable = "tof_criteria";
       
        final String sqlDropTable = "DROP TABLE IF EXISTS " + mysqlTable;
        final String sqlCreateTable = " CREATE TABLE IF NOT EXISTS " + mysqlTable + " (" +
                "id int(11) PRIMARY KEY," +
                "description varchar(255)," +
                "unit int(11)," +
                "type varchar(6)," +
                "is_interval int(5)," +
                "successor int(11) " +
            ")";
       
        final String[] sqlIndexes = {
                "ALTER TABLE " + mysqlTable + " ADD INDEX (id)"
        };
       
        Statement st;
        Statement mysqlSt;
        try {
           
            System.out.println("Export Criteria");
           
            st = connection.createStatement();
            ResultSet result = st.executeQuery("SELECT CRI_ID, TEX_TEXT, CRI_UNIT_DES_ID, CRI_TYPE, CRI_IS_INTERVAL, CRI_SUCCESSOR" +
                    " FROM " + tableName + ", " + tableCountry + ", " + tableDescriptions + " WHERE" +
                    " DES_LNG_ID = " + russianId + " AND DES_TEX_ID = TEX_ID AND CRI_SHORT_DES_ID = DES_ID");           
            ResultSetMetaData metaResult = result.getMetaData();
            int numberOfColumns = metaResult.getColumnCount();
           
            mysqlSt = mysqlConnection.createStatement();
            mysqlSt.executeUpdate(sqlDropTable);
           
            mysqlSt = mysqlConnection.createStatement();
            mysqlSt.executeUpdate(sqlCreateTable);
           
            for (String sql : sqlIndexes) {
                mysqlSt = mysqlConnection.createStatement();
                mysqlSt.executeUpdate(sql);
            }
           
            exportTableData(result, numberOfColumns, mysqlTable);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

public void exportArticlesAttributes() {
   
    final String tableName = "TOF_ARTICLE_INFO";
    final String tableCountry = "TOF_TEXT_MODULES";
    final String tableDescriptions = "TOF_TEXT_MODULE_TEXTS";
    final String mysqlTable = "tof_article_info";
   
    final String sqlDropTable = "DROP TABLE IF EXISTS " + mysqlTable;
    final String sqlCreateTable = " CREATE TABLE IF NOT EXISTS " + mysqlTable + " (" +
            "article_id int(11)," +
            "sort int(11)," +
            "description TEXT" +
        ")";
   
    final String[] sqlIndexes = {
            "ALTER TABLE " + mysqlTable + " ADD INDEX (article_id)"
    };
   
    Statement st;
    Statement mysqlSt;
    try {
       
        System.out.println("Export Info");
       
        st = connection.createStatement();
        ResultSet result = st.executeQuery("SELECT AIN_ART_ID, AIN_SORT, TMT_TEXT" +
                " FROM " + tableName + ", " + tableCountry + ", " + tableDescriptions + " WHERE" +
                " TMO_LNG_ID = " + russianId + " AND TMO_TMT_ID = TMT_ID AND AIN_TMO_ID = TMO_ID");           
        ResultSetMetaData metaResult = result.getMetaData();
        int numberOfColumns = metaResult.getColumnCount();
       
        mysqlSt = mysqlConnection.createStatement();
        mysqlSt.executeUpdate(sqlDropTable);
       
        mysqlSt = mysqlConnection.createStatement();
        mysqlSt.executeUpdate(sqlCreateTable);
       
        for (String sql : sqlIndexes) {
            mysqlSt = mysqlConnection.createStatement();
            mysqlSt.executeUpdate(sql);
        }
       
        exportTableData(result, numberOfColumns, mysqlTable);
    } catch (SQLException e) {
        e.printStackTrace();
    }
}
[/code]

Трохи пояснень:
- Tecdoc використовує поля *_CTM для зберігання інформації про країну. Вони зберігаються як послідовність бітів. Кожній країні відповідає певний біт. За допомогою логічного "і" можна визначити чи доступна дана запчастина/авто/інше в даній країні. Наступним чином можна відсікти все, що нам потрібно:

[code=sql]*_CTM SUBRANGE (" + ukraineCode + " CAST INTEGER) = 1[/code]

- Для зберігання всіх текстів використовується окрема таблиця - TOF_DES_TEXTS. TOF_DESIGNATIONS - допоміжна таблиця, яка зв'язує мову та id тексу, який потрібно отримати. Приклад для описання запчастини (ART_COMPLETE_DES_ID):

[code=sql]DES_LNG_ID = " + russianId + " AND DES_TEX_ID = TEX_ID AND ART_COMPLETE_DES_ID = DES_ID[/code]

Здається нічого не забув. Приведу ще код для підключення до mysql та виклик цього всього:

MysqlHelper

[code]
/**
Author: Leonid Yaremchuk
Date: 2012-09-12
Company: http://leonid.pro/
*/
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class MysqlHelper {
    private static final String dbDriver = "com.mysql.jdbc.Driver";
    private static final String dbUrl = "jdbc:mysql://leoparts.com.ua:3306/";
    private static final String dbDatabase = "leo_leoparts";
    private static final String dbUser = "leo_leoparts";
    private static final String dbPassword = "*****";
    private static final String characterEncoding = "utf-8";
    private Connection connection = null;

    public MysqlHelper() {
        try {
            Class.forName(dbDriver);
            connection = DriverManager.getConnection(dbUrl + dbDatabase + "?characterEncoding=utf-8&useUnicode=true", dbUser, dbPassword);
           
            String sqlCharset = "SET NAMES utf8 COLLATE utf8_general_ci";
            Statement st = connection.createStatement();
            st.executeQuery(sqlCharset);
            st.executeQuery("SET CHARACTER SET utf8");
           
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();   
        }
       
    }
   
    public Connection getConnection() {
        return connection;
    }
}
[/code]


MysqlHelper

[code]
/**
Author: Leonid Yaremchuk
Date: 2012-09-10
Company: http://leonid.pro/
*/

// run java -classpath tbjdbc.jar:mysql-connector-java-5.1.20-bin.jar:. TecdocExport

public class TecdocExport {

    public static void main(String[] args) {
        ExportHelper helper = new ExportHelper(new MysqlHelper().getConnection());
        helper.printSysTable();
       
        // Cars
        //helper.exportManufacturers();   
        //helper.exportModels();
        //helper.exportTypes();
        //helper.exportTypesBody();
        //helper.exportTypesEngine();
        //helper.exportTypesFuel();
        //helper.exportTypesDrive();
        //helper.exportLinkTypeEngine();
        //helper.exportEngines();
       
        // Articles
        //helper.exportArticles();
        //helper.exportSuppliers();
        //helper.exportArticlesLookup();
        //helper.exportLinkTypeArticle();
        //helper.exportArticlesLink();
        //helper.exportGenericArticles();
        //helper.exportLinkGenericArticleSearchTree();
        //helper.exportArticlesAttributes();
        //helper.exportSearchTree();
        //helper.exportLinkGenericArticleSearchTree();
        //helper.exportCriteriaArticle();   
        //helper.exportPictures();
        helper.close();
    }

}
[/code]

P.S. 1) Кому цікаво, що в мене вийшло: http://leoparts.com.ua/  :)
2) JDBC-драйвери в прикріплених файлах
3) Якщо вам сподобалась стаття не забувайте поділитись в соціальних мережах.
4) Якщо вас цікавить розробка сайту автозапчастин, то прошу на http://leonid.pro/

Post's attachments

mysql-connector-java-5.1.20-bin.jar 783.91 kb, 2754 downloads since 2013-06-22 

tbjdbc.jar 216.65 kb, 2756 downloads since 2013-06-22 

2

Re: Експорт з Tecdoc в Mysql (TecDoc Online)

Тема виявилась дуже популярною, принаймі багато людей пишуть мені, запитують.

Відповіді на питання, які часто задаються:

1. Чи змінюється структура бази в порівнянні з оригінальним tecdoc?
Так. Структура трохи інша. Деякі таблиці розбить, деякі поєднані, певні поля були видалені. Тобто, якщо ви десь знайшли скрипт, який працює з незмінною базою tecdoc, то цей код навряд вам допоможе.

2. Як зробити експорт картинок з Tecdoc?
Ось код. Розбирайтесь, можливо написано не найкращим чином, але працює.

Експорт картинок Tecdoc
    public void exportPictures() {
        
        final String mysqlTable = "tof_graphics";
        
        final String sqlDropTable = "DROP TABLE IF EXISTS " + mysqlTable;
        final String sqlCreateTable = " CREATE TABLE IF NOT EXISTS " + mysqlTable + " (" +
                "article_id int(11), " +
                "image VARCHAR(100)" +
                ") ENGINE=MYISAM DEFAULT CHARSET=utf8";
        
        
        final String[] sqlIndexes = {
                "ALTER TABLE " + mysqlTable + " ADD INDEX (article_id)"
        };
        
        Statement st;
        Statement mysqlSt;
    
        try {
            
            System.out.println("Export pictures");
            
            st = connection.createStatement();
            ResultSet result = st.executeQuery("SELECT LGA_ART_ID, GRA_ID, GRA_TAB_NR, GRA_GRD_ID, DOC_EXTENSION, GRA_LNG_ID FROM TOF_LINK_GRA_ART, TOF_GRAPHICS, TOF_DOC_TYPES WHERE DOC_TYPE=GRA_DOC_TYPE AND LGA_GRA_ID=GRA_ID AND GRA_TAB_NR IS NOT NULL ORDER BY GRA_TAB_NR");
            
            ResultSetMetaData metaResult = result.getMetaData();
            
            mysqlSt = mysqlConnection.createStatement();
            mysqlSt.executeUpdate(sqlDropTable);
            mysqlSt = mysqlConnection.createStatement();
            mysqlSt.executeUpdate(sqlCreateTable);
            
        
            for (String sql : sqlIndexes) {
                mysqlSt = mysqlConnection.createStatement();
                mysqlSt.executeUpdate(sql);
            }
            
            int count = 0;
            
            ArrayList<Integer> tableNumber = new ArrayList<Integer>();
            ArrayList<Integer> ids = new ArrayList<Integer>();
            ArrayList<Integer> articles = new ArrayList<Integer>();
            
            
            while (result.next()) {
                tableNumber.add(count, result.getInt(3));
                ids.add(count, result.getInt(4));
                articles.add(count, result.getInt(1));
                count++;
                System.out.println(count);
            }
            
            int limit = 1000;
            
            String sql = "INSERT INTO " + mysqlTable + " VALUES (?, ?)";            
            PreparedStatement ps = mysqlConnection.prepareStatement(sql);
            mysqlConnection.setAutoCommit(false);
            for (int i = 0; i < ids.size(); i++) {

                ps.setLong(1, articles.get(i));
                System.out.println(tableNumber.get(i)+ "/" + ids.get(i) + ".jpg");
                ps.setString(2, tableNumber.get(i)+ "/" + ids.get(i) + ".jpg");
                ps.addBatch();
                
                if (i % 5000 == 4500) {
                    System.out.println(i);
                    ps.executeBatch();
                    mysqlConnection.commit();
                }
            }
            ps.executeBatch();
            mysqlConnection.commit();
            ps.close();
                        
            for (int i = 0; i < ids.size(); i++) {
            
                try {
                  OutputStream output = null;
                  try {
                    File dir = new File("/Users/leo/images/" + tableNumber.get(i)+ "/");
                    if (!dir.exists()) {
                        dir.mkdir();
                    }
                    
                    File file = new File("/Users/leo/images/" + tableNumber.get(i)+ "/" + ids.get(i) + ".jpg");
                    
                    System.out.print(i + " " +tableNumber.get(i)+ "-" + ids.get(i));
                    if (file.exists()) {
                        System.out.println(" - skip");
                            ;
                    }
                    System.out.println(" - write");
                    
                    Statement st3 = connection.createStatement();
                    String sql = "SELECT GRD_GRAPHIC FROM TOF_GRA_DATA_" + tableNumber.get(i) + " WHERE GRD_ID=" + ids.get(i);
                    ResultSet result2 = st3.executeQuery(sql);
                    result2.next();
                    byte[] data = result2.getBytes(1);
                    
                    output = new BufferedOutputStream(new FileOutputStream(file));
                    output.write(data);
                    output.close();
                    this.convertImage("/Users/leo/images/" + tableNumber.get(i)+ "/" + ids.get(i) + ".jpg");
                  } catch(FileNotFoundException ex){
                      ex.printStackTrace();
                  }
                } catch(IOException ex){
                  ex.printStackTrace();
                }
                
            }
            
            
        } catch (SQLException e) {
            e.printStackTrace();
        }
        
    }
    

3. В якому форматі будуть вихідні картинки?
На виході картинки в форматі JPEG2000. Для конвертації в звичайний JPEG можна використати спеціально призначені програми, або робити це одразу при збереженні. Ось код для того щоб конвертувати на льоту.

Конвертація з JPEG2000 в JPEG
    public boolean convertImage(String path) {
        try {
            
            Iterator<ImageReader> iter = ImageIO.getImageReadersByFormatName("JPEG2000");
            ImageReader reader = iter.next();

            if(reader == null) {
                System.out.println("Could not locate any Readers for the JPEG 2000 format image.");
                return true;
            } else {
            //    System.out.println(reader.getFormatName());
            }
            
            BufferedImage image = null;
            image = ImageIO.read(new File(path));
            File outputFile = new File(path);
            ImageWriter writer = ImageIO.getImageWritersByFormatName("jpeg").next();
            ImageWriteParam param = writer.getDefaultWriteParam();
            param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); // Needed see javadoc
            param.setCompressionQuality(0.9F); // Highest quality
            writer.setOutput(ImageIO.createImageOutputStream(outputFile));
            writer.write(null, new IIOImage(image, null, null), param);
            writer.dispose();

        } catch (IOException e) {
            e.printStackTrace();
        }
        return true;
    }

4. Чи є різниця яка в мене версія Tecdoc?
Ні, немає різниці. Нещодавно робив експорт для Tecdoc 2014 (1 квартал) і все успішно пройшло.

5. Який розмір диску потрібен для бази та картинок?
Приблизно 15 гб для бази та 30 гб для картинок.

6. Чи не могли би ви мені допомогти з експортом в MySQL. Я зовсім не знаю Java.
Такі питання я просто ігнорую. У мене не так багато часу щоб всім допомагати.

Подякували: coba432

3

Re: Експорт з Tecdoc в Mysql (TecDoc Online)

Не могли би ви ще дати інформацію по фільтрах. При експорті моделей машин по типах у мене в вибірці багато зайвого - видно по полю TYP_SORT .Значення TYP_LA_CTM однотипні (для задвоєних записів) ,а TYP_CTM хоть і має відмінності але не дає потрібний фільтр - не відповідає виводу на екран ТекДока

4 Востаннє редагувалося coba43 (12.02.2014 09:04:48)

Re: Експорт з Tecdoc в Mysql (TecDoc Online)

Знайшов причину дублікатів сам. Якщо когось цікавить дане питання то потрібно фільтрувати поле CDS_CTM таблиці TECDOC_TOF_COUNTRY_DESIGNATIONS (через неї виводимо опис) і TECDOC_TOF_TYPES по TYP_CTM.

5

Re: Експорт з Tecdoc в Mysql (TecDoc Online)

Hello.
Thank you very much for this article and all of the code. I am very grateful.
I have a couple of questions and I would be glad if you could help me.
I do not know Ukrainian and sorry for my bad English.

Подякували: Replace1

6

Re: Експорт з Tecdoc в Mysql (TecDoc Online)

Hi, Thanks.  :)
You can ask any questions in this topic.

7

Re: Експорт з Tecdoc в Mysql (TecDoc Online)

Прихований текст

Нарешті збулась мрія одного пана, і на наш форум завітав справжній англомовний іноземець.

8

Re: Експорт з Tecdoc в Mysql (TecDoc Online)

Прихований текст
Replace написав:

Hi, Thanks.  :)
You can ask any questions in this topic.

Хм... За правилами

1.1. Мовою спілкування на форумі є українська. Якщо у вас з українською мовою проблема, ви можете використовувати будь-який російськомовний форум такої ж тематики.

і є окремий розділ...

9

Re: Експорт з Tecdoc в Mysql (TecDoc Online)

Chemist-i

Розуйте очі, пане Chemist-i, бо ви там ґав рахували, а не допис нашого ізраїльського комрада читали. А якби ж прочитали останній рядок, то помітили б там -

I do not know Ukrainian and sorry for my bad English.

Проте, особисто мене, тішать такі неформальні євроінтеграційні процеси.

10

Re: Експорт з Tecdoc в Mysql (TecDoc Online)

Прихований текст

За статистикою цю тему більше переглядають іноземці ніж українці, тому можна зробити виключення з правил. Я думаю користувача з ніком david цікавить лише tecdoc.
У мене колись було в профілі вказано велику кількість контактних даних тому писали особисто мені.
Крім того краще англійська, ніж українська через google translate.

11

Re: Експорт з Tecdoc в Mysql (TecDoc Online)

Доброго дня! Дякую за матеріал! Хотів запитати чи можете кинути дані методи або самі селекти до БД helper.exportTypesBody(); helper.exportTypesEngine(); helper.exportTypesFuel(); helper.exportTypesDrive();        helper.exportLinkTypeEngine(); helper.exportEngines(); helper.exportLinkTypeArticle(); helper.exportArticlesLink(); helper.exportGenericArticles(); helper.exportCriteriaArticle(); helper.close();

12

Re: Експорт з Tecdoc в Mysql (TecDoc Online)

Будь ласка:

Tecdoc exportTypesBody
public void exportTypesBody() {
        
        final String tableName = "TOF_TYPES";
        final String tableCountry = "TOF_DESIGNATIONS";
        final String tableDescriptions = "TOF_DES_TEXTS";
        final String mysqlTable = "tof_types_body";
        
        final String sqlDropTable = "DROP TABLE IF EXISTS " + mysqlTable;
        final String sqlCreateTable = " CREATE TABLE IF NOT EXISTS " + mysqlTable + " (" +
                "id int(11) PRIMARY KEY," +
                "body varchar(100)" +
                ")";
        
        Statement st;
        Statement mysqlSt;
        try {
            
            System.out.println("Export types body");
            
            st = connection.createStatement();
            ResultSet result = st.executeQuery("SELECT TYP_ID, TEX_TEXT " +
                    " FROM " + tableName + ", " + tableCountry + ", " + tableDescriptions + " WHERE" +
                    " (TYP_CTM SUBRANGE (" + ukraineCode + " CAST INTEGER) = 1 OR" +
                    " TYP_LA_CTM SUBRANGE (" + ukraineCode + " CAST INTEGER) = 1) AND" +
                    " DES_LNG_ID = " + russianId + " AND DES_TEX_ID = TEX_ID AND TYP_KV_BODY_DES_ID = DES_ID");
            
            ResultSetMetaData metaResult = result.getMetaData();
            int numberOfColumns = metaResult.getColumnCount();
            
            mysqlSt = mysqlConnection.createStatement();
            mysqlSt.executeUpdate(sqlDropTable);
            
            mysqlSt = mysqlConnection.createStatement();
            mysqlSt.executeUpdate(sqlCreateTable);
            
            exportTableData(result, numberOfColumns, mysqlTable);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        
    }

Tecdoc exportTypesEngine
public void exportTypesEngine() {
        
        final String tableName = "TOF_TYPES";
        final String tableCountry = "TOF_DESIGNATIONS";
        final String tableDescriptions = "TOF_DES_TEXTS";
        final String mysqlTable = "tof_types_engine";
        
        final String sqlDropTable = "DROP TABLE IF EXISTS " + mysqlTable;
        final String sqlCreateTable = " CREATE TABLE IF NOT EXISTS " + mysqlTable + " (" +
                "id int(11) PRIMARY KEY," +
                "engine varchar(100)" +
                ")";
        
        Statement st;
        Statement mysqlSt;
        try {
            
            System.out.println("Export types engines");
            
            st = connection.createStatement();
            ResultSet result = st.executeQuery("SELECT TYP_ID, TEX_TEXT " +
                    " FROM " + tableName + ", " + tableCountry + ", " + tableDescriptions + " WHERE" +
                    " (TYP_CTM SUBRANGE (" + ukraineCode + " CAST INTEGER) = 1 OR" +
                    " TYP_LA_CTM SUBRANGE (" + ukraineCode + " CAST INTEGER) = 1) AND" +
                    " DES_LNG_ID = " + russianId + " AND DES_TEX_ID = TEX_ID AND TYP_KV_ENGINE_DES_ID = DES_ID");
            
            ResultSetMetaData metaResult = result.getMetaData();
            int numberOfColumns = metaResult.getColumnCount();
            
            mysqlSt = mysqlConnection.createStatement();
            mysqlSt.executeUpdate(sqlDropTable);
            
            mysqlSt = mysqlConnection.createStatement();
            mysqlSt.executeUpdate(sqlCreateTable);
            
            exportTableData(result, numberOfColumns, mysqlTable);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        
    }

Tecdoc exportTypesFuel
public void exportTypesFuel() {
    
    final String tableName = "TOF_TYPES";
    final String tableCountry = "TOF_DESIGNATIONS";
    final String tableDescriptions = "TOF_DES_TEXTS";
    final String mysqlTable = "tof_types_fuel";
    
    final String sqlDropTable = "DROP TABLE IF EXISTS " + mysqlTable;
    final String sqlCreateTable = " CREATE TABLE IF NOT EXISTS " + mysqlTable + " (" +
            "id int(11) PRIMARY KEY," +
            "fuel varchar(100)" +
            ")";
    
    Statement st;
    Statement mysqlSt;
    try {
        
        System.out.println("Export types fuel");
        
        st = connection.createStatement();
        ResultSet result = st.executeQuery("SELECT TYP_ID, TEX_TEXT " +
                " FROM " + tableName + ", " + tableCountry + ", " + tableDescriptions + " WHERE" +
                " (TYP_CTM SUBRANGE (" + ukraineCode + " CAST INTEGER) = 1 OR" +
                " TYP_LA_CTM SUBRANGE (" + ukraineCode + " CAST INTEGER) = 1) AND" +
                " DES_LNG_ID = " + russianId + " AND DES_TEX_ID = TEX_ID AND TYP_KV_FUEL_DES_ID = DES_ID");
        
        ResultSetMetaData metaResult = result.getMetaData();
        int numberOfColumns = metaResult.getColumnCount();
        
        mysqlSt = mysqlConnection.createStatement();
        mysqlSt.executeUpdate(sqlDropTable);
        
        mysqlSt = mysqlConnection.createStatement();
        mysqlSt.executeUpdate(sqlCreateTable);
        
        exportTableData(result, numberOfColumns, mysqlTable);
    } catch (SQLException e) {
        e.printStackTrace();
    }
    
}

Tecdoc exportTypesDrive
public void exportTypesDrive() {
    
    final String tableName = "TOF_TYPES";
    final String tableCountry = "TOF_DESIGNATIONS";
    final String tableDescriptions = "TOF_DES_TEXTS";
    final String mysqlTable = "tof_types_drive";
    
    final String sqlDropTable = "DROP TABLE IF EXISTS " + mysqlTable;
    final String sqlCreateTable = " CREATE TABLE IF NOT EXISTS " + mysqlTable + " (" +
            "id int(11) PRIMARY KEY," +
            "drive varchar(100)" +
            ")";
    
    Statement st;
    Statement mysqlSt;
    try {
        
        System.out.println("Export types drive");
        
        st = connection.createStatement();
        ResultSet result = st.executeQuery("SELECT TYP_ID, TEX_TEXT " +
                " FROM " + tableName + ", " + tableCountry + ", " + tableDescriptions + " WHERE" +
                " (TYP_CTM SUBRANGE (" + ukraineCode + " CAST INTEGER) = 1 OR" +
                " TYP_LA_CTM SUBRANGE (" + ukraineCode + " CAST INTEGER) = 1) AND" +
                " DES_LNG_ID = " + russianId + " AND DES_TEX_ID = TEX_ID AND TYP_KV_DRIVE_DES_ID = DES_ID");
        
        ResultSetMetaData metaResult = result.getMetaData();
        int numberOfColumns = metaResult.getColumnCount();
        
        mysqlSt = mysqlConnection.createStatement();
        mysqlSt.executeUpdate(sqlDropTable);
        
        mysqlSt = mysqlConnection.createStatement();
        mysqlSt.executeUpdate(sqlCreateTable);
        
        exportTableData(result, numberOfColumns, mysqlTable);
    } catch (SQLException e) {
        e.printStackTrace();
    }
    
}

Tecdoc exportLinkTypeEngine
public void exportLinkTypeEngine() {
    
    final String tableName = "tof_link_typ_eng";
    final String mysqlTable = "tof_link_type_engine";
    
    final String sqlDropTable = "DROP TABLE IF EXISTS " + mysqlTable;
    final String sqlCreateTable = " CREATE TABLE IF NOT EXISTS " + mysqlTable + " (" +
            "type_id int(11), " +
            "engine_id int(11) " +
            ")";
    
    final String[] sqlIndexes = {
            "ALTER TABLE " + mysqlTable + " ADD INDEX (type_id)",
            "ALTER TABLE " + mysqlTable + " ADD INDEX (engine_id)"
    };
            
    Statement st;
    Statement mysqlSt;
    try {
        
        
        mysqlSt = mysqlConnection.createStatement();
        mysqlSt.executeUpdate(sqlDropTable);
        mysqlSt = mysqlConnection.createStatement();
        mysqlSt.executeUpdate(sqlCreateTable);
        
        for (String sql : sqlIndexes) {
            mysqlSt = mysqlConnection.createStatement();
            mysqlSt.executeUpdate(sql);
        }
        
        
        st = connection.createStatement();
        ResultSet result = st.executeQuery("SELECT DISTINCT lte_typ_id, lte_eng_id " +
                " FROM " + tableName);
        
        ResultSetMetaData metaResult = result.getMetaData();
        int numberOfColumns = metaResult.getColumnCount();
        
        exportTableData(result, numberOfColumns, mysqlTable);
        result.close();
        st.close();
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

Tecdoc exportEngines
public void exportEngines() {
    
    final String tableName = "TOF_ENGINES";
    final String tableCountry = "TOF_DESIGNATIONS";
    final String tableDescriptions = "TOF_DES_TEXTS";
    final String mysqlTable = "tof_engines";
    
    final String sqlDropTable = "DROP TABLE IF EXISTS " + mysqlTable;
    final String sqlCreateTable = " CREATE TABLE IF NOT EXISTS " + mysqlTable + " (" +
            "id int(11) PRIMARY KEY," +
            "eng_code varchar(100) " +
            ")";
    
    Statement st;
    Statement mysqlSt;
    try {
        
        System.out.println("Export engines");
        
        st = connection.createStatement();
        ResultSet result = st.executeQuery("SELECT ENG_ID, ENG_CODE" +
                " FROM " + tableName + " WHERE" +
                " (ENG_CTM SUBRANGE (" + ukraineCode + " CAST INTEGER) = 1 OR" +
                " ENG_LA_CTM SUBRANGE (" + ukraineCode + " CAST INTEGER) = 1)");
        
        ResultSetMetaData metaResult = result.getMetaData();
        int numberOfColumns = metaResult.getColumnCount();
        
        mysqlSt = mysqlConnection.createStatement();
        mysqlSt.executeUpdate(sqlDropTable);
        
        mysqlSt = mysqlConnection.createStatement();
        mysqlSt.executeUpdate(sqlCreateTable);
        
        exportTableData(result, numberOfColumns, mysqlTable);
    } catch (SQLException e) {
        e.printStackTrace();
    }
    
}

Tecdoc exportLinkTypeArticle
public void exportLinkTypeArticle() {
        
        final String tableName = "TOF_LINK_LA_TYP";
        final String mysqlTable = "tof_link_type_article";
        
        final String sqlDropTable = "DROP TABLE IF EXISTS " + mysqlTable;
        final String sqlCreateTable = " CREATE TABLE IF NOT EXISTS " + mysqlTable + " (" +
                "type_id int(11), " +
                "article_link_id int(11), " +
                "generic_article_id int(11), " +
                "supplier_id int(11) " +
                ") ENGINE=MYISAM";
        
        final String[] sqlIndexes = {
                "ALTER TABLE " + mysqlTable + " ADD INDEX (type_id)",
                "ALTER TABLE " + mysqlTable + " ADD INDEX (article_link_id)",
                "ALTER TABLE " + mysqlTable + " ADD INDEX (generic_article_id)"
        };
                
        Statement st;
        Statement mysqlSt;
        try {
            
            
            mysqlSt = mysqlConnection.createStatement();
            mysqlSt.executeUpdate(sqlDropTable);
            mysqlSt = mysqlConnection.createStatement();
            mysqlSt.executeUpdate(sqlCreateTable);
            
            for (String sql : sqlIndexes) {
                mysqlSt = mysqlConnection.createStatement();
                mysqlSt.executeUpdate(sql);
            }
            
            
            st = connection.createStatement();
            ResultSet result = st.executeQuery("SELECT DISTINCT LAT_TYP_ID, LAT_LA_ID, LAT_GA_ID, LAT_SUP_ID" +
                    " FROM " + tableName + " WHERE LAT_CTM SUBRANGE (" + ukraineCode + " CAST INTEGER) = 1 AND LAT_TYP_ID >= 0");
            
            ResultSetMetaData metaResult = result.getMetaData();
            int numberOfColumns = metaResult.getColumnCount();
            
            exportTableData(result, numberOfColumns, mysqlTable);
            result.close();
            st.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    

Tecdoc exportArticlesLink
    public void exportArticlesLink() {
        final String tableName = "TOF_LINK_ART";
        final String mysqlTable = "tof_article_link";
        
        final String sqlDropTable = "DROP TABLE IF EXISTS " + mysqlTable;
        final String sqlCreateTable = " CREATE TABLE IF NOT EXISTS " + mysqlTable + " (" +
                "id INT(11), " +
                "article_id INT(11), " +
                "PRIMARY KEY (id)" +
                ") ENGINE = MYISAM";
        
        final String[] sqlIndexes = {
                "ALTER TABLE " + mysqlTable + " ADD INDEX (article_id)"
        };
        
        Statement st;
        Statement mysqlSt;
        try {
            st = connection.createStatement();
            ResultSet result = st.executeQuery("SELECT DISTINCT LA_ID, LA_ART_ID " +
                    " FROM " + tableName);
            
            ResultSetMetaData metaResult = result.getMetaData();
            int numberOfColumns = metaResult.getColumnCount();
            
            mysqlSt = mysqlConnection.createStatement();
            mysqlSt.executeUpdate(sqlDropTable);
            
            mysqlSt = mysqlConnection.createStatement();
            mysqlSt.executeUpdate(sqlCreateTable);
            
            for (String sql : sqlIndexes) {
                mysqlSt = mysqlConnection.createStatement();
                mysqlSt.executeUpdate(sql);
            }
            
            exportTableData(result, numberOfColumns, mysqlTable);
            result.close();
            st.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }        
    }
    

Tecdoc exportLinkTypeArticle
public void exportLinkTypeArticle() {
        
        final String tableName = "TOF_LINK_LA_TYP";
        final String mysqlTable = "tof_link_type_article";
        
        final String sqlDropTable = "DROP TABLE IF EXISTS " + mysqlTable;
        final String sqlCreateTable = " CREATE TABLE IF NOT EXISTS " + mysqlTable + " (" +
                "type_id int(11), " +
                "article_link_id int(11), " +
                "generic_article_id int(11), " +
                "supplier_id int(11) " +
                ") ENGINE=MYISAM";
        
        final String[] sqlIndexes = {
                "ALTER TABLE " + mysqlTable + " ADD INDEX (type_id)",
                "ALTER TABLE " + mysqlTable + " ADD INDEX (article_link_id)",
                "ALTER TABLE " + mysqlTable + " ADD INDEX (generic_article_id)"
        };
                
        Statement st;
        Statement mysqlSt;
        try {
            
            
            mysqlSt = mysqlConnection.createStatement();
            mysqlSt.executeUpdate(sqlDropTable);
            mysqlSt = mysqlConnection.createStatement();
            mysqlSt.executeUpdate(sqlCreateTable);
            
            for (String sql : sqlIndexes) {
                mysqlSt = mysqlConnection.createStatement();
                mysqlSt.executeUpdate(sql);
            }
            
            
            st = connection.createStatement();
            ResultSet result = st.executeQuery("SELECT DISTINCT LAT_TYP_ID, LAT_LA_ID, LAT_GA_ID, LAT_SUP_ID" +
                    " FROM " + tableName + " WHERE LAT_CTM SUBRANGE (" + ukraineCode + " CAST INTEGER) = 1 AND LAT_TYP_ID >= 0");
            
            ResultSetMetaData metaResult = result.getMetaData();
            int numberOfColumns = metaResult.getColumnCount();
            
            exportTableData(result, numberOfColumns, mysqlTable);
            result.close();
            st.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    

Tecdoc exportGenericArticles
    public void exportGenericArticles() {
        final String tableName = "TOF_GENERIC_ARTICLES";
        final String mysqlTable = "tof_generic_articles";
        final String tableCountry = "TOF_DESIGNATIONS";
        final String tableDescriptions = "TOF_DES_TEXTS";
        
        final String sqlDropTable = "DROP TABLE IF EXISTS " + mysqlTable;
        final String sqlCreateTable = " CREATE TABLE IF NOT EXISTS " + mysqlTable + " (" +
                "id INT(11), " +
                "description VARCHAR(255), " +
                "PRIMARY KEY (id)" + 
                ")";
        
        Statement st;
        Statement mysqlSt;
        try {
            st = connection.createStatement();
            ResultSet result = st.executeQuery("SELECT DISTINCT GA_ID, TEX_TEXT" +
                    " FROM " + tableName + ", " + tableCountry + ", " + tableDescriptions + " " +
                    " WHERE DES_LNG_ID = " + russianId + " AND DES_TEX_ID = TEX_ID AND " +
                    " DES_ID=GA_DES_ID");
            ResultSetMetaData metaResult = result.getMetaData();
            int numberOfColumns = metaResult.getColumnCount();
            
            mysqlSt = mysqlConnection.createStatement();
            mysqlSt.executeUpdate(sqlDropTable);
            mysqlSt = mysqlConnection.createStatement();
            mysqlSt.executeUpdate(sqlCreateTable);
            exportTableData(result, numberOfColumns, mysqlTable);
            result.close();
            st.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }        
    }
    

Tecdoc exportCriteriaArticle
    public void exportCriteriaArticle() {
        
        final String tableName = "TOF_ARTICLE_CRITERIA";
        final String tableCountry = "TOF_DESIGNATIONS";
        final String tableDescriptions = "TOF_DES_TEXTS";
        final String mysqlTable = "tof_article_criteria";
        
        final String sqlDropTable = "DROP TABLE IF EXISTS " + mysqlTable;
        final String sqlCreateTable = " CREATE TABLE IF NOT EXISTS " + mysqlTable + " (" +
                "article_id int(11)," +
                "sort int(11)," +
                "criteria_id int(11)," +
                "value varchar(100)," +
                "display int(11) " +
            ")";
        
        final String[] sqlIndexes = {
                "ALTER TABLE " + mysqlTable + " ADD INDEX (article_id)",
                "ALTER TABLE " + mysqlTable + " ADD INDEX (criteria_id)",
                "ALTER TABLE " + mysqlTable + " ADD INDEX (sort)"
        };
        
        Statement st;
        Statement mysqlSt;
        try {
            
            System.out.println("Export Article Criteria");
            
            st = connection.createStatement();
            ResultSet result = st.executeQuery(
                    "(SELECT ACR_ART_ID, ACR_SORT, ACR_CRI_ID, ACR_VALUE, ACR_DISPLAY" + 
                    " FROM " + tableName + " " +
                    "WHERE ACR_KV_DES_ID IS NULL) ");
                //    "(SELECT ACR_ART_ID, ACR_SORT, ACR_CRI_ID, TEX_TEXT, ACR_DISPLAY" + 
                //    " FROM " + tableName + ", " + tableCountry + ", " + tableDescriptions + " " +
                //    "WHERE ACR_KV_DES_ID=DES_ID AND DES_TEX_ID=TEX_ID AND ACR_KV_DES_ID IS NOT NULL AND DES_LNG_ID=" + russianId + ")" +
                //    "");        
            ResultSetMetaData metaResult = result.getMetaData();
            int numberOfColumns = metaResult.getColumnCount();
            
            //mysqlSt = mysqlConnection.createStatement();
            //mysqlSt.executeUpdate(sqlDropTable);
            
            //mysqlSt = mysqlConnection.createStatement();
            //mysqlSt.executeUpdate(sqlCreateTable);
            
            //for (String sql : sqlIndexes) {
            //    mysqlSt = mysqlConnection.createStatement();
            //    mysqlSt.executeUpdate(sql);
            //}
            
            exportTableData(result, numberOfColumns, mysqlTable);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

Tecdoc close
    public void close() {
        try {
        //    connection.close();
            mysqlConnection.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

Проте розбирайтесь самі, що до чого там :)
Я вже собаку з'їв. Почало нудити від Tecdoc.

Подякували: stud181177, pintiliy2

13

Re: Експорт з Tecdoc в Mysql (TecDoc Online)

Є дві проблеми з експортом картинок:
на початку декілька тис картинок експортується нормально, а далі ідуть биті картинки не відкриваюсться взагалі;
і з експортом даних з таблиці TOF_TEXT_MODULE_TEXTS поле TMT_TEXT(type BLOB) - локалізований текст перекодовується в крякозябри, а en версія імпортується нормально, все що зміг придумати перепробував
підкажіть будь-ласка як вирішити даний баг

14

Re: Експорт з Tecdoc в Mysql (TecDoc Online)

Метод cleanString
private String cleanString(String str) {
    str = str.replace("\\", "\\\\'");
    return str.replace("'", "\\'");
}

15

Re: Експорт з Tecdoc в Mysql (TecDoc Online)

Доброго часу дня! Я також зайнявся експортом бази з техдоку, пробую зараз зробити щось подібне на зразок вибору виробника, моделі, модифікації, і дойшов до дерева груп запчастин. Чи не могли б Ви мені на пальцях пояснити які дані і з яких таблиць потрібно використовувати для побудови ось такого дерева:
https://images.x10.name/spares-tree.png

16

Re: Експорт з Tecdoc в Mysql (TecDoc Online)

А ви оригінальну базу tecdoc використовуєте чи модифіковану (описано в цій темі)?

17 Востаннє редагувалося Oleksandr Zhyrytovskyi (17.04.2014 15:31:22)

Re: Експорт з Tecdoc в Mysql (TecDoc Online)

Використовую оригінальну
Доречі викачував ось таким скриптом:

<?php
    class Tecdoc {
        var $db;
    
        function __construct() {
            $connection_str = "Driver={Transbase ODBC TECDOC CD 1_2014};Database=TECDOC_CD_1_2014@localhost";
            $this->db = odbc_connect($connection_str,"tecdoc","tcd_error_0") or odbc_errormsg();
            
            mysql_connect("localhost", "tecdoc", "1111");
            mysql_select_db("tecdoc");
            mysql_set_charset("utf8");
        }
        
        function export($table_name) {
            echo "$table_name - processing... ";
            flush();
            
            $query = "SELECT * FROM " . $table_name;

            $data = odbc_exec($this->db, $query);
            odbc_longreadlen($data, 10485760);

            while($row = odbc_fetch_array($data)) {
                foreach($row as $key => $value) {
                    $keys[] = "`" . $key . "`";
                    $values[] = "'" . mysql_real_escape_string($value) . "'";
                }

                $mysql_query = "INSERT INTO `" . $table_name . "` (" . implode(",", $keys) . ") VALUES (" . implode(",", $values) . ")";
                mysql_query($mysql_query);
                //echo "$mysql_query<hr>";
                set_time_limit(3600);
                unset($keys);
                unset($values);
                unset($row);
            }
            echo "completed!<br>";
            flush();
        }
        
        function exportGraphics($table_name) {
            echo "$table_name - exporting... ";
            flush();
            
            $query = "SELECT * FROM " . $table_name;
            @mkdir("images/" . $table_name);

            $data = odbc_exec($this->db, $query);
            odbc_longreadlen($data, 10485760);
            while($row = odbc_fetch_array($data)) {
                if($row['GRD_ID'] != "") {
                    $file_name_jp2 = "images/" . $table_name . "/" . $row['GRD_ID'] . ".jp2";
                    $file = fopen ($file_name_jp2, "w");
                    fputs($file, $row['GRD_GRAPHIC']);
                    fclose($file);
                    set_time_limit(3600);
                    unset($row);
                }
            }
            echo "completed!<br>";
            flush();
        }
        
        function exportAllGraphics() {
            $result = odbc_tables($this->db);
            while (odbc_fetch_row($result)) {
                if(odbc_result($result, "TABLE_TYPE") == "TABLE") {
                    $name = odbc_result($result, "TABLE_NAME");
                    if (substr($name, 0, 12) == 'TOF_GRA_DATA')
                        if (!is_dir("images/" . $name))
                            $this->exportGraphics($name);
                }
            }
        }
    }
    
    $tecdoc = new Tecdoc();
    $tecdoc->export("TOF_MANUFACTURERS");
    $tecdoc->export("TOF_MODELS");
    $tecdoc->export("TOF_DES_TEXTS");
    $tecdoc->export("TOF_COUNTRY_DESIGNATIONS");
    $tecdoc->export("TOF_DESIGNATIONS");
    $tecdoc->export("TOF_TYPES");
    $tecdoc->export("TOF_ARTICLES");
    $tecdoc->export("TOF_SUPPLIERS");
    $tecdoc->export("TOF_ART_LOOKUP");
    $tecdoc->export("TOF_SEARCH_TREE");
    $tecdoc->export("TOF_LINK_GA_STR");
    $tecdoc->export("TOF_BRANDS");
    $tecdoc->exportAllGraphics();
?>
Подякували: sooleva1

18

Re: Експорт з Tecdoc в Mysql (TecDoc Online)

Доброго часу доби, шановні. Підкажіть, будь ласка, яким чином за кодом товару знайти зображення, чи можна це здійснити прямо з бази TecDoc чи простіше вже з перетвореної в MySQL.
Дякую.

19

Re: Експорт з Tecdoc в Mysql (TecDoc Online)

Підкажіть, будь ласка, аналог Limit в transbase. Буду вдячний!

20 Востаннє редагувалося 0xDADA11C7 (22.07.2014 20:14:13)

Re: Експорт з Tecdoc в Mysql (TecDoc Online)

Гляньте сюди Перше ж посилання веде до відповіді.

SELECT * FROM tablename FIRST(1000);

Наступного разу створюйте окрему тему