Comment synchroniser les données client entre Salesforce et Kintone (Java-Simple JDBC)

En tant que méthode de synchronisation des données client entre Salesforce et kintone, j'ai présenté un autre article utilisant une application de formulaire Windows (C # / ADO.NET) qui utilise le ** pilote CData **. Le pilote CData est fourni par diverses technologies ainsi que ADO.NET. Cette fois, je voudrais présenter un exemple Java d'une application qui synchronise les données client entre Salesforce et kintone.

000_構成図.png

Les grandes lignes de cette application sont les suivantes.

Voyons maintenant les étapes de développement de cet exemple d'application.

Code source

Cliquez ici pour le code source de cet exemple d'application (https://github.com/kasoorimethi/Salesforce2KintoneJDBC).

Installation du produit CData

Installez le logiciel CData. Les deux suivants sont nécessaires cette fois.

Préparation de l'environnement de développement

Utilisez Eclipse 4.6. Veuillez installer les fonctionnalités suivantes dans Eclipse.

Création de projet

Créez un nouveau projet. Sélectionnez Projet JavaFX.

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

Conservez les valeurs par défaut et cliquez sur le bouton "Suivant" dans l'ordre. Dans la boîte de dialogue finale, spécifiez «FXML» pour «Language», «javax.scene.layout.AnchorPane» pour «Root-Type», «MainPane» pour «File Name» et «MainPaneController» pour «Controller Name». Cliquez sur le bouton Terminer.

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

Mise en œuvre du traitement

Classe de modèle de données

Le côté Salesforce implémente la classe correspondant à Contact et le côté kintone implémente la classe correspondant à la liste de clients. Il s'agit d'un simple 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;

	//Ce qui suit est omis pour chaque passeur/getter
}
package application;


liste de clients de classe publique{

	private int recordId;

	private String fax_Chiffres uniquement_;

	private String tel_Chiffres uniquement_;

adresse e-mail de chaîne privée;
	
numéro d'enregistrement de chaîne privé;

nom de société String privé;

adresse de chaîne privée;

private String Nom du contact;

nom du département de chaîne privé;

code postal de chaîne privée_Chiffres uniquement_;

	//Ce qui suit est omis pour chaque passeur/getter
}

MainPaneController C'est la classe principale de cette application. Implémentez javafx.fxml.Initializable afin qu'il puisse être initialisé. De plus, ajoutez une URL JDBC pour vous connecter à Salesforce / kintone et un champ TableView pour afficher leurs données.

public class MainPaneController implements Initializable {

	private String salesforceJdbcUrl = "<URL JDBC Salesforce>";
	
	private String kintoneJdbcUrl = "<URL JDBC de kintone>";
	
	@FXML
	private TableView<Contact> salesforceTable;
	
	@FXML
	private TableView<Liste de clients> kintoneTable;

Lire les données

Implémentez le processus de lecture des données Salesforce / kintone dans TableView dans MainPaneController. C'est simple en utilisant 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 *À PARTIR de la liste des clients");
			ResultSet rs = pstmt.executeQuery();
			) {

			while (rs.next()) {
Liste des clients c=nouvelle liste de clients();
				c.setRecordId(rs.getInt("RecordId"));
				c.setFax_Chiffres uniquement_(rs.getString("Fax(Chiffres uniquement)"));
				c.setTel_Chiffres uniquement_(rs.getString("Tel(Chiffres uniquement)"));
				c.définir l'adresse e-mail(rs.getString("adresse mail"));
				c.définir le numéro d'enregistrement(rs.getString("Numéro d'enregistrement"));
				c.définir le nom de l'entreprise(rs.getString("Nom de la compagnie"));
				c.définir l'adresse(rs.getString("adresse de rue"));
				c.définir le nom de la personne responsable(rs.getString("Personne en charge"));
				c.définir le nom du département(rs.getString("Nom du département"));
				c.définir le code postal_Chiffres uniquement_(rs.getString("Code postal(Chiffres uniquement)"));
				kintoneTable.getItems().add(c);
			}
			
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}

Initialisation de l'application

Implémentez l'initialisation de MainPaneController. Le processus principal consiste simplement à appeler la méthode de lecture des données.

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

Processus d'importation

Implémentez le processus d'importation. Ce que nous faisons, ce sont les données de la ligne sélectionnée dans le TableView du côté Salesforce, et exécutons simplement l'instruction INSERT / UPDATE du côté kintone dans JDBC.

	@FXML
	private void importOnClick(MouseEvent event) {
		
		try (Connection conn = DriverManager.getConnection(kintoneJdbcUrl)) {
			
			conn.setAutoCommit(false);
			
			for (Contact contact : salesforceTable.getSelectionModel().getSelectedItems()) {
				
Liste de clients kintoneItem= kintoneTable.getItems().stream()
					.filter(o -> o.obtenir une adresse e-mail().equals(contact.getEmail()))
					.findFirst()
					.orElse(nouvelle liste de clients());
				
				PreparedStatement pstmt;
				
				if (kintoneItem.getRecordId() == 0) {
					pstmt = conn.prepareStatement("INSÉRER DANS LA LISTE DES CLIENTS(adresse mail,Nom de la compagnie,adresse de rue,Personne en charge,Nom du département, [Code postal(Chiffres uniquement)], [Tel(Chiffres uniquement)], [Fax(Chiffres uniquement)]) VALUES(?, ? ,? ,? ,? ,? ,? ,?)");
				} else {
					pstmt = conn.prepareStatement("METTRE À JOUR la liste des clients DÉFINIR l'adresse électronique=?,Nom de la compagnie=?,adresse de rue=?,Personne en charge=?,Nom du département=?, [Code postal(Chiffres uniquement)]=?, [Tel(Chiffres uniquement)]=?, [Fax(Chiffres uniquement)]=? 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();
	}

Créer un écran

Enfin, créez l'écran. Ouvrez application / MainPane.fxml et implémentez le code suivant. Il mappe chaque propriété de la classe de modèle de données aux colonnes de la table.

<?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="Personne en charge">
            <cellValueFactory><PropertyValueFactory property="name" /></cellValueFactory>
          </TableColumn>
          <TableColumn prefWidth="150.0" text="adresse mail">
            <cellValueFactory><PropertyValueFactory property="email" /></cellValueFactory>
          </TableColumn>
          <TableColumn prefWidth="150.0" resizable="false" sortable="false" text="Nom de la compagnie">
          	<cellValueFactory><PropertyValueFactory property="accountName" /></cellValueFactory>
          </TableColumn>
          <TableColumn prefWidth="150.0" text="Nom du département">
            <cellValueFactory><PropertyValueFactory property="department" /></cellValueFactory>
          </TableColumn>
          <TableColumn prefWidth="150.0" text="adresse de rue">
            <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="importer" />
      <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="Numéro d'enregistrement">
            <cellValueFactory><PropertyValueFactory property="Numéro d'enregistrement" /></cellValueFactory>
          </TableColumn>
          <TableColumn editable="false" prefWidth="150.0" sortable="false" text="Personne en charge">
            <cellValueFactory><PropertyValueFactory property="Personne en charge" /></cellValueFactory>
          </TableColumn>
          <TableColumn editable="false" prefWidth="150.0" sortable="false" text="adresse mail">
            <cellValueFactory><PropertyValueFactory property="adresse mail" /></cellValueFactory>
          </TableColumn>
          <TableColumn editable="false" prefWidth="150.0" sortable="false" text="Nom de la compagnie">
            <cellValueFactory><PropertyValueFactory property="Nom de la compagnie" /></cellValueFactory>
          </TableColumn>
          <TableColumn editable="false" prefWidth="100.0" sortable="false" text="Nom du département">
            <cellValueFactory><PropertyValueFactory property="Nom du département" /></cellValueFactory>
          </TableColumn>
          <TableColumn editable="false" prefWidth="150.0" sortable="false" text="adresse de rue">
            <cellValueFactory><PropertyValueFactory property="adresse de rue" /></cellValueFactory>
          </TableColumn>
        </columns>
      </TableView>
   </children>
</AnchorPane>

Définit la taille de la fenêtre. Ouvrez application / Main.java et redimensionnez la scène.

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

C'est tout pour la mise en œuvre.

Courir

Créez une configuration d'exécution. Ouvrez Exécuter-> Exécuter la configuration, cliquez avec le bouton droit sur Application Java et sélectionnez Nouveau. Ouvrez l'onglet Chemin de classe, spécifiez deux pilotes JDBC pour CData et cliquez sur le bouton Exécuter.

018_実行構成.png

Une fois exécutée, une fenêtre avec les données Salesforce et kintone affichées dans la vue de table sera lancée.

019_実行直後.png

Sélectionnez la ligne dans laquelle vous souhaitez migrer les données et cliquez sur le bouton "Importer", et les données sélectionnées seront enregistrées dans kintone.

020_移行後.png

021_移行後kintone.png

Recommended Posts

Comment synchroniser les données client entre Salesforce et Kintone (Java-Simple JDBC)
Promesse JDBC et exemple d'écriture
Ruby Comment convertir entre les majuscules et les minuscules
Comment éviter les conflits entre les modules JBoss et les bibliothèques d'applications
Différence entre Java et JavaScript (comment trouver la moyenne)
[Rails] Différentes différences entre redirect_to et méthode de rendu et méthode de sortie de la méthode de rendu
Différences dans la gestion des chaînes entre Java et Perl
Comment basculer dynamiquement entre FIN et RST dans Netty
Comment supprimer de grandes quantités de données dans Rails et problèmes
Comment obtenir et ajouter des données depuis Firebase Firestore dans Ruby
Comment utiliser StringBurrer et Arrays.toString.
Comment utiliser EventBus3 et ThreadMode
[Comment installer Spring Data Jpa]
Comment créer un pilote JDBC
Comment appeler des classes et des méthodes
Comment utiliser l'égalité et l'égalité (comment utiliser l'égalité)
Comment connecter Heroku et Sequel
[Java] Relation entre H2DB et JDBC
Comment convertir LocalDate et Timestamp
Comment modifier le nombre maximum et maximum de données POST dans Spark