You need to sign in to do that
Don't have an account?

Truncating Text on Apex Code or Visualforce PAge
Hi,
I have written a fucntionality to convert lead to case. The only problem is I have a field on Lead as Web-to-Lead Notes which is Text Area long and that is being popualated on Case Subject on Conversion. It gives error if the length is big. So I need to truncate the length of Lead to Web Notes field to 50 to properly fit in the Case Subject. Please help. Here is my code VFP and Apex:
Visualforce Page:
<apex:page standardController="Lead" extensions="CaseConverter">
<apex:form >
<apex:pageBlock title="Convert information to a new Case.">
<apex:pageBlockButtons >
<apex:commandbutton action="{!createCase}" value="Finish"/>
<apex:commandbutton action="{!returnToLead}" value="Previous"/>
</apex:pageBlockButtons>
<apex:pageBlockSection title="Lead content Section">
<tr><th class="labelCol vfLabelColTextWrap " scope="row">Lead Record Type</th><td class="dataCol "><span id="j_id0:j_id1:j_id2:j_id6:nameId">{!recordTypeName}</span></td></tr>
<apex:outputText value="{!lead.Web_To_Lead_Notes__c} " rendered="true"/>
<apex:outputField value="{!lead.Name}" id="nameId"/>
<apex:outputField value="{!lead.Company}" id="companyId"/>
<apex:outputField value="{!lead.Phone}" id="phoneid"/>
<apex:outputField value="{!lead.City}" id="cityId"/>
<apex:outputField value="{!lead.Street}" id="streetId"/>
<apex:outputField value="{!lead.Country}" id="countryid"/>
<apex:outputField value="{!lead.Email}" id="emailid"/>
<apex:outputField value="{!lead.PostalCode}" id="postalId"/>
<apex:outputField value="{!lead.MobilePhone}" id="mobileId"/>
<apex:outputField value="{!lead.Website}" id="websiteId"/>
<apex:outputField value="{!lead.Description}" id="descriptionId"/>
<apex:outputField value="{!lead.Industry}" id="industryId"/>
</apex:pageBlockSection>
Apex Class:
public with sharing class CaseConverter {
public Lead curLead{set;get;}
private final String name;
private final String company;
private final String phone;
private final String city;
private final String street;
private final String country;
private final String email;
private final String postal;
private final String mobile;
private final String website;
private final String description;
private final String industry;
private final String leadId;
public String Web_To_Lead_Notes_Case;
public string accountOwnerId;
//getter,setter for the selected list values
public String statusCaseSelected{get;set;}
public String originSelected{get;set;}
//getter,setter for the input fields
public String subjectInput{get;set;}
//getter,setter for the input fields
public String recordTypeName{get;set;}
//getter setter for the checkboxes
public Boolean createAccount{get;set;}
/*get the select options from the case system schema for the status field
* Input: nothing
* Output: List of the select options from case status
*/
public List<Selectoption> getStatusCaseItems(){
List<Selectoption> statusValues = new List<Selectoption>();
Schema.Describefieldresult systemCaseStatus = Case.Status.getDescribe();
for(Schema.Picklistentry plEntry : systemCaseStatus.getPicklistValues()){
statusValues.add(
new Selectoption(
plEntry.getValue(),
plEntry.getLabel()
)
);
}
return statusValues;
}
/*get the select options from the case system schema for the origin field
* Input: nothing
* Output: List of the select options from case origin
*/
public List<Selectoption> getOriginItems(){
List<Selectoption> originValues = new List<Selectoption>();
originValues.add(
new Selectoption(
'Customer Service','Customer Service'
)
);
return originValues;
}
//constructor, this page will be called from the LeadToCase Page
public CaseConverter(ApexPages.StandardController controller) {
this.curLead= (Lead)controller.getRecord();
List<QueueSobject> lstQueues = [SELECT Id,queue.Name, QueueId FROM QueueSobject WHERE SobjectType = 'Case'and queue.Name = 'Customer Service Cases'];
curLead.OwnerId = lstQueues[0].QueueId;
List<recordType> recordTypeList = [select Name from recordType where Id = :curlead.recordTypeId];
if(recordTypeList.Size() > 0 ) {
recordTypeName = recordTypeList[0].Name;
}
this.name = curLead.FirstName + ' ' + curLead.LastName;
this.company = curLead.Company;
this.phone = curLead.Phone;
this.city = curLead.City;
this.street = curLead.Street;
this.country = curLead.Country;
this.email = curLead.Email;
this.postal = curLead.PostalCode;
this.mobile = curLead.MobilePhone;
this.website = curLead.Website;
this.description = curLead.Description;
this.industry = curLead.Industry;
this.leadId = curLead.Id;
this.Web_To_Lead_Notes_Case = curLead.Web_To_Lead_Notes__c;
subjectInput = curLead.Web_To_Lead_Notes__c;
}
I have written a fucntionality to convert lead to case. The only problem is I have a field on Lead as Web-to-Lead Notes which is Text Area long and that is being popualated on Case Subject on Conversion. It gives error if the length is big. So I need to truncate the length of Lead to Web Notes field to 50 to properly fit in the Case Subject. Please help. Here is my code VFP and Apex:
Visualforce Page:
<apex:page standardController="Lead" extensions="CaseConverter">
<apex:form >
<apex:pageBlock title="Convert information to a new Case.">
<apex:pageBlockButtons >
<apex:commandbutton action="{!createCase}" value="Finish"/>
<apex:commandbutton action="{!returnToLead}" value="Previous"/>
</apex:pageBlockButtons>
<apex:pageBlockSection title="Lead content Section">
<tr><th class="labelCol vfLabelColTextWrap " scope="row">Lead Record Type</th><td class="dataCol "><span id="j_id0:j_id1:j_id2:j_id6:nameId">{!recordTypeName}</span></td></tr>
<apex:outputText value="{!lead.Web_To_Lead_Notes__c} " rendered="true"/>
<apex:outputField value="{!lead.Name}" id="nameId"/>
<apex:outputField value="{!lead.Company}" id="companyId"/>
<apex:outputField value="{!lead.Phone}" id="phoneid"/>
<apex:outputField value="{!lead.City}" id="cityId"/>
<apex:outputField value="{!lead.Street}" id="streetId"/>
<apex:outputField value="{!lead.Country}" id="countryid"/>
<apex:outputField value="{!lead.Email}" id="emailid"/>
<apex:outputField value="{!lead.PostalCode}" id="postalId"/>
<apex:outputField value="{!lead.MobilePhone}" id="mobileId"/>
<apex:outputField value="{!lead.Website}" id="websiteId"/>
<apex:outputField value="{!lead.Description}" id="descriptionId"/>
<apex:outputField value="{!lead.Industry}" id="industryId"/>
</apex:pageBlockSection>
Apex Class:
public with sharing class CaseConverter {
public Lead curLead{set;get;}
private final String name;
private final String company;
private final String phone;
private final String city;
private final String street;
private final String country;
private final String email;
private final String postal;
private final String mobile;
private final String website;
private final String description;
private final String industry;
private final String leadId;
public String Web_To_Lead_Notes_Case;
public string accountOwnerId;
//getter,setter for the selected list values
public String statusCaseSelected{get;set;}
public String originSelected{get;set;}
//getter,setter for the input fields
public String subjectInput{get;set;}
//getter,setter for the input fields
public String recordTypeName{get;set;}
//getter setter for the checkboxes
public Boolean createAccount{get;set;}
/*get the select options from the case system schema for the status field
* Input: nothing
* Output: List of the select options from case status
*/
public List<Selectoption> getStatusCaseItems(){
List<Selectoption> statusValues = new List<Selectoption>();
Schema.Describefieldresult systemCaseStatus = Case.Status.getDescribe();
for(Schema.Picklistentry plEntry : systemCaseStatus.getPicklistValues()){
statusValues.add(
new Selectoption(
plEntry.getValue(),
plEntry.getLabel()
)
);
}
return statusValues;
}
/*get the select options from the case system schema for the origin field
* Input: nothing
* Output: List of the select options from case origin
*/
public List<Selectoption> getOriginItems(){
List<Selectoption> originValues = new List<Selectoption>();
originValues.add(
new Selectoption(
'Customer Service','Customer Service'
)
);
return originValues;
}
//constructor, this page will be called from the LeadToCase Page
public CaseConverter(ApexPages.StandardController controller) {
this.curLead= (Lead)controller.getRecord();
List<QueueSobject> lstQueues = [SELECT Id,queue.Name, QueueId FROM QueueSobject WHERE SobjectType = 'Case'and queue.Name = 'Customer Service Cases'];
curLead.OwnerId = lstQueues[0].QueueId;
List<recordType> recordTypeList = [select Name from recordType where Id = :curlead.recordTypeId];
if(recordTypeList.Size() > 0 ) {
recordTypeName = recordTypeList[0].Name;
}
this.name = curLead.FirstName + ' ' + curLead.LastName;
this.company = curLead.Company;
this.phone = curLead.Phone;
this.city = curLead.City;
this.street = curLead.Street;
this.country = curLead.Country;
this.email = curLead.Email;
this.postal = curLead.PostalCode;
this.mobile = curLead.MobilePhone;
this.website = curLead.Website;
this.description = curLead.Description;
this.industry = curLead.Industry;
this.leadId = curLead.Id;
this.Web_To_Lead_Notes_Case = curLead.Web_To_Lead_Notes__c;
subjectInput = curLead.Web_To_Lead_Notes__c;
}
Please replace your code with this code and check and let me know ho wit works..because I hae created the same field and test the same and it is working fine for you even if it is blank..
if(curLead.Web_To_Lead_Notes__c != null)
{
Integer Intlength = objCo.Web_To_Lead_Notes__c.length();
if(Intlength >49 )
subjectInput = objCo.Web_To_Lead_Notes__c.substring(0,49);
else if(Intlength < 49)
subjectInput = objCo.Web_To_Lead_Notes__c.substring(0,Intlength);
}
Please check and let me know..
P.S. If my answer helps you to solve your problem please mark it as best answer. It will help other to find best answer.
Thanks,
Sandeep
Salesforce Certified Developer
All Answers
Change the line in class as below:
subjectInput = curLead.Web_To_Lead_Notes__c.substring(0,49);
If this helps please mark this answer as solution.
Sorry if the text is less than 50, I am getting this error. Please Help
Ending position out of bounds: 50
Error:
Attempt to de-reference a null object
An unexpected error has occurred. Your development organization has been notified.
You can first do the null check for thise field and then proceed with calculation
Plese use this
if(curLead.Web_To_Lead_Notes__c!= null)
{
subjectInput = curLead.Web_To_Lead_Notes__c.substring(0,49);
}
P.S. If my answer helps you to solve your problem please mark it as best answer. It will help other to find best answer.
Thanks,
Sandeep
Salesforce Certified Developer
Error
Ending position out of bounds: 49
Can you paste your code how your tried ?
Thanks,
Sandeep
You should check the field length first before substring, because if it is less than 49 and you are doing substring then it will surely throw an error..
In this sscenario what you can do, you can first check whatever is the length then you can substring based on that length..
Please try checking length first and then do substring..let me know if you need any help on this..
P.S. If my answer helps you to solve your problem please mark it as best answer. It will help other to find best answer.
Thanks,
Sandeep
Salesforce Certified Developer
this.leadId = curLead.Id;
if((curLead.Web_To_Lead_Notes__c!= null) || (curLead.Web_To_Lead_Notes__c.length() < 49))
{
subjectInput = curLead.Web_To_Lead_Notes__c.substring(0,49);
}
You can simply use below code:
this.leadId = curLead.Id;
if((curLead.Web_To_Lead_Notes__c!= null) || (curLead.Web_To_Lead_Notes__c.length() < 49))
{
subjectInput = curLead.Web_To_Lead_Notes__c.substring(0,curLead.Web_To_Lead_Notes__c.length());
}
Please check this, it will work for you..
The error was coming because length is less than 49 but it can be 4 and 5 and 34 which is less than 49..so in this case when you will do substring to (0,49)..where 49 does not exist so it will throw the error..
Please use above code , it will work ..
P.S. If my answer helps you to solve your problem please mark it as best answer. It will help other to find best answer.
Thanks,
Sandeep
Salesforce Certified Developer
Error: System.NullPointerException: Attempt to de-reference a null object
Error: System.DmlException: Insert failed. First exception on row 0; first error: STRING_TOO_LONG, Error is in expression '{!createCase}' in component <apex:commandButton> in page leadtocase: Class.CaseConverter.createCase: line 171, column 1
Please use below code it will solve your all issue..
this.leadId = curLead.Id;
if((curLead.Web_To_Lead_Notes__c!= null) && (curLead.Web_To_Lead_Notes__c!= '')&&(curLead.Web_To_Lead_Notes__c.length() < 49))
{
subjectInput = curLead.Web_To_Lead_Notes__c.substring(0,curLead.Web_To_Lead_Notes__c.length());
}
else if(curLead.Web_To_Lead_Notes__c.length() > 49)
{
subjectInput = curLead.Web_To_Lead_Notes__c.substring(0,49);
}
from above code if it is not null, not blank and less then 49 then it will take entire string..if it is more than 49 then it will take till 49..
Please implement and let me know if it solves your issue..
P.S. If my answer helps you to solve your problem please mark it as best answer. It will help other to find best answer.
Thanks,
Sandeep
Salesforce Certified Developer
Class.CaseConverter.<init>: line 92, column 1
If the field is blank, giving this error
Can you paste your entire code here, so I can look into and help you out ?
Thanks,
Sandeep
public Lead curLead{set;get;}
private final String name;
private final String company;
private final String phone;
private final String city;
private final String street;
private final String country;
private final String email;
private final String postal;
private final String mobile;
private final String website;
private final String description;
private final String industry;
private final String leadId;
public String Web_To_Lead_Notes_Case;
public string accountOwnerId;
//getter,setter for the selected list values
public String statusCaseSelected{get;set;}
public String originSelected{get;set;}
//getter,setter for the input fields
public String subjectInput{get;set;}
//getter,setter for the input fields
public String recordTypeName{get;set;}
//getter setter for the checkboxes
public Boolean createAccount{get;set;}
/*get the select options from the case system schema for the status field
* Input: nothing
* Output: List of the select options from case status
*/
public List<Selectoption> getStatusCaseItems(){
List<Selectoption> statusValues = new List<Selectoption>();
Schema.Describefieldresult systemCaseStatus = Case.Status.getDescribe();
for(Schema.Picklistentry plEntry : systemCaseStatus.getPicklistValues()){
statusValues.add(
new Selectoption(
plEntry.getValue(),
plEntry.getLabel()
)
);
}
return statusValues;
}
/*get the select options from the case system schema for the origin field
* Input: nothing
* Output: List of the select options from case origin
*/
public List<Selectoption> getOriginItems(){
List<Selectoption> originValues = new List<Selectoption>();
originValues.add(
new Selectoption(
'Customer Service','Customer Service'
)
);
return originValues;
}
//constructor, this page will be called from the LeadToCase Page
public CaseConverter(ApexPages.StandardController controller) {
this.curLead= (Lead)controller.getRecord();
List<QueueSobject> lstQueues = [SELECT Id,queue.Name, QueueId FROM QueueSobject WHERE SobjectType = 'Case'and queue.Name = 'Customer Service Cases'];
curLead.OwnerId = lstQueues[0].QueueId;
List<recordType> recordTypeList = [select Name from recordType where Id = :curlead.recordTypeId];
if(recordTypeList.Size() > 0 ) {
recordTypeName = recordTypeList[0].Name;
}
this.name = curLead.FirstName + ' ' + curLead.LastName;
this.company = curLead.Company;
this.phone = curLead.Phone;
this.city = curLead.City;
this.street = curLead.Street;
this.country = curLead.Country;
this.email = curLead.Email;
this.postal = curLead.PostalCode;
this.mobile = curLead.MobilePhone;
this.website = curLead.Website;
this.description = curLead.Description;
this.industry = curLead.Industry;
this.leadId = curLead.Id;
if((curLead.Web_To_Lead_Notes__c!= null) && (curLead.Web_To_Lead_Notes__c!= '') && (curLead.Web_To_Lead_Notes__c.length() < 49))
{
subjectInput = curLead.Web_To_Lead_Notes__c.substring(0,curLead.Web_To_Lead_Notes__c.length());
}
else if(curLead.Web_To_Lead_Notes__c.length() > 49)
{
subjectInput = curLead.Web_To_Lead_Notes__c.substring(0,49);
}
}
/* Exec after clicking the Finish Button
* Map the system lead fields to to the case description
* return the new case as page and delete the lead
*/
public Pagereference createCase(){
Case leadToCase = new Case();
//reconstruct new owner information
if(!((string)curLead.OwnerId).startsWith('00G')){
accountOwnerId = curLead.OwnerId;
} else{
accountOwnerId = UserInfo.getUserId();
}
update curLead;
system.debug('curLead---->'+curLead);
List<Lead> updatedLeads = new List<Lead>([SELECT OwnerId FROM Lead WHERE id =:leadId limit 1]);
List<recordType> recordTypeList = [select ID from recordType where sObjectType='Case' AND Name = 'Email to Case'];
String newOenwerId = updatedLeads[0].OwnerId;
system.debug('curLead43434---->'+updatedLeads[0].OwnerId);
leadToCase.OwnerId = updatedLeads[0].OwnerId;
system.debug('curLead9879---->'+leadToCase.OwnerId);
//case without account/contact
if(!createAccount){
String combineContactInfos = '';
if(name != null){
combineContactInfos += 'Name: ' + name + '\r\n';
}
if(company != null){
combineContactInfos += 'Company: ' + company + '\r\n';
}
if(phone != null){
combineContactInfos += 'Phone: ' + phone + '\r\n';
}
if(mobile != null){
combineContactInfos += 'Mobile: ' + mobile + '\r\n';
}
if(street != null){
combineContactInfos += 'Street: ' + street + '\r\n';
}
if(city != null){
combineContactInfos += 'City: ' + city + '\r\n';
}
if(postal != null){
combineContactInfos += 'Postal Code: ' + postal + '\r\n';
}
if(country != null){
combineContactInfos += 'Country: ' + country + '\r\n';
}
if(website != null){
combineContactInfos += 'Website: ' + website + '\r\n';
}
if(industry != null){
combineContactInfos += 'Industry: ' + industry + '\r\n';
}
if(description != null){
combineContactInfos += 'Description: ' + description + '\r\n';
}
if(Web_To_Lead_Notes_Case != null){
combineContactInfos += 'Web-to-Lead Notes: ' + Web_To_Lead_Notes_Case + '\r\n';
}
//set the required case information
if(recordTypeList.Size() > 0 ) {
leadToCase.recordTypeId = recordTypeList[0].Id;
}
leadToCase.Description = combineContactInfos;
leadToCase.Origin = this.originSelected;
leadToCase.Status = this.statusCaseSelected;
leadToCase.Subject = this.subjectInput;
leadToCase.SuppliedEmail = this.email;
system.debug('case44444---->'+leadToCase);
insert leadToCase;
//case with account/contact
}else{
RecordType accountRecordTypeInfo = [SELECT Id FROM RecordType WHERE Name = 'Individual' AND SobjectType = 'Account'];
RecordType contactRecordTypeInfo = [SELECT Id FROM RecordType WHERE Name = 'IND Standard' AND SobjectType = 'Contact'];
//create the new account
Account convAccount = new Account();
convAccount.name = company;
convAccount.Phone = phone;
convAccount.OwnerId = accountOwnerId ;
convAccount.Website = website;
convAccount.RecordTypeId = accountRecordTypeInfo.id;
insert convAccount;
//Create the contact and attach to the account
Contact convContact = new Contact();
convContact.AccountId = convAccount.Id;
convContact.OwnerId = accountOwnerId;
convContact.Phone = phone;
convContact.MobilePhone = mobile;
convContact.MailingCity = city;
convContact.MailingStreet = street;
convContact.MailingPostalCode = postal;
convContact.MailingCountry = country;
convContact.Email = email;
convContact.RecordTypeId = contactRecordTypeInfo.id;
List<String> subNames = name.split(' ',0);
if(subNames.size() > 1){
convContact.LastName = subNames[1];
convContact.FirstName = subNames[0];
}else{
convContact.LastName = name;
}
insert convContact;
//create the case and attach them to the new account
if(recordTypeList.Size() > 0 ) {
leadToCase.recordTypeId = recordTypeList[0].Id;
}
leadToCase.Description = description;
leadToCase.Origin = this.originSelected;
leadToCase.Status = this.statusCaseSelected;
leadToCase.Subject = this.subjectInput;
leadToCase.SuppliedEmail = this.email;
leadToCase.AccountId = convAccount.Id;
leadToCase.ContactId = convcontact.Id;
insert leadToCase;
}
//show the created case as new page and delete the lead
Pagereference casePage = new Apexpages.Standardcontroller(leadToCase).view();
casePage.setRedirect(true);
delete curLead;
return casePage;
}
/* Exec after clicking the previous button
* give the focus back to the list
*/
public Pagereference returnToLead(){
Pagereference leadPage = new Apexpages.Standardcontroller(this.curLead).view();
leadPage.setRedirect(true);
return leadPage;
}
}
Can you comment the code which I hev given, then check..because your code is very large and it seems you are using same field somewhere else and it is throwing the error from other place..so just to confirm that our code is throwing error, you can remove the code and check if error comes menas there is another place where we are refering teh same field else it is coming due to our code..Please can you quiclky confirm and it would be good if you can highlist the line number in code which is throwing the error..
Thanks
Sandeep
You have not initalized your variables..
Please add this above my code..
subjectInput = '';
After initalizing this can you check and let me know if it solves your issue..We should always initalize all variables in our constructor to avoid these type of errors.
In your case you have not initalized your variables which you are using pageside..
P.S. If my answer helps you to solve your problem please mark it as best answer. It will help other to find best answer.
Thanks,
Sandeep
Salesforce Certified Developer
Removing your block of code is not throwing me error. This is your piece of code. May I will explain it better.
Web to lead notes on lead needs to populated on case subject and description (2 places).If the length is more than 49, subject field can be truncated and only 49 character needs to be show but on description the whole web to lead field needs to be shown.
This piece of code was working perfectly until I didn't realized the subject cannot take text area long. So, I thought of truncating it.
Thanks
Abhishek
It will be very helpful if you can highlight the code or line number whihc is throwing error..or you can paste your code in code format by using <> this from bar..
Because we are doing null and blank check so it should not go inside any of the conidition and throw error..may b small thing we are missing so please highlight those..
Thanks,
Sandeep
Class.CaseConverter.<init>: line 94, column 1
This is pointing to your code this
subjectInput = curLead.Web_To_Lead_Notes__c.substring(0,curLead.Web_To_Lead_Notes__c.length());
Can you replace above line with this line
if(!curLead.Web_To_Lead_Notes__c == ' ')
subjectInput = curLead.Web_To_Lead_Notes__c.substring(0,curLead.Web_To_Lead_Notes__c.length());
Thanks,
Sandeep
Okay! give me sometime, let me have a look in depth if we are missing any small thing which is casuing the issue..
Thanks
Please replace your code with this code and check and let me know ho wit works..because I hae created the same field and test the same and it is working fine for you even if it is blank..
if(curLead.Web_To_Lead_Notes__c != null)
{
Integer Intlength = objCo.Web_To_Lead_Notes__c.length();
if(Intlength >49 )
subjectInput = objCo.Web_To_Lead_Notes__c.substring(0,49);
else if(Intlength < 49)
subjectInput = objCo.Web_To_Lead_Notes__c.substring(0,Intlength);
}
Please check and let me know..
P.S. If my answer helps you to solve your problem please mark it as best answer. It will help other to find best answer.
Thanks,
Sandeep
Salesforce Certified Developer
Sure, please test throughly and let me know if you face any issue..
P.S. If my answer helps you to solve your problem please mark it as best answer. It will help other to find best answer.
Thanks,
Sandeep
Salesforce Certified Developer
Yes, please post your question..
Thanks,
Sandeep
Here is another problem. We are using Case Feed on Cases. And part of the case is article managment. There is 2 views - Case Feed view and regular Case Details view. We can attach or create article from Case detail view. But we can only attach article from Case Feed but cannot create a new article. Do you have any idea how to create a Knowledge Article from the Case Feed view?
Thanks
Adda
Can you help in a button using URL hacking.
I need to create a button that whenever a contact is created from case automatically the case should be attached in the contact as a related list. So far I can came upto this but I am not able to pass the value from case to contact. Please help.
https://cs30.salesforce.com/003/e?retURL=%2F003n0000006N1WG&con4={!Case.Account}&con10={!Account.Phone}&{!Case.ContactId}={!Case.Id}&RecordType=012n00000008Wq0&ent=Case