我想通过使用SOAP API以编程方式创建5-6个SalesForce用户。我正在使用Partner API,我有一个Developer Edition沙箱。我正在从数据库表中检索用户信息,然后使用API我想一次创建这5-6个用户。我可以创建一个用户但是在创建另一个用户之后它会抛出错误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"));
}
}
在这里,我可以创建一个用户,但是在创建一个用户之后,它会抛出错误LICENSE_LIMIT_EXCEEDED:License Limit Exceeded
。
这些是可用的许可证数量:
我可以看到SalesForce剩余的许可证是0.但是,我只想创建一些不一定是SalesForce用户的用户。它可以是任何类型的用户,应该能够登录我的组织。当我尝试创建一些不同类型的用户,例如使用user.setField("UserType", "CsnOnly")
拥有5000个许可证的“Chatter Free”时,它会给出错误INVALID_FIELD_FOR_INSERT_UPDATE:Unable to create/update fields: UserType
这些是SalesForce中的用户:
如何解决这个问题?我只想从数据库创建一些用户,然后可以登录到SalesForce。它们不一定是管理员。他们可以拥有最低权限,但他们应该能够登录SalesForce。
答案 0 :(得分:4)
在开发人员组织中,您将无法拥有两个以上具有Salesforce许可证的活动用户。为了创建具有Chatter Free许可证的用户,您只需要为其分配Chatter Free User
的个人资料 - 它将根据分配给他们的个人资料自动设置其许可证(UserType
字段是不可编辑的。)
编辑:要获取Chatter Free用户的个人资料ID而不对其进行硬编码(因为它可能会从org更改为org),您必须查询它。我修改了你的代码以包含这个查询,并重新编写它以便只有一个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"));
}
}
答案 1 :(得分:2)
您需要将ProfileId
设置为与可用许可类型相关联的配置文件,在您的情况下,设置为Chatter Free,Salesforce平台上的配置文件或您的其他可用许可类型。每个配置文件都绑定到特定的UserLicense记录,例如:
(要了解更多信息,请在UserLicense
对象上执行“全部查询”)。
因此,您需要查询有关可用许可类型的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"));
}