OMFG, I am finally getting to dig into SF 2010, and I gotta say I LOVE it! The install routine is perfect, and the features are great. This is a fantastic product from Microsoft. I can't see any reason why everyone isn't running this. Its perfect for hosting applications and allowing for collaboration and document sharing.
I'm going to host an application on it and I am heavily customizing the L&F right now. I will update and maybe add some screen shots when I am done.
Wednesday, September 01, 2010
Tuesday, June 01, 2010
Outsourced SharePoint Development
If you have a SharePoint development need, but can't afford to hire a developer or just don't want to go through the hassle, drop me a line. I can help you with any need, be it workflow, web part, theme or customization. I can turn most projects around fairly quickly and for a reasonable fee.
Also, be sure to check out my free components!
You can always donate too!
-Thanks!
Also, be sure to check out my free components!
You can always donate too!
-Thanks!
Donate
Hey everyone, I appreciate all the downloads. If you want to, you can help me by donating a little something for my efforts.
Thanks!
Thanks!
Friday, April 16, 2010
Adding Opportunities In MS CRM with Code!
Ok, in case anyone cares, I am now doing a LOT of custom dev with MS CRM 4.0. If you have a question, ask me. I have probably already done it!
Anyway, I'll try and share code snippets when I think about it. Here is how to create a new opportunity via code. You know, in case you have a dataset of leads and want to auto-magically create opportunities from it.
opportunity o = new opportunity();
o.name = "*NAME OF OPP*";
Customer c = new Customer();
c.type = EntityName.account.ToString();
c.Value = new Guid(*GUID of Account to tie it to*);
o.customerid = c;
//ADD any other data about the opp HERE!!
//Grab the new opportunities ID on create!
Guid gOpId = _Service.Create(o);
See? Easy!
Anyway, I'll try and share code snippets when I think about it. Here is how to create a new opportunity via code. You know, in case you have a dataset of leads and want to auto-magically create opportunities from it.
opportunity o = new opportunity();
o.name = "*NAME OF OPP*";
Customer c = new Customer();
c.type = EntityName.account.ToString();
c.Value = new Guid(*GUID of Account to tie it to*);
o.customerid = c;
//ADD any other data about the opp HERE!!
//Grab the new opportunities ID on create!
Guid gOpId = _Service.Create(o);
See? Easy!
Wednesday, April 07, 2010
SharePoint Is Awesome
So, there have been quite a few posts lately that trash SharePoint. The comments are along the lines of "it's too hard to install/ develop on" or "it's too complicated". To all the whiners out there all I have to say is $(%&P($#%(#$%#$(, sorry I mean suck it up. Geez! I mean you are working in TECHNOLOGY!!!!!! Hello!! The world changes, new technologies come and old ones go. SharePoint is the future of development for at least the next 5 years. Deal with it. I love this blog post in response to one of these boo-hooers:
http://tonybierman.com/blog/2007/10/16/i-dont-care-if-you-dont-want-to-develop-on-sharepoint-and-neither-does-your-boss
It really says it all. Especially this part:
"I don’t care if you don’t want to develop on SharePoint. In fact, neither does your boss. Because he’s going turn on SharePoint in your enterprise anyway, just like everybody else is. One billion in sales baby, and growing fast. And your boss is going to want customizations and apps written for SharePoint. If you can’t do it, your boss is going to find someone else to do it. Like me."
And from Bob Mixon:
http://bobmixon.com/BLOG/archive/2007/10/16/Are-You-Ready-For-SharePoint.aspx
Couldn't have said it better myself! If you think SharePoint is too hard/complicated/difficult then you probably shouldn't be working as a developer. Why dont you run on home and let the grown ups get back to work
http://tonybierman.com/blog/2007/10/16/i-dont-care-if-you-dont-want-to-develop-on-sharepoint-and-neither-does-your-boss
It really says it all. Especially this part:
"I don’t care if you don’t want to develop on SharePoint. In fact, neither does your boss. Because he’s going turn on SharePoint in your enterprise anyway, just like everybody else is. One billion in sales baby, and growing fast. And your boss is going to want customizations and apps written for SharePoint. If you can’t do it, your boss is going to find someone else to do it. Like me."
And from Bob Mixon:
http://bobmixon.com/BLOG/archive/2007/10/16/Are-You-Ready-For-SharePoint.aspx
Couldn't have said it better myself! If you think SharePoint is too hard/complicated/difficult then you probably shouldn't be working as a developer. Why dont you run on home and let the grown ups get back to work
MOSS Bug?
I'm working on an application and we are using User Controls hosted in an ASP.Net 2.0 Web Part. Everything was working fine then suddenly nothing seemed to work right. The form view controls were either outright broken, or the we saving blank rows to the database. It took some investigating, but here is what I discovered:
1. You cannot have an Object Data Source running on MOSS and it have a parameter (insert, update or otherwise) with a type of 'object'. This appears to be the type assigned for GUIDs (database fields of type 'unique identifier'). When you do, as soon as I would bind the formview I would get a generic MOSS error page. You know the one, 'A web part is causing a problem....'
By changing the type on the parameter to 'string' everything started working. Of course that was only half the problem. Since making this change eliminated the MOSS error but I was still getting blank rows in the database.
2. The other thing I discovered. You cannot use the asp:table control in templates of the form view. When you do, the data fields are no longer bound to the datasource. The asp:table is bound. The controls of the form view are now children of the asp:table and not the form view. You could probably get around this by fully qualifying the controls for the parameters but why?
So, we changed the templates back to straight HTML tables and changed the parameter types to strings and voila! The app is working as it should.
Now keep in mind that outside off MOSS the app worked fine without changing the parameter types. The asp:tables were still an issue thou.
1. You cannot have an Object Data Source running on MOSS and it have a parameter (insert, update or otherwise) with a type of 'object'. This appears to be the type assigned for GUIDs (database fields of type 'unique identifier'). When you do, as soon as I would bind the formview I would get a generic MOSS error page. You know the one, 'A web part is causing a problem....'
By changing the type on the parameter to 'string' everything started working. Of course that was only half the problem. Since making this change eliminated the MOSS error but I was still getting blank rows in the database.
2. The other thing I discovered. You cannot use the asp:table control in templates of the form view. When you do, the data fields are no longer bound to the datasource. The asp:table is bound. The controls of the form view are now children of the asp:table and not the form view. You could probably get around this by fully qualifying the controls for the parameters but why?
So, we changed the templates back to straight HTML tables and changed the parameter types to strings and voila! The app is working as it should.
Now keep in mind that outside off MOSS the app worked fine without changing the parameter types. The asp:tables were still an issue thou.
Windows Auth + FBA
I have been working to implement Forms auth and Wndows AD together on the same web application for the last few days. I am pretty happy with the results (extending the app, creating an extranet zone etc.) but saw this great article and thought it would help a lot of you out (like Scot!). Here's a quick blurb:
"This method uses forms authentication on a SharePoint web application to authenticate users against both SQL Server and Active Directory. Not only will this hybrid provider be able to manage users across the two most prevalent user data stores in Windows, but it can also be scaled out to support other .NET membership providers, as well as run custom code to query into any source of user information."
Thanks go out to Christopher V Domino for the great article!
"This method uses forms authentication on a SharePoint web application to authenticate users against both SQL Server and Active Directory. Not only will this hybrid provider be able to manage users across the two most prevalent user data stores in Windows, but it can also be scaled out to support other .NET membership providers, as well as run custom code to query into any source of user information."
Thanks go out to Christopher V Domino for the great article!
Workflows P2
So, I was working on a project and need to programatically fire off a work flow for a list item. Easy you say? Well it is. Sort of. See first I needed to know WHICH work flow to fire off (in case there were multiple workflows associated with the list). So here is the code I used:
private void GetWorkflows()
{
SPWeb web = new SPSite "http://serverurl").OpenWeb();
SPList list = web.Lists["list name"];
string strWorkFlows = "";
//This would normally be passed in. Its the List Item ID
string strTaskID = "4";
foreach (SPWorkflowAssociation wfa in list.WorkflowAssociations)
{
if (wfa.BaseTemplate.Name == "NameOfWorkflow")
{
strWorkFlows += wfa.InstantiationUrl + "?List=" + list.ID.ToString() + "&ID=" + strTaskID + "&TemplateID={" + wfa.ParentAssociationId.ToString() + "}&Source=" + list.DefaultViewUrl;
}
}
Neat huh? What I did was re-create the URL that exists when you initiate a workflow from the list itself. The 'BaseTemplate.Name' will give you the name of the workflow assigned in the feature, not the one assigned by whoever created the association. This is helpful for making sure you find the correct workflow. That's it. Ping me with any questions/thoughts/suggestions.
private void GetWorkflows()
{
SPWeb web = new SPSite "http://serverurl").OpenWeb();
SPList list = web.Lists["list name"];
string strWorkFlows = "";
//This would normally be passed in. Its the List Item ID
string strTaskID = "4";
foreach (SPWorkflowAssociation wfa in list.WorkflowAssociations)
{
if (wfa.BaseTemplate.Name == "NameOfWorkflow")
{
strWorkFlows += wfa.InstantiationUrl + "?List=" + list.ID.ToString() + "&ID=" + strTaskID + "&TemplateID={" + wfa.ParentAssociationId.ToString() + "}&Source=" + list.DefaultViewUrl;
}
}
Neat huh? What I did was re-create the URL that exists when you initiate a workflow from the list itself. The 'BaseTemplate.Name' will give you the name of the workflow assigned in the feature, not the one assigned by whoever created the association. This is helpful for making sure you find the correct workflow. That's it. Ping me with any questions/thoughts/suggestions.
Setting the Content Type of a document programatically
I had occasion to write a workflow that collected some documents and uploaded them to a documnet library. Pretty easy task, however I hit a little snag. Each document had a unique content type depending on the type of document. How would one go about setting the content type of a document that was being added to a doc lib programatically I asked. It would make sense to do it like so:
SPContentType type = list.ContentTypes["[Enter Content Type ID]"];
file.Item.ContentType = type;
folder.Files.Add(file);
folder.Update();
list.Update();
Alas, no. You see file.Item.ContentType is READ ONLY. Hmmm, now what? Well answer was a little more obscure than I expected. But ironically was the same methode I was using for someting else. Here is the solution:
Hashtable fileProps = new Hashtable();
fileProps.Add("ContentType", fileDocType);
Where fileDocType is passed in as a string representing the name of the ContentType. I already had the Hashtable created to set some other metadata on the document, so I really only need one additional line of code. Neat huh?
SPContentType type = list.ContentTypes["[Enter Content Type ID]"];
file.Item.ContentType = type;
folder.Files.Add(file);
folder.Update();
list.Update();
Alas, no. You see file.Item.ContentType is READ ONLY. Hmmm, now what? Well answer was a little more obscure than I expected. But ironically was the same methode I was using for someting else. Here is the solution:
Hashtable fileProps = new Hashtable();
fileProps.Add("ContentType", fileDocType);
Where fileDocType is passed in as a string representing the name of the ContentType. I already had the Hashtable created to set some other metadata on the document, so I really only need one additional line of code. Neat huh?
Adding new Virtual Directories with code!!!
Ok, we had a question come up at the User Group (UG) the other night. This person needs to create new virtual directories each time a new site is created. These VirDirs are to host legacy ASP.net applications. Now I know the CORRECT answer (at least mine) is to not host other applications on your SharePoint FEWS. However in the interest of being fair and realizing that it may be the only option for some folks, here is some C# code you can use where appropriate:
=================
//Create New Virtual Directory in IIS with DirectoryEntry()
string wwwroot = "c:\\Inetpub\\wwwroot";
string virtualDirectoryName = "myNewApp";
string sitepath = "IIS://localhost/W3SVC/1/ROOT";
DirectoryEntry vRoot = new DirectoryEntry(sitepath);
DirectoryWntry vDir = vRoot.Children.Add(virtualDirectoryName, "IIsWebVirtualDir");
vDir.CommitChanges();
vDir.Properties["Path"].Value = wwwroot + "\\" + virtualDirectoryName;
vDir.Properties["DefaultDoc"].Value = "Default.aspx";
vDir.Properties["DirBrowseFlags"].Value = 2147483648;
vDir.Commitchanges();
vRoot.CommitChanges();
======================
Enjoy!
=================
//Create New Virtual Directory in IIS with DirectoryEntry()
string wwwroot = "c:\\Inetpub\\wwwroot";
string virtualDirectoryName = "myNewApp";
string sitepath = "IIS://localhost/W3SVC/1/ROOT";
DirectoryEntry vRoot = new DirectoryEntry(sitepath);
DirectoryWntry vDir = vRoot.Children.Add(virtualDirectoryName, "IIsWebVirtualDir");
vDir.CommitChanges();
vDir.Properties["Path"].Value = wwwroot + "\\" + virtualDirectoryName;
vDir.Properties["DefaultDoc"].Value = "Default.aspx";
vDir.Properties["DirBrowseFlags"].Value = 2147483648;
vDir.Commitchanges();
vRoot.CommitChanges();
======================
Enjoy!
Monday, January 04, 2010
Tuesday, November 24, 2009
Sunday, November 08, 2009
Dynamics CRM
So, I have been tackling a new MS beast these last few months. Her name is Dynamics CRM. In a lot of was CRM is very similar to MOSS. Sadly it's in their failings that they are most alike. The SDK is the worst. At least in CRM it's not full of placeholder content. However the content that is there is absolutely useless.
So, over the course of the last couple of weeks I have become the CRM master, as I had to become the Sharepoint master before. It all started with my desire to handle all of the data migration and integration myself, rather than let the consultants we hired for the implementation handle it. At the rate they were charging us and knowing that they required us to buy a third party tool, I felt (and rightly so of course) that I could do a better job. Most of the work was pretty easy. I created several SSIS packages to handle various tasks (full loads, incremental loads etc) from our data sources (Outlook contacts, ERP data from an Informix database etc...). The real problem came with the little gotchas. Things like assigning an owner of an account to a system user, or setting the parent company of an imported contact and sharing contacts with other system users.
These were not unsolvable problems (obviously since the code is complete) but they could have been made much easier with a properly written SDK. I'll try and put the code I came up with out on the interwebs for all to see soon.
Cheers!
So, over the course of the last couple of weeks I have become the CRM master, as I had to become the Sharepoint master before. It all started with my desire to handle all of the data migration and integration myself, rather than let the consultants we hired for the implementation handle it. At the rate they were charging us and knowing that they required us to buy a third party tool, I felt (and rightly so of course) that I could do a better job. Most of the work was pretty easy. I created several SSIS packages to handle various tasks (full loads, incremental loads etc) from our data sources (Outlook contacts, ERP data from an Informix database etc...). The real problem came with the little gotchas. Things like assigning an owner of an account to a system user, or setting the parent company of an imported contact and sharing contacts with other system users.
These were not unsolvable problems (obviously since the code is complete) but they could have been made much easier with a properly written SDK. I'll try and put the code I came up with out on the interwebs for all to see soon.
Cheers!
Wednesday, June 24, 2009
SiriusXM iPhone App Review
So, I have been a huge fan of satellite radio for a while now. I have had XM in the wifes car since 2007 and Sirius in mine since 2008. I also had several radios around the house and the office. When the iPhone app was released last week I was pretty excited. I saw it as an oppurtunity to drop at least some of my radios, possibly all of them. Having used the app for only a day or so I have to say it feels like more of a novelty than anything else. While they did a great job for an intial effort it is still lacking in a couple of key areas.
First, the information displayed is too small. The artist, track etc is in small print ant the bottom of the screen. You have the option to show the station logo basically full screen, but the track info still stays small at the bottom. To me this is a huge miss. Especially for use on the go. It's hard to read at a glance if you or the iPhone is moving.
Next, and this is more a problem with Apples restriction on background apps but still, when someone calls your phone the app closes and you have to re-open it and navigate back to the channel you were listening too. That is a huge issue since you can't know when a call may come in.
Finally, the audio quality, while generally good, seems erratic. It appears that the initial 2-3 mins of listening is at a much lower bitrate, then as you maintain the stream it abruptly changes to a higher quality.
The second issue is why I consider the app a novelty. How can you use it for anything if the app can be closed at anytime? You couldn't effectivly use it to work out or connected to your stereo for a party. I guess I'll have to stick with the iPod functionality for that.
First, the information displayed is too small. The artist, track etc is in small print ant the bottom of the screen. You have the option to show the station logo basically full screen, but the track info still stays small at the bottom. To me this is a huge miss. Especially for use on the go. It's hard to read at a glance if you or the iPhone is moving.
Next, and this is more a problem with Apples restriction on background apps but still, when someone calls your phone the app closes and you have to re-open it and navigate back to the channel you were listening too. That is a huge issue since you can't know when a call may come in.
Finally, the audio quality, while generally good, seems erratic. It appears that the initial 2-3 mins of listening is at a much lower bitrate, then as you maintain the stream it abruptly changes to a higher quality.
The second issue is why I consider the app a novelty. How can you use it for anything if the app can be closed at anytime? You couldn't effectivly use it to work out or connected to your stereo for a party. I guess I'll have to stick with the iPod functionality for that.
Friday, May 29, 2009
hulu Desktop
I just installed hulu desktop on my PC. All I can say is wow! I have a PC that I use for Media Center capabilities. It is connected to an HDTV via component video. The interface for hulu is fantastic and the video quality is simply amazing. It's the same as my Uverse, which is IPTV.
I may be able to scale back my TV subscriptions with all of this great content on the 'net/
Cheers!
I may be able to scale back my TV subscriptions with all of this great content on the 'net/
Cheers!
Tuesday, May 12, 2009
Hi, I'm a Mac...
Ok, so I finally took the plunge and made the switch to a Mac. Specifically I grabbed an older Mac Mini off of eBay. $200 for a 1.5GHz Core Solo Mini with 512 MB ram and a 60GB HDD. Not the most blazing fast of Mac, but something to start with. First things first, I installed iLife 09 and iWork 09 and got to business. Well, Leopard blows with 512 MB of RAM, so I grabbed a couple of 1GB sticks I had laying around, and since I'd be cracking her open anyway I also grabbed a 160 GB 7200 RPM drive I had handy. Now, first things first. I cloned my existing drive to the new drive to avoid a needless OS install. Then I watched about a million 'hack your Mini' videos on the interwebs. Finally I cracked that baby open. It was really easy! Installed the RAM and new HDD and fired her up. Perfect! Or not. Suddenly core sound was gone. Errg. After trying everything on apple.com I had to open her up again. No worries. I found a ribbon cable I had inadvertantly pulled out the first time. Plug in, boot up and tada! Sound!
Post upgrade the machine is quite usable, but I think a CPU upgrade is in my future. And the reason for the switch? Windows failed me too many times. I still use Windows (ver 7) at work, and I have a Windows box at home, just in case. But my daily non-work computing is all on the Mac now. Maybe once I upgrade to a Core 2 Duo I'll throw VMWare on it and ditch the fulltime Win box forever.
Cheers!
Post upgrade the machine is quite usable, but I think a CPU upgrade is in my future. And the reason for the switch? Windows failed me too many times. I still use Windows (ver 7) at work, and I have a Windows box at home, just in case. But my daily non-work computing is all on the Mac now. Maybe once I upgrade to a Core 2 Duo I'll throw VMWare on it and ditch the fulltime Win box forever.
Cheers!
Friday, May 08, 2009
Foxmarks = Xmarks = Greatest Thing Ever!
Ok, so I love Foxmarks, soon to be just Xmarks.
It's a tool to allow you to sync your bookmarks on one machine to all of you machines. And the best part is it works on every platform I've tried it on so far. OSX and Safari, check. Windows 7 and IE 8, check. Ububtu 9.04 and Firefox 3, check.
Simply amazing. Only problem is they somehow got reordered. I blame IE 8.
It's a tool to allow you to sync your bookmarks on one machine to all of you machines. And the best part is it works on every platform I've tried it on so far. OSX and Safari, check. Windows 7 and IE 8, check. Ububtu 9.04 and Firefox 3, check.
Simply amazing. Only problem is they somehow got reordered. I blame IE 8.
iPhone OS 3 Beta 5
So I finally got access to the beta and SDK. Yeah me! Anyways, the huge thing for us here at work is that you can now ADD calendar events to your phone, and INCLUDE invitees!! This is huge for our CEO who wants to schedule meetings on his phone and invite other people from the company to the meeting.
Wednesday, April 22, 2009
Planet of the Dead
Ok, I got to see the Doctor Who Easter special "Planet of the Dead" last night. I really enjoyed it, but I have to admit my enjoyment was tempered with the knowledge that each new special brings us closer to David Tennants departure. The show was really good. I love Michelle Ryan (here in the states she was the Bionic Woman in the new but short lived series of the same name) who was the Doctors 'companion' for this outing. Her character was a Laura Croft clone. Smart, beautiful and always ready for an adventure. I thought she was a good companion for the Doctor. I don't want to ruin any of the plot so I won't say much else. I have no idea when or if it will be broadcast in the states.
Cheers!
Cheers!
Subscribe to:
Posts (Atom)