<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Anthony Victorio</title>
	<atom:link href="http://www.anthonyvictorio.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.anthonyvictorio.com</link>
	<description>SEO, SEM, Webmaster, Web Design, Salesforce Developer, Freelancer</description>
	<lastBuildDate>Tue, 27 Mar 2012 07:12:13 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Salesforce Apex RSS Reader for Visualforce</title>
		<link>http://www.anthonyvictorio.com/salesforce/apex-rss-reader-visualforce/</link>
		<comments>http://www.anthonyvictorio.com/salesforce/apex-rss-reader-visualforce/#comments</comments>
		<pubDate>Tue, 27 Mar 2012 07:12:13 +0000</pubDate>
		<dc:creator>Anthony Victorio</dc:creator>
				<category><![CDATA[Salesforce]]></category>

		<guid isPermaLink="false">http://www.anthonyvictorio.com/?p=177</guid>
		<description><![CDATA[You may have, at one time or another, had the need or notion to embed an RSS feed into a Visualforce page.  If you are anything like me, you immediately began searching for &#8220;salesforce rss reader&#8221; or &#8220;visualforce rss reader&#8221; or &#8220;salesforce apex rss reader&#8221; or &#8220;salesforce rss parser&#8221; without much luck, which is precisely [...]]]></description>
			<content:encoded><![CDATA[<p><div id="attachment_186" class="wp-caption alignright" style="width: 360px"><img src="http://www.anthonyvictorio.com/media/salesforce-rss-reader-visualforce.png" alt="Salesforce RSS Reader for Visualforce" title="Salesforce RSS Reader for Visualforce" width="350" height="300" class="size-full wp-image-186" /><p class="wp-caption-text">Salesforce RSS Reader for Visualforce</p></div>You may have, at one time or another, had the need or notion to embed an RSS feed into a Visualforce page.  If you are anything like me, you immediately began searching for &#8220;salesforce rss reader&#8221; or &#8220;visualforce rss reader&#8221; or &#8220;salesforce apex rss reader&#8221; or &#8220;salesforce rss parser&#8221; without much luck, which is precisely why I created this post.</p>
<p>So what is RSS and what is the use case for including it inside of a Visualforce pages? If you&#8217;ve ever used a news reader application, it was powered by the RSS feeds of various websites or services. RSS, aka <a href="http://en.wikipedia.org/wiki/RSS" target="_blank">Really Simple Syndication</a>, uses a standard XML format (<a href="http://www.rssboard.org/rss-specification" target="_blank">RSS 2.0 spec</a> will be used in this example) to provide access to data from applications such as blogs, stock quotes, weather websites, news headlines, and many more.  Being able to bring data from RSS feeds into your Visualforce pages gives you the ability to aggregate information from multiple sources, and because those resources use the same standard, you don&#8217;t have to develop independent processes for each resource. My goal, is to provide you with a utility that will make this integration even easier.</p>
<p><strong>A few things to note:</strong> <em>You are confined by the call out limits of Salesforce (as of 03/27/2012 it is a max of 10 web service calls per transaction, essentially a max of 10 RSS feeds per page).  Second, you need to manually configure the &#8220;Remote Site Settings&#8221; of your org to work with each feed resource.</em></p>
<p>Before we started, I would just like to point out a few handy services that make their content available through RSS feeds:</p>
<p><strong>News feeds</strong></p>
<ul>
<li>Bing News (which I will cover in this example) - <a href="http://api.bing.com/rss.aspx?Source=News&amp;Market=en-US&amp;Version=2.0&amp;Query=">http://api.bing.com/rss.aspx?Source=News&amp;Market=en-US&amp;Version=2.0&amp;Query=</a></li>
<li>Google News - <a href="http://news.google.com/news?pz=1&amp;cf=all&amp;ned=us&amp;hl=en&amp;output=rss">http://news.google.com/news?pz=1&amp;cf=all&amp;ned=us&amp;hl=en&amp;output=rss</a></li>
<li>CNN Top Stories - <a href="http://rss.cnn.com/rss/cnn_topstories.rss">http://rss.cnn.com/rss/cnn_topstories.rss</a></li>
<li>ABC Top Stories - <a href="http://feeds.abcnews.com/abcnews/topstories">http://feeds.abcnews.com/abcnews/topstories</a></li>
<li>MSNBC Top Stories - <a href="http://pheedo.msnbc.msn.com/id/3032091/device/rss">http://pheedo.msnbc.msn.com/id/3032091/device/rss</a></li>
</ul>
<p><strong>Stock Quotes</strong> (most will allow you to get news feeds for specific stock symbols)</p>
<ul>
<li>Nasdaq - <a href="http://articlefeeds.nasdaq.com/nasdaq/categories?category=Stocks">http://articlefeeds.nasdaq.com/nasdaq/categories?category=Stocks</a></li>
<li>Yahoo Stocks - <a href="http://news.yahoo.com/rss/stock-markets">http://news.yahoo.com/rss/stock-markets</a></li>
</ul>
<p><strong>Weather</strong></p>
<ul>
<li>Weather.com National Weather - <a href="http://rss.weather.com/rss/national/rss_nwf_rss.xml?cm_ven=NWF&amp;cm_cat=rss&amp;par=NWF_rss">http://rss.weather.com/rss/national/rss_nwf_rss.xml?cm_ven=NWF&amp;cm_cat=rss&amp;par=NWF_rss</a></li>
</ul>
<p><strong>Other</strong></p>
<ul>
<li>Salesforce AppExchange New Listing - <a href="http://appexchange.salesforce.com/services/xml/NewListings">http://appexchange.salesforce.com/services/xml/NewListings</a></li>
<li>Salesforce Developer Blog - <a href="http://feeds.feedburner.com/SforceBlog?format=xml">http://feeds.feedburner.com/SforceBlog?format=xml</a></li>
</ul>
<p>Now, onto the fun part.</p>
<h2>Salesforce.com Apex RSS Parser Utility</h2>
<p>The purpose of this Apex utility class is to allow you to parse the XML data of an RSS feed using its own standards and store that data into a wrapper class that you can then use to display the data however you wish (e.g. in a Visualforce page). This class is built so that it accepts a single parameter, the RSS feed endpoint, below is the code including a test unit.</p>
<pre class="brush: apex; title: ; notranslate">
public class RSS {

	public class channel {
		public String title {get;set;}
		public String link {get;set;}
		public String description {get;set;}
		public String author {get;set;}
		public String category {get;set;}
		public String copyright {get;set;}
		public String docs {get;set;}
		public RSS.image image {get;set;}
		public list&lt;RSS.item&gt; items {get;set;}
		public channel() {
			items = new list&lt;RSS.item&gt;();
		}
	}

	public class image {
		public String url {get;set;}
		public String title {get;set;}
		public String link {get;set;}
	}

	public class item {
		public String title {get;set;}
		public String guid {get;set;}
		public String link {get;set;}
		public String description {get;set;}
		public String pubDate {get;set;}
		public String source {get;set;}
		public Date getPublishedDate() {
			Date result = (pubDate != null) ? Date.valueOf(pubDate.replace('T', ' ').replace('Z','')) : null;
			return result;
		}
		public DateTime getPublishedDateTime() {
			DateTime result = (pubDate != null) ? DateTime.valueOf(pubDate.replace('T', ' ').replace('Z','')) : null;
			return result;
		}
	}

	public static RSS.channel getRSSData(string feedURL) {

		HttpRequest req = new HttpRequest();
		req.setEndpoint(feedURL);
        req.setMethod('GET');

        Dom.Document doc = new Dom.Document();
		Http h = new Http();

		if (!Test.isRunningTest()){
			HttpResponse res = h.send(req);
            doc = res.getBodyDocument();
		} else {
			String xmlString = '&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&gt;&lt;rss version=&quot;2.0&quot; xmlns:os=&quot;http://a9.com/-/spec/opensearch/1.1/&quot;&gt;&lt;channel&gt;&lt;title&gt;salesforce.com - Bing News&lt;/title&gt;&lt;link&gt;http://www.bing.com/news&lt;/link&gt;&lt;description&gt;Search Results for salesforce.com at Bing.com&lt;/description&gt;&lt;category&gt;News&lt;/category&gt;&lt;os:totalResults&gt;3370&lt;/os:totalResults&gt;&lt;os:startIndex&gt;0&lt;/os:startIndex&gt;&lt;os:itemsPerPage&gt;10&lt;/os:itemsPerPage&gt;&lt;os:Query role=&quot;request&quot; searchTerms=&quot;salesforce.com&quot; /&gt;&lt;copyright&gt;These XML results may not be used, reproduced or transmitted in any manner or for any purpose other than rendering Bing results within an RSS aggregator for your personal, non-commercial use. Any other use requires written permission from Microsoft Corporation. By using these results in any manner whatsoever, you agree to be bound by the foregoing restrictions.&lt;/copyright&gt;&lt;image&gt;&lt;url&gt;http://www.bing.com/s/a/rsslogo.gif&lt;/url&gt;&lt;title&gt;Bing&lt;/title&gt;&lt;link&gt;http://www.bing.com/news&lt;/link&gt;&lt;/image&gt;&lt;docs&gt;http://www.rssboard.org/rss-specification&lt;/docs&gt;&lt;item&gt;&lt;title&gt;Salesforce.com Makes Friends With CIOs - Information Week&lt;/title&gt;&lt;guid&gt;http://informationweek.com/news/cloud-computing/software/232602782&lt;/guid&gt;&lt;link&gt;http://informationweek.com/news/cloud-computing/software/232602782&lt;/link&gt;&lt;description&gt;Parade of CIOs at CloudForce shows how social networking inroads are making Salesforce.com a larger part of the IT infrastructure. Salesforce.com isn&amp;apos;t just for sales forces anymore. Its Chatter app has opened a social networking avenue into the enterprise ...&lt;/description&gt;&lt;pubDate&gt;2012-03-19T15:21:47Z&lt;/pubDate&gt;&lt;source&gt;Information Week&lt;/source&gt;&lt;/item&gt;&lt;/channel&gt;&lt;/rss&gt;';
			doc.load(xmlString);
		}

		Dom.XMLNode rss = doc.getRootElement();
		//first child element of rss feed is always channel
		Dom.XMLNode channel = rss.getChildElements()[0];

		RSS.channel result = new RSS.channel();

		list&lt;RSS.item&gt; rssItems = new list&lt;RSS.item&gt;();

		//for each node inside channel
		for(Dom.XMLNode elements : channel.getChildElements()) {
			if('title' == elements.getName()) {
				result.title = elements.getText();
			}
			if('link' == elements.getName()) {
                result.link = elements.getText();
            }
            if('description' == elements.getName()) {
                result.description = elements.getText();
            }
            if('category' == elements.getName()) {
                result.category = elements.getText();
            }
            if('copyright' == elements.getName()) {
                result.copyright = elements.getText();
            }
            if('docs' == elements.getName()) {
                result.docs = elements.getText();
            }
            if('image' == elements.getName()) {
                RSS.image img = new RSS.image();
                //for each node inside image
                for(Dom.XMLNode xmlImage : elements.getChildElements()) {
                	if('url' == xmlImage.getName()) {
                		img.url = xmlImage.getText();
                	}
                	if('title' == xmlImage.getName()) {
                        img.title = xmlImage.getText();
                    }
                    if('link' == xmlImage.getName()) {
                        img.link = xmlImage.getText();
                    }
                }
                result.image = img;
            }

            if('item' == elements.getName()) {
            	RSS.item rssItem = new RSS.item();
            	//for each node inside item
            	for(Dom.XMLNode xmlItem : elements.getChildElements()) {
            		if('title' == xmlItem.getName()) {
            			rssItem.title = xmlItem.getText();
        			}
        			if('guid' == xmlItem.getName()) {
                        rssItem.guid = xmlItem.getText();
                    }
                    if('link' == xmlItem.getName()) {
                        rssItem.link = xmlItem.getText();
                    }
                    if('description' == xmlItem.getName()) {
                        rssItem.description = xmlItem.getText();
                    }
                    if('pubDate' == xmlItem.getName()) {
                        rssItem.pubDate = xmlItem.getText();
                    }
                    if('source' == xmlItem.getName()) {
                        rssItem.source = xmlItem.getText();
                    }
            	}
            	//for each item, add to rssItem list
            	rssItems.add(rssItem);
            }

		}
		//finish RSS.channel object by adding the list of all rss items
		result.items = rssItems;

		return result;

	}

	static testMethod void RSSTest() {
        RSS.channel chan = RSS.getRSSData('test');
        Date pDate = chan.items[0].getPublishedDate();
        DateTime pDateTime = chan.items[0].getPublishedDateTime();
    }

}
</pre>
<h2>Visualforce RSS Reader</h2>
<p>Now let&#8217;s say that you want to use the parser utility to display data in a Visualforce page. The usage is very simple, as you will see below. We will begin by building a controller for the page.</p>
<pre class="brush: apex; title: ; notranslate">

public class RSSNewsReader {

	public String rssQuery {get;set;}
	private String rssURL {get;set;}

	public RSSNewsReader() {

		rssURL = 'http://api.bing.com/rss.aspx?Source=News&amp;Market=en-US&amp;Version=2.0&amp;Query=';
		rssQuery = 'salesforce.com'; //default on load

	}

	public RSS.channel getRSSFeed() {
		return RSS.getRSSData(rssURL + EncodingUtil.urlEncode(rssQuery,'UTF-8'));
	}

	static testMethod void RSSNewsReaderTest() {
        RSSNewsReader con = new RSSNewsReader();
        RSS.channel rssFeed = con.getRSSFeed();
    }

}
</pre>
<p>In the above example, I&#8217;m using the Bing news feed url, which accepts a query parameter. This allows me to accept user input in order to dynamically modify the feed end point and get the new data from the getRSSFeed() method.  Below is the Visualforce page that goes with this controller.</p>
<pre class="brush: VisualForce; title: ; notranslate">

&lt;apex:page controller=&quot;RSSNewsReader&quot; sidebar=&quot;false&quot; showHeader=&quot;false&quot; cache=&quot;false&quot;&gt;
&lt;style&gt;
.ajax-loader {
    background: url({!$Resource.ajax_loader});
    display: inline-block;
    width: 16px;
    height: 11px;
}
&lt;/style&gt;
&lt;apex:image value=&quot;{!$Resource.ajax_loader}&quot; style=&quot;visibility: hidden;&quot; /&gt;

&lt;apex:pageBlock id=&quot;rssBlock&quot; tabStyle=&quot;Lead&quot;&gt;

    &lt;apex:form style=&quot;padding-bottom: 10px;&quot;&gt;
	    &lt;span&gt;Bing News Query (Enter a Topic): &lt;/span&gt;
	    &lt;apex:inputText value=&quot;{!rssQuery}&quot; /&gt;
	    &lt;apex:commandButton value=&quot;Search Bing News&quot; reRender=&quot;rssBlock&quot; status=&quot;searchStatus&quot; /&gt;
	    &lt;apex:actionStatus id=&quot;searchStatus&quot; startStyleClass=&quot;ajax-loader&quot; /&gt;
    &lt;/apex:form&gt;

    &lt;apex:pageBlockSection title=&quot;Channel&quot; columns=&quot;2&quot;&gt;
        &lt;apex:pageBlockSectionItem &gt;
            &lt;apex:outputLabel value=&quot;title&quot; /&gt;
            &lt;apex:outputText value=&quot;{!RSSFeed.title}&quot; /&gt;
        &lt;/apex:pageBlockSectionItem&gt;
        &lt;apex:pageBlockSectionItem &gt;
            &lt;apex:outputLabel value=&quot;link&quot; /&gt;
            &lt;apex:outputText value=&quot;{!RSSFeed.link}&quot; /&gt;
        &lt;/apex:pageBlockSectionItem&gt;
        &lt;apex:pageBlockSectionItem &gt;
            &lt;apex:outputLabel value=&quot;description&quot; /&gt;
            &lt;apex:outputText value=&quot;{!RSSFeed.description}&quot; /&gt;
        &lt;/apex:pageBlockSectionItem&gt;
        &lt;apex:pageBlockSectionItem &gt;
            &lt;apex:outputLabel value=&quot;category&quot; /&gt;
            &lt;apex:outputText value=&quot;{!RSSFeed.category}&quot; /&gt;
        &lt;/apex:pageBlockSectionItem&gt;
        &lt;apex:pageBlockSectionItem &gt;
            &lt;apex:outputLabel value=&quot;docs&quot; /&gt;
            &lt;apex:outputText value=&quot;{!RSSFeed.docs}&quot; /&gt;
        &lt;/apex:pageBlockSectionItem&gt;
    &lt;/apex:pageBlockSection&gt;

    &lt;apex:pageBlockSection columns=&quot;1&quot;&gt;
        &lt;apex:pageBlockSectionItem &gt;
            &lt;apex:outputLabel value=&quot;copyright&quot; /&gt;
            &lt;apex:outputText value=&quot;{!RSSFeed.copyright}&quot; /&gt;
        &lt;/apex:pageBlockSectionItem&gt;
    &lt;/apex:pageBlockSection&gt;

    &lt;apex:pageBlockSection title=&quot;Image&quot; columns=&quot;2&quot;&gt;
        &lt;apex:pageBlockSectionItem &gt;
            &lt;apex:outputLabel value=&quot;title&quot; /&gt;
            &lt;apex:outputText value=&quot;{!RSSFeed.image.title}&quot; /&gt;
        &lt;/apex:pageBlockSectionItem&gt;
        &lt;apex:pageBlockSectionItem &gt;
            &lt;apex:outputLabel value=&quot;url&quot; /&gt;
            &lt;apex:outputText value=&quot;{!RSSFeed.image.url}&quot; /&gt;
        &lt;/apex:pageBlockSectionItem&gt;
        &lt;apex:pageBlockSectionItem &gt;
            &lt;apex:outputLabel value=&quot;link&quot; /&gt;
            &lt;apex:outputText value=&quot;{!RSSFeed.image.link}&quot; /&gt;
        &lt;/apex:pageBlockSectionItem&gt;
        &lt;apex:pageBlockSectionItem &gt;
            &lt;apex:outputLabel value=&quot;url image&quot; /&gt;
            &lt;apex:image value=&quot;{!RSSFeed.image.url}&quot; /&gt;
        &lt;/apex:pageBlockSectionItem&gt;
    &lt;/apex:pageBlockSection&gt;

    &lt;apex:pageBlockSection title=&quot;Items&quot; columns=&quot;1&quot;&gt;

        &lt;apex:pageBlockTable value=&quot;{!RSSFeed.items}&quot; var=&quot;i&quot;&gt;
            &lt;apex:column headerValue=&quot;title&quot;&gt;
                &lt;apex:outputLink value=&quot;{!i.link}&quot; target=&quot;_blank&quot;&gt;{!i.title}&lt;/apex:outputLink&gt;
            &lt;/apex:column&gt;
            &lt;apex:column headerValue=&quot;description&quot; value=&quot;{!i.description}&quot;/&gt;
            &lt;apex:column headerValue=&quot;pubDate&quot; style=&quot;width: 140px;&quot;&gt;
                &lt;apex:outputText value=&quot;{0,date,MM/dd/yy h:mm:ss a}&quot; &gt;
                    &lt;apex:param value=&quot;{!i.PublishedDateTime}&quot; /&gt;
                &lt;/apex:outputText&gt;
            &lt;/apex:column&gt;
            &lt;apex:column headerValue=&quot;source&quot; value=&quot;{!i.source}&quot; style=&quot;width: 140px;&quot; /&gt;
        &lt;/apex:pageBlockTable&gt;

    &lt;/apex:pageBlockSection&gt;

&lt;/apex:pageBlock&gt;

&lt;/apex:page&gt;
</pre>
<p>To see the news reader in action, visit the <a href="http://anthonyvictorio.force.com/RSSNewsReader" target="_blank">Salesforce RSS Reader for Visualforce demo</a> page. As always, I highly encourage your feedback. Put this solution to the harshest of tests, break it, and we will work on fixing it together.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.anthonyvictorio.com/salesforce/apex-rss-reader-visualforce/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Salesforce Roll-up Summary Utility for Lookup Fields with Filter</title>
		<link>http://www.anthonyvictorio.com/salesforce/roll-up-summary-utility/</link>
		<comments>http://www.anthonyvictorio.com/salesforce/roll-up-summary-utility/#comments</comments>
		<pubDate>Mon, 05 Mar 2012 18:32:42 +0000</pubDate>
		<dc:creator>Anthony Victorio</dc:creator>
				<category><![CDATA[Salesforce]]></category>

		<guid isPermaLink="false">http://www.anthonyvictorio.com/?p=137</guid>
		<description><![CDATA[A while back I wrote a Salesforce roll-up summary trigger which mimics the declarative roll-up summary functionality provided by Salesforce.com.  I received several comments from the community, some relating to additional functionality (such as MAX, MIN, and COUNT) others about filters and some about code structure. So I decided to revisit my original solution and put together something a [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_146" class="wp-caption alignright" style="width: 310px"><img class="size-medium wp-image-146" title="Salesforce Roll-Up Summary Utility" src="http://www.anthonyvictorio.com/media/salesforce-roll-up-utility-300x237.png" alt="Salesforce Roll-Up Summary Utility" width="300" height="237" /><p class="wp-caption-text">Salesforce Roll-Up Summary Utility</p></div>
<p>A while back I wrote a <a href="http://www.anthonyvictorio.com/salesforce/roll-up-summary-trigger/">Salesforce roll-up summary trigger</a> which mimics the declarative roll-up summary functionality provided by Salesforce.com.  I received several comments from the community, some relating to additional functionality (such as MAX, MIN, and COUNT) others about filters and some about code structure. So I decided to revisit my original solution and put together something a bit more generic and robust.</p>
<p><em>*Note: I should mention that this utility can be used for objects with Master-Detail relationships as well as Look-up relationships. Also, this utility only provides summary for numeric fields (double, integer, decimal primitive types), it <span style="text-decoration: underline;"><strong>DOES NOT</strong></span> support text, date or any other primitive types. Finally, while this utility and the examples shown here are written for &#8220;bulk&#8221; processing, they have not been tested with large data sets (50K records or more).</em></p>
<p><strong><span style="color: #ff0000;">Update (03/16/2012): I&#8217;ve updated the utility to support multiple fields with multiple operations. The utility is optimized for bulk processing.  This video outlines the changes:</span></strong></p>
<p><iframe width="630" height="354" src="http://www.youtube.com/embed/v-eTraGsL6s?fs=1&#038;feature=oembed" frameborder="0" allowfullscreen></iframe></p>
<h2>Using the Salesforce sObject Method and Dynamic SOQL</h2>
<p>In order to provide maximum flexibility for this utility class, I am employing the use of the <a href="http://www.salesforce.com/us/developer/docs/apexcode/Content/apex_methods_system_sobject.htm" target="_blank">sObject methods</a> and <a href="http://www.salesforce.com/us/developer/docs/apexcode/Content/apex_dynamic_soql.htm" target="_blank">dynamic SOQL</a>.  Why is this useful? Good question. First, this allows the utility to be used across any sObject type (e.g. Standard and Custom Objects) without having to write more code (or rather, without having to write object specific code). Second, I wanted to build something that a beginner could use with minimal effort.</p>
<h2>Salesforce Roll-up Summary Trigger with Utility Example</h2>
<p>Below is a usage example of how this utility can be leveraged to create a simple roll-up summary trigger. For this example we go back to the Opportunity (parent) and Payments__c (child) scenario: we want to populate the Opportunity.Total_Payments__c field with sum of all Payments__c.Amount__c fields.</p>
<pre class="brush: apex; title: ; notranslate">
trigger OpportunityRollUpPayments on Payment__c (after delete, after insert,
after update, after undelete) {

    if(trigger.isInsert || trigger.isUpdate || trigger.isUnDelete){

		list&lt;RollUpSummaryUtility.fieldDefinition&gt; fieldDefinitions =
		new list&lt;RollUpSummaryUtility.fieldDefinition&gt; {
			new RollUpSummaryUtility.fieldDefinition('SUM', 'Amount__c',
			'Total_Payments__c'),
			new RollUpSummaryUtility.fieldDefinition('MAX', 'Amount_2__c',
			'Total_Payments_2__c')
		};

        RollUpSummaryUtility.rollUpTrigger(fieldDefinitions, trigger.new,
        'Payment__c', 'Opportunity__c', 'Opportunity', '');

    }

    if(trigger.isDelete){

        list&lt;RollUpSummaryUtility.fieldDefinition&gt; fieldDefinitions =
        new list&lt;RollUpSummaryUtility.fieldDefinition&gt; {
            new RollUpSummaryUtility.fieldDefinition('SUM', 'Amount__c',
            'Total_Payments__c'),
            new RollUpSummaryUtility.fieldDefinition('MAX', 'Amount_2__c',
            'Total_Payments_2__c')
        };

        RollUpSummaryUtility.rollUpTrigger(fieldDefinitions, trigger.old,
        'Payment__c', 'Opportunity__c', 'Opportunity', '');

    }

}
</pre>
<p>Pretty simple, right? All we&#8217;re doing is passing a few variables across to the utility and it handles the rest for you. Now, let&#8217;s talk about these variables. I&#8217;ve updated the demo page to use this utility, feel free to try out the <a href="http://avictorio-developer-edition.na9.force.com/roll_up_summary_trigger?Id=006E00000026787IAA" target="_blank">Salesforce Roll-up Summary utility demo</a>.</p>
<h2>Salesforce Roll-up Summary Utility Variables and Considerations</h2>
<p>The utility accepts the following variables:</p>
<pre class="brush: apex; title: ; notranslate">

RollUpSummaryUtility.rollUpTrigger(fieldDefinitions, records, childObject,
childParentLookupField, parentObject, queryFilter);
</pre>
<p><strong>fieldDefinitions</strong> (list&lt;RollUpSummaryUtility.fieldDefinition&gt;) &#8211; The list of field definitions.  The fieldDefinition class is comprised of three variables:</p>
<ol>
<li><em><strong>operation</strong></em> (String) &#8211; Can be either SUM, MAX, MIN, or COUNT. When using COUNT, the childField must <span style="text-decoration: underline;"><strong>ALWAYS</strong></span> be &#8216;ID&#8217;.</li>
<li><em><strong>childField</strong></em> (String) &#8211; The api name for the child object&#8217;s field that contains the values you wish to summarize. Remember, when using the COUNT operation, the value for this variable must <span style="text-decoration: underline;"><strong>ALWAYS</strong></span> be &#8216;ID&#8217;.</li>
<li><em><strong>parentField</strong></em> (String) &#8211; The api name for the parent object&#8217;s field that where the summarized value of the child object field will be stored.</li>
</ol>
<p>Here&#8217;s an example of how you can create a fieldDefinitions list:</p>
<pre class="brush: apex; title: ; notranslate">

list&lt;RollUpSummaryUtility.fieldDefinition&gt; fieldDefinitions =
new list&lt;RollUpSummaryUtility.fieldDefinition&gt; {
new RollUpSummaryUtility.fieldDefinition('SUM', 'Amount__c', 'Total_Payments__c'),
new RollUpSummaryUtility.fieldDefinition('MAX', 'Amount_2__c', 'Total_Payments_2__c')
};
</pre>
<p><strong>records</strong> (list&lt;sObject&gt;) &#8211; The list of records being passed to the utility. When using with a trigger this can either be trigger.new or trigger.old. <em>Tip: Use trigger.old when executing during a trigger.isDelete operation.</em></p>
<p><strong>childObject</strong> (String) &#8211; The API name for the child object. This object must have either a look-up or master-detail relationship to a parent object.</p>
<p><strong>childParentLookupField</strong> (String) &#8211; The API name for the child object field that performs a look-up to a parent object where the summary results will be stored.</p>
<p><strong>parentObject</strong> (String) &#8211; The API name for the parent object related to the child object. The childParentLookupField variable must be related to the object supplied in this variable.</p>
<p><strong>queryFilter</strong> (String) &#8211; An SOQL statement that will be used to filter the child object records. The string must always begin with &#8216;and&#8217; if it&#8217;s being used. If no filter is needed simply supply an empty text value of &#8221;, <strong>never supply a NULL value</strong>. Let&#8217;s say that based on the above example we only want to get a sum of payments made by check, our code would look like this:</p>
<pre class="brush: apex; title: ; notranslate">

RollUpSummaryUtility.rollUpTrigger(fieldDefinitions, trigger.old, 'Payment__c',
'Opportunity__c', 'Opportunity', 'and Type__c = \'Check\'');
</pre>
<h2>Code for Salesforce Roll-up Summary Utility</h2>
<p>Finally, the star of the show. Here&#8217;s the code used by the utility.  I have not written a test class for it but you should be able to get started by looking at the original trigger I published 9 months ago. If I get some time I&#8217;ll put together the unit tests and publish them here but they will be specific to the example above. If you use the utility with, let&#8217;s say, an Account trigger, you will have to write your test class around the Account object.</p>
<pre class="brush: apex; title: ; notranslate">
public class RollUpSummaryUtility {

	//the following class will be used to house the field names
    //and desired operations
    public class fieldDefinition {
        public String operation {get;set;}
        public String childField {get;set;}
        public String parentField {get;set;}

        public fieldDefinition (String o, String c, String p) {
            operation = o;
            childField = c;
            parentField = p;
        }
    }

    public static void rollUpTrigger(list&lt;fieldDefinition&gt; fieldDefinitions,
    list&lt;sObject&gt; records, String childObject, String childParentLookupField,
    String parentObject, String queryFilter) {

        //Limit the size of list by using Sets which do not contain duplicate
        //elements prevents hitting governor limits
        set&lt;Id&gt; parentIds = new set&lt;Id&gt;();

        for(sObject s : records) {
            parentIds.add((Id)s.get(childParentLookupField));
        }

        //populate query text strings to be used in child aggregrator and
        //parent value assignment
        String fieldsToAggregate = '';
        String parentFields = '';

        for(fieldDefinition d : fieldDefinitions) {
            fieldsToAggregate += d.operation + '(' + d.childField + ') ' +
            ', ';
            parentFields += d.parentField + ', ';
        }

        //Using dynamic SOQL with aggergate results to populate parentValueMap
        String aggregateQuery = 'Select ' + fieldsToAggregate +
        childParentLookupField + ' from ' + childObject + ' where  ' +
        childParentLookupField + ' IN :parentIds ' + queryFilter + ' ' +
        ' group by ' + childParentLookupField;

        //Map will contain one parent record Id per one aggregate object
        map&lt;Id, AggregateResult&gt; parentValueMap =
        new map &lt;Id, AggregateResult&gt;();

        for(AggregateResult q : Database.query(aggregateQuery)){
            parentValueMap.put((Id)q.get(childParentLookupField), q);
        }

        //list of parent object records to update
        list&lt;sObject&gt; parentsToUpdate = new list&lt;sObject&gt;();

        String parentQuery = 'select ' + parentFields + ' Id ' +
         ' from ' + parentObject + ' where Id IN :parentIds';

        //for each affected parent object, retrieve aggregate results and
        //for each field definition add aggregate value to parent field
        for(sObject s : Database.query(parentQuery)) {

            Integer row = 0; //row counter reset for every parent record
            for(fieldDefinition d : fieldDefinitions) {
            	String field = 'expr' + row.format();
                AggregateResult r = parentValueMap.get(s.Id);
                //r will be null if no records exist
                //(e.g. last record deleted)
                if(r != null) {
                    Decimal value = ((Decimal)r.get(field) == null ) ? 0 :
                        (Decimal)r.get(field);
                    s.put(d.parentField, value);
                } else {
                    s.put(d.parentField, 0);
                }
                row += 1; //plus 1 for every field definition after first
            }
            parentsToUpdate.add(s);
        }

        //if parent records exist, perform update of all parent records
        //with a single DML statement
        if(parentsToUpdate.Size() &gt; 0) {
            update parentsToUpdate;
        }

    }

}
</pre>
<p>Please feel free to slice and dice this code all you want and please I encourage you to share your feed back (good or bad). I&#8217;m going to try to devote more time to this website so if you have any questions or need assistance please leave a comment here and I&#8217;ll get to you as soon as I can.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.anthonyvictorio.com/salesforce/roll-up-summary-utility/feed/</wfw:commentRss>
		<slash:comments>44</slash:comments>
		</item>
		<item>
		<title>Salesforce Roll-Up Summary Trigger Revised</title>
		<link>http://www.anthonyvictorio.com/salesforce/roll-up-summary-trigger/</link>
		<comments>http://www.anthonyvictorio.com/salesforce/roll-up-summary-trigger/#comments</comments>
		<pubDate>Tue, 07 Jun 2011 17:17:16 +0000</pubDate>
		<dc:creator>Anthony Victorio</dc:creator>
				<category><![CDATA[Salesforce]]></category>
		<category><![CDATA[apex]]></category>
		<category><![CDATA[roll-up summary]]></category>
		<category><![CDATA[trigger]]></category>

		<guid isPermaLink="false">http://www.anthonyvictorio.com/?p=100</guid>
		<description><![CDATA[Why on earth would anybody want a Salesforce trigger to perform a roll-up summary type function when Salesforce already provides you with Roll-Up Summary fields? The answer may not be apparent until you begin to be inhibited by the limitations of Roll-Up Summary fields. So what are these limitations? Objects have a limit of 10 [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_108" class="wp-caption alignright" style="width: 310px"><img class="size-full wp-image-108" title="Salesforce Roll-Up Summary Trigger" src="http://www.anthonyvictorio.com/media/salesforce-roll-up-summary-trigger.png" alt="Salesforce Roll-Up Summary Trigger" width="300" height="250" /><p class="wp-caption-text">Salesforce Roll-Up Summary Trigger</p></div>
<p>Why on earth would anybody want a <strong>Salesforce trigger to perform a roll-up summary</strong> type function when Salesforce already provides you with Roll-Up Summary fields?</p>
<p>The answer may not be apparent until you begin to be inhibited by the limitations of Roll-Up Summary fields. So what are these limitations?</p>
<ul>
<li>Objects have a limit of 10 maximum roll-up summary fields</li>
<li>Objects on the master side of a master-detail relationship can have roll-up summary fields</li>
<li>Lookup relationships do not support roll-up summary fields</li>
<li>Long text area, multi-select picklist, and system fields are not supported as filters or bases for roll-up summary fields</li>
<li>Campaign roll-up summary fields do not recalculate values when Lead or Contacts are deleted</li>
</ul>
<p>Colin Loretz and Jeff Douglas have both developed very similar solutions for combating these challenges through the use of Salesforce apex triggers:</p>
<ul>
<li><a href="http://blog.jeffdouglas.com/2009/07/30/roll-up-summary-fields-with-lookup-relationships-part-1/">Roll-Up Summary Fields with Lookup Relationships Part 1</a> &#8211; Jeff Douglas</li>
<li><a href="http://colinloretz.com/2008/10/salesforce-rollup-summary-fields-using-apex-code/">Salesforce Rollup Summary Fields using Apex Code</a> &#8211; Colin Loretz</li>
</ul>
<p>However, both approaches still face some challenges:</p>
<ul>
<li><strong>Governor Limits</strong> &#8211; If their list&lt;&gt; contains more than the allowed amount (currently 10,000) then an exception will be thrown</li>
<li><strong>Invalid Query Locator</strong> &#8211; Colin&#8217;s solutions relies on sub-query (related record) calls, which tend to break when processing thousands of records.</li>
</ul>
<p>To address these challenges I put together an apex trigger that reduces the size of my list by taking advantage of sets, the SOQL SUM and Group By functions and the AggregateResult sObject.  I also used maps to retrieve my sum totals which eliminates the invalid query locator errors.</p>
<p>The following trigger sums a number field on a custom object and then updates an Opportunity number field with the total. The structure is as follows:</p>
<ul>
<li>Opportunity
<ul>
<li>Payments (Lookup Relationship on Opportunity__c)</li>
</ul>
</li>
</ul>
<p><strong>Salesforce Roll-Up Summary Trigger</strong></p>
<pre class="brush: apex; title: ; notranslate">
trigger OpportunityRollUpPayments on Payment__c (after delete, after insert, after update) {

  //Limit the size of list by using Sets which do not contain duplicate elements
  set OpportunityIds = new set();

  //When adding new payments or updating existing payments
  if(trigger.isInsert || trigger.isUpdate){
    for(Payment__c p : trigger.new){
      OpportunityIds.add(p.Opportunity__c);
    }
  }

  //When deleting payments
  if(trigger.isDelete){
    for(Payment__c p : trigger.old){
      OpportunityIds.add(p.Opportunity__c);
    }
  }

  //Map will contain one Opportunity Id to one sum value
  map OpportunityMap = new map ();

  //Produce a sum of Payments__c and add them to the map
  //use group by to have a single Opportunity Id with a single sum value
  for(AggregateResult q : [select Opportunity__c,sum(Amount__c)
    from Payment__c where Opportunity__c IN :OpportunityIds group by Opportunity__c]){
      OpportunityMap.put((Id)q.get('Opportunity__c'),(Double)q.get('expr0'));
  }

  List OpportunitiesToUpdate = new List();

  //Run the for loop on Opportunity using the non-duplicate set of Opportunities Ids
  //Get the sum value from the map and create a list of Opportunities to update
  for(Opportunity o : [Select Id, Total_Payments__c from Opportunity where Id IN :OpportunityIds]){
    Double PaymentSum = OpportunityMap.get(o.Id);
    o.Total_Payments__c = PaymentSum;
    OpportunitiesToUpdate.add(o);
  }

  update OpportunitiesToUpdate;
}
</pre>
<p>I have tested this method and have successfully updated over 10,000 Opportunity records with over 35,000 payment records through the bulk-api, so I feel good about it. When I get around to it I&#8217;ll write up the test class and publish it here.</p>
<p>Update: Here&#8217;s the test class.</p>
<pre class="brush: apex; title: ; notranslate">
@isTest
private class TestOpportunityRollUpPayments {

    static testMethod void myUnitTest() {

        Profile pf = [Select Id from Profile where Name = 'System Administrator'];

        User u = new User();
        u.FirstName = 'Test';
        u.LastName = 'User';
        u.Email = 'testuser@test123456789.com';
        u.CompanyName = 'test.com';
        u.Title = 'Test User';
        u.Username = 'testuser@test123456789.com';
        u.Alias = 'testuser';
        u.CommunityNickname = 'Test User';
        u.TimeZoneSidKey = 'America/Mexico_City';
        u.LocaleSidKey = 'en_US';
        u.EmailEncodingKey = 'ISO-8859-1';
        u.ProfileId = pf.Id;
        u.LanguageLocaleKey = 'en_US';
        insert u;

        system.runAs(u){

            Opportunity o = new Opportunity();
            o.Name = 'Test Opportunity';
            o.StageName = 'Closed Won';
            o.CloseDate = system.today();
            insert o;

            system.assertEquals(o.Total_Payments__c, null);

            //Test payments on insert
            Payment__c p1 = new Payment__c();
            p1.Opportunity__c = o.Id;
            p1.Amount__c = 100;
            insert p1;

            Opportunity ou1 = [select Total_Payments__c from Opportunity where Id = :o.Id];
            system.assertEquals(ou1.Total_Payments__c,p1.Amount__c);

            //Test payments on update
            Payment__c p1u = [select Amount__c from Payment__c where Id = :p1.Id];
            p1u.Amount__c = 200;
            update p1u;

            Opportunity ou2 = [select Total_Payments__c from Opportunity where Id = :o.Id];
            system.assertEquals(ou2.Total_Payments__c,p1u.Amount__c);

            //Test payments on second insert
            Payment__c p2 = new Payment__c();
            p2.Opportunity__c = o.Id;
            p2.Amount__c = 800;
            insert p2;

            AggregateResult ag1 = [select sum(Amount__c) from Payment__c where Opportunity__c = :o.Id];

            Opportunity ou3 = [select Total_Payments__c from Opportunity where Id = :o.Id];
            system.assertEquals(ou3.Total_Payments__c,ag1.get('expr0'));

            //Test payment on delete
            delete p2;

            AggregateResult ag2 = [select sum(Amount__c) from Payment__c where Opportunity__c = :o.Id];

            Opportunity ou4 = [select Total_Payments__c from Opportunity where Id = :o.Id];
            system.assertEquals(ou4.Total_Payments__c,ag2.get('expr0'));

        }

    }

}
</pre>
<p>To see this trigger in action jump over to the <a href="http://avictorio-developer-edition.na9.force.com/roll_up_summary_trigger?Id=006E00000026787IAA" target="_blank">roll-up summary trigger demo</a>.</p>
<p>Do you see any holes in my code? Please point them out in the comment section below :)</p>
<p><strong>Update:</strong> I&#8217;ve re-purposed this trigger in order to create a generic utility for performing roll-up summaries. Please see: <a href="http://www.anthonyvictorio.com/salesforce/roll-up-summary-utility/">Salesforce Roll-Up Summary Utility For Lookup Fields With Filter</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.anthonyvictorio.com/salesforce/roll-up-summary-trigger/feed/</wfw:commentRss>
		<slash:comments>24</slash:comments>
		</item>
		<item>
		<title>Salesforce Apex &amp; VisualForce Syntax Highlighter for WordPress</title>
		<link>http://www.anthonyvictorio.com/salesforce/syntax-highlighter/</link>
		<comments>http://www.anthonyvictorio.com/salesforce/syntax-highlighter/#comments</comments>
		<pubDate>Tue, 07 Jun 2011 05:00:30 +0000</pubDate>
		<dc:creator>Anthony Victorio</dc:creator>
				<category><![CDATA[Salesforce]]></category>
		<category><![CDATA[apex]]></category>
		<category><![CDATA[highlighter]]></category>
		<category><![CDATA[syntax]]></category>
		<category><![CDATA[visualforce]]></category>

		<guid isPermaLink="false">http://www.anthonyvictorio.com/?p=79</guid>
		<description><![CDATA[If you&#8217;ve ever used a search engine to find help on Salesforce development, then you&#8217;re probably familiar with Jeff Douglas. He is the inspiration behind this section of my blog. As a developer, I often find my self accumulating an ever growing array of help documents, useful functions, tips, shortcuts and commonly repeated code. Rather [...]]]></description>
			<content:encoded><![CDATA[<p><div id="attachment_97" class="wp-caption alignright" style="width: 312px"><img src="http://www.anthonyvictorio.com/media/salesforce-apex-visualforce-highlighter.png" alt="Salesforce Apex / Visualforce Syntax Highlighter" title="Salesforce Apex / Visualforce Syntax Highlighter" width="302" height="252" class="size-full wp-image-97" /><p class="wp-caption-text">Salesforce Apex / Visualforce Syntax Highlighter</p></div>If you&#8217;ve ever used a search engine to find help on Salesforce development, then you&#8217;re probably familiar with <a href="http://blog.jeffdouglas.com/">Jeff Douglas</a>.  He is the inspiration behind this section of my blog. As a developer, I often find my self accumulating an ever growing array of help documents, useful functions, tips, shortcuts and commonly repeated code. Rather than hog them for my self, I decided to do what Jeff has been doing and share my knowledge with the online community.</p>
<p>Before I started to blog about Salesforce, I began looking for syntax highlighter wordpress plugins that might meet my needs.  While the options were plentiful, none were specific to Salesforce and so I took it upon my self to develop my own. Now, to begin my first Salesforce post I share this plugin with you and a bit of information about how it came together.</p>
<p>Thanks to a post by Eric Santiago on his version of a <a href="http://www.ericsantiago.com/eric_santiago/2011/03/visualforce-apex-syntax-highlighter-for-typepad.html">Visualforce Syntax Highlighter</a> for Typepad and a post by Alex on <a href="http://www.viper007bond.com/wordpress-plugins/syntaxhighlighter/adding-a-new-brush-language/">adding new brushes to Syntax Highlighter Evolved</a> I was able to put together a WordPress plugin that works alongside the SyntaxHighlighter Evolved plugin in order to provide Apex &#038; VisualForce sytanx highlighting.</p>
<p>You can download the plugin by clicking on this link: <a href="http://www.anthonyvictorio.com/media/visualforce-sh.zip">SyntaxHighlighter Evolved: Salesforce Apex &#038; VisualForce Brush</a>.</p>
<p>I&#8217;ve submitted the plugin to the wordpress.org depository so hopefully it will appear there soon.</p>
<p>Once you&#8217;ve installed both plugins, you can begin writing your code by using the following shortcodes:</p>
<p>&#91;visualforce&#93; &#91;/visualforce&#93;<br />
&#91;apex&#93; &#91;/apex&#93;</p>
<p>Here&#8217;s an example of the Visualforce syntax:</p>
<pre class="brush: VisualForce; title: ; notranslate">
&lt;apex:page standardController=&quot;Opportunity&quot; &gt;
  &lt;apex:sectionHeader title=&quot;Cancellation Approval&quot;/&gt;
  &lt;apex:form &gt;
      &lt;apex:pageBlock title=&quot;Edit&quot; mode=&quot;edit&quot; id=&quot;thepageblock&quot;&gt;
          &lt;apex:pageblockButtons &gt;
              &lt;apex:commandButton value=&quot;Save&quot; action=&quot;{!save}&quot;/&gt;
          &lt;/apex:pageblockButtons&gt;

          &lt;apex:pageBlockSection columns=&quot;1&quot; title=&quot;Opportunity Details&quot;&gt;
          &lt;apex:outputField value=&quot;{!Opportunity.Name}&quot;/&gt;
          &lt;apex:outputField value=&quot;{!Opportunity.Customer_Name__c}&quot;/&gt;
          &lt;apex:outputField value=&quot;{!Opportunity.Hotel_Name__c}&quot;/&gt;

          &lt;apex:outputField value=&quot;{!Opportunity.Booked_Room_Nights__c}&quot;/&gt;
          &lt;apex:outputField value=&quot;{!Opportunity.Booked_Gross_Booking__c}&quot;/&gt;
          &lt;apex:outputField value=&quot;{!Opportunity.Request_To_Cancel__c}&quot;/&gt;
          &lt;/apex:pageBlockSection&gt;

          &lt;apex:pageBlockSection columns=&quot;1&quot; title=&quot;Approval Details&quot;&gt;
          &lt;apex:inputField value=&quot;{!Opportunity.Sales_Agent_Action__c}&quot; required=&quot;true&quot; /&gt;
          &lt;apex:inputField value=&quot;{!Opportunity.Cancellation_Is__c}&quot; required=&quot;true&quot; &gt;
              &lt;apex:actionSupport event=&quot;onchange&quot; rerender=&quot;thepageblock&quot; status=&quot;status&quot;/&gt;
          &lt;/apex:inputField&gt;
          &lt;apex:inputField value=&quot;{!Opportunity.Sales_Agent_Outcome__c}&quot; rendered=&quot;{!opportunity.Sales_Agent_Action__c == 'Called Customer' || opportunity.Sales_Agent_Action__c == 'Emailed Customer' || Opportunity.Cancellation_Is__c == 'Declined'}&quot; required=&quot;true&quot; style=&quot;width:500px;height:100px;&quot;/&gt;
          &lt;/apex:pageBlockSection&gt;
      &lt;/apex:pageBlock&gt;
  &lt;/apex:form&gt;
&lt;/apex:page&gt;
</pre>
<p>Here&#8217;s an example for the Apex syntax:</p>
<pre class="brush: apex; title: ; notranslate">
trigger CreateActivityFromPublicTask on Public_Task__c (after insert) {

  List&lt;Task&gt; TasksToCreate = new List&lt;Task&gt;();

  for (Public_Task__c pt : Trigger.new) {

    Task t = new Task();
    t.Priority = pt.Priority__c;
    t.ActivityDate = pt.Call_Back_Date__c;
    t.Call_Back_Time__c = pt.Call_Back_Time__c;
    t.Call_Back_Number__c = pt.Call_Back_Number__c;
    t.Description = pt.Comments__c;
    t.WhoId = pt.Lead__c;
    t.Status = pt.Status__c;
    t.Type = pt.Type__c;
    t.Subject = pt.Subject__c;
    t.IsReminderSet = pt.IsReminderSet__c;
    t.ReminderDateTime = pt.ReminderDateTime__c;
    t.OwnerId = pt.OwnerId;
    TasksToCreate.add(t);
  }
  if(TasksToCreate.size() &gt; 0) {
    insert TasksToCreate;
  }
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.anthonyvictorio.com/salesforce/syntax-highlighter/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Who is Anthony Victorio?</title>
		<link>http://www.anthonyvictorio.com/blog/anthony-victorio/</link>
		<comments>http://www.anthonyvictorio.com/blog/anthony-victorio/#comments</comments>
		<pubDate>Tue, 14 Apr 2009 02:30:20 +0000</pubDate>
		<dc:creator>Anthony Victorio</dc:creator>
				<category><![CDATA[Blog]]></category>

		<guid isPermaLink="false">http://www.anthonyvictorio.com/?p=3</guid>
		<description><![CDATA[Hello. I am Anthony Victorio. I would love to share all kinds of personal details about my self, however, identity theft has made me way too paranoid.  I can tell you that I was born in Peru and migrated to the US when I was very young.  I currently reside in Texas and make my [...]]]></description>
			<content:encoded><![CDATA[<p>Hello. I am Anthony Victorio.</p>
<p>I would love to share all kinds of personal details about my self, however, identity theft has made me way too paranoid.  I can tell you that I was born in Peru and migrated to the US when I was very young.  I currently reside in Texas and make my living as a webmaster / web designer / seo consultant.</p>
<p>I created this site to share personal aspects of my life with my friends and to showcase my professional work with colleagues. To see some of my work check out the &#8220;Portfolio&#8221; section listed on the top menu.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.anthonyvictorio.com/blog/anthony-victorio/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

