4

SOAP API を使用して、プログラムで一度に 5 ~ 6 人の SalesForce ユーザーを作成したいと考えています。Partner API を使用しており、Developer エディションのサンドボックスを使用しています。データベース テーブルからユーザー情報を取得し、API を使用してこれらの 5 ~ 6 人のユーザーを一度に作成したいと考えています。1 人のユーザーを作成できますが、別のユーザーを作成するとエラーがスローされますLICENSE_LIMIT_EXCEEDED:License Limit Exceeded

これは、データベースからユーザー情報を取得し、プログラムでユーザーを作成するコードのスナップショットです。

SObject user = new SObject();

user.setType("User");

while (rs.next()) {
    user.setField("Alias", rs.getString("Alias"));
    user.setField("Email", rs.getString("Email"));
    user.setField("EmailEncodingKey", rs.getString("EmailEncodingKey"));
    user.setField("LanguageLocaleKey", "En_US");
    user.setField("LastName", rs.getString("LastName"));
    user.setField("LocaleSidKey", rs.getString("LocaleSidKey"));
    user.setField("TimeZoneSidKey", "America/Los_Angeles");
    user.setField("Username", rs.getString("Username"));
    user.setField("UserPermissionsCallCenterAutoLogin", "false");
    user.setField("UserPermissionsMarketingUser", "false");
    user.setField("UserPermissionsOfflineUser", "false");
    user.setField("ProfileId", connection.getUserInfo().getProfileId());

    SaveResult[] results = connection.create(new SObject[] { user });
    System.out.println("Created user: " + results[0].getId());

    if (results[0].isSuccess())
        out.println("Created user: " + results[0].getId());
    else
        out.println("Error: " + results[0].getErrors()[0].getStatusCode() + 
                           ":" + results[0].getErrors()[0].getMessage());

}

QueryResult queryResults = connection
        .query("SELECT Id, Name from User "
                + "ORDER BY CreatedDate DESC LIMIT 5");

if (queryResults.getSize() > 0) {
    for (SObject s : queryResults.getRecords()) {
        out.println("Id: " + s.getField("Id") + " - Name: "
                + s.getField("Name"));
    }
}

ここで 1 人のユーザーを作成できますが、1 人のユーザーを作成した後、エラーがスローされますLICENSE_LIMIT_EXCEEDED:License Limit Exceeded

利用可能なライセンスの数は次のとおりです。ここに画像の説明を入力

SalesForce の残りのライセンスが 0 であることがわかります。ただし、必ずしも SalesForce ユーザーである必要のないユーザーをいくつか作成したいだけです。私の組織にログインできるユーザーであれば、どのタイプのユーザーでもかまいません。「Chatter Free」を使用して 5000 ライセンスを持つ別のタイプのユーザーを作成しようとするとuser.setField("UserType", "CsnOnly")、エラーが発生します。INVALID_FIELD_FOR_INSERT_UPDATE:Unable to create/update fields: UserType

これらは私のSalesForceのユーザーです: ここに画像の説明を入力

この問題を解決するには?データベースから何人かのユーザーを作成して、SalesForce にログインできるようにしたいだけです。管理者である必要はありません。最小限の権限を持つことができますが、SalesForce にログインできる必要があります。

4

2 に答える 2

4

開発者組織では、Salesforce ライセンスを持つアクティブ ユーザーを 3 人以上持つことはできません。Chatter Free ライセンスを持つユーザーを作成するには、プロファイルを割り当てるだけで済みます。Chatter Free User割り当てられたプロファイルに基づいて、ライセンスが自動的に正しく設定されます (UserTypeフィールドは編集できません)。

編集: Chatter Free User のプロファイル ID をハードコーディングせずに取得するには (組織によって異なる可能性があるため)、クエリを実行する必要があります。このクエリを含めるようにコードを変更し、コードを作り直して、へのコールアウトが 1 つだけになるようにしPartnerConnection.createました (SOAP コールアウトのオーバーヘッドを節約するための単なる提案です)。

QueryResult profileQuery = connection.query("select Id from Profile where Name = 'Chatter Free User' limit 1");
SObject chatterFreeProfile;
if ( profileQuery.getSize() > 0 ) {
    chatterFreeProfile = profileQuery.getRecords()[0];
}

ArrayList<SObject> users = new ArrayList<SObject>();
while (rs.next()) {
    SObject user = new SObject();
    user.setType("User");
    user.setField("Alias", rs.getString("Alias"));
    user.setField("Email", rs.getString("Email"));
    user.setField("EmailEncodingKey", rs.getString("EmailEncodingKey"));
    user.setField("LanguageLocaleKey", "En_US");
    user.setField("LastName", rs.getString("LastName"));
    user.setField("LocaleSidKey", rs.getString("LocaleSidKey"));
    user.setField("TimeZoneSidKey", "America/Los_Angeles");
    user.setField("Username", rs.getString("Username"));
    user.setField("UserPermissionsCallCenterAutoLogin", "false");
    user.setField("UserPermissionsMarketingUser", "false");
    user.setField("UserPermissionsOfflineUser", "false");
    if ( chatterFreeProfile != null )
        user.setField("ProfileId", chatterFreeProfile.getField("Id"));
    else
        user.setField("ProfileId", connection.getUserInfo().getProfileId());
    users.add(user);
}

if ( users.size() > 0 ) {
    SaveResult[] results = connection.create(users.toArray(new SObject[users.size()]));
    for ( int i = 0; i < saveResults.length; i++ ) {
        if (results[i].isSuccess())
            out.println("Created user: " + results[i].getId());
        else
            out.println("Error: " + results[i].getErrors()[0].getStatusCode() + ":" + results[i].getErrors()[0].getMessage());
    }
}

QueryResult queryResults = connection.query("SELECT Id, Name from User ORDER BY CreatedDate DESC LIMIT 5");
if ( queryResults.getSize() > 0 ) {
    for ( SObject s : queryResults.getRecords() ) {
        out.println("Id: " + s.getField("Id") + " - Name: " + s.getField("Name"));
    }
}
于 2012-09-26T14:27:13.613 に答える
2

ProfileId使用可能なライセンス タイプに関連付けられたプロファイルに設定する必要があります。この場合は、Chatter Free、Salesforce プラットフォーム、または他の使用可能なライセンス タイプのいずれかのプロファイルに設定する必要があります。各プロファイルは、特定の UserLicense レコードに関連付けられています。次に例を示します。

  • 「SFDC」: Salesforce のフルライセンス
  • 'CSN_User' : Chatter Free ライセンス
  • 'AUL' : Salesforce プラットフォーム ライセンス

(さらに表示するには、UserLicenseオブジェクトに対して Query All を実行します)。

そのため、利用可能なライセンス タイプのレコードを照会しProfile、これを新しいユーザーに関連付ける必要があります。

QueryResult profileQuery = connection.query(
    "SELECT Id FROM Profile "
    + "WHERE UserLicense.Name = 'Chatter Free' LIMIT 1"
);
SObject chatterFreeProfile;
if ( profileQuery.getSize() > 0 ) {
    chatterFreeProfile = profileQuery.getRecords()[0];
    user.setField("ProfileId", chatterFreeProfile.getField("Id"));
}
于 2012-09-26T16:33:33.407 に答える