Salesforceでは、Webで簡単に項目を追加したり、項目の属性を変更したりすることができ、非常にスピーディーな開発を行うことができます。
ただ、その項目名や属性を設計書に起こすのは、結構手間だったりします。。。
ツールを使うのもいいですし、javaであれば、自分の好きな項目を好きな形にフォーマットして出力するのも比較的簡単にできます。
ここでは、以前の記事で作成したテンプレートを使って、オブジェクトの項目定義をCSVに出力するプログラムを作成してみましょう。
csvであれば、出力結果をエクセルに貼り付けるのも簡単です。
なお、csv出力には、以前の記事で作成した、「CSVFileWriter」クラスを使っていますので、そちらも参照してください。
import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import com.sforce.soap.partner.Connector; import com.sforce.soap.partner.DescribeGlobalResult; import com.sforce.soap.partner.DescribeSObjectResult; import com.sforce.soap.partner.Field; import com.sforce.soap.partner.PartnerConnection; import com.sforce.soap.partner.PicklistEntry; import com.sforce.ws.ConnectionException; import com.sforce.ws.ConnectorConfig; public class MainPrefix { //static final String USERNAME = "YOUR-USERNAME"; //static final String PASSWORD = "YOUR-PASSWORD&SECURITY-TOKEN"; static final String OUTPUT_DIR = "D:\\OUTPUT\\"; static PartnerConnection connection; static private List<ArrayList> gLineList = null; public static void main(String[] args) { ConnectorConfig config = new ConnectorConfig(); config.setUsername(USERNAME); config.setPassword(PASSWORD); //本番かSandboxかで向き先を切り替えてください。 config.setAuthEndpoint(ENDPOINT); //config.setTraceMessage(true); //config.setProxy("xxxxxx.xxxxx.xx.xx", 8000); try { connection = Connector.newConnection(config); // display some current settings System.out.println("Auth EndPoint: "+config.getAuthEndpoint()); System.out.println("Service EndPoint: "+config.getServiceEndpoint()); System.out.println("Username: "+config.getUsername()); System.out.println("SessionId: "+config.getSessionId()); queryAttachments(); } catch (ConnectionException e1) { e1.printStackTrace(); } } private static void queryAttachments() { try { DescribeGlobalResult dgr = connection.describeGlobal(); for (int i = 0; i < dgr.getSobjects().length; i++) { System.out.println(dgr.getSobjects()[i].getName()); System.out.println(dgr.getSobjects()[i].getLabel()); System.out.println(dgr.getSobjects()[i].getKeyPrefix()); //オブジェクトをAccountに制限してます。ここを変更すれば、他のオブジェクトを出力したりできます。 if(dgr.getSobjects()[i].getName().equals("Account")){ writeSObjectDesc(dgr.getSobjects()[i].getName()); } } } catch (Exception e) { e.printStackTrace(); } } private static void writeSObjectDesc(String objectName) throws IOException, ConnectionException { gLineList = new ArrayList<ArrayList>(); ArrayList lineList = null; String objectToDescribe = objectName; DescribeSObjectResult[] dsrArray = connection.describeSObjects(new String[] { objectToDescribe }); DescribeSObjectResult dsr = dsrArray[0]; System.out.println("Object Name: " + dsr.getName()); lineList = new ArrayList(); lineList.add("オブジェクト名"); lineList.add(dsr.getName()); gLineList.add(lineList); lineList = new ArrayList(); lineList.add("表示ラベル(日本語)"); if (dsr.getLabel() != null) System.out.println("Label: " + dsr.getLabel()); lineList.add(dsr.getLabel()); gLineList.add(lineList); lineList = new ArrayList(); lineList.add("表示ラベル(英語)"); lineList.add(""); gLineList.add(lineList); lineList = new ArrayList(); lineList.add("カスタムオブジェクトかどうか"); if (dsr.isCustom()){ System.out.println("Custom Object"); lineList.add("TRUE"); }else{ System.out.println("Standard Object"); lineList.add("FALSE"); } gLineList.add(lineList); lineList = new ArrayList(); lineList.add(""); lineList.add(""); gLineList.add(lineList); lineList = new ArrayList(); lineList.add("項目"); lineList.add(""); gLineList.add(lineList); //ヘッダ項目 lineList = new ArrayList(); lineList.add("標準項目/カスタム項目"); lineList.add("項目名"); lineList.add("表示ラベル"); lineList.add("必須"); lineList.add("データ型"); lineList.add("データ長"); lineList.add("参照先"); lineList.add("式"); lineList.add("ピックリスト項目"); gLineList.add(lineList); System.out.println("Number of fields: " + dsr.getFields().length); // Now, retrieve metadata for each field for (int i = 0; i < dsr.getFields().length; i++) { System.out.println("Field No = ." + i); // Get the field Field field = dsr.getFields()[i]; lineList = new ArrayList(); //カスタム項目かどうか if (field.isCustom()) System.out.println("\tThis is a custom field."); if (field.isCustom()){ System.out.println("Custom field"); lineList.add("カスタム項目"); }else{ System.out.println("Standard field"); lineList.add("標準項目"); } //項目名 System.out.println("Field name: " + field.getName()); lineList.add(field.getName()); //表示ラベル System.out.println("\tField Label: " + field.getLabel()); lineList.add(field.getLabel()); //必須 if (field.isNillable()){ System.out.println("\tCan be nulled."); lineList.add(""); }else{ System.out.println("\tCan be required."); lineList.add("必須"); } //データ型 System.out.println("\tType is: " + field.getType()); if (field.getCalculatedFormula()!=null ){ //nullでなければ数式が入っているということ if(field.getType().toString().equals("double")){ lineList.add("数式 (数値)"); }else if(field.getType().toString().equals("string")){ lineList.add("数式 (テキスト)"); }else{ lineList.add("想定外の数式"); } }else{ lineList.add(field.getType().toString()); } //データ長 if (field.getLength() >= 0) System.out.println("\tLength: " + field.getLength()); if (field.getScale() >= 0) System.out.println("\tScale: " + field.getScale()); if (field.getPrecision() >= 0) System.out.println("\tPrecision: " + field.getPrecision()); if (field.getDigits() >= 0) System.out.println("\tDigits: " + field.getDigits()); if (field.getType().toString().equals("string") || field.getType().toString().equals("textarea") || field.getType().toString().equals("picklist") || field.getType().toString().equals("id")|| field.getType().toString().equals("email")) { lineList.add(""+ field.getLength()); }else if(field.getType().toString().equals("percent")|| field.getType().toString().equals("double")|| field.getType().toString().equals("currency")){ lineList.add("("+ (field.getPrecision()-field.getScale()) + ":" +field.getScale() + ")"); }else{ lineList.add(""+ field.getPrecision()); } //参照先 if (field.getType().toString().equals("reference")) { System.out.println("\tCan reference these objects:"); StringBuffer sb1 = new StringBuffer(""); for (int j = 0; j < field.getReferenceTo().length; j++) { System.out.println("\t\t" + field.getReferenceTo()[j]); sb1.append("参照->" + field.getReferenceTo()[j] + "/"); } lineList.add(sb1.toString()); }else{ lineList.add(""); } //式 System.out.println("数式=" + field.getCalculatedFormula()); if (field.getCalculatedFormula()!=null ){ lineList.add(field.getCalculatedFormula()); }else{ lineList.add(""); } //ピックリスト if (field.getType().toString().equals("picklist")) { System.out.println("\t\tPicklist values: "); PicklistEntry[] picklistValues = field.getPicklistValues(); StringBuffer sb2 = new StringBuffer(""); for (int j = 0; j < field.getPicklistValues().length; j++) { System.out.println("\t\tValue: " + picklistValues[j].getValue()); sb2.append(picklistValues[j].getValue() + "/"); } lineList.add(sb2.toString()); }else{ lineList.add(""); } gLineList.add(lineList); if (field.isNameField()) System.out.println("\tThis is a name field."); if (field.isRestrictedPicklist()) System.out.println("This is a RESTRICTED picklist field."); } writeCSVFile(gLineList, objectName); } private static void writeCSVFile(List<ArrayList> gLineList, String objectName) throws IOException{ File csvFile = null; CSVFileWriter writer = null; try { csvFile = new File(OUTPUT_DIR + objectName + ".csv"); writer = new CSVFileWriter(csvFile); writer.open(); Iterator<ArrayList> iter = gLineList.iterator(); while(iter.hasNext()){ writer.writeLine(iter.next()); } } finally { if (writer != null) { writer.close(); } } } }
出力した結果は、こんな風に出力されます。
サンプルでは、出力する対象のオブジェクトを「Account」だけに制限しています。(67行目)
ここは、制限を解除したり、出力の必要なオブジェクトのリストを渡すように修正すれば、必要なオブジェクトの項目定義を出力可能ですので、お好きに変更してみてください。