So synchronisieren Sie Kundendaten zwischen Salesforce und Kintone (Java-Simple JDBC)

Als Methode zum Synchronisieren von Kundendaten zwischen Salesforce und kintone habe ich einen weiteren Artikel mit einer Windows-Formularanwendung (C # / ADO.NET) eingeführt, die den ** CData-Treiber ** verwendet. Der CData-Treiber wird von verschiedenen Technologien sowie von ADO.NET bereitgestellt. Dieses Mal möchte ich ein Java-Beispiel für eine Anwendung vorstellen, die Kundendaten zwischen Salesforce und kintone synchronisiert.

000_構成図.png

Der Umriss dieser Anwendung ist wie folgt.

Schauen wir uns nun die Entwicklungsschritte für diese Beispielanwendung an.

Quellcode

Klicken Sie hier, um den Quellcode dieser Beispielanwendung anzuzeigen (https://github.com/kasoorimethi/Salesforce2KintoneJDBC).

CData-Produktinstallation

Installieren Sie die CData-Software. Die folgenden zwei sind diesmal erforderlich.

Vorbereitung der Entwicklungsumgebung

Verwenden Sie Eclipse 4.6. Bitte haben Sie die folgenden Funktionen in Eclipse installiert.

Projekterstellung

Erstellen Sie ein neues Projekt. Wählen Sie JavaFX Project.

001_プロジェクト作成.png

Behalten Sie die Standardeinstellungen bei und klicken Sie nacheinander auf die Schaltfläche "Weiter". Geben Sie im letzten Dialogfeld "FXML" für "Sprache", "javax.scene.layout.AnchorPane" für "Root-Type", "MainPane" für "Dateiname" und "MainPaneController" für "Controllername" an. Klicken Sie auf die Schaltfläche Fertig stellen.

002_プロジェクト作成2.png

Implementierung der Verarbeitung

Datenmodellklasse

Die Salesforce-Seite implementiert die Klasse, die Contact entspricht, und die Kintone-Seite implementiert die Klasse, die der Kundenliste entspricht. Dies ist ein einfacher DTO.

package application;


public class Contact {
	
	private String id;

	private String accountId;

	private String department;

	private String email;

	private String fax;

	private String name;

	private String phone;
	
	private String accountName;
	
	private String accountAddress;
	
	private String accountBillingPostalCode;

	//Das Folgende wird für jeden Setter weggelassen/getter
}
package application;


Kundenliste der öffentlichen Klasse{

	private int recordId;

	private String fax_Nur Zahlen_;

	private String tel_Nur Zahlen_;

private String-E-Mail-Adresse;
	
private String-Datensatznummer;

privater String Firmenname;

private String-Adresse;

privater String Kontaktname;

Name der privaten String-Abteilung;

private Postleitzahl_Nur Zahlen_;

	//Das Folgende wird für jeden Setter weggelassen/getter
}

MainPaneController Dies ist die Hauptklasse dieser Anwendung. Implementieren Sie javafx.fxml.Initializable, damit es initialisiert werden kann. Fügen Sie außerdem eine JDBC-URL hinzu, um eine Verbindung zu Salesforce / kintone herzustellen, und ein TableView-Feld, um deren Daten anzuzeigen.

public class MainPaneController implements Initializable {

	private String salesforceJdbcUrl = "<Salesforce JDBC-URL>";
	
	private String kintoneJdbcUrl = "<JDBC-URL von kintone>";
	
	@FXML
	private TableView<Contact> salesforceTable;
	
	@FXML
	private TableView<Kundenliste> kintoneTable;

Daten lesen

Implementieren Sie den Prozess zum Lesen von Salesforce / Kintone-Daten in TableView in MainPaneController. Es ist einfach mit JDBC.

	private void loadSalesforceTableView() {
		
		salesforceTable.getItems().clear();
		
		try (
			Connection conn = DriverManager.getConnection(salesforceJdbcUrl);
			PreparedStatement pstmt = conn.prepareStatement(
				"SELECT c.*, " +
				"a.Name AccountName, a.BillingPostalCode AccountBillingPostalCode, CONCAT(a.BillingState, a.BillingCity, a.BillingStreet) AccountAddress " +
				"FROM Contact c INNER JOIN Account a ON a.Id=c.AccountId");
			ResultSet rs = pstmt.executeQuery();
			) {

			while (rs.next()) {
				Contact c = new Contact();
				c.setId(rs.getString("Id"));
				c.setAccountId(rs.getString("AccountId"));
				c.setDepartment(rs.getString("Department"));
				c.setEmail(rs.getString("Email"));
				c.setFax(rs.getString("Fax"));
				c.setName(rs.getString("Name"));
				c.setPhone(rs.getString("Phone"));
				c.setAccountName(rs.getString("AccountName"));
				c.setAccountAddress(rs.getString("AccountAddress"));
				c.setAccountBillingPostalCode(rs.getString("AccountBillingPostalCode"));
				salesforceTable.getItems().add(c);
			}
			
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}
	private void loadKintoneTableView() {
	
		kintoneTable.getItems().clear();
		
		try (
			Connection conn = DriverManager.getConnection(kintoneJdbcUrl);
			PreparedStatement pstmt = conn.prepareStatement("SELECT *AUS DER Kundenliste");
			ResultSet rs = pstmt.executeQuery();
			) {

			while (rs.next()) {
Kundenliste c=neue Kundenliste();
				c.setRecordId(rs.getInt("RecordId"));
				c.setFax_Nur Zahlen_(rs.getString("Fax(Nur Zahlen)"));
				c.setTel_Nur Zahlen_(rs.getString("Tel(Nur Zahlen)"));
				c.E-Mail-Adresse festlegen(rs.getString("Mail Adresse"));
				c.Datensatznummer einstellen(rs.getString("Rekordzahl"));
				c.Firmennamen einstellen(rs.getString("Name der Firma"));
				c.Adresse einstellen(rs.getString("Adresse"));
				c.Name der verantwortlichen Person festlegen(rs.getString("Verantwortliche Person"));
				c.Abteilungsname festlegen(rs.getString("Abteilungsname"));
				c.Postleitzahl einstellen_Nur Zahlen_(rs.getString("Postleitzahl(Nur Zahlen)"));
				kintoneTable.getItems().add(c);
			}
			
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}

Anwendungsinitialisierung

Implementieren Sie die Initialisierung von MainPaneController. Der Hauptprozess besteht darin, nur die Datenlesemethode aufzurufen.

	@Override
	public void initialize(URL location, ResourceBundle resources) {
		
		salesforceTable.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
		
		loadSalesforceTableView();
		loadKintoneTableView();
	}

Importvorgang

Implementieren Sie den Importvorgang. Was wir tun, sind die Daten der Zeile, die in der TableView auf der Salesforce-Seite ausgewählt wurde, und die einfache Ausführung der INSERT / UPDATE-Anweisung auf der Kintone-Seite in JDBC.

	@FXML
	private void importOnClick(MouseEvent event) {
		
		try (Connection conn = DriverManager.getConnection(kintoneJdbcUrl)) {
			
			conn.setAutoCommit(false);
			
			for (Contact contact : salesforceTable.getSelectionModel().getSelectedItems()) {
				
Kundenliste kintoneItem= kintoneTable.getItems().stream()
					.filter(o -> o.E-Mail-Adresse erhalten().equals(contact.getEmail()))
					.findFirst()
					.orElse(neue Kundenliste());
				
				PreparedStatement pstmt;
				
				if (kintoneItem.getRecordId() == 0) {
					pstmt = conn.prepareStatement("IN Kundenliste EINFÜGEN(Mail Adresse,Name der Firma,Adresse,Verantwortliche Person,Abteilungsname, [Postleitzahl(Nur Zahlen)], [Tel(Nur Zahlen)], [Fax(Nur Zahlen)]) VALUES(?, ? ,? ,? ,? ,? ,? ,?)");
				} else {
					pstmt = conn.prepareStatement("UPDATE Kundenliste SET E-Mail-Adresse=?,Name der Firma=?,Adresse=?,Verantwortliche Person=?,Abteilungsname=?, [Postleitzahl(Nur Zahlen)]=?, [Tel(Nur Zahlen)]=?, [Fax(Nur Zahlen)]=? WHERE RecordId=?");
					pstmt.setInt(9, kintoneItem.getRecordId());
				}
				
				pstmt.setString(1, contact.getEmail());
				pstmt.setString(2, contact.getAccountName());
				pstmt.setString(3, contact.getAccountAddress());
				pstmt.setString(4, contact.getName());
				pstmt.setString(5, Optional.ofNullable(contact.getDepartment()).orElse(""));
				pstmt.setString(6, Optional.ofNullable(contact.getAccountBillingPostalCode()).orElse("").replace("-", ""));
				pstmt.setString(7, contact.getPhone());
				pstmt.setString(8, contact.getFax());
				
				pstmt.execute();
				pstmt.close();
			}
			
			conn.commit();
			
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
		
		loadKintoneTableView();
	}

Bildschirm erstellen

Erstellen Sie abschließend den Bildschirm. Öffnen Sie application / MainPane.fxml und implementieren Sie den folgenden Code. Es ordnet jede Eigenschaft der Datenmodellklasse den Spalten der Tabelle zu.

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.TableColumn?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.control.cell.PropertyValueFactory?>
<?import javafx.scene.layout.AnchorPane?>

<AnchorPane prefHeight="660.0" prefWidth="1200.0" xmlns="http://javafx.com/javafx/8.0.102" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.MainPaneController">
   <children>
      <TableView fx:id="salesforceTable" layoutX="14.0" layoutY="53.0" prefHeight="600.0" prefWidth="485.0">
        <columns>
          <TableColumn prefWidth="150.0" text="Verantwortliche Person">
            <cellValueFactory><PropertyValueFactory property="name" /></cellValueFactory>
          </TableColumn>
          <TableColumn prefWidth="150.0" text="Mail Adresse">
            <cellValueFactory><PropertyValueFactory property="email" /></cellValueFactory>
          </TableColumn>
          <TableColumn prefWidth="150.0" resizable="false" sortable="false" text="Name der Firma">
          	<cellValueFactory><PropertyValueFactory property="accountName" /></cellValueFactory>
          </TableColumn>
          <TableColumn prefWidth="150.0" text="Abteilungsname">
            <cellValueFactory><PropertyValueFactory property="department" /></cellValueFactory>
          </TableColumn>
          <TableColumn prefWidth="150.0" text="Adresse">
            <cellValueFactory><PropertyValueFactory property="accountAddress" /></cellValueFactory>
          </TableColumn>
        </columns>
      </TableView>
      <Button layoutX="542.0" layoutY="263.0" mnemonicParsing="false" onMouseClicked="#importOnClick" prefHeight="35.0" prefWidth="116.0" text="importieren" />
      <TableView fx:id="kintoneTable" layoutX="696.0" layoutY="53.0" prefHeight="600.0" prefWidth="485.0">
        <columns>
          <TableColumn editable="false" prefWidth="75.0" sortable="false" text="Rekordzahl">
            <cellValueFactory><PropertyValueFactory property="Rekordzahl" /></cellValueFactory>
          </TableColumn>
          <TableColumn editable="false" prefWidth="150.0" sortable="false" text="Verantwortliche Person">
            <cellValueFactory><PropertyValueFactory property="Verantwortliche Person" /></cellValueFactory>
          </TableColumn>
          <TableColumn editable="false" prefWidth="150.0" sortable="false" text="Mail Adresse">
            <cellValueFactory><PropertyValueFactory property="Mail Adresse" /></cellValueFactory>
          </TableColumn>
          <TableColumn editable="false" prefWidth="150.0" sortable="false" text="Name der Firma">
            <cellValueFactory><PropertyValueFactory property="Name der Firma" /></cellValueFactory>
          </TableColumn>
          <TableColumn editable="false" prefWidth="100.0" sortable="false" text="Abteilungsname">
            <cellValueFactory><PropertyValueFactory property="Abteilungsname" /></cellValueFactory>
          </TableColumn>
          <TableColumn editable="false" prefWidth="150.0" sortable="false" text="Adresse">
            <cellValueFactory><PropertyValueFactory property="Adresse" /></cellValueFactory>
          </TableColumn>
        </columns>
      </TableView>
   </children>
</AnchorPane>

Legt die Größe des Fensters fest. Öffnen Sie application / Main.java und ändern Sie die Größe der Szene.

Scene scene = new Scene(root, 1200, 660);

Das ist alles für die Implementierung.

Lauf

Erstellen Sie eine Ausführungskonfiguration. Öffnen Sie Ausführen-> Konfiguration ausführen, klicken Sie mit der rechten Maustaste auf Java-Anwendung und wählen Sie Neu. Öffnen Sie die Registerkarte Klassenpfad, geben Sie zwei JDBC-Treiber für CData an und klicken Sie auf die Schaltfläche Ausführen.

018_実行構成.png

Bei der Ausführung wird ein Fenster mit Salesforce- und Kintone-Daten geöffnet, die in der Tabellenansicht angezeigt werden.

019_実行直後.png

Wählen Sie die Zeile aus, in die Sie Daten migrieren möchten, und klicken Sie auf die Schaltfläche "Importieren". Die ausgewählten Daten werden in Kintone registriert.

020_移行後.png

021_移行後kintone.png

Recommended Posts

So synchronisieren Sie Kundendaten zwischen Salesforce und Kintone (Java-Simple JDBC)
JDBC Versprechen und Schreibbeispiel
Ruby So konvertieren Sie zwischen Groß- und Kleinschreibung
Ich habe zum ersten Mal seit einiger Zeit einen DB-Suchprozess in Rails geschrieben und untersucht, wie eine Datumsvergleichssuche geschrieben wird. Deshalb habe ich ein Memo geschrieben. Die meiste Zeit, wenn ich nach etwas anderem suchte, wie SQL schreiben oder Arel verwenden, konnte ich es wie folgt schreiben. Das Gegenteil ist wahr. So verhindern Sie Konflikte zwischen Ruby, dem Rails JBoss-Modul und der Anwendungsbibliothek
Unterschied zwischen Java und JavaScript (wie man den Durchschnitt findet)
[Rails] Verschiedene Unterschiede zwischen redirect_to und Render-Methode und Ausgabemethode der Render-Methode
Unterschiede im Umgang mit Zeichenfolgen zwischen Java und Perl
So wechseln Sie in Netty dynamisch zwischen FIN und RST
So löschen Sie große Datenmengen in Rails und Bedenken
Abrufen und Hinzufügen von Daten aus dem Firebase Firestore in Ruby
Verwendung von StringBurrer und Arrays.toString.
Verwendung von EventBus3 und ThreadMode
[So installieren Sie Spring Data Jpa]
So erstellen Sie einen JDBC-Treiber
Aufrufen von Klassen und Methoden
Wie man Gleichheit und Gleichheit benutzt (wie man Gleichheit benutzt)
So verbinden Sie Heroku und Sequel
[Java] Beziehung zwischen H2DB und JDBC
So konvertieren Sie LocalDate und Timestamp
So ändern Sie die maximale und maximale Anzahl von POST-Daten in Spark