Simple Loader image for Visualforce Page.

Hello guys,

I am gonna show you simple way to pop up loader image i.e status image for loading purpose using CSS and javascript function.

Using simple html div and Javascript you can create your status loader.

Below i am gonna show you simple html tag for it. you can call javascript function on onclick method to show loader and hide it on oncomplete.

ADD BELOW STYLE TO YOUR VF PAGE

#filter{ 
      display:none;
      background-image: url({!URLFOR($Resource.Static_Resource_Main,'Static_Resource_Main/loading32.gif')});
      z-index:10000;
      position:fixed;
      top:0%;left:0%;
      width:100%;
      height:100%;
      background-repeat:no-repeat;
      background-position:center;
      background-color: #ffffff;
      opacity:0.6;
      filter:alpha(opacity=50);
} 
Call startProces method when you call action( Controller function or any function after which you want to show loading image).

 

function startProcess()
{
      $('#filter').show();
}

function endProcess ()
{
      $('#filter').hide();
}   
Add below Div tag at the start of body tag or form.

<center>
    <div id="filter"></div>
</center>                        
startProcess will add display: block css to div.
endProcess  will hide the div.

Its just awsomeness of css.

Hope you will like it.
Enjoy coding....

How to know how many records where sucess and failed in batch class?

Lets say you want to send an email to some user on end of batch class that how many records where successfully executed and how many were failed to be executing.

Its very simply to do if you know the Object used to store data related to Async jobs.

There is called Standard object named AsyncApexJob which store information of jobs runs.

You can query on AsyncApexJob object to get record of currently run batch by its Batch id in finish method.

Fields to be Used:

JobItemsProcessed: Number of job items processed. Label is Batches Processed.
NumberOfErrors: Total number of batches with a failure. A batch is considered transactional, so any unhandled exceptions constitute an entire failure of the batch. Label is Failures.


global void finish(Database.BatchableContext BC) {
 
 
//Below code will fetch the job Id

 AsyncApexJob a = [Select a.TotalJobItems, a.Status, a.NumberOfErrors, a.JobType, a.JobItemsProcessed, a.ExtendedStatus, a.CreatedById, a.CompletedDate From AsyncApexJob a WHERE id = :BC.getJobId()];             

}
                            
you can use above code to send mail with details of job.

Hope you will find it useful.

For more details of Object visit:
Here

Custom button: How to pass currency field to an Apex web service?


you can try using the VALUE function to get the decimal value from the currency field before passing it to the webservice method.
Example:
We want to pass decimal value of Opportunity Amount. Then we use below code in custom button to pass decimal value to web-service.
{!REQUIRESCRIPT("/soap/ajax/10.0/connection.js")}
{!REQUIRESCRIPT("/soap/ajax/10.0/apex.js")}

var amt = {!VALUE(TEXT(Opportunity.Amount))};
var retVal = sforce.apex.execute("WSclassname", "WSmethod", {oppAmt:amt});
alert (retVal) ;
window.location.reload() ;

Share certain records with only certain users


If you would require to have some records to only be shared with certain users, e.g. based on record level, to a certain group (those selected users), and the rest of the records (e.g. records that are the other recod types) with the rest of the internal users.

It can be done by restricting all objects on OWD(Organization-Wide Defaults) level to private and then share certain records.By default 'Grant Access Using Hierarchies' is selected (checked). If you don't want to share the records with users based on role hierarchy, make sure to uncheck this box for respective objects in OWD settings.

Once the OWD setting for an object is set to Private, applying Sharing rules based on criteria would be the best way to meet your requirement scope.If you want Users to share at record level, you can also enable Manual Sharing.

You can navigate to OWD by searching Sharing settings in Setup > quick search.

You can refer Below link for more sharing Information.
https://developer.salesforce.com/docs/atlas.en-us.securityImplGuide.meta/securityImplGuide/security_data_access.htm

Reset changed user profile permissions

Hi,

There is no way to "Reset" the changes made on your profile.

But there is one way by which you can revert it some what.

you can

look in to the "View Setup Audit Trail" from Setup and see the list of changes made to your profile, and then try to correct it manually.


Hope this helps.

Merge field syntax is correct yet the generated PDF document is not displaying the data : Steelbrick CPQ


This might be because of merge field is not populated on source code. So try to verify your merge field in source code.

If your merge field syntax is correct yet the generated PDF document is not displaying the data or is displaying an error, click the HTML button highlighted below in your template content toolbar to troubleshoot.

Ensure your merge field name was pasted in correctly. Formatting tags can get inserted within the brackets when pasted in from a rich text applications.
Instead, paste from Notepad, which strips out all excess formatting.

Alternatively, click the HTML button on the template content editing toolbar and remove formatting tags manually, making sure that the merge field syntax is not interrupted by these tags.

If still not working click Source Button and check if merge field is populated.


For merge field information visit: https://community.steelbrick.com/t5/Quote-Templates-Knowledge-Base/Merge-Fields/ta-p/299

Custom Picklist lookup using javascript in Visual page

In this post I'm gonna show you how to create simple custom picklist lookup in Visual page using javascript.

We will use window eventlistner to get data from child window open by parent window.

Here is snippet of my simple vf page.

  
<apex:page >
    <script>
        function open_pop_up(idx, field, sObj){
            var child = window.open('/apex/picklistLookup?idx='+idx+'&field='+field+
'&sObj='+sObj+'', '_blank', 
'toolbar=yes,scrollbars=yes,resizable=yes,top=500,left=500,width=400,height=400')
            console.log('==> Child: ' + child);
        }
        
        var eventMethod = window.addEventListener ? "addEventListener" : "attachEvent";
        var eventer = window[eventMethod];
        var messageEvent = eventMethod == "attachEvent" ? "onmessage" : "message";
    
        //Listen to message from child window
        eventer(messageEvent,function(e) {
            console.log('parent received message!: ',e.data);
            var dataArr = e.data.split(':'); 
            var elmtId = e.data.substring(0, e.data.lastIndexOf(':'));
            var datavalue = e.data.substring(e.data.lastIndexOf(':') + 1,e.data.length);
            document.getElementById(elmtId).value = datavalue;
        },false);  
        
    </script>
    
    <input id="testId" value="" onclick="open_pop_up('testId','CustomerPriority__c',
'Account');"/>
</apex:page>

Let me explain the code.

when we click on input it will open popup lookup window.
Here i have use my custom picklist field CustomerPriority__c of Account Object for test data.

Now new vf page for lookup popup window.

  
<apex:page controller="PicklistLookupCon" showHeader="false">

    <apex:variable value="{!0}" var="rowNum"/>
    
    <table>
        <tr>  
            <td></td>  
            <td>
                <input type="button" value="Insert Selected" onclick="InsertSelected()" class="btn"/>
            </td>
        </tr>
        <apex:repeat value="{!picklistValues}" var="plv">
            <tr>
                <td>
                    <input type="checkbox" onclick="selectValue('{!rowNum}', this.checked, '{!plv}')"/>
                </td>
                <td>{!plv}</td>
            </tr>
            <apex:variable value="{!rowNum+1}" var="rowNum"/>             
        </apex:repeat>            
    </table>
    
    <script type="text/javascript">
        var arrValue  = new Array();
               
        function selectValue(id, isChecked, value){

            if(isChecked == true){
                arrValue[arrValue.length] = value;
            }else{
                var index = arrValue.indexOf(value);
                arrValue.splice(index,1);
           }  
        }
           
        function InsertSelected(){
            console.log(window.parent.opener);
            var win = window.parent.opener;
            var dataStr= '';
            
            for(var k=0;k<arrValue.length;k++){
                if(k==0) dataStr = arrValue[k];
                else dataStr +=','+arrValue[k];
            }
            win.postMessage('{!$CurrentPage.parameters.idx}:'+dataStr, window.parent.opener.location.href); 
            window.parent.close();
        }
  </script> 
</apex:page>

controller:

public without sharing class PicklistLookupCon {

    string sObj = Apexpages.currentpage().getParameters().get('sObj');
    string field = Apexpages.currentpage().getParameters().get('field');

    public picklistLookupCon(){
    
    }
        
    public List picklistValues{
      get{
          if(picklistValues!=null)
              return picklistValues;
          else{
              picklistValues = new List();
              
              Map gd = Schema.getGlobalDescribe(); 
              Schema.SObjectType ctype = gd.get(sObj);
              Map fmap = ctype.getDescribe().fields.getMap();
              Schema.DescribeFieldResult fieldResult = fmap.get(field).getDescribe();
              List ple = fieldResult.getPicklistValues();   
              
              for( Schema.PicklistEntry f : ple){
                  picklistValues.add(f.getValue());
             }
          }
          return picklistValues;
      }
      set;
    }
    
 }

That's it.

Yepppieee you done it.