<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1728716091528445142</id><updated>2012-02-16T03:14:50.482-08:00</updated><title type='text'>Project server programming through PSI</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://project-server-optimization.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1728716091528445142/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://project-server-optimization.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Carlos Ezquerra</name><uri>http://www.blogger.com/profile/07151775757927259946</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>22</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1728716091528445142.post-2171400612749770669</id><published>2009-07-24T05:56:00.001-07:00</published><updated>2009-07-24T06:09:32.322-07:00</updated><title type='text'>Migrating PPS from one server to another</title><content type='html'>Hello,&lt;br /&gt;I'm now working with Project Portfolio Server so, during this days I will write some posts about it.&lt;br /&gt;The first scenario thah I have found is a migration from one Project Portfolio Server to another server. How to migrate that?.&lt;br /&gt;I have follow this steps:&lt;br /&gt;&lt;br /&gt;1- Make a database backup using Sql server Management Studio of PPSAccountData and PPSAccountIndex databases.&lt;br /&gt;&lt;br /&gt;2- Restore them in the new Sql Server. In my case I have to install the databases in one server, MOSS 2007 and Project Server 2007 in three servers (1 WFE &amp; 2 APP. Servers), and Project Portfolio Server in another server.&lt;br /&gt;&lt;br /&gt;3- Install PPS in the new server. I found that if I install PPS with SP1 it gives the message "Cannot find database PPSAccountIndex". So you have to install the version without SP1 and then install SP1.&lt;br /&gt;&lt;br /&gt;4- Once It has been installed see if you can log on as superuser. In my installation I couldn't log on, so I had to modify the web.config file:&lt;br /&gt;add key="AccountID" value="-1"&lt;br /&gt;with&lt;br /&gt;add key="AccountID" value="1"&lt;br /&gt;&lt;br /&gt;5- Then I tryed to connect It with Sharepoint. When I modifyed user credentials in the preferences section I found the next error:&lt;br /&gt;&lt;br /&gt;"Cryptographic Exception"&lt;br /&gt;&lt;br /&gt;To solve it you have to delete the cryptographic key using this SQL sentence over the PPSAccountIndex database:&lt;br /&gt;&lt;br /&gt;DELETE FROM sfSETTINGS WHERE (Name LIKE '%key%')&lt;br /&gt;&lt;br /&gt;Once you do that you can connect to Sharepoint Server.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1728716091528445142-2171400612749770669?l=project-server-optimization.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://project-server-optimization.blogspot.com/feeds/2171400612749770669/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1728716091528445142&amp;postID=2171400612749770669' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1728716091528445142/posts/default/2171400612749770669'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1728716091528445142/posts/default/2171400612749770669'/><link rel='alternate' type='text/html' href='http://project-server-optimization.blogspot.com/2009/07/migrating-pps-from-one-server-to.html' title='Migrating PPS from one server to another'/><author><name>Carlos Ezquerra</name><uri>http://www.blogger.com/profile/07151775757927259946</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1728716091528445142.post-2574952883727869304</id><published>2009-02-23T03:34:00.000-08:00</published><updated>2009-02-23T03:37:23.204-08:00</updated><title type='text'>Search Server in Stopping state</title><content type='html'>I have found some errors when trying to stop the search server when there is a bad configuration and the crawling never ends. This is how we solved it when the service hangs in a “Stopping” state.&lt;br /&gt;Errors and solutions:&lt;br /&gt;1.Try to stop and restart the service:&lt;br /&gt;  Net stop osearch&lt;br /&gt;  Net start osearch&lt;br /&gt;2.Try to kill the current processes&lt;br /&gt;  Stsadm –o osearch –action stop&lt;br /&gt;  Stsadm –o osearch –action start&lt;br /&gt;3.Try to kill the processes from task manager. The processes will be processing by the search service user.&lt;br /&gt;4.Stop the service and kill the processes (1&amp;2) and then go to your sqlServer and open the Activity job. Kill all processes which are using your crawling user which will be the processes which are hanging your server. Then restart the service.&lt;br /&gt;Hope it helps!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1728716091528445142-2574952883727869304?l=project-server-optimization.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://project-server-optimization.blogspot.com/feeds/2574952883727869304/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1728716091528445142&amp;postID=2574952883727869304' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1728716091528445142/posts/default/2574952883727869304'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1728716091528445142/posts/default/2574952883727869304'/><link rel='alternate' type='text/html' href='http://project-server-optimization.blogspot.com/2009/02/search-server-in-stopping-state.html' title='Search Server in Stopping state'/><author><name>Carlos Ezquerra</name><uri>http://www.blogger.com/profile/07151775757927259946</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1728716091528445142.post-5813949335767888864</id><published>2008-12-24T02:47:00.000-08:00</published><updated>2009-01-07T11:45:08.366-08:00</updated><title type='text'>Create automatic approval rules for all users</title><content type='html'>Hi,&lt;br /&gt;I've got a test environment where we must use only "Outlook Add In" to update the projects. As you know, there are 2 big problems when you try to do it.&lt;br /&gt;The first one is that approval rules are created for each supervisor user. So, if we have got 350 users we have to generate a tutorial and every user has to configure his own rules.&lt;br /&gt;The second one is when you update a project from "Outlook Add In" or "My Tasks" section, the project is not published, so the update is not visible from the Project details.&lt;br /&gt;&lt;br /&gt;We are going to solve the first issue creating an automatic rule in the Publish Database. Of course, YOU MUST NOT touch production databases unless you will like to lost Microsoft Support. (The next code modifys direcly Project server Publishing database).&lt;br /&gt;&lt;br /&gt;To create automaticaly a rule you can make a console program like this:&lt;br /&gt;&lt;br /&gt;static void Main(string[] args)       &lt;br /&gt;{ &lt;br /&gt;connectionString = ""; //Connection string           &lt;br /&gt;SqlConnection connCosts = new SqlConnection(connectionString);           &lt;br /&gt;SqlCommand cmdCosts = new SqlCommand("Select res.RES_UID from MSP_RESOURCES as res ", connCosts);           &lt;br /&gt;SqlDataAdapter daCosts = new SqlDataAdapter(cmdCosts);           &lt;br /&gt;DataTable dtCosts = new DataTable();            &lt;br /&gt;daCosts.Fill(dtCosts);            &lt;br /&gt;foreach (DataRow dr in dtCosts.Rows)            &lt;br /&gt;{                &lt;br /&gt;&lt;br /&gt;SqlConnection connUsr = new SqlConnection(connectionString);                SqlCommand cmdUsr = new SqlCommand("Select RULE_UID from MSP_RULES where RES_UID_MGR ='" + new Guid(dr[0].ToString())+"'", connUsr);                &lt;br /&gt;SqlDataAdapter daUsr = new SqlDataAdapter(cmdUsr);                &lt;br /&gt;DataTable dtUsr = new DataTable();                &lt;br /&gt;daUsr.Fill(dtUsr);                &lt;br /&gt;if (dtUsr.Rows.Count == 0)                &lt;br /&gt;{                    &lt;br /&gt;//If the rule was not created for the user create it                    &lt;br /&gt;SqlConnection myConnection = new SqlConnection();                    myConnection.ConnectionString = connectionString;                    myConnection.Open();                    &lt;br /&gt;string insertstring = "INSERT into MSP_RULES(RULE_UID,RES_UID_MGR,RULE_NAME,RULE_IS_AUTOMATIC,RULE_TYPE,RULE_CONDITION_TYPE,RULE_IS_EXCL_PROJECT,RULE_IS_EXCL_RESOURCE,RULE_IS_EXCL_DELEGATEE,CREATED_DATE,MOD_DATE) values('" + Guid.NewGuid() + "','" + new Guid(dr[0].ToString()) + "','" + "Approve All" + "','" + "True" + "','"+ "5" +"','"+"0',"+"'True','True','True','"+DateTime.Now+"','"+DateTime.Now+"' ) ";                    SqlCommand comando = new SqlCommand(insertstring, myConnection);                    &lt;br /&gt;comando.ExecuteNonQuery();                    &lt;br /&gt;myConnection.Close();                                &lt;br /&gt;}                        &lt;br /&gt;}&lt;br /&gt;                                &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;If you activate it after ervery sinchronization It would create rules for all the new users and let other rules as the same.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1728716091528445142-5813949335767888864?l=project-server-optimization.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://project-server-optimization.blogspot.com/feeds/5813949335767888864/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1728716091528445142&amp;postID=5813949335767888864' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1728716091528445142/posts/default/5813949335767888864'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1728716091528445142/posts/default/5813949335767888864'/><link rel='alternate' type='text/html' href='http://project-server-optimization.blogspot.com/2008/12/create-automatic-approval-rules-for-all.html' title='Create automatic approval rules for all users'/><author><name>Carlos Ezquerra</name><uri>http://www.blogger.com/profile/07151775757927259946</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1728716091528445142.post-5604454307839316504</id><published>2008-10-06T02:52:00.000-07:00</published><updated>2008-10-06T03:17:36.358-07:00</updated><title type='text'>Conflict updates between Project Web Access, Outlook add-in and PSI.</title><content type='html'>Hi,&lt;br /&gt;Recently I have been working on a project wich integrates PSI, My Tasks (project Web Access) and Outlook Add-in to modify tasks. We have developed a project Professional emulator with a grid, sending the information to the server using Ajax. As Outlook Add-in and My Tasks don't publish the project and we have automatic rule to approve all the changes, every time the users updates their tasks through Outlook they can't see our changes in Project Web Acces but, what was wrothly was when a user opens the project with our "Web Project Professional" this user can change the tasks making conflic updates between PSI and Outlook add-in.&lt;br /&gt;How did we solve it?&lt;br /&gt;When a user updates his tasks using Project Web Access or outlook Add-in it only modifyes the working store. When we publish the project, the same data in working store is passed to published store, so the only thing that we have to do is compare the two datasets to know if there are changes pending.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1728716091528445142-5604454307839316504?l=project-server-optimization.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://project-server-optimization.blogspot.com/feeds/5604454307839316504/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1728716091528445142&amp;postID=5604454307839316504' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1728716091528445142/posts/default/5604454307839316504'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1728716091528445142/posts/default/5604454307839316504'/><link rel='alternate' type='text/html' href='http://project-server-optimization.blogspot.com/2008/10/conflict-updates-between-project-web.html' title='Conflict updates between Project Web Access, Outlook add-in and PSI.'/><author><name>Carlos Ezquerra</name><uri>http://www.blogger.com/profile/07151775757927259946</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1728716091528445142.post-2448017697547569189</id><published>2008-09-26T06:53:00.000-07:00</published><updated>2008-09-26T07:09:13.425-07:00</updated><title type='text'>Cost Assignments and PSI</title><content type='html'>Hi again,&lt;br /&gt;After some days trying to work arround to create cost assignments through PSI without luck I found this post: &lt;a href="http://projectserverblogs.com/?p=1540"&gt;http://projectserverblogs.com/?p=1540&lt;/a&gt;&lt;br /&gt;If you look this post you will find the next lines:&lt;br /&gt;&lt;em&gt;Further compounding this concern is item three under User scenarios to avoid, which states that tasks with Cost Resources assigned to them should not have any assignments (meaning assignments to Cost, Material, or Work Resources) updated on that task through PWA or the PSI. This means that if you choose to disregard item one in Best practice use cases, you may only perform task updates from within Project Professional. However, it is possible to configure the system so that it will only accept Task Updates through PWA. This essentially eliminates Cost Resources as a tool for organizations who’ve chosen this configuration.&lt;/em&gt;&lt;br /&gt;As soon as I have read this lines I started to find a work arround to create and modify cost assignments through PSI.&lt;br /&gt;We couldn't find any solution yet, but in out project we use Reporting Services to make our reports and only PSI to modify tasks from Projects so we can create a new table assignments in Reporting database wich has the same structuree than MSP_ASSIGNMENTS.&lt;br /&gt;Now our client can modify It's cost assignments of his tasks and get his reports through Reporting Services. Of course, if you open your project with Project Professional or use costs views you will not be able to see anything.&lt;br /&gt;So we still wait for a solution for this problem wich seems that only Microsoft can solve.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1728716091528445142-2448017697547569189?l=project-server-optimization.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://project-server-optimization.blogspot.com/feeds/2448017697547569189/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1728716091528445142&amp;postID=2448017697547569189' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1728716091528445142/posts/default/2448017697547569189'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1728716091528445142/posts/default/2448017697547569189'/><link rel='alternate' type='text/html' href='http://project-server-optimization.blogspot.com/2008/09/cost-assignments-and-psi.html' title='Cost Assignments and PSI'/><author><name>Carlos Ezquerra</name><uri>http://www.blogger.com/profile/07151775757927259946</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1728716091528445142.post-4355967318306933550</id><published>2008-08-22T01:29:00.000-07:00</published><updated>2008-08-22T01:38:19.051-07:00</updated><title type='text'>Creating a cost assignment</title><content type='html'>Hi,&lt;br /&gt;I've been working this days on creating cost assignments from PSI. I've found something strange in Project Server behaviour. When you create a new AssignmentRow and you select RES_TYPE = 25 (cost resource) and try to update the project, Project Server automaticaly cancell the job in the queue. I don't know why Project Server does that and the only workarround I found (and I know that is not the better workarround) was create costs assignments as work assignments and indicate in assignment Group that resource is from cost Group. If you do this there is another problem...You can't assign a cost to the resource (ASSN_COST) becouse is not a cost resource, so you have to work with ASSN_UNITS field. The problem here is that if you modify resource's units and TASK_TYPE is in mode Fixed Units (as default) will modify task duration too, so you need to set the TASK_TYPE as Fixed Duration before you assign the resource.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1728716091528445142-4355967318306933550?l=project-server-optimization.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://project-server-optimization.blogspot.com/feeds/4355967318306933550/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1728716091528445142&amp;postID=4355967318306933550' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1728716091528445142/posts/default/4355967318306933550'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1728716091528445142/posts/default/4355967318306933550'/><link rel='alternate' type='text/html' href='http://project-server-optimization.blogspot.com/2008/08/creating-cost-assignment.html' title='Creating a cost assignment'/><author><name>Carlos Ezquerra</name><uri>http://www.blogger.com/profile/07151775757927259946</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1728716091528445142.post-4789297331459796709</id><published>2008-07-13T15:31:00.000-07:00</published><updated>2008-07-13T15:41:07.093-07:00</updated><title type='text'>Project actuals error when modifying TASK_PCT_WORK_COMP through PSI</title><content type='html'>I've been working a few hours trying to modify the percent work complete on a task. I've been working with TASK_PCT_WORK, TASK_WORK (read only), TASK_ACT_WORK and TASK_REM_WORK.&lt;br /&gt;As you will know the percent complete of a task can be modifyed directly (using PSI) from TASK_PCT_WORK_COMP column but today, in a new installation of Project Server, I receive an error from the queue saying ProjectActualsAreBlocked. After a few hours trying to find what does that error means I have found modifying the project from Project Professional that I couldn't modify the percent of task completed saying the same error. Project Professional gave me the clue saying that task work could only be modifyed through Project Web Access. So if you acces server setting in PWA will find that under task settings and display there is an option (which is maked as default) called "Restrict updates to Project Web Access". When I uncheked this option I could modify TASK_PCT_WORK_COMP from PSI.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1728716091528445142-4789297331459796709?l=project-server-optimization.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://project-server-optimization.blogspot.com/feeds/4789297331459796709/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1728716091528445142&amp;postID=4789297331459796709' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1728716091528445142/posts/default/4789297331459796709'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1728716091528445142/posts/default/4789297331459796709'/><link rel='alternate' type='text/html' href='http://project-server-optimization.blogspot.com/2008/07/project-actuals-error-when-modifying.html' title='Project actuals error when modifying TASK_PCT_WORK_COMP through PSI'/><author><name>Carlos Ezquerra</name><uri>http://www.blogger.com/profile/07151775757927259946</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1728716091528445142.post-8664359600025948983</id><published>2008-06-19T17:07:00.000-07:00</published><updated>2008-06-19T17:18:28.116-07:00</updated><title type='text'>Error in outlook add-in when user assignment is Proposed</title><content type='html'>If you have an assignamet which has got its booking type as Proposed you will find that outlook add in gives you a message like this "You have not any assignments to upload" when you try to import new assignments. This hapens becouse resource hours are not reserved, as the user is just proposed for the project.&lt;br /&gt;To solve this change user's booking type from Proposed to Commited. This can be done editing the resource from the resources pages.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1728716091528445142-8664359600025948983?l=project-server-optimization.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://project-server-optimization.blogspot.com/feeds/8664359600025948983/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1728716091528445142&amp;postID=8664359600025948983' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1728716091528445142/posts/default/8664359600025948983'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1728716091528445142/posts/default/8664359600025948983'/><link rel='alternate' type='text/html' href='http://project-server-optimization.blogspot.com/2008/06/error-in-outlook-add-in-when-user.html' title='Error in outlook add-in when user assignment is Proposed'/><author><name>Carlos Ezquerra</name><uri>http://www.blogger.com/profile/07151775757927259946</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1728716091528445142.post-2715447946420993033</id><published>2008-06-11T09:08:00.000-07:00</published><updated>2008-06-11T09:23:09.997-07:00</updated><title type='text'>Error synchronizing Project Server and Active Directory resources</title><content type='html'>I have find some resources which cannot be sync with Active Directory and makes that Published database gets in an inconsistent state. For these resources you will get an "Unknown Error" when you try to modify them and if you try to remove them you will find that resources are cheked-out. As you can see in "force check-in enterprise objects" these resources are not listened as cheked-out.&lt;br /&gt;Another sympthom of this is that users which are in an inconsistent state have it's status as innactive, so they can't get in Project Web Access.&lt;br /&gt;How to monitor the error?&lt;br /&gt;If you take a look to the Published database you will find in the MSP_RESOURCES table that users which are in an inconsistent state have his RES_CHEKEDUOT_BY filed to a empty GUID.&lt;br /&gt;Of course it is not correct that value since this is what is causing the error.&lt;br /&gt;How do we solve it?&lt;br /&gt;1. Open an issue with Microsoft or install its hotfixes.&lt;br /&gt;2. Run a sql squery wich will get the user in a consistent state:&lt;br /&gt;update MSP_RESOURCES&lt;br /&gt;set RES_CHECKOUTBY=Null&lt;br /&gt;Where RES_NAME='Name_Of_The_User'&lt;br /&gt;Of course the second option is not supported by Microsoft so you will loose Microsoft's support if you modify the databases and you don't reurn them to its original state.&lt;br /&gt;After doing that you will be able to modify user's state from the Project Web Access site.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1728716091528445142-2715447946420993033?l=project-server-optimization.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://project-server-optimization.blogspot.com/feeds/2715447946420993033/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1728716091528445142&amp;postID=2715447946420993033' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1728716091528445142/posts/default/2715447946420993033'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1728716091528445142/posts/default/2715447946420993033'/><link rel='alternate' type='text/html' href='http://project-server-optimization.blogspot.com/2008/06/error-synchronizing-project-server-and.html' title='Error synchronizing Project Server and Active Directory resources'/><author><name>Carlos Ezquerra</name><uri>http://www.blogger.com/profile/07151775757927259946</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1728716091528445142.post-7594354440991302487</id><published>2008-06-05T09:14:00.001-07:00</published><updated>2008-06-05T09:25:03.791-07:00</updated><title type='text'>Timer job definitions for SSP</title><content type='html'>I have been working in an enviroment wich was working well unill last week. We found that the queue was not working at all. All the projects were getting enqueued but all of them were in state Waiting... After trying restarting all the services and see that was not a good solution we try to find the error.&lt;br /&gt;Wen we create a new Shared Services Provider this will create two timer job definitions wich are needed for Projecct Server:&lt;br /&gt;Shared Services timer job.&lt;br /&gt;Project Server Synchronizing job for "SharedServicesprovidername".&lt;br /&gt;If there is one of these Timer Jobs Definitions wich doesn't exists then project server sites will not work properly.&lt;br /&gt;What's the solution? there are more than solution for this problem but the most easy is to create another Shared Services Provider, change the associations for the web applications to the new Shared Services Provider and delete the old one.&lt;br /&gt;If you have properties defined in old Shared Services Provider (profiles, excel services, BDC, search....) you will need to configure it again in the new SSP.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1728716091528445142-7594354440991302487?l=project-server-optimization.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://project-server-optimization.blogspot.com/feeds/7594354440991302487/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1728716091528445142&amp;postID=7594354440991302487' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1728716091528445142/posts/default/7594354440991302487'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1728716091528445142/posts/default/7594354440991302487'/><link rel='alternate' type='text/html' href='http://project-server-optimization.blogspot.com/2008/06/timer-job-definitions-for-ssp.html' title='Timer job definitions for SSP'/><author><name>Carlos Ezquerra</name><uri>http://www.blogger.com/profile/07151775757927259946</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1728716091528445142.post-5471486351423457045</id><published>2008-05-27T16:29:00.000-07:00</published><updated>2008-05-27T16:36:10.359-07:00</updated><title type='text'>Bug in eventHandler on itemAdded --&gt; ListItem is null</title><content type='html'>I will continue posting things about sharepoint.&lt;br /&gt;When you implement an ItemAdded event handler you will notify that SPItemEventProperties.ListItem is null. This is becouse a bug in sharepoint.&lt;br /&gt;To work around this you should use the method spList.getItemByUniqueId() passing the memeber SPItemEventProperties.Listitemid wich would be correct.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1728716091528445142-5471486351423457045?l=project-server-optimization.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://project-server-optimization.blogspot.com/feeds/5471486351423457045/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1728716091528445142&amp;postID=5471486351423457045' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1728716091528445142/posts/default/5471486351423457045'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1728716091528445142/posts/default/5471486351423457045'/><link rel='alternate' type='text/html' href='http://project-server-optimization.blogspot.com/2008/05/bug-in-eventhandler-on-itemadded.html' title='Bug in eventHandler on itemAdded --&gt; ListItem is null'/><author><name>Carlos Ezquerra</name><uri>http://www.blogger.com/profile/07151775757927259946</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1728716091528445142.post-3542986972153805218</id><published>2008-04-25T07:49:00.000-07:00</published><updated>2008-05-21T03:20:41.193-07:00</updated><title type='text'>Change sharepoint site collection language once it is created</title><content type='html'>&lt;a href="http://3.bp.blogspot.com/_eZijqqf-WQ8/SBHyqsshDrI/AAAAAAAAAAM/AqeJEAal_44/s1600-h/Untitled.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5193198660701195954" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_eZijqqf-WQ8/SBHyqsshDrI/AAAAAAAAAAM/AqeJEAal_44/s320/Untitled.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;I know that this blog is inteed to be a Project Server Blog, but today I'm going to write something about MOSS 2007.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;I've seen several posts saying that is not possible to change the language of a site collection or a site once it's created (included in Microsoft's web), but there is a way to do it modifying it directly from the databases.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;There is a field in the content database wich stores the LCID of the site collection. Changing it you will get all the menus in the new language, alerts, mails, etc.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;The field you have to change is Language from the table Webs.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;You must use the correct LCID (ex. 1033 --&gt; english, 3082 --&gt; spanish) and must have installed language packs acording to the new language, otherwise Sharepoint will be inestable.&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;The locale field could be changed using local site configuration in the administration of the site, but to change the site language you must change the language field.&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;REMEBER --&gt; this is only for information pruporses. You MUST NOT TOUCH sharepoint databases.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1728716091528445142-3542986972153805218?l=project-server-optimization.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://project-server-optimization.blogspot.com/feeds/3542986972153805218/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1728716091528445142&amp;postID=3542986972153805218' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1728716091528445142/posts/default/3542986972153805218'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1728716091528445142/posts/default/3542986972153805218'/><link rel='alternate' type='text/html' href='http://project-server-optimization.blogspot.com/2008/04/change-sharepoint-site-collection.html' title='Change sharepoint site collection language once it is created'/><author><name>Carlos Ezquerra</name><uri>http://www.blogger.com/profile/07151775757927259946</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_eZijqqf-WQ8/SBHyqsshDrI/AAAAAAAAAAM/AqeJEAal_44/s72-c/Untitled.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1728716091528445142.post-5559453228149902254</id><published>2008-04-25T04:55:00.000-07:00</published><updated>2008-04-25T05:09:16.929-07:00</updated><title type='text'>Queue blocked in project server caused by tasks getting enqueued</title><content type='html'>El otro día trabajando en una solución me encontré con una cola con más de 700 tareas en espera de proceso. Una vez depuradas las tareas y buscando cúales eran las que producían el bloqueo en la cola me encontré con diversas tareas con el estado "Getting enqueued".&lt;br /&gt;Este estado se produce cuando hay algún cliente externo que está compartiendo datos con project server, por ejemplo una publicación de un proyecto desde Project Professional. Si finaliza la conexión con el servidor durante el proceso de sincronización y transmisión de los datos a Project Server la tarea se queda en éste estado, produciendo el bloqueo de la cola para dicho proyecto.&lt;br /&gt;Soluciones:&lt;br /&gt;&lt;br /&gt;a) Encontrar el cliente que estaba enviando los datos y que acabe de enviarlos (por ejemplo que el ordenador se haya suspendido mientras realizaba la actualización).&lt;br /&gt;&lt;br /&gt;b) Eliminar las tareas que están en este estado marcando antes la opción "Cancelar trabajos en la cola de espera" dentro de "Opciones avanzadas". Éste proceso puede provocar la pérdida de los datos que no se hayan transmitido a Project Server.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1728716091528445142-5559453228149902254?l=project-server-optimization.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://project-server-optimization.blogspot.com/feeds/5559453228149902254/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1728716091528445142&amp;postID=5559453228149902254' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1728716091528445142/posts/default/5559453228149902254'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1728716091528445142/posts/default/5559453228149902254'/><link rel='alternate' type='text/html' href='http://project-server-optimization.blogspot.com/2008/04/queue-blocked-in-project-server-caused.html' title='Queue blocked in project server caused by tasks getting enqueued'/><author><name>Carlos Ezquerra</name><uri>http://www.blogger.com/profile/07151775757927259946</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1728716091528445142.post-634335662065858974</id><published>2008-04-08T04:53:00.000-07:00</published><updated>2008-04-08T04:59:20.021-07:00</updated><title type='text'>Issue in Outlook integration when assignning tasks to a resource using PSI</title><content type='html'>We we assign a task to a resource using PSI Outlook add-in for Project Server is unable to import new assignments.&lt;br /&gt;The root cause of the problem was due to the fact that assignments created entirely through the PSI do not show the link in the progress column that allows clicking through to the timephased entry pop-up.&lt;br /&gt;Microsoft has released a Project Server Rollup KB950816 to solve this problem.&lt;br /&gt;The hotfix will be public soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1728716091528445142-634335662065858974?l=project-server-optimization.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://project-server-optimization.blogspot.com/feeds/634335662065858974/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1728716091528445142&amp;postID=634335662065858974' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1728716091528445142/posts/default/634335662065858974'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1728716091528445142/posts/default/634335662065858974'/><link rel='alternate' type='text/html' href='http://project-server-optimization.blogspot.com/2008/04/issue-in-outlook-integration-when.html' title='Issue in Outlook integration when assignning tasks to a resource using PSI'/><author><name>Carlos Ezquerra</name><uri>http://www.blogger.com/profile/07151775757927259946</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1728716091528445142.post-5944398831640655295</id><published>2008-04-02T08:14:00.000-07:00</published><updated>2008-04-02T08:27:20.027-07:00</updated><title type='text'>Types of assignments</title><content type='html'>This is the table of assignments values taken from msdn.&lt;br /&gt;Most used are work resource (value =2) cost resource (value = 25) and material resource (value = 21 ).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;BudgetCostResource&lt;br /&gt;Value=51. Budget cost resource. Can be assigned to Project summary tasks only; cannot log on to Project Web Access.&lt;br /&gt;BudgetMaterialResource&lt;br /&gt;Value=52. Budget material resource. Can be assigned to Project summary tasks only; cannot log on to Project Web Access.&lt;br /&gt;BudgetWorkResource&lt;br /&gt;Value=50. Budget work resource. Can be assigned to Project summary tasks only; cannot log on to Project Web Access.&lt;br /&gt;CAN_LOG_IN_MAXIMUM&lt;br /&gt;Value=20. Any resource with a resource-type value less than this value can log on to Project Web Access.&lt;br /&gt;CostResources&lt;br /&gt;Value=25. Cost resource. Can be assigned to Project tasks; cannot log on to Project Web Access.&lt;br /&gt;GenericBudgetCostResource&lt;br /&gt;Value=54. Generic budget cost resource. Can be assigned to Project summary tasks only; cannot log on to Project Web Access.&lt;br /&gt;GenericBudgetMaterialResource&lt;br /&gt;Value=55. Generic budget material resource. Can be assigned to Project summary tasks only; cannot log on to Project Web Access.&lt;br /&gt;GenericBudgetWorkResource&lt;br /&gt;Value=53. Generic budget work resource. Can be assigned to Project summary tasks only; cannot log on to Project Web Access.&lt;br /&gt;GenericCostResources&lt;br /&gt;Value=26. Generic cost resource. Can be assigned to Project tasks; cannot log on to Project Web Access.&lt;br /&gt;GenericMaterialResource&lt;br /&gt;Value=22. Generic material resource. Can be assigned to Project tasks; cannot log on to Project Web Access.&lt;br /&gt;GenericWorkResource&lt;br /&gt;Value=20. Generic work resource. Can be assigned to Project tasks; cannot log on to Project Web Access.&lt;br /&gt;INACTIVATED_OFFSET&lt;br /&gt;Value=100. An inactive resource has the value of this enumeration added to its resource-type value.&lt;br /&gt;IS_NONBUDGET_TYPE_MAXIMUM&lt;br /&gt;Value=50. Any resource value less than this value is not a budget resource.&lt;br /&gt;MaterialResource&lt;br /&gt;Value=21. Material resource. Can be assigned to Project tasks; cannot log on to Project Web Access.&lt;br /&gt;PureUser&lt;br /&gt;Value=1. Pure user, such as Admins. Cannot be assigned to Project tasks; can use Project Web Access.&lt;br /&gt;WinProjScratchpadResource&lt;br /&gt;Value=-1. Internal use only; do not use.&lt;br /&gt;WinProjSummaryResource&lt;br /&gt;Value=-4. Internal use only; do not use.&lt;br /&gt;WinProjUnassignedResource&lt;br /&gt;Value=-3. Internal use only; do not use.&lt;br /&gt;WinProjUnknownResource&lt;br /&gt;Value=-2. Internal use only; do not use.&lt;br /&gt;WorkResource&lt;br /&gt;Value=2. Work resource. This is the default value. Can be assigned to Project tasks; can log on to Project Web Access.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1728716091528445142-5944398831640655295?l=project-server-optimization.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://project-server-optimization.blogspot.com/feeds/5944398831640655295/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1728716091528445142&amp;postID=5944398831640655295' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1728716091528445142/posts/default/5944398831640655295'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1728716091528445142/posts/default/5944398831640655295'/><link rel='alternate' type='text/html' href='http://project-server-optimization.blogspot.com/2008/04/types-of-assignments.html' title='Types of assignments'/><author><name>Carlos Ezquerra</name><uri>http://www.blogger.com/profile/07151775757927259946</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1728716091528445142.post-6785881558393677829</id><published>2008-04-02T07:46:00.000-07:00</published><updated>2008-04-02T08:14:47.042-07:00</updated><title type='text'>Create a task assignment</title><content type='html'>Hi again,&lt;br /&gt;Today I'm going to explain how to create a resource asignment and a cost assignment to a task using PSI.&lt;br /&gt;&lt;br /&gt;Variables&lt;br /&gt;ProjWS --&gt; project web service initialized&lt;br /&gt;proyectoid --&gt; GUID of the project&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;1. First of all we need to get the ProjectDataSet of our project.&lt;br /&gt;&lt;br /&gt;ProjectDataSet dsNew = projWS.ReadProject(proyectoid, Project.DataStoreEnum.WorkingStore);&lt;br /&gt;&lt;br /&gt;2. Create a new Assignment row in the project&lt;br /&gt;&lt;br /&gt;Project.ProjectDataSet.AssignmentRow ResRow = dsNew.Assignment.NewAssignmentRow();&lt;br /&gt;&lt;br /&gt;3. Make the assignment between the user and the task&lt;br /&gt;&lt;br /&gt; ResRow.PROJ_UID = projectUid; //GUID of the project&lt;br /&gt;ResRow.ASSN_UID = Guid.NewGuid();           &lt;br /&gt;ResRow.RES_UID = resUid;        // GUID of the resource   &lt;br /&gt;ResRow.RES_TYPE = AssignmentType;  //Type of assignment          &lt;br /&gt;ResRow.TASK_UID = taskUid; //GUID of the task&lt;br /&gt;&lt;br /&gt;4. Add the assignment cost if is a cost resource&lt;br /&gt;  if ( AssignmentType= 25) {&lt;br /&gt;ResRow.ASSN_COST = ResourceCost;          &lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;5. Add the new Assignment row to the ProjectDataSet and add it to the project&lt;br /&gt;&lt;br /&gt;dsNew.Assignment.AddAssignmentRow(ResRow);                                   &lt;br /&gt;Guid jobGuid = Guid.NewGuid();&lt;br /&gt; projWS.QueueAddToProject(jobGuid, sessionGuid, dsNew, false);&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1728716091528445142-6785881558393677829?l=project-server-optimization.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://project-server-optimization.blogspot.com/feeds/6785881558393677829/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1728716091528445142&amp;postID=6785881558393677829' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1728716091528445142/posts/default/6785881558393677829'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1728716091528445142/posts/default/6785881558393677829'/><link rel='alternate' type='text/html' href='http://project-server-optimization.blogspot.com/2008/04/create-task-assignment.html' title='Create a task assignment'/><author><name>Carlos Ezquerra</name><uri>http://www.blogger.com/profile/07151775757927259946</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1728716091528445142.post-3841591700987770454</id><published>2008-04-01T07:48:00.001-07:00</published><updated>2008-04-01T07:56:31.229-07:00</updated><title type='text'>Change Project Start Date once it's created through PSI</title><content type='html'>I've seen several posts on internet of people having problems changing the project start date once the project has been created.&lt;br /&gt;Here is an example of how to do it:&lt;br /&gt;&lt;br /&gt;1. Read the project&lt;br /&gt;&lt;br /&gt;ProjectDataSet templateProject = projWS.ReadProject(projectUID, Project.DataStoreEnum.WorkingStore);&lt;br /&gt;&lt;br /&gt;2. create a copy to store the changes&lt;br /&gt;&lt;br /&gt;ProjectDataSet temporal = ((Project.ProjectDataSet)(templateProject.Copy()));&lt;br /&gt;&lt;br /&gt;3. Store the new date (fechaInicio.SelectedDate is a Daytime parameter)&lt;br /&gt;&lt;br /&gt;temporal.Tables[temporal.Project.TableName].Rows[0][temporal.Project.PROJ_INFO_START_DATEColumn] = fechaInicio.SelectedDate;&lt;br /&gt;&lt;br /&gt;4. Get the changes and store them in another ProjectDatatSet&lt;br /&gt;&lt;br /&gt;ProjectDataSet updateProjectDataSet = new ProjectDataSet(); updateProjectDataSet.Project.Merge(temporal.Tables[temporal.Project.TableName], true);&lt;br /&gt;updateProjectDataSet = ((Project.ProjectDataSet)updateProjectDataSet.GetChanges(DataRowState.Modified));&lt;br /&gt;&lt;br /&gt;5. Check-in and publish the project&lt;br /&gt;&lt;br /&gt;projWS.QueueUpdateProject(jobGuid, sessionGuid, updateProjectDataSet, false);&lt;br /&gt;jobGuid = Guid.NewGuid();&lt;br /&gt;projWS.QueueCheckInProject(jobGuid, newProject, true, sessionGuid,"");&lt;br /&gt;WaitForQueueJobCompletion(jobGuid, 1);&lt;br /&gt;jobGuid = Guid.NewGuid();&lt;br /&gt;projWS.QueuePublish(jobGuid, newProject, true, "");&lt;br /&gt;WaitForQueueJobCompletion(jobGuid, 1);&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1728716091528445142-3841591700987770454?l=project-server-optimization.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://project-server-optimization.blogspot.com/feeds/3841591700987770454/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1728716091528445142&amp;postID=3841591700987770454' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1728716091528445142/posts/default/3841591700987770454'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1728716091528445142/posts/default/3841591700987770454'/><link rel='alternate' type='text/html' href='http://project-server-optimization.blogspot.com/2008/04/change-project-start-date-once-its.html' title='Change Project Start Date once it&apos;s created through PSI'/><author><name>Carlos Ezquerra</name><uri>http://www.blogger.com/profile/07151775757927259946</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1728716091528445142.post-7289081563387588508</id><published>2008-04-01T07:35:00.000-07:00</published><updated>2008-04-01T07:44:42.577-07:00</updated><title type='text'>Modifying project tasks through PSI</title><content type='html'>Aunque parezca una tarea simple el hecho de modificar tareas de Project Server utilizando PSI deberemos tener en cuenta diferentes consideraciones que pueden provocar que los trabajos de actualización de las tareas provoquen un error en la cola de Project Server. Algunas de las consideraciones que deberemos tener son las siguientes:&lt;br /&gt;&lt;br /&gt;1. El motor de planificación de Project Server funciona de la misma forma que el de Project Professional, de manera que si realizamos una modificación de fechas en una tarea que tiene predecesoras también deberemos modificar las fechas de las predecesoras. Dicho recálculo de fechas lo deberemos hacer nosotros teniendo en cuenta, por ejemplo, que los fines de semana no son días lectivos de trabajo por defecto en Project.&lt;br /&gt;&lt;br /&gt;2. Las asignaciones de recursos no se podrán realizar sobre tareas resumen, sino que se realizarán sobre las tareas hijas. En el caso en el que realicemos una asignación sobre una tarea resumen ésta provocará un error general en la cola.&lt;br /&gt;&lt;br /&gt;(más restricciones en próximos días)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1728716091528445142-7289081563387588508?l=project-server-optimization.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://project-server-optimization.blogspot.com/feeds/7289081563387588508/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1728716091528445142&amp;postID=7289081563387588508' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1728716091528445142/posts/default/7289081563387588508'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1728716091528445142/posts/default/7289081563387588508'/><link rel='alternate' type='text/html' href='http://project-server-optimization.blogspot.com/2008/04/modifying-project-tasks-through-psi.html' title='Modifying project tasks through PSI'/><author><name>Carlos Ezquerra</name><uri>http://www.blogger.com/profile/07151775757927259946</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1728716091528445142.post-1774042509382720445</id><published>2008-04-01T04:11:00.000-07:00</published><updated>2008-04-04T07:34:05.684-07:00</updated><title type='text'>Installing Project Server Service Pack 1</title><content type='html'>Durante la instalación del Service Pack 1 de Sharepoint o el de Projcet Server nos podemos encontrar con que el instalador se queda colgado en el paso 8 de 9. Ésto sucede cuando no se puede arrancar de nuevo el servicio de búsqueda por utilizar un usuario diferente al que se utilizó para la instalación de Project Server.&lt;br /&gt;Para forzar que finalice de forma correcta la instalación se puede ejecutar el siguiente comando:&lt;br /&gt;psconfig -cmd upgrade -inplace b2b -wait -force&lt;br /&gt;Una vez realizado ésto se deberá arrancar el servicio de búsqueda a mano indicando el usuario adecuado.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1728716091528445142-1774042509382720445?l=project-server-optimization.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://project-server-optimization.blogspot.com/feeds/1774042509382720445/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1728716091528445142&amp;postID=1774042509382720445' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1728716091528445142/posts/default/1774042509382720445'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1728716091528445142/posts/default/1774042509382720445'/><link rel='alternate' type='text/html' href='http://project-server-optimization.blogspot.com/2008/04/installing-project-server-service-pack.html' title='Installing Project Server Service Pack 1'/><author><name>Carlos Ezquerra</name><uri>http://www.blogger.com/profile/07151775757927259946</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1728716091528445142.post-502861056638044419</id><published>2008-04-01T03:15:00.000-07:00</published><updated>2008-04-01T03:34:45.238-07:00</updated><title type='text'>Queue functions</title><content type='html'>Looking in projectTool you can find the functions to control the end state of the jobs that you are sending to the queue.&lt;br /&gt;Let's take a look to these functions.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;1. Function wich checks if there is an error in the job&lt;br /&gt;&lt;br /&gt;private static bool checkStatusRowHasError(string errorInfo)&lt;br /&gt;{&lt;br /&gt;System.Xml.XmlTextReader xReader = new System.Xml.XmlTextReader(new System.IO.StringReader(errorInfo));&lt;br /&gt;while (xReader.Read()) {&lt;br /&gt; if (xReader.Name == "errinfo" &amp;amp;&amp;amp; xReader.NodeType == System.Xml.XmlNodeType.Element) {&lt;br /&gt;xReader.Read(); if (xReader.Value == "")&lt;br /&gt;return false;&lt;br /&gt;else return true; }&lt;br /&gt;}&lt;br /&gt;return false; }&lt;br /&gt;&lt;br /&gt;2. Function wich waits until the job has finished or timeout has reached.&lt;br /&gt;&lt;br /&gt;private bool WaitForQueueJobCompletion(Guid linkId, int messageType, TaskGrid.QueueSystemDerived queueSystem) {&lt;br /&gt;&lt;br /&gt;QueueSystem.QueueStatusDataSet queueStatusDataSet = new QueueSystem.QueueStatusDataSet();&lt;br /&gt;QueueSystem.QueueStatusRequestDataSet queueStatusRequestDataSet = new QueueSystem.QueueStatusRequestDataSet();&lt;br /&gt;QueueSystem.QueueStatusRequestDataSet.StatusRequestRow statusRequestRow = queueStatusRequestDataSet.StatusRequest.NewStatusRequestRow();&lt;br /&gt;statusRequestRow.JobGUID = linkId;&lt;br /&gt;&lt;br /&gt;3. Coments BUGBUG are from Microsoft Engineers :) Sometimes they leave us some feedback of the development process...&lt;br /&gt;&lt;br /&gt;statusRequestRow.JobGroupGUID = Guid.NewGuid(); statusRequestRow.MessageType = -1; //BUGBUG - Rightnow lets just use -1 queueStatusRequestDataSet.StatusRequest.AddStatusRequestRow(statusRequestRow);&lt;br /&gt;bool inProcess = true;&lt;br /&gt;DateTime startTime = DateTime.Now; i&lt;br /&gt;nt successState = (int)QueueConstants.JobState.Success; i&lt;br /&gt;nt failedState = (int)QueueConstants.JobState.Failed;&lt;br /&gt;int blockedState = (int)QueueConstants.JobState.CorrelationBlocked;&lt;br /&gt;while (inProcess) { queueStatusDataSet = queueSystem.ReadJobStatus(queueStatusRequestDataSet, false, QueueSystem.SortColumn.Undefined, QueueSystem.SortOrder.Undefined);&lt;br /&gt;foreach (QueueSystem.QueueStatusDataSet.StatusRow statusRow in queueStatusDataSet.Status)&lt;br /&gt;{&lt;br /&gt;if ((statusRow["ErrorInfo"] != System.DBNull.Value &amp;amp;&amp;amp; checkStatusRowHasError(statusRow["ErrorInfo"].ToString()) == true) statusRow.JobCompletionState == blockedState statusRow.JobCompletionState == failedState)&lt;br /&gt;{ ///Error en la cola&lt;br /&gt;inProcess = false;&lt;br /&gt;return false; }&lt;br /&gt;if (statusRow.JobCompletionState == successState)&lt;br /&gt;{ inProcess = false; return true; }&lt;br /&gt;else { inProcess = true; System.Threading.Thread.Sleep(500); } }&lt;br /&gt;DateTime endTime = DateTime.Now;&lt;br /&gt;TimeSpan span = endTime.Subtract(startTime);&lt;br /&gt;if (span.Seconds &gt; 30) //Wait for only 20 secs - and then bail out.&lt;br /&gt;{ ///Error en la cola&lt;br /&gt;return false; } }&lt;br /&gt;return true; }&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1728716091528445142-502861056638044419?l=project-server-optimization.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://project-server-optimization.blogspot.com/feeds/502861056638044419/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1728716091528445142&amp;postID=502861056638044419' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1728716091528445142/posts/default/502861056638044419'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1728716091528445142/posts/default/502861056638044419'/><link rel='alternate' type='text/html' href='http://project-server-optimization.blogspot.com/2008/04/queue-functions.html' title='Queue functions'/><author><name>Carlos Ezquerra</name><uri>http://www.blogger.com/profile/07151775757927259946</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1728716091528445142.post-6283642723552270562</id><published>2008-04-01T02:35:00.001-07:00</published><updated>2008-04-01T08:00:49.456-07:00</updated><title type='text'>Create a new Project from a template</title><content type='html'>Today, in our first post, we are going to learn how to crate a new project from a template using PSI.&lt;br /&gt;PSI are web services wich allow us to connect with Project Server.&lt;br /&gt;Let's see how to use them.&lt;br /&gt;First open a new project and import PSI web references. The first one you need is project.asmx&lt;br /&gt;You can find it in your server under the Project Web Access site.&lt;br /&gt;&lt;a href="http://servername/pwa/_vti_bin/PSI/project.asmx"&gt;http://servername/pwa/_vti_bin/PSI/project.asmx&lt;/a&gt;&lt;br /&gt;Once you have imported it you can create new projects from a template.&lt;br /&gt;&lt;br /&gt;Variables&lt;br /&gt;server --&gt; name of the server.&lt;br /&gt;PROJECTWEBSERVICE --&gt; Project web service adress&lt;br /&gt;&lt;br /&gt;1. Create and configure connection&lt;br /&gt;Project.Project projWS;&lt;br /&gt;if (projWS == null)&lt;br /&gt;{&lt;br /&gt;projWS = new Project.Project();&lt;br /&gt;projWS.Url = server + PROJECTWEBSERVICE;&lt;br /&gt;projWS.CookieContainer = new CookieContainer();&lt;br /&gt;projWS.Credentials = CredentialCache.DefaultCredentials;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;2. Implement functions to get UIDs from templates&lt;br /&gt;private Guid GetProjectTemplateGUID(string templateName) {&lt;br /&gt;Guid tempateGuid = Guid.NewGuid();&lt;br /&gt;Project.ProjectDataSet myProjectList = projWS.ReadProjectList();&lt;br /&gt;foreach (DataRow row in myProjectList.Project) {&lt;br /&gt;if ((string)row["PROJ_NAME"] == templateName) {&lt;br /&gt;tempateGuid = (Guid)row["PROJ_UID"];&lt;br /&gt;return tempateGuid;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;return tempateGuid;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;3. Create the project from the template&lt;br /&gt;&lt;br /&gt;Guid plantillaid = GetProjectTemplateGUID(plantilla.Text);&lt;br /&gt;Guid newProject = Guid.Empty;&lt;br /&gt;newProject = projWS.CreateProjectFromTemplate(plantillaid, nombre.Text);&lt;br /&gt;&lt;br /&gt;4. Once you have your new project Created let's change some of its information&lt;br /&gt;&lt;br /&gt;4.1 Declare variables to read the project&lt;br /&gt;&lt;br /&gt;Project.ProjectDataSet templateProject;&lt;br /&gt;Guid jobGuid = Guid.NewGuid();&lt;br /&gt;Guid sessionGuid = Guid.NewGuid();&lt;br /&gt;&lt;br /&gt;4.2 Check-out the project to read it's properties&lt;br /&gt;&lt;br /&gt;projWS.CheckOutProject(newProject, sessionGuid, "");&lt;br /&gt;templateProject = projWS.ReadProject(newProject, Project.DataStoreEnum.WorkingStore);&lt;br /&gt;&lt;br /&gt;4.3 Create a temp DataSet to store the changes.&lt;br /&gt;//Hemos creado el proyecto, cambiamos los parámetros según los introducidos ProjectDataSet temporal = ((Project.ProjectDataSet)(templateProject.Copy()));&lt;br /&gt;&lt;br /&gt;4.4 Change the start date of the project&lt;br /&gt;&lt;br /&gt;temporal.Tables[temporal.Project.TableName].Rows[0][temporal.Project.PROJ_INFO_START_DATEColumn] = fechaInicio.SelectedDate;&lt;br /&gt;&lt;br /&gt;4.5 Change the owner of the project&lt;br /&gt;&lt;br /&gt;Guid propietario = GetResourceGuid(realUser);&lt;br /&gt;if (propietario != Guid.Empty)&lt;br /&gt;temporal.Tables[temporal.Project.TableName].Rows[0][temporal.Project.ProjectOwnerIDColumn] = propietario.ToString();&lt;br /&gt;ProjectDataSet updateProjectDataSet = new ProjectDataSet(); updateProjectDataSet.Project.Merge(temporal.Tables[temporal.Project.TableName], true);&lt;br /&gt;updateProjectDataSet = ((Project.ProjectDataSet)updateProjectDataSet.GetChanges(DataRowState.Modified));&lt;br /&gt;&lt;br /&gt;4.6 If there are any changes --&gt; store them&lt;br /&gt;&lt;br /&gt;if (updateProjectDataSet != null)&lt;br /&gt;{&lt;br /&gt;projWS.QueueUpdateProject(jobGuid, sessionGuid, updateProjectDataSet, false);&lt;br /&gt;WaitForQueueJobCompletion(jobGuid, 1);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;4.7 Check-in and publish the project&lt;br /&gt;&lt;br /&gt;jobGuid = Guid.NewGuid();&lt;br /&gt;projWS.QueueCheckInProject(jobGuid, newProject, true, sessionGuid,"");&lt;br /&gt;WaitForQueueJobCompletion(jobGuid, 1);&lt;br /&gt;jobGuid = Guid.NewGuid();&lt;br /&gt;projWS.QueuePublish(jobGuid, newProject, true, "");&lt;br /&gt;WaitForQueueJobCompletion(jobGuid, 1);&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1728716091528445142-6283642723552270562?l=project-server-optimization.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://project-server-optimization.blogspot.com/feeds/6283642723552270562/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1728716091528445142&amp;postID=6283642723552270562' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1728716091528445142/posts/default/6283642723552270562'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1728716091528445142/posts/default/6283642723552270562'/><link rel='alternate' type='text/html' href='http://project-server-optimization.blogspot.com/2008/04/create-new-project-from-template.html' title='Create a new Project from a template'/><author><name>Carlos Ezquerra</name><uri>http://www.blogger.com/profile/07151775757927259946</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1728716091528445142.post-8261887658715288604</id><published>2008-04-01T02:28:00.000-07:00</published><updated>2008-04-01T02:37:52.059-07:00</updated><title type='text'>Welcome to my project Server blog</title><content type='html'>This blog is created to explain all my experiences with project server and its PSI.&lt;br /&gt;I will create a new post every day explaining all my experiences with Project Server and Project Professional.&lt;br /&gt;Enjoy it !!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1728716091528445142-8261887658715288604?l=project-server-optimization.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://project-server-optimization.blogspot.com/feeds/8261887658715288604/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1728716091528445142&amp;postID=8261887658715288604' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1728716091528445142/posts/default/8261887658715288604'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1728716091528445142/posts/default/8261887658715288604'/><link rel='alternate' type='text/html' href='http://project-server-optimization.blogspot.com/2008/04/welcome-to-my-project-server-blog.html' title='Welcome to my project Server blog'/><author><name>Carlos Ezquerra</name><uri>http://www.blogger.com/profile/07151775757927259946</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry></feed>
