2012-09-26 34 views
4

我想通過使用SOAP API以編程方式一次性創建5-6個SalesForce用戶。我使用的是合作伙伴API,我有一個開發人員版沙箱。我從數據庫表中檢索用戶信息,然後使用API​​,我想一次創建這些5-6個用戶。然而,在創建另一個用戶之後,我可以創建一個用戶,但會拋出錯誤LICENSE_LIMIT_EXCEEDED:License Limit Exceeded創建SalesForce用戶時出錯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之後創建一個用戶。

這些都是可用的許可證數量:enter image description here

我可以看到,剩下的Salesforce的許可證是0。但是,我只是想創造一些用戶不一定必須是Salesforce的用戶。它可以是任何類型的用戶,只要能夠登錄我的組織即可。當我試圖創造一些不同類型的用戶,如「顫振自由」,其利用user.setField("UserType", "CsnOnly")它給錯誤INVALID_FIELD_FOR_INSERT_UPDATE:Unable to create/update fields: UserType

這些都是在我的Salesforce的用戶有5000個許可證的: enter image description here

如何解決這個問題?我只想從數據庫創建一些用戶,然後登錄到SalesForce。它們不應該是管理員。他們可以擁有最低的權限,但他們應該能夠登錄到SalesForce。

回答

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")); 
    } 
} 
+0

感謝JCD的回覆。如何在上面的代碼中分配Chatter Free用戶的配置文件?再次感謝。 – waprau

+1

@waprau,查看我更新的答案 - 您需要查詢Chatter Free用戶配置文件的'Id'字段,以便將其分配到用戶記錄的'ProfileId'字段。在原始示例中,您只是將插入的用戶分配給進行API連接的用戶的配置文件,在本例中爲系統管理員。 – JCD

+0

感謝JCD它的工作。非常感謝您的詳細解答。上面的代碼中有一些拼寫錯誤。 – waprau

2

您需要將ProfileId設置爲與可用許可證類型關聯的配置文件,您的情況爲Chatter Free,Salesforce平臺或您的其他可用許可證類型之一。每個配置文件被綁定到特定的UserLicense記錄,例如:

  • 'SFDC':全Salesforce的許可證
  • 'CSN_User':看點免費許可證
  • 'AUL':Salesforce平臺許可

(要查看更多信息,請在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")); 
} 
+0

謝謝zachelrath它的工作。 – waprau

+0

感謝您的查詢也適用於我 – Utsav