Hallo zusammen ,
dadurch das ich modified als Shopsystem benutze und dort MySQL laufen muss , wie soll
denn der Import in Fakturama möglich sein , wenn Fakturama nur mit HyperSQL läuft? oO
Ich habe dies hier gefunden :
package com.sebulli.fakturama.DataBase;
import static com.sebulli.fakturama.Translate._;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.preference.FieldEditorPreferencePage;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.IntegerFieldEditor;
import org.eclipse.jface.preference.StringFieldEditor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.PlatformUI;
import com.sebulli.fakturama.Activator;
import com.sebulli.fakturama.data.DataSetContact;
import com.sebulli.fakturama.data.DataSetDocument;
import com.sebulli.fakturama.data.DataSetExpenditureVoucher;
import com.sebulli.fakturama.data.DataSetExpenditureVoucherItem;
import com.sebulli.fakturama.data.DataSetItem;
import com.sebulli.fakturama.data.DataSetList;
import com.sebulli.fakturama.data.DataSetPayment;
import com.sebulli.fakturama.data.DataSetProduct;
import com.sebulli.fakturama.data.DataSetReceiptVoucher;
import com.sebulli.fakturama.data.DataSetReceiptVoucherItem;
import com.sebulli.fakturama.data.DataSetShipping;
import com.sebulli.fakturama.data.DataSetText;
import com.sebulli.fakturama.data.DataSetVAT;
import com.sebulli.fakturama.data.UniDataSet;
import com.sebulli.fakturama.data.UniDataType;
import com.sebulli.fakturama.logger.Logger;
public class MySQL extends DataBaseType{
public static String IDENTIFIER = "de.northbridgedevelopment.fakturama.DataBase.MySQL";
public static String DATABASE_NAME = "MySQL";
//TODO: MySQL does not allow varchars of such a size since lines are not allowed to be larger than 65xxx bytes. Temporarily reduces text size to 10000. need to adjust warnings.
@Override
public String getDataBaseTypeByUniDataType(UniDataType udt) {
switch (udt) {
case ID:
case INT:
return "INT";
case BOOLEAN:
return "TINYINT";
case DOUBLE:
case QUANTITY:
case PRICE:
case PERCENT:
return "DOUBLE";
case DATE:
case STRING:
return "VARCHAR(256)";
case TEXT:
return "VARCHAR(10000)";
default:
Logger.logError("DataBase.java: Unknown UniDataType");
}
return "VARCHAR(10000)";
}
@Override
public boolean connect() {
String dbUrl;
Statement stmt;
ResultSet rs;
IPreferenceStore prefs;
DataBaseType.DataBaseSettings settings;
prefs = Activator.getDefault().getPreferenceStore();
try {
Class.forName("com.mysql.jdbc.Driver");
}
catch (ClassNotFoundException e) {
Logger.logError("Class com.mysql.jdbc.Driver not found");
return false;
}
settings = this.getDatabaseSettings(prefs);
// connect to mysql DB
// dbUrl = host:port/dataBaseName?user=monty&password=greatsqldb
dbUrl = String.format("%s:%d/%s?user=%s&password=%s",
settings.dbHost,
settings.dbPort,
settings.dbName,
settings.dbUser,
settings.dbPw
);
try {
connection = DriverManager.getConnection("jdbc:mysql://" + dbUrl);
stmt = connection.createStatement();
} catch (SQLException e) {
Logger.logError(e, "Error connecting the MYSQL Database:" + dbUrl);
return false;
}
// Read the "Properties" table, to see, if it exists.
// If not - it is a new data base.
try {
rs = stmt.executeQuery("SELECT * FROM Properties");
rs.close();
check4Updates();
// Check all tables, if there is a column for each
// UniDataSet property.
checkTableAndInsertNewColumns(new DataSetProduct());
checkTableAndInsertNewColumns(new DataSetContact());
checkTableAndInsertNewColumns(new DataSetItem());
checkTableAndInsertNewColumns(new DataSetVAT());
checkTableAndInsertNewColumns(new DataSetShipping());
checkTableAndInsertNewColumns(new DataSetPayment());
checkTableAndInsertNewColumns(new DataSetText());
checkTableAndInsertNewColumns(new DataSetDocument());
checkTableAndInsertNewColumns(new DataSetList());
checkTableAndInsertNewColumns(new DataSetExpenditureVoucher());
checkTableAndInsertNewColumns(new DataSetExpenditureVoucherItem());
checkTableAndInsertNewColumns(new DataSetReceiptVoucher());
checkTableAndInsertNewColumns(new DataSetReceiptVoucherItem());
} catch (SQLException e) {
try {
stmt.close();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
stmt = null;
// In a new data base: create all the tables
try {
createTables();
return true;
} catch (SQLException e2) {
Logger.logError(e2, "Error creating new tables in database.");
}
}
if(stmt != null){
try {
stmt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return false;
}
@Override
public DataBaseSettings displaySettings(DataBaseSettings settings) {
// TODO Auto-generated method stub
return null;
}
@Override
public void createTables() throws SQLException {
Statement stmt;
String bundleVersion = Platform.getBundle("com.sebulli.fakturama").getHeaders().get("Bundle-Version").toString();
stmt = connection.createStatement();
stmt.executeUpdate("CREATE TABLE Properties(Id INT AUTO_INCREMENT PRIMARY KEY, Name VARCHAR (256), Value VARCHAR (30000))");
stmt.executeUpdate("INSERT INTO Properties VALUES(1,'version','" + DBVersion + "')");
stmt.executeUpdate("INSERT INTO Properties VALUES(2,'bundleversion','" + bundleVersion + "')");
stmt.executeUpdate("CREATE TABLE " + getCreateSqlTableString(new DataSetProduct()));
stmt.executeUpdate("CREATE TABLE " + getCreateSqlTableString(new DataSetContact()));
stmt.executeUpdate("CREATE TABLE " + getCreateSqlTableString(new DataSetItem()));
stmt.executeUpdate("CREATE TABLE " + getCreateSqlTableString(new DataSetVAT()));
stmt.executeUpdate("CREATE TABLE " + getCreateSqlTableString(new DataSetShipping()));
stmt.executeUpdate("CREATE TABLE " + getCreateSqlTableString(new DataSetPayment()));
stmt.executeUpdate("CREATE TABLE " + getCreateSqlTableString(new DataSetText()));
stmt.executeUpdate("CREATE TABLE " + getCreateSqlTableString(new DataSetDocument()));
stmt.executeUpdate("CREATE TABLE " + getCreateSqlTableString(new DataSetList()));
stmt.executeUpdate("CREATE TABLE " + getCreateSqlTableString(new DataSetExpenditureVoucher()));
stmt.executeUpdate("CREATE TABLE " + getCreateSqlTableString(new DataSetExpenditureVoucherItem()));
stmt.executeUpdate("CREATE TABLE " + getCreateSqlTableString(new DataSetReceiptVoucher()));
stmt.executeUpdate("CREATE TABLE " + getCreateSqlTableString(new DataSetReceiptVoucherItem()));
stmt.close();
}
/**
* Generate the SQL string to create a new table in the data base
* Originally from com.sebulli.fakturama.data.DataBase
*
* @param uds
* UniDataSet as template for the new table
* @return
*/
@Override
public String getCreateSqlTableString(UniDataSet uds) {
String s = "";
// Generate a list with all keys in the template UniDataSet
// and sort it alphabetically
List list = new ArrayList();
list.addAll(uds.getHashMap().keySet());
Collections.sort(list);
try {
s = "id INT AUTO_INCREMENT PRIMARY KEY";
// Add all keys to the SQL string.
// They are the columns of the new table
// But do not add a column for "id" because the ID is the
// id of the data base entry
for (String key : list) {
if (!key.equalsIgnoreCase("id")) {
// Separate the columns by an ","
s += ", " + key + " ";
s += getDataBaseTypeByUniDataType(uds.hashMap.get(key).getUniDataType());
}
}
}
catch (Exception e) {
Logger.logError(e, "Error creating SQL String from dataset.");
}
// return the SQL string in brackets.
return uds.sqlTabeName + "(" + s + ")";
}
private boolean testConnection(String host, int port, String dbName, String userName, String password){
String dbUrl;
if(host.isEmpty() || dbName.isEmpty()){
return false;
}
try {
Class.forName("com.mysql.jdbc.Driver");
}
catch (ClassNotFoundException e) {
Logger.logError("Class com.mysql.jdbc.Driver not found");
return false;
}
// connect to mysql DB
// dbUrl = host:port/dataBaseName?user=monty&password=greatsqldb
dbUrl = String.format("%s:%d/%s?user=%s&password=%s",
host,
port,
dbName,
userName,
password
);
try {
connection = DriverManager.getConnection("jdbc:mysql://" + dbUrl);
connection.close();
} catch (SQLException e) {
return false;
}
return true;
}
@Override
public boolean displaySettingsDialog(){
IPreferenceStore preferences;
preferences = Activator.getDefault().getPreferenceStore();
MySQLSettingsDialog dbDialog = new MySQLSettingsDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell());
dbDialog.open();
if(!dbDialog.getSuccessfull()){
return false;
}
preferences.setValue("DATABASE_HOST", dbDialog.getHost());
preferences.setValue("DATABASE_PORT", dbDialog.getPort());
preferences.setValue("DATABASE_NAME", dbDialog.getName());
preferences.setValue("DATABASE_USER", dbDialog.getUser());
preferences.setValue("DATABASE_PASSWORD", dbDialog.getPassword());
return true;
}
private class MySQLSettingsDialog extends Dialog {
private FieldEditorPreferencePage page;
private StringFieldEditor hostEditor, nameEditor, userEditor, passwordEditor;
private IntegerFieldEditor portEditor;
private String host, name, user, password;
private int port;
private boolean successfull;
public MySQLSettingsDialog(Shell parentShell) {
super(parentShell);
successfull = false;
}
@Override
protected void configureShell(Shell newShell) {
super.configureShell(newShell);
newShell.setText(_("MySQL Settings"));
newShell.setSize(500, 400);
super.setBlockOnOpen(true);
}
@Override
protected Control createDialogArea(Composite parent) {
Composite composite = (Composite) super.createDialogArea(parent);
page = new FieldEditorPreferencePage(FieldEditorPreferencePage.GRID) {
@Override
public void createControl(Composite parentComposite) {
noDefaultAndApplyButton();
super.createControl(parentComposite);
this.setValid(true);
}
@Override
protected void createFieldEditors() {
hostEditor = new StringFieldEditor("", "Database Server:", getFieldEditorParent());
hostEditor.setStringValue("127.0.0.1");
portEditor = new IntegerFieldEditor("", "Server Port:", getFieldEditorParent());
portEditor.setStringValue("3306");
nameEditor = new StringFieldEditor("", "Database Name:", getFieldEditorParent());
nameEditor.setStringValue("fakturama");
userEditor = new StringFieldEditor("", "User Name:", getFieldEditorParent());
passwordEditor = new StringFieldEditor("", "Password:", getFieldEditorParent());
addField(hostEditor);
addField(portEditor);
addField(nameEditor);
addField(userEditor);
addField(passwordEditor);
}
@Override
protected void updateApplyButton() {
updateButtons(true);
super.updateApplyButton();
}
};
page.createControl(composite);
Control pageControl = page.getControl();
pageControl.setLayoutData(new GridData(GridData.FILL_BOTH));
return pageControl;
}
@Override
protected void createButtonsForButtonBar(Composite parent) {
super.createButtonsForButtonBar(parent);
updateButtons(page.isValid());
}
private void updateButtons(boolean isValid) {
Button okButton = getButton(IDialogConstants.OK_ID);
if (okButton != null) {
okButton.setEnabled(isValid);
}
}
@Override
protected void buttonPressed(int buttonId) {
if (buttonId == IDialogConstants.OK_ID) {
if(testConnection(hostEditor.getStringValue(), portEditor.getIntValue(), nameEditor.getStringValue(), userEditor.getStringValue(), passwordEditor.getStringValue())){
host = hostEditor.getStringValue();
port = portEditor.getIntValue();
name = nameEditor.getStringValue();
user = userEditor.getStringValue();
password = passwordEditor.getStringValue();
successfull = true;
super.buttonPressed(buttonId);
} else {
MessageBox messageBox = new MessageBox(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), SWT.ICON_INFORMATION);
//T: Title of a message box
messageBox.setText(_("Information"));
//T: Text of the message box, if there is no connection to the database
messageBox.setMessage(_("No database could be opened with the information you entered."));
messageBox.open();
}
return;
}
super.buttonPressed(buttonId);
}
public String getHost(){
return host;
}
public int getPort(){
return port;
}
public String getName(){
return name;
}
public String getUser(){
return user;
}
public String getPassword(){
return password;
}
public boolean getSuccessfull(){
return successfull;
}
}
}
Ist dies eine anpassung an den Connector damit es mit MySQL funktioniert?
Die Daten werden nicht direkt aus der DB gelesen.
Gruß
3xhossa
Kannst du mir dann erklären wie es rein technisch funktionieren soll , das Fakturama mit xtmodified zusammen arbeiten kann? oO
Ich mein , xtmodified legt seine Daten auf meinem Linux Server ab auf die dort installierte MySQL Datenbank.
Fakturama bringt ja eine eigene Datenbank mit sich und legt seine Daten dort ab , in die HyperSQL.
Wie soll es dann rein technisch funktionieren , das sich Fakturama Daten von xtmodified zieht? oO
Weil genau das Funktioniert nicht , es kommt zwar keine Fehlermeldung , es werden aber auch keine Daten übertragen...
Kann ich nicht. Habe das nie benutzt. Soweit ich weiss, werden die Daten per HTTP geholt. Aber zu den Details können andere sicher genaueres sagen. Hast du denn mal in den Connector geschaut? Letztlich steht dort doch alles drin, was passiert.
Gruß
3xhossa
Dummerweise kommt auch kein Error_log wo ich mal nach sehen könnte was da schief geht.
Komischerweise kommt es zum Fehler , wenn ich bestimme Werte an den Artikeln ändere.
Beispielsweise schluckt er den Artikelnamen nicht.
Dann kommt es zur Fehlermeld "Keine verbindung zum Webserver" , wenn ich von Fakturama daten importiere.
Ansonsten , kennst du eine Alternative die Funktioniert?
Sprich mit einem Webshop ausgelagert auf einem Linuxserver und angebunden an Fakturama? :/
Zur Technik dahinter:
Fakturama ruft den Connector auf dem Webserver über eine HTTP Verbindung auf.
Es tut quasi so, als wäre es ein Browser.
Das klappt lokal sowie im WWW. Der aufgerufene Connector macht dann das, was er von der Schnittstelle gesagt bekommen hat. Also "hole neue Bestellungen" oder "sende Änderungsemails" oder "hole neue Artikel".
Die Daten werden dann aus der Shop (MySQL)Datenbank geholt, in eine formatierte XML Datei geschrieben und zurück an Fakturama übertragen. Da kommen die Daten dann in die dahinter laufende Datenbank.
Es ist also egal, welches Datenbanksystem im Shop läuft, es könnte auch SQLite sein. Der Connector macht die Queries und schickt eine XML zurück.
Das Verbindungsproblem wird hier ja besprochen.
Danke für die Antwort.
Nach endloser Recherche habe ich die Technik verstanden , durch dich dann noch einmal richtig. ^^
Dummerweise steht im Log , das nichts übertragen wurde.
Kann es sein das der Connector nicht funktioniert? oO
Ich sehe hier auch niemanden , der mit modified arbeitet :/
Quäle mich auch gerade mit XT:Commerce umher um es damit einmal zu testen..
Dann kann dieser Thread geschlossen werden.