• penguinator
  • NEWBIE
  • 25 Points
  • Member since 2008

  • Chatter
    Feed
  • 1
    Best Answers
  • 0
    Likes Received
  • 0
    Likes Given
  • 3
    Questions
  • 8
    Replies

I am using the following html page as the login page for my REST app. But I am getting consistently the redirect_url mismatch error. I have checked the url and I am sure that the url string is correct. I have also tried other urls but the error keeps popping up. What am I doing wrong?

 

<html>
    <body> <%-- onLoad="document.authorizationForm.submit()">  --%>
    <form action="https://login.salesforce.com/services/oauth/authorize" method="post" name="authorizationForm">    
      <input type="hidden" name="response_type" value="code"/>    
      <input type="hidden" name="client_id" value="3MVG9rFJvQRVOvk6sl7xMXtrbyQb2XUv2vprLKWv0uxBLKFzNqtHJG6cmzuemPYDB3hPwqXsBlw0BGQPkb81P"/>
      <input type="hidden" name="redirect_url" value="https://10.132.35.240:8443/"/>
    </form>
  </body>
</html>

 

 

 

error=redirect_uri_mismatch&error_description=redirect_uri%20must%20match%20configuration

I'm running the following SOQL statement and it always produces an unexpected error:

 

 

select week_in_year(ActivityDate), count(Id)
from Task
group by week_in_year(ActivityDate)

 

 

The error from a previous similar call was: "UNKNOWN_EXCEPTION: An unexpected error occurred. Please include this ErrorId if you contact support: 228937263-10791 (1171053875)"  However, the following code works fine:

 

 

select ActivityDate, count(Id)
from Task
group by ActivityDate

 

Is there something I'm missing or is this a quirk with week_in_year?  I'm using the 18.0 version of the SOAP partner API (https://www.salesforce.com/services/Soap/u/18.0).

 

 

Thanks!

A simplistic approach to getting a quarterly forecast is to use something like this SOQL statement:
 
select Id, Name, Amount, CloseDate from Opportunity where IsWon=true and CloseDate=THIS_QUARTER

This can also be used for when there are OpportunityLineItems (products) used in a given opportunity so long as those don't have revenue or quantity schedules.  However, when there are schedules involved, it's not possible to do a three-level query.  So while something like this is possible:

 

select  Id, Name, Amount, CloseDate, (select Id, Quantity, UnitPrice from OpportunityLineItem) from Opportunity where IsWon=true and CloseDate=THIS_QUARTER

 

You can't directly query the associated OpportunityLineItemSchedule records.  Ideally, if SOQL supported three levels of relationships, you could do the following:

select  Id, Name, Amount, CloseDate, (select Id, Quantity, UnitPrice, (select Id, Quantity, Revenue, ScheduleDate from OpportunityLineItemSchedule) from OpportunityLineItem) from Opportunity where IsWon=true and CloseDate=THIS_QUARTER

Is there a way to do this that I don't know about, or am I stuck with first querying the Opportunity + OpportunityLineItem records, then iterating over each to query for the corresponding OpportunityLineItemSchedule?

Aternatively, is there a more direct way to retrieve the expected revenue based on scheduled and non-scheduled revenue?

I'm having problems saving my test class to the production environment.  In my developer account, everything works well -- the trigger fires and works as expected and my test class gets 100% code coverage of the trigger.  However, when I attempt to save this to the production organization it doesn't work because my trigger isn't active.  Because my trigger isn't active, my test class's assertions fail, and I can't test the trigger.  The chicken and the egg are butting heads.

Here's the code for the trigger:

trigger contactRatingTrigger on Contact (before insert, before update)
{
 for (Contact c : Trigger.new)
 {
  Account a = [select Id, Name, Rating from Account where Id = :c.AccountId];
  
  Map<String, Integer> accountRatingMap = new Map<String, Integer>
  {
   'Loyal Customer (more than 2 years)' => 0,
   'Customer' => 2,
   'Reserved Customer' => 0,
   'Proposal (SOW Submitted)' => 4,
   'Opportunity Identified' => 5,
   'Presentation - Made' => 6,
   'Presentation - Booked' => 7,
   'Qualified Prospect' => 8,
   'Hot Prospect' => 9,
   'Warm Prospect' => 10,
   'Prospect' => 11,
   'Suspect' => 12,
   'Territory' => 13,
   'Not Qualified - no follow up reqd' => 14,
   'Not Qualified - Out of Business' => 0,
   'Lost Customer' => 15
  };
  
  Map<Integer, String> accountRatingReverseMap = new Map<Integer, String>
  {
   2 => 'Customer',
   4 => 'Proposal (SOW Submitted)',
   5 => 'Opportunity Identified',
   6 => 'Presentation - Made',
   7 => 'Presentation - Booked',
   8 => 'Qualified Prospect',
   9 => 'Hot Prospect',
   10 => 'Warm Prospect',
   11 => 'Prospect',
   12 => 'Suspect',
   13 => 'Territory',
   14 => 'Not Qualified - no follow up reqd',
   15 => 'Lost Customer'
  };
  
  Map<String, Integer> contactRatingMap = new Map<String, Integer>
  {
   'Loyal Customer' => 1,
   'Customer' => 2,
   'Reserved Customer' => 3,
   'Proposal (SOW Submitted)' => 4,
   'Opportunity Identified' => 5,
   'Presentation - Made' => 6,
   'Presentation - Booked' => 7,
   'Qualified Prospect' => 8,
   'Hot Prospect' => 9,
   'Warm Prospect' => 10,
   'Prospect' => 11,
   'Suspect' => 12,
   'Territory' => 13,
   'Not Qualified - Not interested - no follow up reqd' => 0,
   'Not Qualified - Opted Out' => 0,
   'Not Qualified - Left company' => 0,
   'Not Qualified - Out of Business' => 0,
   'Lost Customer' => 0
  };
  
  Map<Integer, String> contactRatingReverseMap = new Map<Integer, String>
  {
   1 => 'Loyal Customer',
   2 => 'Customer',
   3 => 'Reserved Customer',
   4 => 'Proposal (SOW Submitted)',
   5 => 'Opportunity Identified',
   6 => 'Presentation - Made',
   7 => 'Presentation - Booked',
   8 => 'Qualified Prospect',
   9 => 'Hot Prospect',
   10 => 'Warm Prospect',
   11 => 'Prospect',
   12 => 'Suspect',
   13 => 'Territory'
  };
  
  Integer accountRating = accountRatingMap.get(a.Rating);
  Integer contactRating = contactRatingMap.get(c.Rating_contact__c);
  
  System.debug('accountRating = ' + accountRating + '; contactRating = ' + contactRating);
  
  // Only handle expected values and ignore all others
  //
  if (contactRating != null)
  {
   // if the account has no rating, give it the lowest priority rating
   //
   if (accountRating == null)
   {
    accountRating = 1000;
   }
   
   // Ignore any ratings which we aren't supposed to touch.  A value
   // of zero indicates that we completely skip over it
   //
   if (accountRating != 0 && contactRating != 0)
   {
    if (contactRating < accountRating)
    {
     System.debug('Contact rating of ' + c.Rating_contact__c + ' is higher priority than account rating of ' + a.Rating + '. Updating Account to match.');
     a.Rating = accountRatingReverseMap.get(contactRating);
     update a;
    }
    
    else
    {
     System.debug('Contact rating of ' + c.Rating_contact__c + ' is not higher priority than account rating of ' + a.Rating + '. Account not updated.');
    }
   }
  }
  
  else
  {
   // In this case, we'll have encountered a contact rating
   // which is not expected, send an email and don't process it
   //
   Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
   mail.setToAddresses(new String[] {'debug@example.com'});
   mail.setSubject('Salesforce APEX error: invalid rating detected!');
   mail.setPlainTextBody('Received account rating: ' + a.Rating + ' and contact rating: ' + c.Rating_contact__c);
   Messaging.sendEmail(new Messaging.SingleEmailMessage[] { mail });
  }
 }
}

 And for the test class:

public class testContactRatingUpdate
{
public static testMethod void test1()
{
// TEST 1:
//
// Ensure that the account with no rating, when adding a contact
// as a 'Hot Prospect' gets updated to equal 'Hot Prospect'
//
Account tA1 = new Account(Name = 'New Demo Account');
insert tA1;

Contact tC1 = new Contact(AccountId = tA1.Id,
FirstName = 'John', LastName = 'Smith',
Rating_contact__c = 'Hot Prospect');

insert tC1;

Account tRA1 = [select Id, Rating from Account where Id=:tA1.Id][0];
System.assertEquals(tRA1.Rating, 'Hot Prospect');

// TEST 2:
//
// When adding a contact with no rating, the original Test Account
// should remain as 'Hot Prospect'
//
Contact tC2 = new Contact(AccountId = tA1.Id,
FirstName = 'Larry', LastName = 'Page');

insert tC2;

Account tRA2 = [select Id, Rating from Account where Id = :tA1.Id][0];
System.assertEquals(tRA2.Rating, 'Hot Prospect');

// TEST 3:
//
// When adding a contact with an unexpected rating, the account shouldn't
// get changed
//
Account tA3 = new Account(Name = 'Test Account 3');
insert tA3;

Contact tC3 = new Contact(AccountId = tA3.Id,
FirstName = 'Bill', LastName = 'Gates',
Rating_contact__c = 'Rating does not exist');

insert tC3;

Account tRA3 = [select Id, Rating from Account where Id = :tA3.Id][0];
System.assertEquals(tRA3.Rating, null);

// TEST 4:
//
// When adding a contact with a lower rating, the account shouldn't
// get changed
//
Account tA4 = new Account(Name = 'Test Account 4', Rating = 'Hot Prospect');
insert tA4;

Contact tC4 = new Contact(AccountId = tA4.Id,
FirstName = 'Steve', LastName = 'Jobs',
Rating_contact__c = 'Warm Prospect');

insert tC4;

Account tRA4 = [select Id, Rating from Account where Id = :tA4.Id][0];
System.assertEquals(tRA4.Rating, 'Hot Prospect');

}
}

 
And here's the errors as returned by the Eclipse IDE:

Severity and Description Path Resource Location Creation Time Id
Test coverage of selected Apex Class and Trigger is 0%, at least 75% test coverage is required  Production line 1 1209178364628 8

Severity and Description Path Resource Location Creation Time Id
File only saved locally, not to server Production/src/unpackaged package.xml line 1 1209429636784 82
File only saved locally, not to server Production/src/unpackaged/classes testContactRatingUpdate.cls line 1 1209429636784 84
Save error: Associate metadata or source file failed to save.  File only saved locally, not to Salesforce. Production/src/unpackaged/classes testContactRatingUpdate.cls-meta.xml line 1 1209432400248 101

If I do this from the command line using Ant:

C:\Salesforce\Deploy>ant deployCode
Buildfile: build.xml

deployCode:

BUILD FAILED
C:\Salesforce\Deploy\build.xml:11: Failures:
Test failure, method: testContactRatingUpdate.test1 -- System.Exception: Assertion Failed: Expected: null, Actual: Hot P
rospect stack Class.testContactRatingUpdate.test1: line 20, column 9 Total time: 14 seconds

 
build.xml file:

<project name="Sample usage of Salesforce Ant tasks" default="test" basedir="." xmlns:sf="antlib:com.salesforce">

    <property file="build.properties"/>
    <property environment="env"/>

    <!-- Shows deploying code & running tests for package 'codepkg' -->
    <target name="deployCode">
      <!-- Upload the contents of the "ContactRatingPkg" package, running the tests for just 1 class -->
      <sf:deploy username="${sf.username}" password="${sf.password}"
    serverurl="${sf.serverurl}"
    deployroot="ContactRatingPkg">
      </sf:deploy>
    </target>

</project>

 build.properties file (with username and password/token stripped):

# build.properties
#

sf.username = redacted@example.com
sf.password = redactedMyTokenWasHere

# Use 'https://www.salesforce.com' for production (the default if not specified).
# Use 'https://test.salesforce.com for sandbox.
sf.serverurl = https://www.salesforce.com

# If your network requires an HTTP proxy, see http://ant.apache.org/manual/proxy.html for configuration.
#

ContactRatingPkg\package.xml file:

<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
    <fullName>ContactRatingPkg</fullName>
    <types>
        <members>*</members>
        <name>ApexTrigger</name>
    </types>
<types> <members>*</members> <name>ApexClass</name> </types> <version>12.0</version> </Package>

The trigger and class files have this as their [filename]-meta.xml file:

Class:
<?xml version="1.0" encoding="UTF-8"?>
<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata">
<apiVersion>12.0</apiVersion>
</ApexClass>

Trigger:

<?xml version="1.0" encoding="UTF-8"?>
<ApexTrigger xmlns="http://soap.sforce.com/2006/04/metadata">
<apiVersion>12.0</apiVersion>
</ApexTrigger>

 

 
Any ideas on what's going wrong here?


Thanks in advance!

I am using the following html page as the login page for my REST app. But I am getting consistently the redirect_url mismatch error. I have checked the url and I am sure that the url string is correct. I have also tried other urls but the error keeps popping up. What am I doing wrong?

 

<html>
    <body> <%-- onLoad="document.authorizationForm.submit()">  --%>
    <form action="https://login.salesforce.com/services/oauth/authorize" method="post" name="authorizationForm">    
      <input type="hidden" name="response_type" value="code"/>    
      <input type="hidden" name="client_id" value="3MVG9rFJvQRVOvk6sl7xMXtrbyQb2XUv2vprLKWv0uxBLKFzNqtHJG6cmzuemPYDB3hPwqXsBlw0BGQPkb81P"/>
      <input type="hidden" name="redirect_url" value="https://10.132.35.240:8443/"/>
    </form>
  </body>
</html>

 

 

 

error=redirect_uri_mismatch&error_description=redirect_uri%20must%20match%20configuration

I'm running the following SOQL statement and it always produces an unexpected error:

 

 

select week_in_year(ActivityDate), count(Id)
from Task
group by week_in_year(ActivityDate)

 

 

The error from a previous similar call was: "UNKNOWN_EXCEPTION: An unexpected error occurred. Please include this ErrorId if you contact support: 228937263-10791 (1171053875)"  However, the following code works fine:

 

 

select ActivityDate, count(Id)
from Task
group by ActivityDate

 

Is there something I'm missing or is this a quirk with week_in_year?  I'm using the 18.0 version of the SOAP partner API (https://www.salesforce.com/services/Soap/u/18.0).

 

 

Thanks!

I'm having problems saving my test class to the production environment.  In my developer account, everything works well -- the trigger fires and works as expected and my test class gets 100% code coverage of the trigger.  However, when I attempt to save this to the production organization it doesn't work because my trigger isn't active.  Because my trigger isn't active, my test class's assertions fail, and I can't test the trigger.  The chicken and the egg are butting heads.

Here's the code for the trigger:

trigger contactRatingTrigger on Contact (before insert, before update)
{
 for (Contact c : Trigger.new)
 {
  Account a = [select Id, Name, Rating from Account where Id = :c.AccountId];
  
  Map<String, Integer> accountRatingMap = new Map<String, Integer>
  {
   'Loyal Customer (more than 2 years)' => 0,
   'Customer' => 2,
   'Reserved Customer' => 0,
   'Proposal (SOW Submitted)' => 4,
   'Opportunity Identified' => 5,
   'Presentation - Made' => 6,
   'Presentation - Booked' => 7,
   'Qualified Prospect' => 8,
   'Hot Prospect' => 9,
   'Warm Prospect' => 10,
   'Prospect' => 11,
   'Suspect' => 12,
   'Territory' => 13,
   'Not Qualified - no follow up reqd' => 14,
   'Not Qualified - Out of Business' => 0,
   'Lost Customer' => 15
  };
  
  Map<Integer, String> accountRatingReverseMap = new Map<Integer, String>
  {
   2 => 'Customer',
   4 => 'Proposal (SOW Submitted)',
   5 => 'Opportunity Identified',
   6 => 'Presentation - Made',
   7 => 'Presentation - Booked',
   8 => 'Qualified Prospect',
   9 => 'Hot Prospect',
   10 => 'Warm Prospect',
   11 => 'Prospect',
   12 => 'Suspect',
   13 => 'Territory',
   14 => 'Not Qualified - no follow up reqd',
   15 => 'Lost Customer'
  };
  
  Map<String, Integer> contactRatingMap = new Map<String, Integer>
  {
   'Loyal Customer' => 1,
   'Customer' => 2,
   'Reserved Customer' => 3,
   'Proposal (SOW Submitted)' => 4,
   'Opportunity Identified' => 5,
   'Presentation - Made' => 6,
   'Presentation - Booked' => 7,
   'Qualified Prospect' => 8,
   'Hot Prospect' => 9,
   'Warm Prospect' => 10,
   'Prospect' => 11,
   'Suspect' => 12,
   'Territory' => 13,
   'Not Qualified - Not interested - no follow up reqd' => 0,
   'Not Qualified - Opted Out' => 0,
   'Not Qualified - Left company' => 0,
   'Not Qualified - Out of Business' => 0,
   'Lost Customer' => 0
  };
  
  Map<Integer, String> contactRatingReverseMap = new Map<Integer, String>
  {
   1 => 'Loyal Customer',
   2 => 'Customer',
   3 => 'Reserved Customer',
   4 => 'Proposal (SOW Submitted)',
   5 => 'Opportunity Identified',
   6 => 'Presentation - Made',
   7 => 'Presentation - Booked',
   8 => 'Qualified Prospect',
   9 => 'Hot Prospect',
   10 => 'Warm Prospect',
   11 => 'Prospect',
   12 => 'Suspect',
   13 => 'Territory'
  };
  
  Integer accountRating = accountRatingMap.get(a.Rating);
  Integer contactRating = contactRatingMap.get(c.Rating_contact__c);
  
  System.debug('accountRating = ' + accountRating + '; contactRating = ' + contactRating);
  
  // Only handle expected values and ignore all others
  //
  if (contactRating != null)
  {
   // if the account has no rating, give it the lowest priority rating
   //
   if (accountRating == null)
   {
    accountRating = 1000;
   }
   
   // Ignore any ratings which we aren't supposed to touch.  A value
   // of zero indicates that we completely skip over it
   //
   if (accountRating != 0 && contactRating != 0)
   {
    if (contactRating < accountRating)
    {
     System.debug('Contact rating of ' + c.Rating_contact__c + ' is higher priority than account rating of ' + a.Rating + '. Updating Account to match.');
     a.Rating = accountRatingReverseMap.get(contactRating);
     update a;
    }
    
    else
    {
     System.debug('Contact rating of ' + c.Rating_contact__c + ' is not higher priority than account rating of ' + a.Rating + '. Account not updated.');
    }
   }
  }
  
  else
  {
   // In this case, we'll have encountered a contact rating
   // which is not expected, send an email and don't process it
   //
   Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
   mail.setToAddresses(new String[] {'debug@example.com'});
   mail.setSubject('Salesforce APEX error: invalid rating detected!');
   mail.setPlainTextBody('Received account rating: ' + a.Rating + ' and contact rating: ' + c.Rating_contact__c);
   Messaging.sendEmail(new Messaging.SingleEmailMessage[] { mail });
  }
 }
}

 And for the test class:

public class testContactRatingUpdate
{
public static testMethod void test1()
{
// TEST 1:
//
// Ensure that the account with no rating, when adding a contact
// as a 'Hot Prospect' gets updated to equal 'Hot Prospect'
//
Account tA1 = new Account(Name = 'New Demo Account');
insert tA1;

Contact tC1 = new Contact(AccountId = tA1.Id,
FirstName = 'John', LastName = 'Smith',
Rating_contact__c = 'Hot Prospect');

insert tC1;

Account tRA1 = [select Id, Rating from Account where Id=:tA1.Id][0];
System.assertEquals(tRA1.Rating, 'Hot Prospect');

// TEST 2:
//
// When adding a contact with no rating, the original Test Account
// should remain as 'Hot Prospect'
//
Contact tC2 = new Contact(AccountId = tA1.Id,
FirstName = 'Larry', LastName = 'Page');

insert tC2;

Account tRA2 = [select Id, Rating from Account where Id = :tA1.Id][0];
System.assertEquals(tRA2.Rating, 'Hot Prospect');

// TEST 3:
//
// When adding a contact with an unexpected rating, the account shouldn't
// get changed
//
Account tA3 = new Account(Name = 'Test Account 3');
insert tA3;

Contact tC3 = new Contact(AccountId = tA3.Id,
FirstName = 'Bill', LastName = 'Gates',
Rating_contact__c = 'Rating does not exist');

insert tC3;

Account tRA3 = [select Id, Rating from Account where Id = :tA3.Id][0];
System.assertEquals(tRA3.Rating, null);

// TEST 4:
//
// When adding a contact with a lower rating, the account shouldn't
// get changed
//
Account tA4 = new Account(Name = 'Test Account 4', Rating = 'Hot Prospect');
insert tA4;

Contact tC4 = new Contact(AccountId = tA4.Id,
FirstName = 'Steve', LastName = 'Jobs',
Rating_contact__c = 'Warm Prospect');

insert tC4;

Account tRA4 = [select Id, Rating from Account where Id = :tA4.Id][0];
System.assertEquals(tRA4.Rating, 'Hot Prospect');

}
}

 
And here's the errors as returned by the Eclipse IDE:

Severity and Description Path Resource Location Creation Time Id
Test coverage of selected Apex Class and Trigger is 0%, at least 75% test coverage is required  Production line 1 1209178364628 8

Severity and Description Path Resource Location Creation Time Id
File only saved locally, not to server Production/src/unpackaged package.xml line 1 1209429636784 82
File only saved locally, not to server Production/src/unpackaged/classes testContactRatingUpdate.cls line 1 1209429636784 84
Save error: Associate metadata or source file failed to save.  File only saved locally, not to Salesforce. Production/src/unpackaged/classes testContactRatingUpdate.cls-meta.xml line 1 1209432400248 101

If I do this from the command line using Ant:

C:\Salesforce\Deploy>ant deployCode
Buildfile: build.xml

deployCode:

BUILD FAILED
C:\Salesforce\Deploy\build.xml:11: Failures:
Test failure, method: testContactRatingUpdate.test1 -- System.Exception: Assertion Failed: Expected: null, Actual: Hot P
rospect stack Class.testContactRatingUpdate.test1: line 20, column 9 Total time: 14 seconds

 
build.xml file:

<project name="Sample usage of Salesforce Ant tasks" default="test" basedir="." xmlns:sf="antlib:com.salesforce">

    <property file="build.properties"/>
    <property environment="env"/>

    <!-- Shows deploying code & running tests for package 'codepkg' -->
    <target name="deployCode">
      <!-- Upload the contents of the "ContactRatingPkg" package, running the tests for just 1 class -->
      <sf:deploy username="${sf.username}" password="${sf.password}"
    serverurl="${sf.serverurl}"
    deployroot="ContactRatingPkg">
      </sf:deploy>
    </target>

</project>

 build.properties file (with username and password/token stripped):

# build.properties
#

sf.username = redacted@example.com
sf.password = redactedMyTokenWasHere

# Use 'https://www.salesforce.com' for production (the default if not specified).
# Use 'https://test.salesforce.com for sandbox.
sf.serverurl = https://www.salesforce.com

# If your network requires an HTTP proxy, see http://ant.apache.org/manual/proxy.html for configuration.
#

ContactRatingPkg\package.xml file:

<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
    <fullName>ContactRatingPkg</fullName>
    <types>
        <members>*</members>
        <name>ApexTrigger</name>
    </types>
<types> <members>*</members> <name>ApexClass</name> </types> <version>12.0</version> </Package>

The trigger and class files have this as their [filename]-meta.xml file:

Class:
<?xml version="1.0" encoding="UTF-8"?>
<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata">
<apiVersion>12.0</apiVersion>
</ApexClass>

Trigger:

<?xml version="1.0" encoding="UTF-8"?>
<ApexTrigger xmlns="http://soap.sforce.com/2006/04/metadata">
<apiVersion>12.0</apiVersion>
</ApexTrigger>

 

 
Any ideas on what's going wrong here?


Thanks in advance!
We're considering starting to use the Forecasting functionality in Salesforce. 
 
What I've found is that the Forecast amount is driven by the Amount field (standard field) in the Opportunity.  We are not using that field.
 
We have 4 revenue componants that we track for each deal.  I've created custom fields for each one, and a calculated field (called 1st Year Revenue) to sum the componants.  It is this field that we report on as our Pipeline revenue. 
 
When I ran my first Forecast, the "Amount" for the deals in my Pipeline was "0."
 
So... I either need to:
  • Somehow, update the "Amount" field with the contents of the calculated field "1st Year Revenue" each time the Opportunity is edited.
  • or, make the "Amount" field a calculated field.
  • or, drive the Forecast calculations off of the "1st Year Revenue" field I've created.

Does anyone out there have a solution or workaround for this issue?

Alan@Avid