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.
Les grandes lignes de cette application sont les suivantes.
Voyons maintenant les étapes de développement de cet exemple d'application.
Cliquez ici pour le code source de cet exemple d'application (https://github.com/kasoorimethi/Salesforce2KintoneJDBC).
Installez le logiciel CData. Les deux suivants sont nécessaires cette fois.
Utilisez Eclipse 4.6. Veuillez installer les fonctionnalités suivantes dans Eclipse.
e(fx)clipse - IDE
Utilisez http://download.eclipse.org/efxclipse/updates-released/2.4.0/site pour l'emplacement du site.
Créez un nouveau projet. Sélectionnez Projet JavaFX.
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.
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;
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());
}
}
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();
}
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();
}
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.
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.
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.
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.
Recommended Posts