-
ChatterFeed
-
24Best Answers
-
3Likes Received
-
0Likes Given
-
43Questions
-
249Replies
is it possible to use apex:relatedList to display a Parent Object's related items?
I have a custom object (Letter_Of_Agreement) that has an Account record as it's master.
I was hoping to be able to leverage the existing related list mechanism to display the Account's contacts on a visualforce page (the page is using the LOA controller).
Is it possible to reference the parent relationship of an object in a related list in some way? i.e. <apex:relatedList list="Account__r.Contacts" />
No matter the variation I use, I get an error "List attribute parent name 'account/account__r/etc' is an invalid field name for entity LOA"
Should I just recreate the related list functionality & look with a custom query and some visualforce?
- icemft1976
- March 03, 2010
- Like
- 0
- Continue reading or reply
problem with action support and required fields
Hey all,
I'm having an issue with apex action support and required fields.
I've got two feilds:
Secondary_phone_number__c, and Secondary_phone_number_type__c.
Secondary_phone_number_type__c isrequired when Secondary_phone_number__c is not null.
So I made a little action region base don this tutorial -
http://wiki.developerforce.com/index.php/Visualforce_DynamicEditPage
- but it only partially works.
If I enter a value in Secondary_phone_number__c, then Secondary_phone_number_type__c is rendered AND required, which is correct. But if I change my mind, and delete the value in Secondary_phone_number__c, it re-renders, but still requires Secondary_phone_number_type__c even though it should not...
Here is my applicable code, can anyone help out?
<apex:actionRegion > <apex:panelGrid columns="3" id="thePanelGrid"> <apex:outputPanel> <apex:inputField value="{!Member__c.Secondary_phone_number__c}" id="theInputField"> <apex:actionSupport event="onchange" rerender="thePanelGrid" status="status"/> </apex:inputField> </apex:outputPanel> <apex:inputField value="{!Member__c.Secondary_phone_number_type__c}" required="{!Member__c.Secondary_phone_number__c != null}" rendered="{!Member__c.Secondary_phone_number__c != null}" id="secPhoneType"> <apex:actionSupport event="onchange" rerender="thePanelGrid"/> </apex:inputField> </apex:panelGrid> <apex:actionStatus startText="applying value..." id="status"/> </apex:actionRegion>
Thanks!
- JNic
- February 10, 2010
- Like
- 0
- Continue reading or reply
Basic Show/Hide pageBlockSection not working...
<apex:page standardController="CustomObject__c" extensions="ControllerExt">
<apex:pageMessages id="pageMessages" />
<apex:form id="terminalForm">
<apex:pageBlock>
<apex:pageBlockSection>
<apex:pageBlockSectionItem >
<apex:outputLabel for="type">Type</apex:outputLabel>
<apex:selectList id="type" value="{!type}" size="1">
<apex:selectOptions value="{!typeOptions}" />
<apex:actionSupport event="onchange"
action="{!pageRefreshAction}"
rerender="TypeSection_CC,TypeSection_CH,pageMessages"
</apex:selectList>
</apex:pageBlockSectionItem>
</apex:pageBlockSection>
<apex:outputPanel id="TypeSection_CC" rendered="{!(type == 'option1'||type == 'option2')}">
<apex:pageBlockSection>
<!-- Stuff -->
</apex:pageBlockSection>
</apex:outputPanel>
<apex:outputPanel id="TypeSection_CH" rendered="{!(type == 'option3')}">
<apex:pageBlockSection>
<!-- More Stuff -->
</apex:pageBlockSection>
</apex:outputPanel>
</apex:pageBlock>
</apex:form>
</apex:page>
As you can see, the sections render depending on the value of "type". The default value of "type" is "option1". So "TypeSection_CC" is displayed when the page loads.
The "pageRefreshAction" method just adds a message to the page that displays the value of "type". I've tried making this method void as well, and it makes no difference.
public PageReference pageRefreshAction() { ApexPages.addMessage(new ApexPages.Message(ApexPages.SEVERITY.INFO, 'Type: '+type)); return null; }
When I choose "option3" from the "type" selectList the pageMessages block is refreshed and shows the value of "type" as "option3", but TypeSection_CC is still displayed and TypeSection_CH is not displayed.
Any help?? I don't know why this is causing problems...
- ryanhca
- February 09, 2010
- Like
- 0
- Continue reading or reply
is this Bug in getContent() PageReference function?
I've tested multiple times and found this persitent behaviour with getContent() or getContentAsPDF() methods of PageReference class.
Tried this:
I've a VF page which accepts a QueryString parameter "stmtid", and readsfrom an Object on page load like this:
MyObject__c[] objs = [Select Id, Name From MyObject__c Where ID =: ApexPages.currentPage().getParameters().get('stmtid')];
I called this VF page from a Custom Button, which works perfectly fine and generates the PDF on load, since the page is RenderAs="PDF".
BUT when I use this code:
PageReference p = Page.MyVFPDF; p.getParameters().put('stmtid', a.ID); Attachment attachment = new Attachment(); attachment.Body = p.getContentAsPDF(); // OR p.getContent() ... ... ... insert attachment;
Here, I getEmpty PDF file, since the Query in MyVFPDF page's extention class' contructor is returning Null value, i.e. No Record, but same ID (stmtid) value can be queried against the database and I can see the results in Eclipse Object browser ...
So, can anyone guide me here why I can't read the Values when I call the page in APEX calls and tries to read the Content to generate a PDF, but can use same page & stmtid variable value on a Custom Button & generate a PDF file ?
- VarunC
- February 09, 2010
- Like
- 0
- Continue reading or reply
Select records with custom date field within the current month?
I'm writing a trigger and need to count records that match a few criteria.
The current query is:
Integer i = [select count() from Account where Account_Status__c = 'Open' AND Producer_Code__c = :pcode ];
I need to add another criteria that will match records with "Account_Established__c" within the current month?
Any quick and easy way to do this?
Thanks in advance.
- David81
- February 03, 2010
- Like
- 0
- Continue reading or reply
geturl returns partial, can work in sandbox but not in production since it points to sandbox
Hi
I am new to visualforce so am probably doing things by trial and error and looking at examples (and so not getting the whole picture).
But I have controller extension for a custom object (call it FSL) and part of what the controller extension is trying to do is to generate a case off the save of this FSL custom object (PageReference save() function) and then have in the Case Description field the value of the full url of this custom object's entry.
Specifically, if this custom object entryhas id of xxxyyz and I am in my sandbox instance, then I want to be able to have in Case Description something like 'For more detail on this object, please refer to '+CustomObject_Link; and the CustomerObject_Link would return say https://tapp0.salesforce.com/xxxyyz.
Right now, I have the following code:
public PageReference Save() {
PageReference CustomObject_Link = new PageReference('/' + FSL.id);
.
.
cases.Description='You can see more detail for the FSL entry related to this request by clicking on this link: '+CustomObject_Link;
And when the case is generated, the Case Description would just contain:
You can see more detail for the FSL entry related to this request by clicking on this link:/xxxyyz.
I can hardcode the CustomObject_link in sandbox so that it has:
public PageReference Save() {
PageReference CustomObject_Link = 'https://tapp0.salesforce.com'+new PageReference('/' + FSL.id);
And this will allow Case Description to contain:
You can see more detail for the FSL entry related to this request by clicking on this link:https://tapp0.salesforce.com/xxxyyz.
Problem is when I bring this to production, we have a different instance (i.e. it would be https://na2.salesforce.com).
So how does one extract the instance information (i.e. that it's na2 instead of tapp0) in visualforce so I can do something like:
PageReference CustomObject_Link = 'https://'+CurrentInstance+'.salesforce.com'+new PageReference('/' + FSL.id);
Or how do I just issue a PageReference properly so that it would return the full url (https://<salesforce instance url>/xxyyz) and not just /xxxyyz?
- zen_nj
- February 02, 2010
- Like
- 0
- Continue reading or reply
My second trigger
trigger chAccGenerate on Organization__c (after insert) {
if (Trigger.isInsert){
List<Chart_of_accounts__c> accounts = new Chart_of_accounts__c[0];
List<SMain__c> smain = new SMain__c[0];
for (Organization__c o : Trigger.new) {
if(o.Industry__c == 'Telecom')
{accounts.add(new Chart_of_accounts__c (name = 'Sales of product income',Type__c = 'Income',Organization__c = o.ID));
accounts.add(new Chart_of_accounts__c (name = 'Service/fee income',Type__c = 'Income',Organization__c = o.ID));
insert accounts;
}
}
}
}
trigger test on Chart_of_accounts__c (after insert) { if (Trigger.isInsert){ List<SMain__c> smain = new SMain__c[0]; for (Chart_of_accounts__c c : Trigger.new) { if(c.Type__c == 'Income') {smain.add(new SMain__c (Chart_of_accounts__c = c.ID)); insert smain; } } } }
after create Organization__c record force say:
Error: Invalid Data.
Review all error messages below to correct your data.
Apex
trigger CloudBudget.chAccGenerate caused an unexpected exception,
contact your administrator: CloudBudget.chAccGenerate: execution of
AfterInsert
caused by: System.DmlException: Insert failed. First exception on row
0; first error: CANNOT_INSERT_UPDATE_ACTIVATE_ENTITY, CloudBudget.test:
execution of AfterInsert
caused by: System.DmlException: Insert failed. First exception on row 0
with id a0AA0000000EdM1MAK; first error:
INVALID_FIELD_FOR_INSERT_UPDATE, cannot specify Id in an insert call:
[Id]
Trigger.CloudBudget.test: line 7, column 13: []:
Trigger.CloudBudget.chAccGenerate: line 9, column 13
???
- split
- January 06, 2010
- Like
- 0
- Continue reading or reply
Odd Child Relationship label - R00*
Hello. I'm building some Apex code - writing a query where I grab a parent and certain child records. The Parent is Conference and the child is Attendee. So I would expect the inner query to be SELECT Id FROM Attendees__r... This wasn't working so i checked it in the schema browser and I see the following:
Select c.Name, c.Id, (Select Id From Sessions__r), (Select Id, Name From R00N50000001QtE7EAK) From Conference__c c
I checked the schema browser and the relationship name is indeed R00N50000001QtE7EAK. How/Why is this happening? Is there a way to change it?
Thanks
Chris
- chris_centra
- December 08, 2009
- Like
- 0
- Continue reading or reply
no label when inputField is in an actionRegion?
easy one, i think, but i can't find it in the forums. i have a vf page that displays some checkboxes and fields - all are fields on the underlying object. i added some functionality where i put a checkbox in an actionRegion - so when the checkbox is toggled, stuff happens. everything works perfectly, but my field label is no longer displayed. i added it manually, but the style and spacing are lost. what am i doing wrong?
i saw one forum post to put the info in pageblocksectionitems, which i did, but it didn't help. code snippet is below...
Thanks for your help.
chris
<apex:actionRegion >
<apex:pageBlockSectionItem >
<apex:outputLabel value="{!$ObjectType.SFDC_520_Quote__c.fields.Estimated_SalesTax_Override_Flag__c.label}"
for="SalesTaxOverrideCheckboxField"/>
<apex:inputField value="{!SFDC_520_Quote__c.Estimated_SalesTax_Override_Flag__c}"
rendered="{!SFDC_520_Quote__c.Opportunity__r.Site_Address_State__c == 'NY'}"
id="SalesTaxOverrideCheckboxField">
<apex:actionSupport event="onchange"
rerender="orderWorksheetDetailPanel" />
</apex:inputField>
</apex:pageBlockSectionItem>
</apex:actionRegion>
- chris_centra
- November 09, 2009
- Like
- 0
- Continue reading or reply
how to use controlling field in visual force page?
Hi,
I have custom field "Speciality(picklist)" and "SubSpeciality(multiselect picklist)" in my Account object. Speciality is the controlling field for SubSpeciality. Subspeciality is changed based on the selection of Speciality.
It is working fine in standard page layout. But I want to use it in my VF page to create new Account record. I have used inputfield and it display the details of both speciality and subspeciality. but subspeciality is not changed on selection of speciality.
How can I change the subspeciality on selection of speciality field. Following are sample code of my page.
Please help.....
<apex:inputfield value="{!Account.Speciality__pc}"></apex:inputfield>
<apex:inputfield value="{!Account.Subspecialty__pc}" />
Thanks in Advance.
Kamlesh Chauhan
- kamlesh_chauhan
- November 06, 2009
- Like
- 0
- Continue reading or reply
Execute case comment Edit button from overriden Case Comment Related List
Hi,
I overrode my CaseComments related list on the Case page layout due to comments customization needs:
VForce Page
<apex:page standardController="Case" extensions="CaseCommentRelatedListExt">
<apex:pageBlock >
<apex:pageBlockTable value="{!Case.CaseComments}" var="c">
<apex:column headerValue="CC">
<apex:form >
<apex:inputField value="{!c.IsPublished}"/>
</apex:form>
</apex:column>
<apex:column headerValue="Date" value="{!c.createddate}"/>
<apex:column headerValue="Created By" value="{!c.CreatedById}"/>
<apex:column headerValue="Comment" value="{!c.CommentBody}"/>
</apex:pageBlockTable>
</apex:pageBlock>
</apex:page>
Even though this is great, I lost some of the standard functionality of CaseComments such as the edit, delete buttons
Is there a way I can call this functionalities from vforce without writing my own Case Comment edit page?
Thank you very much
- kminev
- October 15, 2009
- Like
- 0
- Continue reading or reply
Replace case comments page with visual force
Hi,
Is it do-able to replace the standard case comment related list and replace it with a custom visual force page?
And if it is possible how difficult it is?
Thank you.
- kminev
- October 12, 2009
- Like
- 0
- Continue reading or reply
Error: Invalid field for SObject when building a table of data in a Visualforce page
Hello
I am trying to build a table of data in a page.
I have used the tutorial I find in the Visualforce guide, and it works just fine.
-------------
<apex:page standardController="Account"> <apex:pageBlock title="Hello {!$User.FirstName}!"> You are viewing the {!account.name} account. </apex:pageBlock> <apex:pageBlock title="Contacts"> <apex:pageBlockTable value="{!account.Contacts}" var="contact"> <apex:column value="{!contact.Name}"/> <apex:column value="{!contact.MailingCity}"/> <apex:column value="{!contact.Phone}"/> </apex:pageBlockTable> </apex:pageBlock> </apex:page>
Now, I am trying to adjust this to match what I am trying to do.
I have two custom objects:
Program Participation (which contains a master lookup fiels to Contacts, who participated in this program)
Review (this object has a lookup field to program participation, and basically allows to enter different reviews on the program)
What I am trying to do is, from within the Program Participation, to display all the reviews . This is the code I have
<apex:page standardController="Program_Participation__c">
<apex:pageBlock title="Hello {!$User.FirstName}!">You are viewing the {!Program_Participation__c.name} Program Participation record
<apex:pageBlockTable value="{!Program_Participation__c.Reviews}" var="review"> <apex:column value="{!review.Name}"/> </apex:pageBlockTable> </apex:pageBlock>
</apex:page>
When I save I get this error message
Error: Invalid field Reviews for SObject Program_Participation__c
Does anybody have an idea why this is happening?
Thanks
Giorgio
- giorgio70
- August 10, 2009
- Like
- 0
- Continue reading or reply
HTTP Callout: Specifying Compression?
I got a question from a customer today and just wanted to verify the answer with the community.
If I send an HTTP Callout to a web service that a customer has exposed, how do I make sure that it is compressed? If I simply add an HTTP header like: Content-Encoding: gzip will that do it?
- Caffeine
- July 09, 2009
- Like
- 0
- Continue reading or reply
Duplicate IDs if component is used in a loop in a VF page
Hello Community,
I have a VF page, with a list of objects.
I am using DataTable to bring the list of objects on VF Page, and am using a component to display a single object. The component has its own logic of building the view to display that object.
Now, in that component, I have a small button, that is supposed to do something in the background, and update the display of an object field on the component itself. And, I am using apex:CommandLink and rerender to do that.
But, the issue is, that when a component is rendered repeatedly in a VF page, the IDs inside the component are also duplicated and repeated as-they-are; resulting in duplicate IDs in the VF page.
For example, if I have a <apex:outputText id="DisplayName" value="{!DisplayName}"> inside the component; and if this component is repeated in the VF page, all these outputText elements would have the same ID.., not even a single change....., and if I am trying to re-render this outputText, the system doesn't do anything at all.
Re-render is not working at all, in this case...
To summarize again, if I am using a component repeatedly in a VF page, and doing something inside the component and re-rendering inside the component.. it doesn't work at all !!
Any solutions ? I dont want to go the manual way of writing javascript and ajax methods.
- HGS
- July 08, 2009
- Like
- 0
- Continue reading or reply
Calling an Apex function using Javascript on a VisualForce page
Hi All,
I'm trying to call an Apex function (in a controller extension class) using a Javascript "onclick" event and a VF ActionFunction. The scenario is this....
The button that triggers the "onclick" event is located in a VF page of form:
<apex:page controller="MyMasterPageController">
<apex:sectionHeader title="ATitle">
<apex:pageBlock >
<apex:composition template="MyChildPageComposition"/>
<apex:form >
<apex:commandButton value="Click Me" onclick="MyJavascriptFunc()"/>
</apex:form>
</apex:pageBlock>
</apex:sectionHeader>
</apex:page>
which is known as the "master" page.
The javascript function is located in the composition "MyChildPageComposition" of form:
<apex:page controller="MyMasterPageController" extensions="ControllerExtForChildPage">
<apex:form >
<apex:actionFunction action="{!myApexFunc}" name="MyJavascriptFunc"/>
<apex:pageBlock>
<apex:pageBlockSection title="ASectionTitle">
<!-- Input fields/bulk of VF page etc goes here -->
</apex:pageBlockSection>
</apex:pageBlock>
</apex:form>
</apex:page>
which is known as the "child" page and displayed within the "master" page using the <apex:composition> functionality.
The Apex function "myApexFunc" is found in the class "ControllerExtForChildPageComposition" and is of form:
public PageReference myApexFunc() {
// do something here
system.debug('Print some debug here');
return null;
}
Now, my issue is that if I create the VF pages for real as basic as those examples above, "myApexFunc" is successfully called (the debug is printed, and any other code in it runs) when the "Click Me" button in the master page is clicked.
However, when I have attempted to incorprate the basic apex and VF code above into existing master/child pages and their associated controllers and extensions, "myApexFunc" is never successfully called. In fact, if the child page is subsituted for a child page of this form:
<apex:page controller="MyMasterPageController" extensions="ControllerExtForChildPage">
<apex:form >
<apex:actionFunction action="{!myApexFunc}" name="AnotherJavascriptFunc"/>
<script>
function MyJavascriptFunc() {
alert('Running Javascript');
AnotherJavascriptFunc();
alert('Finishing javascript');
}
</script>
<apex:pageBlock>
<apex:pageBlockSection title="ASectionTitle">
<!-- Input fields/bulk of VF page etc goes here -->
</apex:pageBlockSection>
</apex:pageBlock>
</apex:form>
</apex:page>
which is incorprated into an existing child page,both alerts are run (proving that the link between the "onclick" event in the master page and "MyJavascriptFunc" in the child page composition is there, but "myApexFunc" is still not called! Can anyone shed any light on this? Is there any VF or Apex code which is incompatible with using Javascript and action functions? As I said before, when it's in its basic forms above, everything works, just not when other VF and apex code are added.
Many thanks,
Marco
- mt0859
- May 19, 2009
- Like
- 0
- Continue reading or reply
how to set parameter for actionfunction
I want to add some parameter for the function in actionfunction.
example:
visualforce code
<apex:actionFunction action="{!insertSelDMDocId}" status="selDocIdCb" name="insertSelDMDocId"/>
fuction abc(){
insertSelDMDocId();//i want to add a parameter like insertSelDMDocId(id)
}
apex code:
// I want to get id here like insertSelDMDocId(id) , but it some error occurred.
public void insertSelDMDocId() {
myid = id
}
i have no idea about this issue.
If anyone can help me?
Thank you very much!!
- bestjamie
- May 06, 2009
- Like
- 0
- Continue reading or reply
Required red Mark on a visualforce page
Hi All,
I have a visualforce page which has some input fields displayed in it.
These fields are not present in the database. I want to get the red mark on this fields that Salesforce has for required field.
I have seen that the red mark appears when we use standard controller and display standard field with required = true in the field attribute. But in my case the fields are not a part of the database.
Does visualforce has any inbuilt attribute to display the red mark or should I get it as an image myself?
Thanks & Regards,
Heena
- Heena
- February 26, 2009
- Like
- 0
- Continue reading or reply
user hitting enter key on inputfield in tabbed view
How can I get pressing enter to be the same as clicking the button?
Thanks in advance!!
Jim
- JimRae
- August 27, 2008
- Like
- 1
- Continue reading or reply
Convert a Picklist value to a Double value
Is there any functionnality ( like toString) to covnert My picklist values (String) to a double ( Like parseFloat in Javascript).
Thank you
- Mig
- February 05, 2008
- Like
- 0
- Continue reading or reply
onclick and oncomplete when used together do not work for commandLink
Hi,
I have a commandLink on click of which I want to ask the user for confirmation first i.e. whether he is sure to take the action. Once the user says Yes and the action is completed, I want a alert saying that the action was completed successfully. In order to achieve this, I used the onclick and oncomplete attributes of CommandLink. My issue is that if I use both the attributes, my commandLink action never gets fired. If I use only one of the them, everything works fine except I have only one of the popups.
Is there an issue when both the onclick and oncomplete attribute are used together? Following is a sample code:
<apex:commandLink value="Test" action="{!myAction}" onclick="return window.confirm('Are you sure?');" oncomplete="alert('Event Completed');" />
- Rajesh Shah
- May 27, 2011
- Like
- 1
- Continue reading or reply
Visualforce and ActiveX
Hi,
I have a Visualforce page through which I am trying to access a SDK. It is done using ActiveX control. The VB + JS script that I have runs fine when it is a normal HTML page residing on my desktop. However the same code when incorporated in Visualforce does not work. Does running ActiveX control require uploading any kind of files to Static Resource? My code need not be a Visualforce. If there is any other way I could integrate ActiveX with Salesforce, even that would be fine.
Thanks in Advance.
- Rajesh Shah
- August 24, 2010
- Like
- 0
- Continue reading or reply
Logic to find if given date falls on an Holiday or not
Based on the holidays mentioned in the Company Profile, I need to find out if a given date falls on an Holiday or not? Currently I am doing this using a complex logic where based on all the permutations and combinations like Yearly, Monthly, Daily, etc I try to see if it is a holiday or not. I just wanted to know if there is a simpler way to do this that I don't know about.
- Rajesh Shah
- March 03, 2010
- Like
- 0
- Continue reading or reply
Problem with html image tag
I have a force.com site with lets say XYZ as the home page. In one of the subsequent pages I am displaying images uploaded in the attachment object of the related record. To display the image, I am forming the url as '/servlet/servlet.FileDownload?file=' + attachmentId;' This works fine when I use the apex image tag to display the images on the site.
However due to another problem, I had to use html image tag. But when I use the html tag, the images don't get displayed. In order to display them, I have to change the url as '/XYZ/servlet/servlet.FileDownload?file=' + attachmentId;'. This works fine in sites but gives error when viewing the site page as a normal VF page when logged in.
Can anyone explain why is difference between apex image and html image? And what are the possible solutions I have to display the images on both sites and VF page?
As of now, I am trying to solve the other problem I am facing using apex image. If that works out, I will use Apex Image tag.
- Rajesh Shah
- February 22, 2010
- Like
- 0
- Continue reading or reply
sid problem with JavaScript and VF page
Something very interesting I found today and thought to share it.
We have a custom button on detail page of a object with the OnClick JavaScript behaviour. The JavaScript checks certain field values and based on that, it redirects the User to a Visualforce page. One of the parameters we passed to visualforce page was named 'sid' i.e. we used to pass sid = Id of the record. Everything worked fine except for one case.
When we login to the org and click the button, it didn't redirected us to the VF page. Instead what it did was it toggled between the VF page and the detail page continuously till the browser got tired and threw an error. However if we went to any other Visualforce page and then came back to the detail page and again clicked the button, everything worked fine and we were redirected to the VF page. Weird.
After a lot of debugging, I finally found the problem. It was the name of the parameter sid. I looked into the details of the page getting called using Firebug and I found that my sid parameter contained the session id instead of the Id of the record. For some reason, the first time when we try to visit the Visualforce page, salesforce replaced the sid with session id. However, after visiting another page and then calling our VF page, the sid now had the Id of the record.
To solve, we replaced the sid parameter with something else. Lesson learnt: Do not use the standard parameter that salesforce uses unless you are trying to override it.
- Rajesh Shah
- January 08, 2010
- Like
- 0
- Continue reading or reply
date field in focus on edit page
I have a standard Salesforce edit page where the first 2 fields are picklist and the next one is a date field. Everytime the page loads in edit mode, salesforce automatically brings the date field in focus and the calendar widget pops up. This can be very confusing to the users as the date field is required to be populated only in certain cases. I also do not have the option of moving a text field before the date field.
Is there a way to remove the focus or allow me to have some other field in focus?
- Rajesh Shah
- January 06, 2010
- Like
- 0
- Continue reading or reply
Account Team Member add permission
Requirement: A group of X people in the system should have the right to Add team members to Accounts. The group of people may belong to 1 single profile but not necessarily
Problem: This is what salesforce says about the permissions a user need to have to add a Team member to a Account Group.
a. He is a System Administrator
b. He is the Owner of the Account
c. He is the Manager of the Owner
d. He has Modify all Data and Manage user permission on his profile.
In my case, none of the above condition is satisfactory for the group of X people. Is there any other way I can give them the permission to add Account Team Member? I also found that if a User A is added to Account Team with Read/Write permission, he can add another Team Member but he can only provide that other member Read Access.
Can I use this in some way?
- Rajesh Shah
- December 18, 2009
- Like
- 0
- Continue reading or reply
Account Team with Child Object while creating a Report Type
I am having a problem in creating a report type. Before the problem, let me explain the relationship between the objects.
I have object A as child of Account and object B as child of A. So its like Account -> Object A -> Object B. I need to create a report with the details from Account, Object A and Object B. This can be done using report Type. However, it is also required to summarize the information based on the roles defined in Account Team. This kind of relationship cannot be created in Report Type.
Is there any way, that this is possible to do using Out of the box functionality? If not, what are the alternatives?
Regards,
Rajesh
- Rajesh Shah
- December 11, 2009
- Like
- 0
- Continue reading or reply
Custom Setting : Name too large error
I created a Custom Setting Data Set to store the Visualforce page that needs to be called for each recordtype. In the Name, I am storing the Record Type name. The whole feature works great for my requirement except for a small hitch.
The Name field length is 38 charaters. So I cannot add record type names more than 38 chars and I have record types with length upto 60 characters. Also, in eclipse Schema, I can see that the length of the field is 80 chars. I checked in another org and it also gave the same error. Now because of this small hitch, I cannot use this feature. :smileysad:
Is it a bug from Salesforce? or will the length of the Name field always be 38?
- Rajesh Shah
- November 18, 2009
- Like
- 0
- Continue reading or reply
Passing values from Javascript to Controller
Is there any to pass to parameters from a javascript to a actionFunction?
For eg I have a var 'x' in javascript set to some value. On some condition I need to call a actionFunction which calls a controller. I need to pass the value of x to the controller. I can pass using param tag of actionFunction to controller but how to pass x to the actionFunctio?
- Rajesh Shah
- November 05, 2009
- Like
- 0
- Continue reading or reply
Script Too Large
Hi All,
I am writing an apex class which has grown too big. When saving through Eclipse or UI, it gives me that 'Script too large'.
What exactly is the size limit of an Apex Class?
- Rajesh Shah
- November 04, 2009
- Like
- 0
- Continue reading or reply
History related List using Visualforce
When developing a Visualforce page for overiding view page for any object, one problem that creeps up is to display the History details of a record. The standard related list Component doesn't works for History.
With the help of some code from Community ( I now can't find the link to it :( ), I wrote my own code then to display the history of an object. It mimics the standard list as far as possible.
Heres the code. It is for the Case object but it can be used for any other object.
1.Component Code
<apex:component controller="CaseHistoriesComponentController">
<!-- Attribute Definition -->
<apex:attribute name="CaseId" description="Salesforce Id of the Case whose Case History needs to be rendered" type="Id" required="true" assignTo="{!caseId}" />
<!-- Case History Related List -->
<apex:pageBlock title="Case History">
<apex:pageBlockTable value="{!histories}" var="History" >
<apex:column headerValue="Date" value="{!History.thedate}"/>
<apex:column headerValue="User"> <apex:outputLink value="/{!History.userId}"> {!History.who} </apex:outputLink></apex:column>
<apex:column headerValue="Action"><apex:outputText escape="false" value="{!History.action}"/></apex:column>
</apex:pageBlockTable>
</apex:pageBlock>
</apex:component>
2. Apex Code
public class CaseHistoriesComponentController {
public Id caseId {get; set;}
public cHistories[] histories;
// Variables
public Static final Map<String, Schema.SObjectField> CaseFieldmap = Schema.SObjectType.Case.fields.getMap();
public Static final List<Schema.PicklistEntry> fieldPicklistValues = CaseHistory.Field.getDescribe().getPicklistValues();
public List<cHistories> getHistories()
{
list<cHistories> histories = new list<cHistories>();
String prevDate = '';
for(CaseHistory cHistory : [Select CreatedDate, CreatedBy.Name, CreatedBy.Id, Field, NewValue, OldValue from CaseHistory where CaseId = :caseId order by CreatedDate desc])
{
if((cHistory.newValue == null && cHistory.oldValue == null)
|| (cHistory.newValue != null && !(string.valueOf(cHistory.newValue).startsWith('005') || string.valueOf(cHistory.newValue).startsWith('00G')))
|| (cHistory.oldValue != null && !(string.valueOf(cHistory.oldValue).startsWith('005') || string.valueOf(cHistory.oldValue).startsWith('00G'))))
{
cHistories tempHistory = new cHistories();
// Set the Date and who performed the action
if(String.valueOf(cHistory.CreatedDate) != prevDate)
{
tempHistory.theDate = String.valueOf(cHistory.CreatedDate);
tempHistory.who = cHistory.CreatedBy.Name;
tempHistory.userId = cHistory.CreatedBy.Id;
}
else
{
tempHistory.theDate = '';
tempHistory.who = '';
tempHistory.userId = cHistory.CreatedBy.Id;
}
prevDate = String.valueOf(cHistory.CreatedDate);
// Get the field label
String fieldLabel = CaseHistoriesComponentController.returnFieldLabel(String.valueOf(cHistory.Field));
// Set the Action value
if (String.valueOf(cHistory.Field) == 'created') { // on Creation
tempHistory.action = 'Created.';
}
else if(cHistory.OldValue != null && cHistory.NewValue == null){ // when deleting a value from a field
// Format the Date and if there's an error, catch it and re
try {
tempHistory.action = 'Deleted ' + Date.valueOf(cHistory.OldValue).format() + ' in <b>' + fieldLabel + '</b>.';
} catch (Exception e){
tempHistory.action = 'Deleted ' + String.valueOf(cHistory.OldValue) + ' in <b>' + fieldLabel + '</b>.';
}
}
else{ // all other scenarios
String fromText = '';
if (cHistory.OldValue != null) {
try {
fromText = ' from ' + Date.valueOf(cHistory.OldValue).format();
} catch (Exception e) {
fromText = ' from ' + String.valueOf(cHistory.OldValue);
}
}
String toText = '';
if (cHistory.OldValue != null) {
try {
toText = Date.valueOf(cHistory.NewValue).format();
} catch (Exception e) {
toText = String.valueOf(cHistory.NewValue);
}
}
if(toText != '')
tempHistory.action = 'Changed <b>' + fieldLabel + '</b>' + fromText + ' to <b>' + toText + '</b>.';
else
tempHistory.action = 'Changed <b>' + fieldLabel;
}
// Add to the list
histories.add(tempHistory);
}
}
return histories;
}
// Function to return Field Label of a Case field given a Field API name
public Static String returnFieldLabel(String fieldName)
{
if(CaseHistoriesComponentController.CaseFieldmap.containsKey(fieldName))
return CaseHistoriesComponentController.CaseFieldmap.get(fieldName).getDescribe().getLabel();
else
{
for(Schema.PicklistEntry pickList : fieldPicklistValues)
{
if(pickList.getValue() == fieldName)
{
if(pickList.getLabel() != null)
return pickList.getLabel();
else
return pickList.getValue();
}
}
}
return '';
}
// Inner Class to store the detail of the case histories
public class cHistories {
public String theDate {get; set;}
public String who {get; set;}
public Id userId {get; set;}
public String action {get; set;}
}
}
Let me know your views on the code or if you have any questions
- Rajesh Shah
- October 16, 2009
- Like
- 1
- Continue reading or reply
Case Comments Related List using Visualforce
Recently I was working on a requirement which required overriding the Case detail page with a visualforce page. Problem crept when the related list comonent didnt worked for Case Comments and History. So I decided to write my own code to display the related lists.
I was finally able to write my own code to display the related list. It implements all the function that standard related list of Case Comments provide. In order to make it reusable, I made it as a component so that in other pages I just need to pass the Case Id and I will get the complete list of Case Comments.
Heres the code finally :
1. Component Code
<apex:component controller="CaseCommentsComponentController" allowDML="true">
<!-- Attribute Definition -->
<apex:attribute name="CaseId" description="Salesforce Id of the Case whose Case Comments needs to be rendered" type="Id" required="true" assignTo="{!caseId}" />
<!-- Component Body -->
<apex:componentBody >
<apex:form >
<apex:pageBlock title="Case Comments" >
<apex:pageBlockButtons location="top">
<apex:commandButton action="{!NewComment}" value="New"/>
</apex:pageBlockButtons>
<apex:pageBlockTable value="{!Comments}" var="comment">
<apex:column headerValue="Action">
<apex:outputLink value="/{!comment.cComment.Id}/e?parent_id={!caseId}&retURL=/{!caseId}">Edit</apex:outputLink>  |  
<apex:commandLink action="{!deleteComment}" value="Del">
<apex:param name="CommentId_d" value="{!comment.cComment.Id}"/>
</apex:commandLink>  |  
<apex:commandLink action="{!makePublicPrivate}" value="{!comment.PublicPrivateAction}">
<apex:param name="CommentId_p" value="{!comment.cComment.Id}" />
</apex:commandLink>
</apex:column>
<apex:column headerValue="Public" value="{!comment.cComment.IsPublished}" />
<apex:column headerValue="Comments">
<apex:outputText escape="false" value="{!comment.commentText}"/>
</apex:column>
</apex:pageBlockTable>
</apex:pageBlock>
</apex:form>
</apex:componentBody>
</apex:component>
2. Apex Code
public with sharing class CaseCommentsComponentController {
public Id caseId {get; set;}
public cComments[] comments{
get{
List<cComments> comments = new List<cComments>();
for(CaseComment comment : [Select LastModifiedDate, LastModifiedBy.Id, LastModifiedBy.Name, IsPublished, CreatedDate, CreatedBy.Id, CreatedBy.Name, CommentBody From CaseComment c where ParentId = :caseId order by c.LastModifiedDate desc])
{
cComments tempcComment = new cComments();
tempcComment.cComment = comment;
// Build String to display.
tempcComment.commentText = '<b>Created By: <a href=\'/' + comment.CreatedBy.Id + '\'>' + comment.CreatedBy.Name + '</a> (' + comment.CreatedDate.format() + ') | ';
tempcComment.commentText += 'Last Modified By: <a href=\'/' + comment.LastModifiedBy.Id + '\'>' + comment.LastModifiedBy.Name + '</a> (' + comment.LastModifiedDate.format() + ')</b><br>';
tempcComment.commentText += comment.CommentBody;
if(comment.IsPublished)
tempcComment.PublicPrivateAction = 'Make Private';
else
tempcComment.PublicPrivateAction = 'Make Public';
//Add to list
comments.add(tempcComment);
}
return comments;
}
set;
}
public PageReference NewComment()
{
PageReference pr = new PageReference('/00a/e?parent_id='+ caseId + '&retURL=%2F' + caseId);
pr.setRedirect(true);
return pr;
}
public PageReference deleteComment()
{
Id commentId = ApexPages.currentPage().getParameters().get('CommentId_d');
for(cComments Comment : comments)
{
if(Comment.cComment.Id == commentId)
{
delete Comment.cComment;
break;
}
}
PageReference pg = new PageReference('/' + caseId);
pg.setRedirect(true);
return pg;
}
public PageReference makePublicPrivate()
{
Id commentId = ApexPages.currentPage().getParameters().get('CommentId_p');
for(cComments Comment : comments)
{
if(Comment.cComment.Id == commentId)
{
Comment.cComment.IsPublished = !Comment.cComment.IsPublished;
if(Comment.cComment.IsPublished)
Comment.PublicPrivateAction = 'Make Private';
else
Comment.PublicPrivateAction = 'Make Public';
update Comment.cComment;
break;
}
}
PageReference pg = new PageReference('/' + caseId);
pg.setRedirect(true);
return pg;
}
public class cComments {
public CaseComment cComment {get; set;}
public String commentText {get; set;}
public String PublicPrivateAction {get; set;}
}
}
Hope it is helpful to you.
Let me know your views on the code above or if you have any questions
- Rajesh Shah
- October 16, 2009
- Like
- 1
- Continue reading or reply
actionSupport rerender problem
I am having a problem using action Support and rerendering a section.
Following is the page code.
<apex:form id="AccountForm">
<apex:pageBlock >
<apex:pageBlockButtons >
<apex:commandButton value="Save" action="{!save}" />
<apex:commandButton value="Cancel" action="{!cancel}" />
<apex:commandButton value="Custom Save" action="{!saveCustom}"/>
</apex:pageBlockButtons>
<apex:pageBlockSection >
<apex:inputField value="{!Account.Name}" />
<apex:inputField required="true" value="{!Account.AccountNumber}" />
<apex:inputField value="{!Account.Industry}" />
<apex:inputField value="{!Account.Has_Shipping_Address__c}" >
<apex:actionSupport event="onclick" action="{!changeShippingSection}" rerender="AccountForm" status="StatusChange"/>
<apex:actionStatus startText="Updating page ..." id="StatusChange"/>
</apex:inputField>
</apex:pageBlockSection>
<apex:pageBlockSection id="ShippingAddressSection" rendered="{!shippingSection}" Title="Shipping Address" >
<apex:inputField value="{!Account.ShippingCity}" />
<apex:inputField value="{!Account.ShippingState}" />
<apex:inputField value="{!Account.ShippingCountry}" />
<apex:inputField value="{!Account.ShippingPostalCode}" />
</apex:pageBlockSection>
</apex:pageBlock>
</apex:form>
In the above code, when the Has Shipping Address field is clicked, the Shipping Address section should be visible. Following is the corresponding controller code
public void changeShippingSection()
{
shippingSection = account.Has_Shipping_Address__c;
//return null;
}
It works perfectly fine when I AccountForm as Id in the rerender attribute. But if I put shippingAddressSection as Id in the attribute, no change happens even though function gets called.
Is this the intended behaviour or am I missing something?
- Rajesh Shah
- October 08, 2009
- Like
- 0
- Continue reading or reply
User belongs to Roles and Subordinates group
Hi, I have the following query.
For the current User, I need to determine if it belongs to particular group or not. In the case, where the group is of type Roles And Subordinates, how do I determine this? I checked that for this type of group, there are no group members. So the only option I would have is to traverse through the Role Heirarchy.
Let me know if there is a better way to do this.
- Rajesh Shah
- September 15, 2009
- Like
- 0
- Continue reading or reply
Help: Page running in User mode and Controller in system mode.
I am building a Visualforce page for creating a case. Now there are fields in case which are read only for all profiles except System Adminstrator. I need the user to enter the value for this field and so I created my page with a controller and not a standard controller. Also in my controller I added the modifier as without sharing.
Now when I log in through another user, I still see the field as read only on the page. However from the controller I am able to insert value or update the field. I fail to understand this. It seems to me that the page is running in User mode following the user profile permissions and field level security while the controller is running in Sytem mode. Is this the intended behaviour or am I missing something?
How do I solve this? Has anybody faced a similar problem before? Please reply. This is very critical to the project I am doing.
- Rajesh Shah
- September 09, 2009
- Like
- 0
- Continue reading or reply
PageReference of S-Control
How do I get a pageReference of a S-Control in an Visualforce Controller?
For eg: I want to call an S-Control after saving the record in the s-contol.
I know I can do it using /servlet/servletIntegration ...... but I don't want to do it this way.
- Rajesh Shah
- September 08, 2009
- Like
- 0
- Continue reading or reply
Help: extending standard printable View using Visualforce
We have a Case application where there are many record types. What we have done is using s-control, we have created our own print functions which mimics the printable view function. Basically what we do is get the content of the print page, remove not required sections and display the core details for print with some custom style sheets applied. This is working fine for the existing recordtypes.
Recently we created a new record type, which requried details from a Child Object too. So we build a Visualforce view page for it showing the details in one go from both the Case and the child object. But when I use the print s-control for this, I only get the case details and not the child details. It is very important to show the child details in the print and I can't think of a to do it.
Let me know if any of you have a solution for this.
- Rajesh Shah
- September 04, 2009
- Like
- 0
- Continue reading or reply
Saving the network path in a URl field
How can i pass a network like "\\192.168.0.1\c\project\Salesforce\Test.txt " in a URl field defined for a Custome object thru an Apex Code.
I tried doing the same but type of erros shown are:-
1. Save error: line breaks not allowed in string literals
Please help me in this issue
- Rajesh Shah
- September 03, 2009
- Like
- 0
- Continue reading or reply
Section header rendering Twice
I have a Visualforce page which displays Case details in a custom way. For rendering Case Comments, I cannot directly use Case Comments related list as it is not allowed by Salesforce. So I created a Custom Component which takes Case Id as parameter and generates the related list of Case Comments as it is rendered in a normal view. Everything works fine till now.
In the related list I have also added links like del, Make public/Private for the case comments. These are command links which have corresponding action functions in the custom component controller. These functions return page reference of null. When the page is rerendered after the call, I now see 2 section headers instead of 1. I have no idea why there should be 2 section headers coming up when there is a tag for only 1. btw both the section headers come one below the other.
Has anyone faced this problem before? Do let me kniow your ideas.
- Rajesh Shah
- August 31, 2009
- Like
- 0
- Continue reading or reply
onclick and oncomplete when used together do not work for commandLink
Hi,
I have a commandLink on click of which I want to ask the user for confirmation first i.e. whether he is sure to take the action. Once the user says Yes and the action is completed, I want a alert saying that the action was completed successfully. In order to achieve this, I used the onclick and oncomplete attributes of CommandLink. My issue is that if I use both the attributes, my commandLink action never gets fired. If I use only one of the them, everything works fine except I have only one of the popups.
Is there an issue when both the onclick and oncomplete attribute are used together? Following is a sample code:
<apex:commandLink value="Test" action="{!myAction}" onclick="return window.confirm('Are you sure?');" oncomplete="alert('Event Completed');" />
- Rajesh Shah
- May 27, 2011
- Like
- 1
- Continue reading or reply
History related List using Visualforce
When developing a Visualforce page for overiding view page for any object, one problem that creeps up is to display the History details of a record. The standard related list Component doesn't works for History.
With the help of some code from Community ( I now can't find the link to it :( ), I wrote my own code then to display the history of an object. It mimics the standard list as far as possible.
Heres the code. It is for the Case object but it can be used for any other object.
1.Component Code
<apex:component controller="CaseHistoriesComponentController">
<!-- Attribute Definition -->
<apex:attribute name="CaseId" description="Salesforce Id of the Case whose Case History needs to be rendered" type="Id" required="true" assignTo="{!caseId}" />
<!-- Case History Related List -->
<apex:pageBlock title="Case History">
<apex:pageBlockTable value="{!histories}" var="History" >
<apex:column headerValue="Date" value="{!History.thedate}"/>
<apex:column headerValue="User"> <apex:outputLink value="/{!History.userId}"> {!History.who} </apex:outputLink></apex:column>
<apex:column headerValue="Action"><apex:outputText escape="false" value="{!History.action}"/></apex:column>
</apex:pageBlockTable>
</apex:pageBlock>
</apex:component>
2. Apex Code
public class CaseHistoriesComponentController {
public Id caseId {get; set;}
public cHistories[] histories;
// Variables
public Static final Map<String, Schema.SObjectField> CaseFieldmap = Schema.SObjectType.Case.fields.getMap();
public Static final List<Schema.PicklistEntry> fieldPicklistValues = CaseHistory.Field.getDescribe().getPicklistValues();
public List<cHistories> getHistories()
{
list<cHistories> histories = new list<cHistories>();
String prevDate = '';
for(CaseHistory cHistory : [Select CreatedDate, CreatedBy.Name, CreatedBy.Id, Field, NewValue, OldValue from CaseHistory where CaseId = :caseId order by CreatedDate desc])
{
if((cHistory.newValue == null && cHistory.oldValue == null)
|| (cHistory.newValue != null && !(string.valueOf(cHistory.newValue).startsWith('005') || string.valueOf(cHistory.newValue).startsWith('00G')))
|| (cHistory.oldValue != null && !(string.valueOf(cHistory.oldValue).startsWith('005') || string.valueOf(cHistory.oldValue).startsWith('00G'))))
{
cHistories tempHistory = new cHistories();
// Set the Date and who performed the action
if(String.valueOf(cHistory.CreatedDate) != prevDate)
{
tempHistory.theDate = String.valueOf(cHistory.CreatedDate);
tempHistory.who = cHistory.CreatedBy.Name;
tempHistory.userId = cHistory.CreatedBy.Id;
}
else
{
tempHistory.theDate = '';
tempHistory.who = '';
tempHistory.userId = cHistory.CreatedBy.Id;
}
prevDate = String.valueOf(cHistory.CreatedDate);
// Get the field label
String fieldLabel = CaseHistoriesComponentController.returnFieldLabel(String.valueOf(cHistory.Field));
// Set the Action value
if (String.valueOf(cHistory.Field) == 'created') { // on Creation
tempHistory.action = 'Created.';
}
else if(cHistory.OldValue != null && cHistory.NewValue == null){ // when deleting a value from a field
// Format the Date and if there's an error, catch it and re
try {
tempHistory.action = 'Deleted ' + Date.valueOf(cHistory.OldValue).format() + ' in <b>' + fieldLabel + '</b>.';
} catch (Exception e){
tempHistory.action = 'Deleted ' + String.valueOf(cHistory.OldValue) + ' in <b>' + fieldLabel + '</b>.';
}
}
else{ // all other scenarios
String fromText = '';
if (cHistory.OldValue != null) {
try {
fromText = ' from ' + Date.valueOf(cHistory.OldValue).format();
} catch (Exception e) {
fromText = ' from ' + String.valueOf(cHistory.OldValue);
}
}
String toText = '';
if (cHistory.OldValue != null) {
try {
toText = Date.valueOf(cHistory.NewValue).format();
} catch (Exception e) {
toText = String.valueOf(cHistory.NewValue);
}
}
if(toText != '')
tempHistory.action = 'Changed <b>' + fieldLabel + '</b>' + fromText + ' to <b>' + toText + '</b>.';
else
tempHistory.action = 'Changed <b>' + fieldLabel;
}
// Add to the list
histories.add(tempHistory);
}
}
return histories;
}
// Function to return Field Label of a Case field given a Field API name
public Static String returnFieldLabel(String fieldName)
{
if(CaseHistoriesComponentController.CaseFieldmap.containsKey(fieldName))
return CaseHistoriesComponentController.CaseFieldmap.get(fieldName).getDescribe().getLabel();
else
{
for(Schema.PicklistEntry pickList : fieldPicklistValues)
{
if(pickList.getValue() == fieldName)
{
if(pickList.getLabel() != null)
return pickList.getLabel();
else
return pickList.getValue();
}
}
}
return '';
}
// Inner Class to store the detail of the case histories
public class cHistories {
public String theDate {get; set;}
public String who {get; set;}
public Id userId {get; set;}
public String action {get; set;}
}
}
Let me know your views on the code or if you have any questions
- Rajesh Shah
- October 16, 2009
- Like
- 1
- Continue reading or reply
Case Comments Related List using Visualforce
Recently I was working on a requirement which required overriding the Case detail page with a visualforce page. Problem crept when the related list comonent didnt worked for Case Comments and History. So I decided to write my own code to display the related lists.
I was finally able to write my own code to display the related list. It implements all the function that standard related list of Case Comments provide. In order to make it reusable, I made it as a component so that in other pages I just need to pass the Case Id and I will get the complete list of Case Comments.
Heres the code finally :
1. Component Code
<apex:component controller="CaseCommentsComponentController" allowDML="true">
<!-- Attribute Definition -->
<apex:attribute name="CaseId" description="Salesforce Id of the Case whose Case Comments needs to be rendered" type="Id" required="true" assignTo="{!caseId}" />
<!-- Component Body -->
<apex:componentBody >
<apex:form >
<apex:pageBlock title="Case Comments" >
<apex:pageBlockButtons location="top">
<apex:commandButton action="{!NewComment}" value="New"/>
</apex:pageBlockButtons>
<apex:pageBlockTable value="{!Comments}" var="comment">
<apex:column headerValue="Action">
<apex:outputLink value="/{!comment.cComment.Id}/e?parent_id={!caseId}&retURL=/{!caseId}">Edit</apex:outputLink>  |  
<apex:commandLink action="{!deleteComment}" value="Del">
<apex:param name="CommentId_d" value="{!comment.cComment.Id}"/>
</apex:commandLink>  |  
<apex:commandLink action="{!makePublicPrivate}" value="{!comment.PublicPrivateAction}">
<apex:param name="CommentId_p" value="{!comment.cComment.Id}" />
</apex:commandLink>
</apex:column>
<apex:column headerValue="Public" value="{!comment.cComment.IsPublished}" />
<apex:column headerValue="Comments">
<apex:outputText escape="false" value="{!comment.commentText}"/>
</apex:column>
</apex:pageBlockTable>
</apex:pageBlock>
</apex:form>
</apex:componentBody>
</apex:component>
2. Apex Code
public with sharing class CaseCommentsComponentController {
public Id caseId {get; set;}
public cComments[] comments{
get{
List<cComments> comments = new List<cComments>();
for(CaseComment comment : [Select LastModifiedDate, LastModifiedBy.Id, LastModifiedBy.Name, IsPublished, CreatedDate, CreatedBy.Id, CreatedBy.Name, CommentBody From CaseComment c where ParentId = :caseId order by c.LastModifiedDate desc])
{
cComments tempcComment = new cComments();
tempcComment.cComment = comment;
// Build String to display.
tempcComment.commentText = '<b>Created By: <a href=\'/' + comment.CreatedBy.Id + '\'>' + comment.CreatedBy.Name + '</a> (' + comment.CreatedDate.format() + ') | ';
tempcComment.commentText += 'Last Modified By: <a href=\'/' + comment.LastModifiedBy.Id + '\'>' + comment.LastModifiedBy.Name + '</a> (' + comment.LastModifiedDate.format() + ')</b><br>';
tempcComment.commentText += comment.CommentBody;
if(comment.IsPublished)
tempcComment.PublicPrivateAction = 'Make Private';
else
tempcComment.PublicPrivateAction = 'Make Public';
//Add to list
comments.add(tempcComment);
}
return comments;
}
set;
}
public PageReference NewComment()
{
PageReference pr = new PageReference('/00a/e?parent_id='+ caseId + '&retURL=%2F' + caseId);
pr.setRedirect(true);
return pr;
}
public PageReference deleteComment()
{
Id commentId = ApexPages.currentPage().getParameters().get('CommentId_d');
for(cComments Comment : comments)
{
if(Comment.cComment.Id == commentId)
{
delete Comment.cComment;
break;
}
}
PageReference pg = new PageReference('/' + caseId);
pg.setRedirect(true);
return pg;
}
public PageReference makePublicPrivate()
{
Id commentId = ApexPages.currentPage().getParameters().get('CommentId_p');
for(cComments Comment : comments)
{
if(Comment.cComment.Id == commentId)
{
Comment.cComment.IsPublished = !Comment.cComment.IsPublished;
if(Comment.cComment.IsPublished)
Comment.PublicPrivateAction = 'Make Private';
else
Comment.PublicPrivateAction = 'Make Public';
update Comment.cComment;
break;
}
}
PageReference pg = new PageReference('/' + caseId);
pg.setRedirect(true);
return pg;
}
public class cComments {
public CaseComment cComment {get; set;}
public String commentText {get; set;}
public String PublicPrivateAction {get; set;}
}
}
Hope it is helpful to you.
Let me know your views on the code above or if you have any questions
- Rajesh Shah
- October 16, 2009
- Like
- 1
- Continue reading or reply
Part of Trigger to Create New Account not working
I'm trying to create a trigger that will fire when an opportunity is updated with a checkbox "create_hybrid__c" checked. The trigger should create a new account record and then update a field on the opportunity with the new account.
I can get the trigger to create the new account, but any criteria that references the opportunity is ignored. I've highlighted those lines in red below. Also, I specifically assign a record type in the trigger, but the account is created with a completely different record type. I also tried to assign a parent account and that criteria was ignored.
Is there any way to modify the trigger below so that all the fields I've specified are populated correctly? With this trigger, an account is created, the name, agency_id__c, cmr_numer__c, and assign_rpm_client__c are populated correctly, the record type is not correct, and the other fields I specified are just left blank.
trigger CreateHybridAcct on Opportunity (before update) {
List<Account> a = new List<Account>();
for (Opportunity p : Trigger.new){
if (p.create_hybrid__c == True) {
a.add (new Account(
name = 'testtrigger',
agency_id__c = '300',
cmr_number__c = '997',
client_name__c = p.account.name,
hybrid_account__c = p.account.id,
owner = p.owner,
recordtypeid = '01270000000UHZcAAO',
parentid = '0017000000PgOvrAAF',
assign_rpm_client__c = TRUE
));
insert a;
//p.hybrid_account__c = h.id;
p.create_hybrid__c = false;
}
}
}
- BrandiT
- November 02, 2011
- Like
- 0
- Continue reading or reply
Problem with SessionID Values
Hello everyone i have a strange problem.
i have created one visual force page which stores the current session id in my custom object's key field.
for retrieving the session id, i have created apex class which contains the webservice static method. which returns the session id of current session.
url of my current page is like this = https://c.cs4.visual.force.com/apex/Test
name of apex class is "mysession" and name of the webservice static method getSessionId and i am getting session id by usiing
String SessionID = mysession.getSessionId();
and i am getting SessionID = 00DP000000065Qa!AQEAQJoFPAmHIV4KrqzWQMhTeEcTVjFyxiv3S_YREhq6KU1yo5We5HM_tOZ4iUZlZfP04HmtPkohcNLG0AAzbDNAmzTbSCVg
i am storing this session =id in my custom object as key for the further retrieval of the record in my second page.
i am showing some data of that object in my Test page.
i have made one pageblock table. in which one colum contains hyperlinks. when i click on that hyperlink it directly redirects me to object record in new tab of my browser.
but then my url is getting changed from visual.force.com to salesforce.com. in that page i have added custom button "check" in my custom objects's page layout.
by clicking on that button i am retrieving the session id from my common apex class .
i have written the code of that button as onclick javascript event.
now url of page which is opened in new tab is like this:https://cs4.salesforce.com/a1DP0000001xhujMAA
this url refers to the record of my custom object's record.
now in that javascript i am using
var sessionID = sforce.apex.execute("mysession","getSessionId",{}); for getting a sessionid from common apex class
and i am getting sessionID like: 00DP000000065Qa!AQEAQBflbKcSP8DmYD0X2gpaBpiFlohTNL0jE9wcgoKnF44a05N.lUCJNryVF2eajb0sy9YRXHx2C07KzZrhrw0SciklDsct
now see both the session ids are different.
but why? that i dont know.
my quesion is "how can i have both the sessionids with same value ? ";
what can i do for this kind of problem?
i want both the sessionids with same value because i want to perform some action on the record of my custom object.
because i have stored that sessionid as key filed in my custom object.
any kind of help will be greatly appriciated.
Thanks in advance.
Learn And Contribute.
- Vishal_Thoriya
- October 22, 2011
- Like
- 0
- Continue reading or reply
onclick and oncomplete when used together do not work for commandLink
Hi,
I have a commandLink on click of which I want to ask the user for confirmation first i.e. whether he is sure to take the action. Once the user says Yes and the action is completed, I want a alert saying that the action was completed successfully. In order to achieve this, I used the onclick and oncomplete attributes of CommandLink. My issue is that if I use both the attributes, my commandLink action never gets fired. If I use only one of the them, everything works fine except I have only one of the popups.
Is there an issue when both the onclick and oncomplete attribute are used together? Following is a sample code:
<apex:commandLink value="Test" action="{!myAction}" onclick="return window.confirm('Are you sure?');" oncomplete="alert('Event Completed');" />
- Rajesh Shah
- May 27, 2011
- Like
- 1
- Continue reading or reply
Validation Error on VF Page
SObject[] ClosedTasks = [SELECT (SELECT Id, WhatId, WhoId, LastModifiedDate, Subject, Who.Name, ActivityDate, Status, Priority, Owner.Name, Description, IsTask FROM ActivityHistories ORDER BY ActivityDate DESC, LastModifiedDate DESC LIMIT 500) FROM Opportunity WHERE Id = :o.Id]; myClosedTasks = (List<ActivityHistory>)ClosedTasks.get(0).getSObjects('ActivityHistories');
And here is the VF page.
<apex:page standardController="Opportunity" extensions="trac_Activity_History"> <apex:form > <apex:pageBlock > <apex:pageBlockSection collapsible="false" title="Activity History" columns="1"> <apex:pageBlockTable value="{!myClosedTasks}" var="t"> <apex:column headerValue="Action" width="75px" rendered="{!if(t.IsTask,'true','false')}"> <a href="{!URLFOR($Action.Task.Edit, t.Id,[retURL=URLFOR('/apex/ActivityHistory?Id='+ t.WhatId)])}" target="_top">Edit</a> </apex:column> <apex:column headerValue="Action" width="75px" rendered="{!if(t.IsTask,'false','true')}"> <a href="{!URLFOR($Action.Event.Edit, t.Id,[retURL=URLFOR('/apex/ActivityHistory?Id='+ t.WhatId)])}" target="_top">Edit</a> </apex:column> <apex:column value="{!t.IsTask}"/> <apex:column headerValue="Name"> <apex:outputLink target="_top" value="/{!t.WhoId}">{!t.Who.Name}</apex:outputLink> </apex:column> <apex:column value="{!t.ActivityDate}"/> <apex:column headervalue="Assigned To"> <apex:outputLink target="_top" value="/{!t.OwnerId}">{!t.Owner.Name}</apex:outputLink> </apex:column> <apex:column value="{!t.Status}"/> <apex:column headerValue="Subject" value="{!t.Subject}" /> <apex:column headerValue="Comments"> <apex:outputText >{!t.Description}</apex:outputText> </apex:column> </apex:pageBlockTable> </apex:pageBlockSection> </apex:pageBlock> </apex:form> </apex:page>
Why would this error occur? Seems odd.
- TracMikeL
- March 02, 2011
- Like
- 0
- Continue reading or reply
Code Coverage on Batch Class testMethod
Hi,
having a little trouble getting test coverage on a batch class, odly the test passes like everything was executed, but the execute method isn't covered. Been scratching my head on this one for a while.
The class itself is fairly simple, and according to the test, its doing what its suposed to be. Running it in executeanon works as expected as well.
Class:
line | source |
1 | global class updateContactBatch implements Database.Batchable<sObject> |
2 | { |
3 | |
4 | String Query; |
5 | List<Contact> uC = new List<Contact>(); |
6 | List<Master_Tracker__c> uM = new List<Master_Tracker__c>(); |
7 | |
8 | global Database.QueryLocator start(Database.BatchableContext BC) |
9 | { |
10 | return Database.getQueryLocator(query); |
11 | } |
12 | |
13 | global void execute(Database.BatchableContext BC, List<sObject> scope) |
14 | { |
15 | for(sObject s : scope) |
16 | { |
17 | Master_Tracker__c m = (Master_Tracker__c)s; |
18 | Contact c = new Contact(Id = m.Contact__c, Send_ExactTarget_Email__c = m.Contact_Exact_Target_Send__c); |
19 | m.ContactUpdate__c = false; |
20 | uM.add(m); |
21 | uC.add(c); |
22 | } |
23 | update uC; |
24 | update uM; |
25 | } |
26 | |
27 | global void finish(Database.BatchableContext BC) |
28 | { |
29 | System.debug('Finish'); |
30 | } |
31 | |
32 | public static testMethod void testBatch() |
33 | { |
34 | |
35 | |
36 | List<Contact> cTest = [Select Id from Contact limit 10]; |
37 | List<Account> aTest = [Select Id from Account limit 1]; |
38 | List<Master_Tracker__c> mU = new List<Master_Tracker__c>(); |
39 | for(integer i = 0; i<10; i++) |
40 | { |
41 | Master_Tracker__c m = new Master_Tracker__c(School_Studies__c = 'testing', Contact__c = cTest[i].Id, BID__c = 'test' + i, Account_Name__c = aTest[0].Id, Offer_Id__c = 'test2' + i, Initiated_Date__c = Date.today()); |
42 | mU.add(m); |
43 | } |
44 | insert mU; |
45 | Test.StartTest(); |
46 | updateContactBatch upCon = new updateContactBatch(); |
47 | List<Master_Tracker__c> testing = [SELECT m.Id, m.Contact__c, m.Contact_Exact_Target_Send__c FROM Master_Tracker__c m WHERE m.ContactUpdate__c = true]; |
48 | System.debug('the number of returned records are ' + testing.size()); |
49 | upCon.query = 'SELECT m.Id, m.Contact__c, m.Contact_Exact_Target_Send__c FROM Master_Tracker__c m WHERE m.ContactUpdate__c = true'; |
50 | Id batchProcessId = Database.executeBatch(upCon); |
51 | |
52 | Test.StopTest(); |
53 | |
54 | AsyncApexJob a = [Select Id, Status, NumberOfErrors, JobItemsProcessed, TotalJobItems, CreatedBy.Email from AsyncApexJob where Id = :batchProcessId]; |
55 | System.debug('\n\nFinal results are: '+a); |
56 | System.AssertEquals('Completed', a.status); |
57 | System.AssertEquals(0, a.NumberOfErrors); |
58 | |
59 | List<Master_Tracker__c> m2 = [SELECT Id FROM Master_Tracker__c WHERE School_Studies__c = 'testing' and ContactUpdate__c = false]; |
60 | System.AssertEquals(m2.Size(), 10); |
61 | } |
62 | |
63 | } |
Here are the results of the Async job:
Final results are: AsyncApexJob:{Status=Completed, NumberOfErrors=0, CreatedById=005A0000000S87QIAS, Id=707T0000000EXg3IAG, TotalJobItems=1, JobItemsProcessed=1}
The job was submitted and completed, which should mean the code is covered, or at the least, part of it. Any help or places to look would be much apreciated.
- AnthonyEC
- March 01, 2011
- Like
- 0
- Continue reading or reply
Creating a trigger that updates a field in the detail of a master detail relationship
I am trying to create a trigger that updates a field in the detail of a master detail relationship.
For example...
I have a custom object called Risk and I have a junction object called Risk Relationship.
Risk Relationship is connected to Risk by a Master Detail relationship and a lookup relationship as well.
Risk Relationship is the detail in both relationships.
Is it possible to create a trigger so that whenever a Risk is edited, a trigger is fired to create a field update in the Risk Relationship custom object?
Is that possible?
- rusty_
- March 01, 2011
- Like
- 0
- Continue reading or reply
How to display History Related lists in descending order in Visualforce?
Hi All,
I am displaying History Related lists in Visualforce using the below code:
<apex:dataTable value="{!Object.histories}" var="history" rowClasses="odd,even" cellspacing="15" width="100%"> <apex:column > <apex:facet name="header"></apex:facet> <apex:facet name="footer"></apex:facet> <apex:outputText value="{0,date,MM/dd/yyyy HH:mm }"> <apex:param value="{!history.createddate}" /> </apex:outputText> </apex:column> <apex:column > <apex:facet name="header">Field</apex:facet> <apex:facet name="footer"></apex:facet> <b> <apex:outputText value="{!history.field}"/></b> </apex:column> <apex:column > <apex:facet name="header">Editied By</apex:facet> <apex:facet name="footer"></apex:facet> <apex:outputText value="{!history.createdby.name}"/> </apex:column> <apex:column > <apex:facet name="header">Old Value</apex:facet> <apex:facet name="footer"></apex:facet> <apex:outputText value="{!history.oldvalue}"/> </apex:column> <apex:column > <apex:facet name="header">New Value</apex:facet> <apex:facet name="footer"></apex:facet> <apex:outputText value="{!history.newvalue}"/> </apex:column> </apex:datatable>
The history table is appearing in the ascending order(ie, "Created" is coming first, followed by the other field trackings).
But I need to display descendingly (by Created Date).
Any Suggestions?
Thanks
Bhuvana
- Sureka
- February 09, 2011
- Like
- 0
- Continue reading or reply
JSONObject Too many script statements?
Has anyone figured out how to get around the JSONObject "Too many script statements" error?
Also, now with the REST API being GA in Spring '11, when are we getting native JSON processing support?
Thanks,
Jon
- CloudConversion
- February 06, 2011
- Like
- 0
- Continue reading or reply
Update original object started playing up
Hi All,
I am updating the same object using "after update" and it's throwing an error which to me seems impossible as I am using trigger.new and not trigger.old
Error:Apex trigger AccountTrigger caused an unexpected exception, contact your administrator: AccountTrigger: execution of AfterUpdate caused by: System.FinalException: Record is read-only: Trigger.AccountTrigger: line 7, column 3
So I decided to perform a simple test in a clean dev org using the following:
trigger AccountTrigger on Account (after update) { List<Account> acc=new List<Account>(); for (Account a: Trigger.new){ a.Description = 'Test'; acc.add(a); } update acc; }
This should work or am I being stupid?
Thx
- MikeGill
- February 04, 2011
- Like
- 0
- Continue reading or reply
Call a javascript function from controller or call controller method from javascript
I am not sure what the subject should be, But here is what i want to do..
i am generating data for my flot graph from my controller.
I have 2 <apex:selectList> in the VF page which captures project name and milestone. I need to pass these values into my controller method and that method returns a string value which would be used to build the graph. This graph needs to be generated on click of a button.
I have a html button on click of which the graph is generated.
How do i send the values of the selectlist into controller method?
Can i call the controller method from onclick of button and then run the rest of the javascript code to generate the graph?
Thanks
Prady
- prady
- January 18, 2011
- Like
- 0
- Continue reading or reply
How to display field label in History related lists in visualforce
Hi All,
I am using the below code to display History related lists in visualforce.
<apex:dataTable value="{!Object.histories}" var="history" rowClasses="odd,even" cellspacing="15" width="100%">
<apex:column >
<apex:facet name="header"></apex:facet>
<apex:facet name="footer"></apex:facet>
<apex:outputText value="{0,date,MM/dd/yyyy HH:mm }">
<apex:param value="{!history.createddate}" />
</apex:outputText>
</apex:column>
<apex:column >
<apex:facet name="header">Field</apex:facet>
<apex:facet name="footer"></apex:facet>
<b> <apex:outputText value="{!history.field}"/></b>
</apex:column>
<apex:column >
<apex:facet name="header">Editied By</apex:facet>
<apex:facet name="footer"></apex:facet>
<apex:outputText value="{!history.createdby.name}"/>
</apex:column>
<apex:column >
<apex:facet name="header">Old Value</apex:facet>
<apex:facet name="footer"></apex:facet>
<apex:outputText value="{!history.oldvalue}"/>
</apex:column>
<apex:column >
<apex:facet name="header">New Value</apex:facet>
<apex:facet name="footer"></apex:facet>
<apex:outputText value="{!history.newvalue}"/>
</apex:column>
</apex:datatable>
But in "Field" column, its displaying API name of the field. Is there a way to display field label instead of API Name?
Or can u suggest any other way to display History related lists with standard controller(without Apex).
Thanks
Sureka
- Sureka
- January 14, 2011
- Like
- 0
- Continue reading or reply
Formula to calculate Age in years and months
Hi, I need help in developing a custom formula field that calculates the Age from a given date, in terms of years and months, like this:
MyDate: 18/05/1990 (dd/mm/yyyy)
Calculated Age: 19 year(s), 11 month(s)
I have tried several formulas, but I only could get the year and I got problems with the months calculation.
Could someone help with this?
Regards,
Wilmer
- Wilmer
- May 10, 2010
- Like
- 0
- Continue reading or reply
Apex Navigation to Top Level Tabs
How do you navigate to a specific top-level (standard object or custom object) tab from Apex? Not to a specific instance of an SObject, but to the top-level tab/list.
Thanks!
Dave
- dfc
- January 29, 2010
- Like
- 0
- Continue reading or reply
Bug? with Custom Settings when attempting to get 100% code coverage (affects Packaging)
I recently tried to package an app with custom settings. Unfortunately I couldn't write test methods because I wanted to create custom settings instances to test the various areas of my code. The error message I got is well known to me: MIXED_DML_OPERATION, DML operation on setup object is not permitted after you have updated a non-setup object (or vice versa).
Since inserting a Custom Settings object is a setup operation I can not create a custom settings and then proceed to create my test data. I tried creating my custom settings inside an @future method and this didn't work either (I did wrap my @future call with Test.startTest() and Test.stopTest() to ensure my @future method completed (i.e. to force synchornous execution). But I still got the same error message.
Ultimately what I did was write my code in such a way that the Class which relied on the custom settings had a local variable for the custom settings which I could set. In normal operation my code will query the custom settings using .getInstance() however my testMethods will all override this normal behavior and "force" set the custom settings.
My class which uses custom settings is below as is my class which tests my code. I hope you find this useful, and if you spot anything wrong with this please let me know. Thanks,
Caleb
------------ Class --------------
public without sharing class CrossObjectUtil {
private Map<Id,gii__AccountAdd__c> childrenToUpdateParent;
private List<Account> parentsToUpdate;
private Boolean isTest = false;
//This is the key!
private CrossObjectSettings__c crossObjSettingsInstance = null;
public CrossObjectUtil() {
childrenToUpdateParent = new Map<Id,gii__AccountAdd__c>();
parentsToUpdate = new List<Account>();
setCrossObjectSettings(null);
}
//Used by the test methods!
public void setCrossObjectSettings(CrossObjectSettings__c cos) {
if(cos == null) {
CrossObjectSettings__c crossObjSettingsInstance = null;
Map<String,CrossObjectSettings__c> crossObjSettingsInstanceMap = CrossObjectSettings__c.getAll();
for(CrossObjectSettings__c cosInstance : crossObjSettingsInstanceMap.values()) {
if(cosInstance.Child_Object_Name__c == 'gii__AccountAdd__c'&&
cosInstance.Parent_Object_Name__c == 'Account') {
crossObjSettingsInstance = cosInstance;
}
}
} else {
crossObjSettingsInstance = cos;
}
}
public void addChildToUpdateParent(Id parentId, gii__AccountAdd__c child) {
childrenToUpdateParent.put(parentId,child);
}
public void updateParents() {
if (childrenToUpdateParent.size() > 0) {
updateParents(childrenToUpdateParent,false);
}
update parentsToUpdate;
}
private void updateParents(Map<Id,gii__AccountAdd__c> children,Boolean isDelete) {
System.debug('updateParents: isDelete = ' + isDelete);
for(Id parentId : children.keySet()) {
SObject parent = new Account(Id=parentId);
SObject child = children.get(parentId);
if(crossObjSettingsInstance == null) {
setCrossObjectSettings(null);
if(crossObjSettingsInstance == null) {
return;
}
}
List<String> fieldMappings = crossObjSettingsInstance.Child_to_Parent_Field_Mapping__c.split(';',0);
if(fieldMappings.size() == 0) return;
for(String mapping : fieldMappings) {
List<String> fields = mapping.split('=',0);
if(fields.size() == 2) {
if(!isDelete) {
parent.put(fields[1],child.get(fields[0]));
} else {
parent.put(fields[1],null);
}
}
}
parentsToUpdate.add((Account)parent);
}
}
}
-----------Test Method -------------
static testMethod void test_CrossObjectUtil_Self() {
Account a = insertAccount();
gii__Warehouse__c w = insertWharehouse();
gii__AccountAdd__c acctAdd = getAccountAdd(a,w);
CrossObjectUtil coUtil = new CrossObjectUtil();
//Set the custom settings - the object is never saved!
coUtil.setCrossObjectSettings(createCustomSettings());
coUtil.addChildToUpdateParent(a.Id,acctAdd);
coUtil.updateParents();
Account assertAccount = [SELECT Name, Description FROM Account WHERE Id =:a.Id LIMIT 1];
System.assertEquals(w.Id,assertAccount.Name);
System.assertEquals(acctAdd.Name,assertAccount.Description);
}
//Notice that I do NOT insert the object! it's all in memory!
static CrossObjectSettings__c createCustomSettings() {
CrossObjectSettings__c crossObjSettingsInstance = new CrossObjectSettings__c(Name = 'Test Account Add to Account');
crossObjSettingsInstance.Child_Object_Name__c = 'gii__AccountAdd__c';
crossObjSettingsInstance.Parent_Object_Name__c = 'Account';
crossObjSettingsInstance.Child_to_Parent_Field_Mapping__c = 'Name=Description;gii__DefaultWarehouse__c=Name';
return crossObjSettingsInstance;
}
- Caleb_Sidel
- November 25, 2009
- Like
- 0
- Continue reading or reply
History related List using Visualforce
When developing a Visualforce page for overiding view page for any object, one problem that creeps up is to display the History details of a record. The standard related list Component doesn't works for History.
With the help of some code from Community ( I now can't find the link to it :( ), I wrote my own code then to display the history of an object. It mimics the standard list as far as possible.
Heres the code. It is for the Case object but it can be used for any other object.
1.Component Code
<apex:component controller="CaseHistoriesComponentController">
<!-- Attribute Definition -->
<apex:attribute name="CaseId" description="Salesforce Id of the Case whose Case History needs to be rendered" type="Id" required="true" assignTo="{!caseId}" />
<!-- Case History Related List -->
<apex:pageBlock title="Case History">
<apex:pageBlockTable value="{!histories}" var="History" >
<apex:column headerValue="Date" value="{!History.thedate}"/>
<apex:column headerValue="User"> <apex:outputLink value="/{!History.userId}"> {!History.who} </apex:outputLink></apex:column>
<apex:column headerValue="Action"><apex:outputText escape="false" value="{!History.action}"/></apex:column>
</apex:pageBlockTable>
</apex:pageBlock>
</apex:component>
2. Apex Code
public class CaseHistoriesComponentController {
public Id caseId {get; set;}
public cHistories[] histories;
// Variables
public Static final Map<String, Schema.SObjectField> CaseFieldmap = Schema.SObjectType.Case.fields.getMap();
public Static final List<Schema.PicklistEntry> fieldPicklistValues = CaseHistory.Field.getDescribe().getPicklistValues();
public List<cHistories> getHistories()
{
list<cHistories> histories = new list<cHistories>();
String prevDate = '';
for(CaseHistory cHistory : [Select CreatedDate, CreatedBy.Name, CreatedBy.Id, Field, NewValue, OldValue from CaseHistory where CaseId = :caseId order by CreatedDate desc])
{
if((cHistory.newValue == null && cHistory.oldValue == null)
|| (cHistory.newValue != null && !(string.valueOf(cHistory.newValue).startsWith('005') || string.valueOf(cHistory.newValue).startsWith('00G')))
|| (cHistory.oldValue != null && !(string.valueOf(cHistory.oldValue).startsWith('005') || string.valueOf(cHistory.oldValue).startsWith('00G'))))
{
cHistories tempHistory = new cHistories();
// Set the Date and who performed the action
if(String.valueOf(cHistory.CreatedDate) != prevDate)
{
tempHistory.theDate = String.valueOf(cHistory.CreatedDate);
tempHistory.who = cHistory.CreatedBy.Name;
tempHistory.userId = cHistory.CreatedBy.Id;
}
else
{
tempHistory.theDate = '';
tempHistory.who = '';
tempHistory.userId = cHistory.CreatedBy.Id;
}
prevDate = String.valueOf(cHistory.CreatedDate);
// Get the field label
String fieldLabel = CaseHistoriesComponentController.returnFieldLabel(String.valueOf(cHistory.Field));
// Set the Action value
if (String.valueOf(cHistory.Field) == 'created') { // on Creation
tempHistory.action = 'Created.';
}
else if(cHistory.OldValue != null && cHistory.NewValue == null){ // when deleting a value from a field
// Format the Date and if there's an error, catch it and re
try {
tempHistory.action = 'Deleted ' + Date.valueOf(cHistory.OldValue).format() + ' in <b>' + fieldLabel + '</b>.';
} catch (Exception e){
tempHistory.action = 'Deleted ' + String.valueOf(cHistory.OldValue) + ' in <b>' + fieldLabel + '</b>.';
}
}
else{ // all other scenarios
String fromText = '';
if (cHistory.OldValue != null) {
try {
fromText = ' from ' + Date.valueOf(cHistory.OldValue).format();
} catch (Exception e) {
fromText = ' from ' + String.valueOf(cHistory.OldValue);
}
}
String toText = '';
if (cHistory.OldValue != null) {
try {
toText = Date.valueOf(cHistory.NewValue).format();
} catch (Exception e) {
toText = String.valueOf(cHistory.NewValue);
}
}
if(toText != '')
tempHistory.action = 'Changed <b>' + fieldLabel + '</b>' + fromText + ' to <b>' + toText + '</b>.';
else
tempHistory.action = 'Changed <b>' + fieldLabel;
}
// Add to the list
histories.add(tempHistory);
}
}
return histories;
}
// Function to return Field Label of a Case field given a Field API name
public Static String returnFieldLabel(String fieldName)
{
if(CaseHistoriesComponentController.CaseFieldmap.containsKey(fieldName))
return CaseHistoriesComponentController.CaseFieldmap.get(fieldName).getDescribe().getLabel();
else
{
for(Schema.PicklistEntry pickList : fieldPicklistValues)
{
if(pickList.getValue() == fieldName)
{
if(pickList.getLabel() != null)
return pickList.getLabel();
else
return pickList.getValue();
}
}
}
return '';
}
// Inner Class to store the detail of the case histories
public class cHistories {
public String theDate {get; set;}
public String who {get; set;}
public Id userId {get; set;}
public String action {get; set;}
}
}
Let me know your views on the code or if you have any questions
- Rajesh Shah
- October 16, 2009
- Like
- 1
- Continue reading or reply
Add Sales Team member on Lead Convert
This seems easy enough, but it has me stumped.
Use Case: Partners create leads in the partner portal. When the lead is ready to convert, our reps change themselves to the owner and convert it. I want to automatically add (since they forget all the time) the partner user to the sales team.
Problem: When I convert the lead (i have the trigger running after insert) I get an error saying that the record is locked.
It looks to me like Salesforce inserts the opportunity record, but locks it so its uneditable through the conversion. My trigger also depends on a custom field being mapped over, so that's why I run the trigger after insert so that the field will be mapped over.
Any thoughts anyone on how to get around this?
Here's my code:
trigger addPartnerToSalesTeam on Opportunity (after insert) {
/**
* Need to get the opportunity and user
*/
private Opportunity[] newOpty = new Opportunity[1];
newOpty = Trigger.new;
//get userId of lead creator
String leadCreatorId = newOpty[0].Lead_Creator_Id__c;
//get lead Creator profile Id
User leadCreator = [select profileId from user where id =:leadCreatorId];
newOpty[0].description = leadCreator.ProfileId;//testing
//run trigger if the owner of the converted lead was a partner user
if(leadCreator.ProfileId == '00e20000000uCnj') {
newOpty[0].description = newOpty[0].description + ' It works!!!' + ' ' + leadCreatorId; //for testing
addtoSalesTeam.addUser(newOpty[0], leadCreatorId);
}//end if
}//end addPartnerToSalesTeam trigger
________________________________________________________________
public class addToSalesTeam {
/**
* To run this method, the trigger (or whatever calls it) must pass two variables:
*
* @Opportunity opty = the opportunity being shared
* @User theUser = the user to be shared with
*
*/
public static void addUser (Opportunity opty, String userId) {
OpportunityTeamMember optyMemb = new OpportunityTeamMember();
//put acctId into optyMemb object
optyMemb.OpportunityId = opty.Id;
//put userId into optyMemb object
optyMemb.UserId = userId;
//Insert sharing record into database
Database.Saveresult sr = Database.insert(optyMemb);
}//end addPartner method
}//end AddToSalesTeam
- rgard23
- March 13, 2009
- Like
- 0
- Continue reading or reply
Moderators / VF experts - A bug with repeat/tabs? (full code to replicate inside)
I'm experiencing some unexpected behavior when trying to use the apex:repeat function to render tabs....
Basically it seems that tabs cannot be created on demand? My controller is definitely returning data... as the second page block in my sample will show... repeat works - just the tabs are not rendered..
I'm sure any of you guys can see where I was going with this - and I guess I can achieve a similar result by dropping down to boring old html - just trying to use the standard components (as per best practice)
Any assistance greatly appreciated - as the purist coder me is seriously disturbed at the moment...
here is my 'simplified' and easily testable page & controller
<apex:page controller="clsRecordType"> <apex:pageBlock > <apex:tabPanel id="theTabPanel"> <apex:tab label="Account Types"/> <apex:repeat value="{!RecordTypes}" var="types"> <apex:tab label="{!types.Name}"/> </apex:repeat> </apex:tabPanel> </apex:pageBlock> <apex:pageBlock > <apex:repeat value="{!RecordTypes}" var="types"> {!types.Name}<br/> </apex:repeat> </apex:pageBlock> </apex:page>
and the controller
public class clsRecordType { list<RecordType> lrecordtypes; public list<RecordType> getRecordTypes() { if(lrecordtypes==null) lrecordtypes = [Select Name, Id, Description From RecordType where SobjectType = 'Account' and IsActive=True]; return lrecordtypes; } }
- London Ben
- July 10, 2008
- Like
- 0
- Continue reading or reply
OpportunityTeamMember is nice, but needs an OpportunityAccessLevel!
I'm having trouble with the API for OpportunityTeamMember: There's no way to set the Opportunity Access Level via the API, as there is when using the website.
The OpportunityShare object has exactly the field I need (OpportunityAccessLevel), but that object doesn't include the TeamMemberRole attribute, which I also need.
Finally, UserTeamMember has both, but isn't associated directly with a Opportunity, my last requirement in all this.
Any and all thoughts are appreciated!
Thanks,
Tim
- sherburne
- February 03, 2006
- Like
- 0
- Continue reading or reply