• miteshsura
  • NEWBIE
  • 79 Points
  • Member since 2010

  • Chatter
    Feed
  • 3
    Best Answers
  • 2
    Likes Received
  • 0
    Likes Given
  • 36
    Questions
  • 81
    Replies

Hello SF champs,

 

I wanted to understnad how Deep linking (redirecting user after authenticating via SSO) works. We have email going out from SF, and we would like to have links, that would take user to Ping server for authentication, once authenticated, redirect them to specific page in SF (we would have the SF Id in the link in the email). 

 

I found this documentatoin from PingIdentity: http://documentation.pingidentity.com/display/SFC/SP-Initiated+SSO+via+Deep+Linking

that basically explains the same, but from what I understand, the user need to be already authenticated for deep linking to work. 

 

Is that true? Can't we redirect the user for the very first time they login?

 

Appreciate your time. 

 

thanks

Mitesh

Hi,

 

I would like to allow user to print multiple line items in related list at once, instead of printing one item at a time. 

 

For eg in the related list I would have a button that says "Print line items" and it should take user to printview of those selected line items. 

Can Pagereference class help? 

 

URL that Sf generates for individual line item is like: https://na7.salesforce.com/001xxxxxxxxxxxxxx/p

 

any help is appreciated. 

thanks

I unzipped the file: SForce_Office_Toolkit_MSI.zip  but it is MSI file, there is no add-ins.. how can I can get the add-in to install in Excel? 

OS: Win 7, 32 bit

Excel 2007

 

thanks. 

Hi all,

 

This one is driving me crazy, as I cannot see what wrong I am doing. I have 2 wrapper class within single controller class.

One for Estimate_Step__c object and other for Misc_Cost__c object, both are child object to Estimate__c object. 

 

I have a detail page button on Estimate__c object, that takes user to a VF page, that displays Master record and all related records for both these objects. Also on VF page, I have "Add New" button for both these objects/datatables. "Add New" adds a record with default values to respective list, so users can udpate it VF page. 

 

While it works great for Estimate_Steps__c object, it does not work for Misc_Cost__c object, in reality they are ditto copy, just change in variable names. When user changes values for Misc_Cost__c records in VF, it is not passed to the controller. 

 

Please find the code below. Thanks in advance.. 

 

VF page

 

<apex:outputPanel id="pnlEstimateSteps">  
            <apex:outputLabel value="Step II: Choose Estimate Steps" styleClass="bold" /><br/>  
            <apex:pageBlock >    
                <apex:pageBlockButtons location="bottom">
                    <apex:commandButton action="{!addStep}" value="New (RL) Estimate Step" rerender="pnlEstimateSteps" status="addStepStatus" immediate="true"/>
                    <apex:actionStatus startText="loading..." id="addStepStatus"/>
                </apex:pageBlockButtons>
                
                <apex:pageBlockTable id="tblEstimateSteps" value="{!estimateWrapperList}" rendered="{!estimateWrapperList.size!=0 && NOT(ISNULL(estimateWrapperList))}" style="width:800px" var="e">
                    <apex:column headerValue="Select" >
                        <apex:inputCheckbox value="{!e.selected}" style="width:20px"/>
                    </apex:column>
                    <apex:column headerValue="Step Order" rendered="true">
                        <apex:inputText id="stepOrder" value="{!e.stepOrder}" style="width:20px" required="true" />
                    </apex:column>
                    <apex:column >
                        <apex:facet name="header">
                            {!$ObjectType.Name.Label}
                        </apex:facet> 
                        <apex:inputField id="stepName" value="{!e.estimateStep.Name}"  style="width:150px" required="true"/>
                    </apex:column>  
                    <apex:column >
                        <apex:facet name="header">
                            {!$ObjectType.Estimate_Step__c.Fields.Hours_Required__c.Label}
                        </apex:facet> 
                        <apex:inputField id="stepHrs" value="{!e.estimateStep.Hours_Required__c}"  style="width:50px" />                        
                    </apex:column>
                </apex:pageBlockTable>
            </apex:pageBlock>
        </apex:outputPanel>    
        
        <br/>
        
        <apex:outputPanel id="pnlEstimateMisc">  
            <apex:outputLabel value="Step III: Choose Miscellaneous Costs" styleClass="bold" /><br/>  
            <apex:pageBlock >    
                <apex:pageBlockButtons location="bottom">
                    <apex:commandButton action="{!addMiscCost}" value="New (RL) Misc. Costs" rerender="pnlEstimateMisc" status="addMiscStatus" immediate="true"/>
                    <apex:actionStatus startText="loading..." id="addMiscStatus"/>
                    <br/><br/><br/>
                    <apex:commandButton action="{!Save}" value="Save" />
                    <apex:commandButton action="{!Cancel}" value="Cancel" />
                </apex:pageBlockButtons>
               
                
                <apex:pageBlockTable id="tblEstimateMisc" value="{!estimateMiscWrapperList}" rendered="{!estimateMiscWrapperList.size!=0 && NOT(ISNULL(estimateMiscWrapperList))}" style="width:800px" var="m">
                    <apex:column headerValue="Select">
                        <apex:inputCheckbox value="{!m.selected}" style="width:20px"/>
                    </apex:column>
                    <apex:column >
                        <apex:facet name="header">
                            {!$ObjectType.RL_Misc_Cost__c.Fields.Misc_picklist__c.Label}
                        </apex:facet> 
                        <apex:inputField id="miscName" value="{!m.estimateMisc.Misc_picklist__c}"  style="width:200px" required="true" />                        
                    </apex:column>  
                    <apex:column >
                        <apex:facet name="header">
                            {!$ObjectType.RL_Misc_Cost__c.Fields.Cost__c.Label}
                        </apex:facet> 
                        <apex:inputField id="miscCost" value=" {!m.estimateMisc.Cost__c}"  style="width:50px" required="true" />                       
                    </apex:column>
                </apex:pageBlockTable>
            </apex:pageBlock>
        </apex:outputPanel>

 

Apex class

 

//Class variables
    private final Estimate__c estimateRecord;
    public List<Estimate_Step__c> estimateStepsList {get; set;}
    public List<RL_Misc_Cost__c> estimateMiscList {get; set;}
    public list<clsEstimateWrapper> estimateWrapperList {get; set;}
    public list<clsEstimateMiscWrapper> estimateMiscWrapperList {get; set;}
    public String qryString;
    public String prodDescription {get; set;}
    public Integer stepOrder;
    public String action {get; set;}.
.
.
. 


//Wrapper class for Estimate_Step__c
    public class clsEstimateWrapper{
        public Estimate_Step__c estimateStep{get; set;}
        public Boolean selected {get; set;}
        public Integer stepOrder {get; set;}
        
        /*This is the contructor method. for each new instance set Estimate_Step__c and stepOrder. Selected is true by default */
        public clsEstimateWrapper(Estimate_Step__c estStep, Integer stepOrder){
            estimateStep = estStep;
            selected = true;       
            this.stepOrder = stepOrder;     
        }       
    }
    
    //Wrapper class for RL_Misc_Cost__c
    public class clsEstimateMiscWrapper{
        public RL_Misc_Cost__c estimateMisc{get; set;}
        public Boolean selected {get; set;}
        
        /*This is the contructor method. for each new instance set RL_Misc_Cost__c. Selected is true by default */
        public clsEstimateMiscWrapper(RL_Misc_Cost__c estMisc){
            this.estimateMisc = estMisc;
            selected = true;
        }       
    }
    
    //Save Estimate along with selected Steps
    public PageReference Save(){
        
        //Estimate header 
        system.Debug('estimateRecord.Name: ' + estimateRecord.Name);  
        system.Debug('estimateRecord.Drawing_No__c: ' + estimateRecord.Drawing_No__c);  
        system.Debug('estimateRecord.Quantity__c: ' + estimateRecord.Quantity__c);      
        
        Estimate__c clonedEstimate= new Estimate__c(Name=estimateRecord.Name, Drawing_No__c=estimateRecord.Drawing_No__c, Quantity__c=estimateRecord.Quantity__c, Opportunity__c=estimateRecord.Opportunity2__c,
            Product__c=estimateRecord.Product__c, Estimate_Notes__c=estimateRecord.Estimate_Notes__c, Estimate_UOM__c=estimateRecord.Estimate_UOM__c, Metal_Type__c=estimateRecord.Metal_Type__c, Metal_Cost__c=estimateRecord.Metal_Cost__c,
            Lbs_babbitt__c=estimateRecord.Lbs_babbitt__c, Shop_Rate__c=estimateRecord.Shop_Rate__c, Est_Standard_Delivery__c=estimateRecord.Est_Standard_Delivery__c,
            Est_Std_Delivery_Units__c=estimateRecord.Est_Std_Delivery_Units__c, Est_Expedited_Delivery__c=estimateRecord.Est_Expedited_Delivery__c, Est_Exp_Delivery_Units__c=estimateRecord.Est_Exp_Delivery_Units__c, 
            Base_Price_Multiplier__c=estimateRecord.Base_Price_Multiplier__c, Expedited_Multiplier__c=estimateRecord.Expedited_Multiplier__c);
        
        try{
            //1. Insert Estimate
            insert clonedEstimate;
           
            
            system.Debug('estimateWrapperList in Save(): ' + estimateWrapperList);  
            
          
            //2. Estimate Steps logic            
            //Empty existing estimateSteps List
            estimateStepsList = new List<Estimate_Step__c>{};
            for(clsEstimateWrapper EstimateWrapper : estimateWrapperList){
                //Check if Estimate Step is checked
                if(EstimateWrapper.selected){  
                    system.debug('EstimateWrapper: ' + EstimateWrapper);     
                    Estimate_Step__c estimateStep = new Estimate_Step__c(Name=EstimateWrapper.estimateStep.Name, Hours_Required__c=EstimateWrapper.estimateStep.Hours_Required__c, 
                        Estimate__c=clonedEstimate.Id,  Comments__c= EstimateWrapper.estimateStep.Comments__c);
                    estimateStepsList.add(estimateStep);
                    system.debug('estimateStep: ' + estimateStep);
                }
            } 
                
            //insert Estimate Steps
            insert estimateStepsList;
            
            
            //3. Estimate Misc Cost logic
            system.Debug('estimateMiscList in Save(): ' + estimateMiscList);  
            //Empty existing estimateMisc List
            estimateMiscList = new List<RL_Misc_Cost__c>{};         
            for(clsEstimateMiscWrapper EstimateMiscWrapper : estimateMiscWrapperList){
                //Check if Estimate Misc Cost is checked
                if(EstimateMiscWrapper.selected){
                    system.debug('EstimateMiscWrapper: ' + EstimateMiscWrapper);
                    RL_Misc_Cost__c estimateMisc = new RL_Misc_Cost__c(Misc_picklist__c=EstimateMiscWrapper.estimateMisc.Misc_picklist__c, Cost__c=EstimateMiscWrapper.estimateMisc.Cost__c, 
                        Comments__c=EstimateMiscWrapper.estimateMisc.Comments__c, RL_Estimate__c=clonedEstimate.Id);
                    estimateMiscList.add(estimateMisc);
                    system.debug('estimateMisc: ' + estimateMisc);
                }
            }           
            //insert Estimate Steps
            insert estimateMiscList;        
            
          
            
            //4. Redirect user to Estimate
            PageReference pageRef = new PageReference('https://cs9.salesforce.com/'+clonedEstimate.Id);
            pageRef.setRedirect(false);
            return pageRef;
        }
        catch(DmlException ex){
            ApexPages.addMessages(ex);
            return null;
        }
        catch(Exception e){
            ApexPages.addMessages(e);
            return null;
        }
    }
    
    //Add Dynamic Estimate Step
    public PageReference addStep(){     
        estimateWrapperList.add(new clsEstimateWrapper(new Estimate_Step__c(Hours_Required__c=0.0, Comments__c='test', Estimate__c=estimateRecord.Id), stepOrder++));      
        return null;        
    }
    
    //Add Dynamic Misc Cost
    public PageReference addMiscCost(){     
        estimateMiscWrapperList.add(new clsEstimateMiscWrapper(new RL_Misc_Cost__c(Cost__c=0.0, Comments__c='test', RL_Estimate__c=estimateRecord.Id)));     
        return null;        
    }

 

Mitesh

Hi,

 

Recently there was a need in my org to create bunch of Portal users, and I hate doing repitative things, off course I come from developing background. So I called SF premier support, asking the same, and they told I cannot create Portal Users via DL. 

 

I will have to create contact, hit allow login, enter user details, blah blah.. for each and every user. Did not make sense to me and I started to look into the Data Structure to see how User, Contact, Porfile, license objects are related. To my surprise there was contactId field under user object. 

 

All I did was populated the PortalUser.csv file with correct SF contactId, ProfileId(Partner Profile), RecordTypeId(Portal Contact) along with other info like Name, Email, Alias for 200 odd records. Uploaded via Data Loader and boom it all went in. 

 

I thought I will post here, so others can take advantage of this. Just shoot me an email or reply to this post, if you need further assitance.

 

Hi,

 

Recently there was a need in my org to create bunch of Portal users, and I hate doing repitative things, off course I come from developing background. So I called SF premier support, asking the same, and they told I cannot create Portal Users via DL. 

 

I will have to create contact, hit allow login, enter user details, blah blah.. for each and every user. Did not make sense to me and I started to look into the Data Structure to see how User, Contact, Porfile, license objects are related. To my surprise there was contactId field under user object. 

 

All I did was populated the PortalUser.csv file with correct SF contactId, ProfileId(Partner Profile), RecordTypeId(Portal Contact) along with other info like Name, Email, Alias for 200 odd records. Uploaded via Data Loader and boom it all went in. 

 

I thought I will post here, so others can take advantage of this. Just shoot me an email or reply to this post, if you need further assitance.

 

Mitesh

Hi,

 

While creating a list button, it asks me "Display Checkboxes (for Multi-Record Selection)" ? May I know how do I take advantage of it in my custom list button?

 

Selecting the option does show checkbox next to each line item in the related list, but thats about it. I want to take action only on selected records, how can I do it? 

 

Any idea, reference? 

 

Thanks. 

Hi,

 

Based on certain fields, I want to auto select the template, can that be done. 

Lets say, if value in field-A is NA, when user hits generate pdf, it should auto select NA Quote template. 

And if value in the field is EMEA, EMEA quote template shuld be auto selected. 

 

thanks for the help.

I can reaname all, but Standard price book. Currently the name is German, and I want to reanme it to english. 

Is there a reason why SF won't allow to reanme it? What options do I have? 

 

One way would be clone and give the English name to it, but I am not sure how SF would treat the new pricebook, as I cannot even delete German pricebook. I do not see any special setting which tells SF that this is my standard pricebook, how does it know? 

 

Thanks in advance for the time. 

 

Mitesh

hello all,

 

I have a APEX class, with a webservice

 

 

global class ProductAdminWebService { 
...
...
   webservice static string goLive(string recordId, string status, string productRegion){ 
   ...
   ...
   }
 }

 

 

The only purpose why its a web service, so I can call from my custom button on VF page with a page refresh. It does not make any call outs. 

 

The webservice has a SOSL (NOT SOQL) querry and returns result when called from my custom button on VF page but returns nothing when called from my test method. Am I missing anything here? Below is the SOSL query:

 

 

 

List<List<SObject>> searchList;

searchList = [FIND :productRegion IN ALL FIELDS
    RETURNING 
                                                Product_Administration__c (id, Description__c, Product__c, Product_Region__c, AP_Price__c, Direct_Price__c, Dist_Price__c, LA_Price__c, Standard_Price__c, Schedule_Date__c WHERE Id= :recordId), 
                                                Service_Administration__c (id, Description__c, Product__c, Product_Region__c, AP_Price__c, Direct_Price__c, Dist_Price__c, LA_Price__c, Standard_Price__c WHERE Product_Administration__c= :recordId LIMIT 7)
                                              LIMIT 8];

 

 

 

This is urgent, as I need to deploy to production asap. Please help. 

Hi,

 

Is there a way to deactive a validation rule in APEX. I want to update a record from APEX, but do not want to fire Validation rule, if the same rule is fired from UI, validation rule should fire. 

 

I am thinking to deactive just before record.update and active again. Can this be done? Is there any other way to acheive this? 

 

thanks for the time.

Mitesh

I can lock a record via Approval Process .. I want to also lock a record if Status__c == 'Live' .. can I do that via apex?? 

On the other hand how does SF locks a record?? I do not see any standard-lock-field in the objects ?? 

this sounds really stupid.. can someone help me with passing var by reference to a method in apex. 

 

I have a pagecontroller class that has a method in it. The method is called multiple times, I want a pass a variable by reference so that it gets updated in that method .

 

thanks in advance.

Hello! All,

 

I come from asp.net background and have worked on many projects that creates/modifies files. 

 

I am looking for something similar in Apex. By now I figured the basic of writing Apex code, now I want to create csv files in apex trigger which automatically gets stored in one of shared folder. 

 

Is that even possible using apex. Thanks for reading. 

Hello! all,

 

I have a date field, that I need to compare before I show the records in the lookup. My criteria is "End Date > Today()"

Currently SF does not allow me to do so, I know this is still in Beta, but this looks pretty staright fwd ..

 

Any other work arounds for meeting my criteria??

 

Thanks

Hi all,

 

at first I thought this would be straight fwd, and did not even care to test the cloning of custom master-child objects.. my bad, should have tested based on my experience with SF.. 

 

I have 2 custom objects: Product Bundle(master) and Product Line Items(Child). 

When I clone master record, I want the related Product line items to be conned as well, but that is not happening.. 

How can I achieve this functionality without building my own VF and Controller. 

 

Is there something like trigger.Clone that I can use?? 

Hi,

 

This is really really urgent. The Unit Price column in the csv file is always empty, but when I run the samq query in Force.com Explorer it shows be the value.

 

SELECT ProductCode, Name, (SELECT UnitPrice FROM PricebookEntries where Pricebook2Id='01s20000000HSJzAAO' and UnitPrice>0)UnitPrice FROM Product2 where Status__c='active' and isactive = true and DE_Product_Region__c='NA 2010-01' and (productcode like '980-%' or productcode like '990-%')

 

PricebookEntries is the child object for Product2.

 

Thanks and appreciate your time.

Hello All,

 

I am not able to figure why a field in Child object is not available for roll ups in master object?

 

I have formula field in Child Object, Product Bundle. I want to roll this field in Master Object, Opportunity.

In Opportunity I select new field type roll-up, sum,  the drop down for selecting the fields is grayed out!!

 

I can the see the values of Product Bundle Child object in the Opportunity related section, so that is working fine.

I am just not able to figure why is this happening??

 

The reason why I want this is: I want (Sum of Amount for individual line items) + (Sum of Amount of Product Bundle) in Opportunity.

 

Thanks for the time..

Hello! All,

 

I have a custom object: Product Bundle, as name suggests, they have more than one Product/Service attached to it. 

And in my opportunity section I can add both individual line items and/or Product Bundle - this was the hard part. 

Apex and VF helped. 

 

So now coming to the quotes, how can I add this custom object to my quote, I want each Bundle Item to be seen in a different section under quote. Has anyone thought/worked on it. 

 

Thanks for viewing this thread...

Hello!

 

this is very trivial but important from end customer point of view. 

I have a Discount Formula field, and for some reasons the "%" is not see after the value. It does the calculation fine.

Just for testing purpose I changed the type from Percent to Currency, and it did showed "USD" in the value. 

 

What is going wrong here?

 

thanks

Hi,

 

Recently there was a need in my org to create bunch of Portal users, and I hate doing repitative things, off course I come from developing background. So I called SF premier support, asking the same, and they told I cannot create Portal Users via DL. 

 

I will have to create contact, hit allow login, enter user details, blah blah.. for each and every user. Did not make sense to me and I started to look into the Data Structure to see how User, Contact, Porfile, license objects are related. To my surprise there was contactId field under user object. 

 

All I did was populated the PortalUser.csv file with correct SF contactId, ProfileId(Partner Profile), RecordTypeId(Portal Contact) along with other info like Name, Email, Alias for 200 odd records. Uploaded via Data Loader and boom it all went in. 

 

I thought I will post here, so others can take advantage of this. Just shoot me an email or reply to this post, if you need further assitance.

 

Mitesh

Hello everyone.

 

I came acrosee a problem,that is:

 

I created a page,renderAs="pdf",then in components,i got all datas to the body part. So,the result is when i click un button in the opportunity,i can get a pdf.

 

But my chef ask me to add the javascript that can call a  mouse events when passing a url in the PDF.

 

I want to know that it is possible to implement this funtion or not? and how?

 

Thank u !

  • June 19, 2012
  • Like
  • 0

Hi 

 

 

I am facing an issue with VF to word doc conversion , header is being disaplyed twice on the first page, and header is displayed only once in the remaining all pages.

 

 

 

Thanks

Prajnith

Hello SF champs,

 

I wanted to understnad how Deep linking (redirecting user after authenticating via SSO) works. We have email going out from SF, and we would like to have links, that would take user to Ping server for authentication, once authenticated, redirect them to specific page in SF (we would have the SF Id in the link in the email). 

 

I found this documentatoin from PingIdentity: http://documentation.pingidentity.com/display/SFC/SP-Initiated+SSO+via+Deep+Linking

that basically explains the same, but from what I understand, the user need to be already authenticated for deep linking to work. 

 

Is that true? Can't we redirect the user for the very first time they login?

 

Appreciate your time. 

 

thanks

Mitesh

Hi,

 

I am working on a report to be generated in pdf format.

I have to display the column header values in all the pages. Is it possible to handle this in visualforce.

 

The code is somewhat like this which i am trying. I want the apex:column headerValue="Primary Name"  to appear in all the pages when rendered as pdf.Currently only in the first page the header is coming with values  and in the following pages the values are coming with no header. Is it possible to display the header in all pages in an aligned manner.

 

 

<apex:page renderAs="pdf" standardStylesheets="false">
<head>
<style>

@page :first
{

margin : 70pt .5in .7in .5in;
size:landscape;
@top-right
{
        content : element(header);
}
@top-left {
     font-family:Arial;font-size:16pt;font-weight:bold;
     content: "Relationship";
        }
          @bottom-left {
        font-family:Arial;font-size:10pt;
        content : element(footer);
    }

         
            @bottom-right {
   
    font-family:Arial;font-size:10pt;
    content: "Page " counter(page) " of " counter(pages);
      
    }


}

@page
{

margin : 70pt .5in .7in .5in;
size:landscape;
@top-right
{
        content : element(header);
}
@top-left {
     font-family:Arial;font-size:16pt;font-weight:bold;
     content: "Relationship all";
        }
       
        @top-center
{
content: element(test1);
}
       

       
          @bottom-left {
        font-family:Arial;font-size:10pt;
        content : element(footer);
    }

         
            @bottom-right {
   
    font-family:Arial;font-size:10pt;
    content: "Page " counter(page) " of " counter(pages);
      
    }


}


div.header {
    position : running(header) ;
}
div.footer {   
    position : running(footer) ;
}

div.test1
{
position: running(test1);
width:703px;
padding-left:9px;
}

.table1Value{color: #333333; font-size: 70%;text-align: center;border-bottom:0px double #605E5E;}
</style>


</head>

 


<div class="header" align='right'>
    <apex:image value="logo"/>
</div>

<div class="test1">
<table>
<tr >
<th width="10%" align="left">Relationship </th><th width="10%">AA</th><th width="10%">BB</th><th width="12%">CC</th><th width="10%">DD</th><th width="12%">EE</th><th width="10%">FF</th><th width="12%">GG</th>
</tr>
</table>
</div>


<div class="footer" align='left'>
    Date Printed  : {!MONTH(TODAY())}/{!DAY(TODAY())}/{!YEAR(TODAY())}<br/>

</div>

     <apex:column headerValue="Primary Name" style="font-family:Arial;font-size:10pt;">
     {!NULLVALUE(l.rg.households__PrimaryAccount__r.Name,'-')}
     </apex:column> 


</apex:page>

Hi,

 

I would like to allow user to print multiple line items in related list at once, instead of printing one item at a time. 

 

For eg in the related list I would have a button that says "Print line items" and it should take user to printview of those selected line items. 

Can Pagereference class help? 

 

URL that Sf generates for individual line item is like: https://na7.salesforce.com/001xxxxxxxxxxxxxx/p

 

any help is appreciated. 

thanks

Hi all,

 

This one is driving me crazy, as I cannot see what wrong I am doing. I have 2 wrapper class within single controller class.

One for Estimate_Step__c object and other for Misc_Cost__c object, both are child object to Estimate__c object. 

 

I have a detail page button on Estimate__c object, that takes user to a VF page, that displays Master record and all related records for both these objects. Also on VF page, I have "Add New" button for both these objects/datatables. "Add New" adds a record with default values to respective list, so users can udpate it VF page. 

 

While it works great for Estimate_Steps__c object, it does not work for Misc_Cost__c object, in reality they are ditto copy, just change in variable names. When user changes values for Misc_Cost__c records in VF, it is not passed to the controller. 

 

Please find the code below. Thanks in advance.. 

 

VF page

 

<apex:outputPanel id="pnlEstimateSteps">  
            <apex:outputLabel value="Step II: Choose Estimate Steps" styleClass="bold" /><br/>  
            <apex:pageBlock >    
                <apex:pageBlockButtons location="bottom">
                    <apex:commandButton action="{!addStep}" value="New (RL) Estimate Step" rerender="pnlEstimateSteps" status="addStepStatus" immediate="true"/>
                    <apex:actionStatus startText="loading..." id="addStepStatus"/>
                </apex:pageBlockButtons>
                
                <apex:pageBlockTable id="tblEstimateSteps" value="{!estimateWrapperList}" rendered="{!estimateWrapperList.size!=0 && NOT(ISNULL(estimateWrapperList))}" style="width:800px" var="e">
                    <apex:column headerValue="Select" >
                        <apex:inputCheckbox value="{!e.selected}" style="width:20px"/>
                    </apex:column>
                    <apex:column headerValue="Step Order" rendered="true">
                        <apex:inputText id="stepOrder" value="{!e.stepOrder}" style="width:20px" required="true" />
                    </apex:column>
                    <apex:column >
                        <apex:facet name="header">
                            {!$ObjectType.Name.Label}
                        </apex:facet> 
                        <apex:inputField id="stepName" value="{!e.estimateStep.Name}"  style="width:150px" required="true"/>
                    </apex:column>  
                    <apex:column >
                        <apex:facet name="header">
                            {!$ObjectType.Estimate_Step__c.Fields.Hours_Required__c.Label}
                        </apex:facet> 
                        <apex:inputField id="stepHrs" value="{!e.estimateStep.Hours_Required__c}"  style="width:50px" />                        
                    </apex:column>
                </apex:pageBlockTable>
            </apex:pageBlock>
        </apex:outputPanel>    
        
        <br/>
        
        <apex:outputPanel id="pnlEstimateMisc">  
            <apex:outputLabel value="Step III: Choose Miscellaneous Costs" styleClass="bold" /><br/>  
            <apex:pageBlock >    
                <apex:pageBlockButtons location="bottom">
                    <apex:commandButton action="{!addMiscCost}" value="New (RL) Misc. Costs" rerender="pnlEstimateMisc" status="addMiscStatus" immediate="true"/>
                    <apex:actionStatus startText="loading..." id="addMiscStatus"/>
                    <br/><br/><br/>
                    <apex:commandButton action="{!Save}" value="Save" />
                    <apex:commandButton action="{!Cancel}" value="Cancel" />
                </apex:pageBlockButtons>
               
                
                <apex:pageBlockTable id="tblEstimateMisc" value="{!estimateMiscWrapperList}" rendered="{!estimateMiscWrapperList.size!=0 && NOT(ISNULL(estimateMiscWrapperList))}" style="width:800px" var="m">
                    <apex:column headerValue="Select">
                        <apex:inputCheckbox value="{!m.selected}" style="width:20px"/>
                    </apex:column>
                    <apex:column >
                        <apex:facet name="header">
                            {!$ObjectType.RL_Misc_Cost__c.Fields.Misc_picklist__c.Label}
                        </apex:facet> 
                        <apex:inputField id="miscName" value="{!m.estimateMisc.Misc_picklist__c}"  style="width:200px" required="true" />                        
                    </apex:column>  
                    <apex:column >
                        <apex:facet name="header">
                            {!$ObjectType.RL_Misc_Cost__c.Fields.Cost__c.Label}
                        </apex:facet> 
                        <apex:inputField id="miscCost" value=" {!m.estimateMisc.Cost__c}"  style="width:50px" required="true" />                       
                    </apex:column>
                </apex:pageBlockTable>
            </apex:pageBlock>
        </apex:outputPanel>

 

Apex class

 

//Class variables
    private final Estimate__c estimateRecord;
    public List<Estimate_Step__c> estimateStepsList {get; set;}
    public List<RL_Misc_Cost__c> estimateMiscList {get; set;}
    public list<clsEstimateWrapper> estimateWrapperList {get; set;}
    public list<clsEstimateMiscWrapper> estimateMiscWrapperList {get; set;}
    public String qryString;
    public String prodDescription {get; set;}
    public Integer stepOrder;
    public String action {get; set;}.
.
.
. 


//Wrapper class for Estimate_Step__c
    public class clsEstimateWrapper{
        public Estimate_Step__c estimateStep{get; set;}
        public Boolean selected {get; set;}
        public Integer stepOrder {get; set;}
        
        /*This is the contructor method. for each new instance set Estimate_Step__c and stepOrder. Selected is true by default */
        public clsEstimateWrapper(Estimate_Step__c estStep, Integer stepOrder){
            estimateStep = estStep;
            selected = true;       
            this.stepOrder = stepOrder;     
        }       
    }
    
    //Wrapper class for RL_Misc_Cost__c
    public class clsEstimateMiscWrapper{
        public RL_Misc_Cost__c estimateMisc{get; set;}
        public Boolean selected {get; set;}
        
        /*This is the contructor method. for each new instance set RL_Misc_Cost__c. Selected is true by default */
        public clsEstimateMiscWrapper(RL_Misc_Cost__c estMisc){
            this.estimateMisc = estMisc;
            selected = true;
        }       
    }
    
    //Save Estimate along with selected Steps
    public PageReference Save(){
        
        //Estimate header 
        system.Debug('estimateRecord.Name: ' + estimateRecord.Name);  
        system.Debug('estimateRecord.Drawing_No__c: ' + estimateRecord.Drawing_No__c);  
        system.Debug('estimateRecord.Quantity__c: ' + estimateRecord.Quantity__c);      
        
        Estimate__c clonedEstimate= new Estimate__c(Name=estimateRecord.Name, Drawing_No__c=estimateRecord.Drawing_No__c, Quantity__c=estimateRecord.Quantity__c, Opportunity__c=estimateRecord.Opportunity2__c,
            Product__c=estimateRecord.Product__c, Estimate_Notes__c=estimateRecord.Estimate_Notes__c, Estimate_UOM__c=estimateRecord.Estimate_UOM__c, Metal_Type__c=estimateRecord.Metal_Type__c, Metal_Cost__c=estimateRecord.Metal_Cost__c,
            Lbs_babbitt__c=estimateRecord.Lbs_babbitt__c, Shop_Rate__c=estimateRecord.Shop_Rate__c, Est_Standard_Delivery__c=estimateRecord.Est_Standard_Delivery__c,
            Est_Std_Delivery_Units__c=estimateRecord.Est_Std_Delivery_Units__c, Est_Expedited_Delivery__c=estimateRecord.Est_Expedited_Delivery__c, Est_Exp_Delivery_Units__c=estimateRecord.Est_Exp_Delivery_Units__c, 
            Base_Price_Multiplier__c=estimateRecord.Base_Price_Multiplier__c, Expedited_Multiplier__c=estimateRecord.Expedited_Multiplier__c);
        
        try{
            //1. Insert Estimate
            insert clonedEstimate;
           
            
            system.Debug('estimateWrapperList in Save(): ' + estimateWrapperList);  
            
          
            //2. Estimate Steps logic            
            //Empty existing estimateSteps List
            estimateStepsList = new List<Estimate_Step__c>{};
            for(clsEstimateWrapper EstimateWrapper : estimateWrapperList){
                //Check if Estimate Step is checked
                if(EstimateWrapper.selected){  
                    system.debug('EstimateWrapper: ' + EstimateWrapper);     
                    Estimate_Step__c estimateStep = new Estimate_Step__c(Name=EstimateWrapper.estimateStep.Name, Hours_Required__c=EstimateWrapper.estimateStep.Hours_Required__c, 
                        Estimate__c=clonedEstimate.Id,  Comments__c= EstimateWrapper.estimateStep.Comments__c);
                    estimateStepsList.add(estimateStep);
                    system.debug('estimateStep: ' + estimateStep);
                }
            } 
                
            //insert Estimate Steps
            insert estimateStepsList;
            
            
            //3. Estimate Misc Cost logic
            system.Debug('estimateMiscList in Save(): ' + estimateMiscList);  
            //Empty existing estimateMisc List
            estimateMiscList = new List<RL_Misc_Cost__c>{};         
            for(clsEstimateMiscWrapper EstimateMiscWrapper : estimateMiscWrapperList){
                //Check if Estimate Misc Cost is checked
                if(EstimateMiscWrapper.selected){
                    system.debug('EstimateMiscWrapper: ' + EstimateMiscWrapper);
                    RL_Misc_Cost__c estimateMisc = new RL_Misc_Cost__c(Misc_picklist__c=EstimateMiscWrapper.estimateMisc.Misc_picklist__c, Cost__c=EstimateMiscWrapper.estimateMisc.Cost__c, 
                        Comments__c=EstimateMiscWrapper.estimateMisc.Comments__c, RL_Estimate__c=clonedEstimate.Id);
                    estimateMiscList.add(estimateMisc);
                    system.debug('estimateMisc: ' + estimateMisc);
                }
            }           
            //insert Estimate Steps
            insert estimateMiscList;        
            
          
            
            //4. Redirect user to Estimate
            PageReference pageRef = new PageReference('https://cs9.salesforce.com/'+clonedEstimate.Id);
            pageRef.setRedirect(false);
            return pageRef;
        }
        catch(DmlException ex){
            ApexPages.addMessages(ex);
            return null;
        }
        catch(Exception e){
            ApexPages.addMessages(e);
            return null;
        }
    }
    
    //Add Dynamic Estimate Step
    public PageReference addStep(){     
        estimateWrapperList.add(new clsEstimateWrapper(new Estimate_Step__c(Hours_Required__c=0.0, Comments__c='test', Estimate__c=estimateRecord.Id), stepOrder++));      
        return null;        
    }
    
    //Add Dynamic Misc Cost
    public PageReference addMiscCost(){     
        estimateMiscWrapperList.add(new clsEstimateMiscWrapper(new RL_Misc_Cost__c(Cost__c=0.0, Comments__c='test', RL_Estimate__c=estimateRecord.Id)));     
        return null;        
    }

 

Hi,

 

Recently there was a need in my org to create bunch of Portal users, and I hate doing repitative things, off course I come from developing background. So I called SF premier support, asking the same, and they told I cannot create Portal Users via DL. 

 

I will have to create contact, hit allow login, enter user details, blah blah.. for each and every user. Did not make sense to me and I started to look into the Data Structure to see how User, Contact, Porfile, license objects are related. To my surprise there was contactId field under user object. 

 

All I did was populated the PortalUser.csv file with correct SF contactId, ProfileId(Partner Profile), RecordTypeId(Portal Contact) along with other info like Name, Email, Alias for 200 odd records. Uploaded via Data Loader and boom it all went in. 

 

I thought I will post here, so others can take advantage of this. Just shoot me an email or reply to this post, if you need further assitance.

 

Mitesh

Hi,

 

Based on certain fields, I want to auto select the template, can that be done. 

Lets say, if value in field-A is NA, when user hits generate pdf, it should auto select NA Quote template. 

And if value in the field is EMEA, EMEA quote template shuld be auto selected. 

 

thanks for the help.

Hi All,

 

 I am populating list of user records on the visualforce page where each record has a selct button.When user clicks on select button the corresponding user record name has to be retreived.

 

To display the list of user records i have used wrapper class which looks like this.

 

 

public class userwrapper
            {
                       public User user{get; set;}
                       public Boolean selected;
                       
                    public userwrapper(User t)
                    {
                        user = t;
                        selected = false;
                       
                    }
            }                   

 

 

when user clicks select button on any of the record I want to make selected value euuals true.So, I can process all the records and check whose selected value euals true and there by get the user associated with it.

 

But I am not able to make the selected value =true when user clicks on select button for any of the record.Can anyone please guide me how can I acheive this.

 

 

Thanks,

Srilakshmi B

In the apex documentation, it says that the sort method for a list can only be used if the list is of primitive types.  Does anyone know of a way to work around this with non-primitive types?

 

I'm building a YouTube integration, and I bind the API results to a custom data type called "video", and I'd like to sort by one of the properties of the video when I have a list of them.

Hi,

 

I am i have a created a custom object and am trying to make a master-detail relationship with the object Product. The problem is when I select Master-Detail the Product object does not show up in the drop down list. Does this mean that I can not create a Master Detail relation ship keeping the Product as the master or is there some settings to be changed to get this done.

 

Thanks

KD 

  • May 20, 2009
  • Like
  • 0

Dear salesforce.com users,

 

I want to share with you one Appex class that sorts a List<sObject> by any field in ascending or descending order. The List<sObject> is generated by any SOQL statement, so it can be made of custom and/or standard objects. 

 

Using this class is quite simple, and because I have written unit tests that validates 100% of the code you can easily use it in production sytems.

 

The class performs quite well because the sorting is done in memory (using Maps, Sets and Lists). It also detects if the sort has been done for this field so it does not need to resort (even if it is in reverse order).

 

Before going into details of the Appex class, let me show you how the class is used...

 

The VisualForce page:

Nothing fancy here... Just a page building a datatable with three columns and command buttons on the table headers to sort the data.

<apex:page controller="aaSorterContact">
<apex:form >
<apex:pageBlock >
<apex:pageBlockSection columns="1" ID="AjaxTable">
<apex:datatable value="{!List}" var="acc" Border="1" cellspacing="1" cellpadding="5">
<apex:column >
<apex:facet name="header">
<apex:commandButton action="{!SortByName}"

value="Sort By Name" rerender="AjaxTable" />
</apex:facet>
<apex:outputText value="{!acc.Name}" />
</apex:column>
<apex:column >
<apex:facet name="header">
<apex:commandButton action="{!SortByPhone}"

value="Sort By Phone" rerender="AjaxTable" />
</apex:facet>
<apex:outputText value="{!acc.Phone}" />

</apex:column>
<apex:column >
<apex:facet name="header">

<apex:commandButton action="{!SortByAccount}"

value="Sort By Account" rerender="AjaxTable" />
</apex:facet>
<apex:outputText value="{!acc.Account.Name}" />

</apex:column>
</apex:datatable>
</apex:pageBlockSection>
</apex:pageBlock>
</apex:form>
</apex:page>

The controller:

Couple things going in here, but that is just to make the page look nice... Nothing really to do with the sorting.

public class aaSorterContact {
private String sortedBy = null;
private Boolean sortAscending = null;
private AP_SortHelper sorter = new AP_SortHelper();
private List<Contact> sortedList = null;

public aaSorterContact() {
sorter.originalList = [SELECT Name, Phone, Account.Name FROM Contact];
}
public PageReference SortByName() {
setSortedBy('NAME');
sortedList = (List<Contact>) sorter.getSortedList('Name', sortAscending);
return null;
}
public PageReference SortByAccount() {
setSortedBy('ACCOUNT');
sortedList = (List<Contact>) sorter.getSortedList('Account.Name', sortAscending);
return null;
}
public PageReference SortByPhone() {
setSortedBy('PHONE');
sortedList = (List<Contact>) sorter.getSortedList('Phone', sortAscending);
return null;
}
public List<Contact> getList() {
if (sortedList == null) {
SortByName();
}
return sortedList;
}
private void setSortedBy(String value) {
if (sortedBy == value) {
sortAscending = !sortAscending;
} else {
sortAscending = true;
}
sortedBy = value;
}
}

 

Let me talk about the easy part first...

 

There are methods that answer the calls from the commandbuttons on the page:

 

  • SortByName
  • SortByAccount
  • SortByPhone

 

These methods follow the same structure:

setSortedBy('NAME');
sortedList = (List<Contact>) sorter.getSortedList('Name', sortAscending);
return null;

First, it calls a method setSortedBy() to find out the ascending or descending order. If the user clicks on a different button, the table is sorted ascending by that column, ortherwise the order is inverted from Ascending to descending and viceversa.

 

Second, it calls the method in the Appex class that does the sorting. (I will explain on detail how to use the Appex class, keep reading) :smileywink:

 

Finally, the controller's method returns a null value to the page.

 

The controller's constructor gets the list from the database.

public aaSorterContact() {
sorter.originalList = [SELECT Name, Phone, Account.Name FROM Contact];
}

Since the buttons use the rerendered propery (using AJAX), the class constructor is only called at the initial page load rather than every time the buttons are clicked, therefore the SOQL gets called only once regardless of how many times the data table gets sorted.

 

Finally, the more interesting part...

 

The Appex class that sorts:

You don't really need to understand how this class works to use it, but those of you who are interested...

public class AP_SortHelper {     // <ID, Position>
private Map<String, Integer> listPosition = null; // <FieldName, <FieldValues>>
private Map<String, List<String>> sortedFieldValuesPerFieldName = null; // <FieldName, <FieldValue, <IDs>>>
private Map<String, Map<String, List<String>>> sObjectIDsPerFieldNames = null;

// Properties
public List<sObject> originalList {get; set;}

// Constructor
public AP_SortHelper() {
originalList = null;
}// Public Method
public List<sObject> getSortedList(String fieldName, Boolean ascending) {
if (originalList == null) {
// Assume that originalList has a not NULL value.
// If the class who uses this method has not assigned a value it will get an Exception which
// needs to be handled by the calling class. // Force the exception...
originalList.clear();
} // Make field name uppercase
fieldName = fieldName.toUpperCase(); // Get sorted list
return makeSortedList(fieldName, ascending);
}
public List<sObject> getSortedList(List<sObject> originalList, String fieldName, Boolean ascending) {
this.originalList = originalList;
sortedFieldValuesPerFieldName = null;
return getSortedList(fieldName, ascending);
}

// Private Methods
private void InitializeFieldName(String fieldName) {
String sObjectID;
Integer position;
String fieldValue;
List<String> sObjectIDs = null;
Set<String> valuesForFieldSet = null; // Sets automatically omit duplicate values
List<String> valuesForFieldList = null;
Map<String, List<String>> sObjectIDsPerFieldValues = null;

// Make sortedFieldValuesPerFieldName
if (sortedFieldValuesPerFieldName == null) {
listPosition = new Map<String, Integer>();
sortedFieldValuesPerFieldName = new Map<String, List<String>>();
sObjectIDsPerFieldNames = new Map<String, Map<String, List<String>>>();
}

// Get (or create) map of sObjectIDsPerFieldValues
sObjectIDsPerFieldValues = sObjectIDsPerFieldNames.get(fieldName);
if (sObjectIDsPerFieldValues == null) {
sObjectIDsPerFieldValues = new Map<String, List<String>>();
sObjectIDsPerFieldNames.put(fieldName, sObjectIDsPerFieldValues);
}
if (!sortedFieldValuesPerFieldName.keySet().contains(fieldName)) {
// Objects need to be initialized
position = 0;
valuesForFieldSet = new Set<String>();
listPosition = new Map<String, Integer>();

for (sObject sObj : originalList) {
sObjectID = sObj.ID;
fieldValue = getValue(sObj, fieldName);

// Add position to list
listPosition.put(sObjectID, position++);

// Add the value to the set (sets rather than lists to prevent duplicates)
valuesForFieldSet.add(fieldValue);

// Get (or create) map of sObjectIDs
sObjectIDs = sObjectIDsPerFieldValues.get(fieldValue);
if (sObjectIDs == null) {
sObjectIDs = new List<String>();
sObjectIDsPerFieldValues.put(fieldValue, sObjectIDs);
}

// Add ID to sObjectIDs
sObjectIDs.add(sObjectID);
}

// Sort set items (Need to convert to list)
valuesForFieldList = new List<String>();
valuesForFieldList.addAll(valuesForFieldSet);
valuesForFieldList.sort();

// Now add it to the map.
sortedFieldValuesPerFieldName.put(fieldName, valuesForFieldList);
}
}
private List<sObject> makeSortedList(String fieldName, Boolean ascending) {
Integer position;
List<String> sObjectIDs = null;
List<String> valuesForFieldList = null; // Initialize objects
InitializeFieldName(fieldName); // Get a list of the same type as the "originalList"
List<sObject> outputList = originalList.clone();
outputList.clear(); // Get a list of sorted values
valuesForFieldList = sortedFieldValuesPerFieldName.get(fieldName);

// for each sorted value
for (String fieldValue : valuesForFieldList) {
// Get lisft of IDs
sObjectIDs = sObjectIDsPerFieldNames.get(fieldName).get(fieldValue);

// for each ID
for (String ID : sObjectIDs) {
// Get position in originalList
position = listPosition.get(ID); // Add each sObject to the list.
if ((ascending) || (outputList.size()==0)) {
outputList.add(originalList[position]);
} else {
outputList.add(0, originalList[position]);
}
}
}
return outputList;
}
private static String getValue(sObject sObj, String fieldName) {
// This returns the sObject desired in case the fieldName refers to a linked object.
Integer pieceCount;
String[] fieldNamePieces;

fieldNamePieces = fieldName.split('\\.');
pieceCount = fieldNamePieces.size();
for (Integer i = 0; i < (pieceCount-1); i++) {
sObj = sObj.getSObject(fieldNamePieces[i]);
}
return String.valueOf(sObj.get(fieldNamePieces[pieceCount-1]));
}

// Unit testing
/*
static testMethod void testSortCustomObject() {
List<TPValue__c> TPValues;
AP_SortHelper sorter = new AP_SortHelper();
String fieldName;

TPValues = [SELECT TPName__r.TPName__c, Value__c FROM TPValue__c LIMIT 50];
fieldName = 'Value__c';
testOrderedList(sorter.getSortedList(TPValues, fieldName, true), fieldName, true);

fieldName = 'TPName__r.TPName__c';
testOrderedList(sorter.getSortedList(TPValues, fieldName, true), fieldName, true);
}
*/
static testMethod void testSimpleField_Ascending() {
testSortingContacts('Name', true);
}
static testMethod void testSimpleField_Descending() {
testSortingContacts('Name', False);
}
static testMethod void testLookupField_Ascending() {
testSortingContacts('Account.Name', True);
}
static testMethod void testLookupField_Decending() {
testSortingContacts('Account.Name', False);
}
static testMethod void testMultipleCalls() {
AP_SortHelper sorter;
sorter = testSortingContacts(null, 'Name', true);
testSortingContacts(sorter, 'Name', False);
testSortingContacts(sorter, 'Account.Name', True);
testSortingContacts(sorter, 'Account.Name', False);
}
static testMethod void testForgotOriginalList() {
Boolean exceptionDetected = false;
AP_SortHelper sorter = new AP_SortHelper();
try {
sorter.getSortedList('Name', true);
} catch (NullPointerException e) {
exceptionDetected = true;
}
System.assert(exceptionDetected);
}
static testMethod void testPassingList() {
AP_SortHelper sorter = new AP_SortHelper();
List<Contact> contacts = [SELECT Name, Phone, Account.Name FROM Contact LIMIT 50];
List<Contact> sortedList = (List<Contact>) sorter.getSortedList(contacts, 'Name', true);
testOrderedList(sortedList, 'Name', true);
}
private static void testSortingContacts(string fieldName, Boolean isAscending) {
testSortingContacts(null, fieldName, isAscending);
}
private static AP_SortHelper testSortingContacts(AP_SortHelper sorter, string fieldName, Boolean isAscending) {
// If sorted is null,create it.
if (sorter == null) {
sorter = new AP_SortHelper();
sorter.originalList = [SELECT Name, Phone, Account.Name FROM Contact LIMIT 50];
}

// Sort list
List<Contact> sortedList = (List<Contact>) sorter.getSortedList(fieldName, isAscending); // Test sort order
testOrderedList(sortedList, fieldName, isAscending);

return sorter;
}
private static void testOrderedList(List<sObject> sortedList, string fieldName, Boolean isAscending) {
String lastValue = null;
String currentValue = null; for (sObject sObj : sortedList) {
currentValue = getValue(sObj, fieldName);
if ((lastValue != null) && (currentValue != null)) { String strDebug = '';
strDebug += '\n--------------------------------------------------------------';
strDebug += '\nSTART';
strDebug += '\n--------------------------------------------------------------';
strDebug += '\n[Ascending:'+isAscending+']';
strDebug += '\n[Previous:'+lastValue+'] [IsNull():'+(lastValue==null)+']';
strDebug += '\n[Current:'+currentValue+'] [IsNull():'+(currentValue==null)+']';
strDebug += '\n[CompareTo:'+(currentValue.compareTo(lastValue))+']';
strDebug += '\n--------------------------------------------------------------';
strDebug += '\nEND';
strDebug += '\n--------------------------------------------------------------';
System.debug(strDebug); if (isAscending) {
System.assertEquals(currentValue.compareTo(lastValue)>=0, true);
} else {
System.assertEquals(currentValue.compareTo(lastValue)<=0, true);
}
}
lastValue = currentValue;
}
}
}

 

How to use this class?

  1. Create an instance of this class AP_SortHelper()
  2. Assign the list to sort. Get this list using SOQL.
  3. Call the getSortedList() method which takes two fields:
    1. The name of the field as it was used in the SOQL
    2. The order (true for ascending, false for descending

 


For now, I have one question to the group...

 

This message is getting long... Is there a better place to post it? The way I see it, AppeXchange is applications not for independent utility classes.

Message Edited by andresperez on 01-28-2009 10:45 AM