Posteado por: terum | octubre 13, 2008

Usuarios de Project Server no pueden acceder a PWA

Cuando damos de alta un usuario en project server y no nos permite acceder a pwa, y todos los permisos parecen estar bien.
Comprobaremos que en el site de PWA –> site settings –> Permisos avanzados, si los usuarios que dimos de alta en project server figuran como readers (project server) en la lista de usuarios del site. Si no es así lo introducimos a mano aquí, y probamos.
Si esto funciona, probablemente no hayamos reiniciado el servidor cuando instalamos PS o Sharepoint, y habrá una mala comunicación entre project server y sharepoint.

Este problema me ha pasado cuando re-instalamos sharepoint y Project Server y luego restauramos las bases de datos de Project Server. También al re-instalar Project Server y Sharepoint y dar de alta usuarios en PWA.

Si no reiniciamos los servicios, es probable que tengamos este problema.

Posteado por: terum | junio 5, 2008

Crecimiento de base de datos de biztalk 2004

He tenido un problema con un servidor de biztalk 2004 sp1 en el cual la base de datos crecía demasiado.

Tras revisar un poco lo que estaba pasando, hemos detectado el sql server agent estaba detenido.

Y el problema radica en que bajo este agente están programados los jobs que biztalk instala para la limpieza de la bbdd. Entonces como primera medida, lo que hicimos fue poner en funcionamiento el agent.

He leído que instalando el sp2 muchos de estos inconvenientes ya están controlados, pero el problema es que el cliente tampoco quería instalar nada más en dicho servidor (o sea que, NO se instalaran service packs ni nada por el estilo)

Luego de activar este agente, el problema era que el servicio de sql server consumía mucha memoria y practicamente el servidor se moría.

En este caso el problema es que ese servidor de biztalk no tenía un mantenimiento periódico y por tanto ningún administrador revisaba los mensajes y/o orquestaciones que estaban suspendidas y por tanto el servicio de biztalk intentaba “hacer algo” con esos mensajes, lo cual producía muchísima actividad en el sql server.

Solución a este problema : Una vez activado el sql server agent, lo que hicimos fue reducir las bbdd.

BBDD MsgBoxDB

  • Reducimos el log de la MsgBoxDB  (BACKUP LOG….) y le pusimos un límite de crecimiento.
  • Con el HAT (Health and Tracking) limpiamos todos los mensajes y orquestaciones suspendidas (incluso en nuestro caso los activos también). (Con esto logramos que la MsgBox tenga espacio para reducirse)
  • Reducimos(Shrink) la bbdd.

 

BBDD de Tracking (DTAdb)

Como no se quería instalar el sp2, hemos realizado los siguientes pasos:

  • Ejecutamos el siguiente script para que nos dejara espacio para reducir la bbdd

if exists (select * from dbo.sysobjects where id = object_id(N’[dbo].[dtasp_PurgeAllCompletedTrackingData]‘) and OBJECTPROPERTY(id, N’IsProcedure’) = 1)
 drop procedure [dbo].[dtasp_PurgeAllCompletedTrackingData]
GO

if exists (select * from dbo.sysobjects where id = object_id(N’[dbo].[dta_ServiceInstancesTemp]‘) and OBJECTPROPERTY(id, N’IsUserTable’) = 1)
 drop table [dbo].[dta_ServiceInstancesTemp]
GO

if exists (select * from dbo.sysobjects where id = object_id(N’[dbo].[dta_MessageInstancesTemp]‘) and OBJECTPROPERTY(id, N’IsUserTable’) = 1)
 drop table [dbo].[dta_MessageInstancesTemp]
GO

if exists (select * from dbo.sysobjects where id = object_id(N’[dbo].[dta_MessageInOutEventsTemp]‘) and OBJECTPROPERTY(id, N’IsUserTable’) = 1)
 drop table [dbo].[dta_MessageInOutEventsTemp]
GO

if exists (select * from dbo.sysobjects where id = object_id(N’[dbo].[dta_MessageFieldValuesTemp]‘) and OBJECTPROPERTY(id, N’IsUserTable’) = 1)
 drop table [dbo].[dta_MessageFieldValuesTemp]
GO

if exists (select * from dbo.sysobjects where id = object_id(N’[dbo].[dta_DebugTraceTemp]‘) and OBJECTPROPERTY(id, N’IsUserTable’) = 1)
 drop table [dbo].[dta_DebugTraceTemp]
GO

if exists (select * from dbo.sysobjects where id = object_id(N’[dbo].[dta_CallChainTemp]‘) and OBJECTPROPERTY(id, N’IsUserTable’) = 1)
 drop table [dbo].[dta_CallChainTemp]
GO

if exists (select * from sysobjects where id = object_id(N’[dbo].[dtasp_DropViews]‘) AND OBJECTPROPERTY(id, N’IsProcedure’) = 1)
 DROP PROCEDURE [dbo].[dtasp_DropViews]
GO

CREATE TABLE [dbo].[dta_ServiceInstancesTemp] (
 [uidActivityId]   [uniqueidentifier]    NOT NULL,
 [uidServiceInstanceId]  [uniqueidentifier]    NOT NULL,
 [uidServiceId]   [uniqueidentifier]    NOT NULL,
 [uidAgentSrvId]   [uniqueidentifier]    NOT NULL,
 [uidServiceClassId]  [uniqueidentifier]    NOT NULL,
 [dtStartTime]    [datetime]     NOT NULL,
 [dtEndTime]    [datetime]     NULL,
 [HRESULT]    [bigint]    NULL DEFAULT(0),
 [ErrorInfo]    [ntext]     NULL,
 [nHostId]   [int]     NOT NULL,
 [nMessageBoxId]   [int]      NOT NULL,
 [nServiceStateId]  [int]     NOT NULL,
 [nGroupId]   [int]     NOT NULL,
        [bExceptionsOccurred]    [int]                         NOT NULL DEFAULT(0) 

) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

CREATE TABLE [dbo].[dta_MessageInOutEventsTemp] (
 [uidActivityId]   [uniqueidentifier]   NOT NULL,
 [uidServiceInstanceId]  [uniqueidentifier]   NOT NULL,
 [uidMessageInstanceId]  [uniqueidentifier]   NOT NULL,
 [nAdapterId]   [bigint]    NOT NULL,
 [nDecryptionSubjectId]  [int]     NOT NULL,
 [nSigningSubjectId]  [int]     NOT NULL,
 [strCorrelationToken]  [nvarchar] (60)    NULL,
 [nUrlId]   [bigint]    NOT NULL,
 [nPartyId]   [bigint]    NOT NULL,
 [nPortId]   [bigint]    NOT NULL,
 [dtTimestamp]   [datetime]     NOT NULL,
 [nStatus]   [int]      NOT NULL
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[dta_CallChainTemp] (
 [uidServiceInstanceId]  [uniqueidentifier]  NOT NULL,
 [vtCallersActionId]  [nvarchar] (60)   NULL,
 [uidCallersServiceId]  [uniqueidentifier]  NULL,
 [nCallersServiceSequence] [int]    NULL,
 [uidCalleesServiceId]  [uniqueidentifier]  NOT NULL,
 [nCalleesServiceSequence] [int]    NOT NULL
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[dta_DebugTraceTemp] (
 [uidServiceInstanceId]  [uniqueidentifier]  NOT NULL,
 [uidServiceId]   [uniqueidentifier]  NOT NULL,
 [vtInstructionId]  [nvarchar] (60)   NOT NULL,
 [nServiceSequence]  [int]    NOT NULL,
 [nInternalSequence]  [int]    NOT NULL,
 [nAction]   [int]    NOT NULL,
 [dtTimeStamp]    [datetime]   NOT NULL,
 [vtContext]   [sql_variant]   NULL
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[dta_MessageInstancesTemp] (
 [uidMessageInstanceId]  [uniqueidentifier]  NOT NULL,
 [nSchemaId]   [bigint]   NOT NULL,
 [nPartCount]   [int]    NULL,
 [nMessageSize]   [bigint]   NULL

) ON [PRIMARY]
GO

CREATE TABLE [dbo].[dta_MessageFieldValuesTemp] (
 [uidMessageInstanceId]  [uniqueidentifier]   NOT NULL,
 [nMessageFieldsId]  [bigint]    NOT NULL,
 [nSchemaId]   [bigint]    NULL,
 [vtValue]   [sql_variant]    NULL,
 [nValueIndex]   [int]     NOT NULL
) ON [PRIMARY]
GO

CREATE PROCEDURE [dbo].[dtasp_DropViews]
AS
 –/——————————————————————————————————–
 –/ Remove health monitoring related static views
 –/——————————————————————————————————–
 if exists (select * from dbo.sysobjects where id = object_id(N’[dbo].[dtav_MessageFacts]‘) and OBJECTPROPERTY(id, N’IsView’) = 1) drop view [dbo].[dtav_MessageFacts]
 if exists (select * from dbo.sysobjects where id = object_id(N’[dbo].[dtav_FindMessageFacts]‘) and OBJECTPROPERTY(id, N’IsView’) = 1) drop view [dbo].[dtav_FindMessageFacts]
 if exists (select * from dbo.sysobjects where id = object_id(N’[dbo].[dtav_ServiceFacts]‘) and OBJECTPROPERTY(id, N’IsView’) = 1) drop view [dbo].[dtav_ServiceFacts]
 if exists (select * from dbo.sysobjects where id = object_id(N’[dbo].[dtav_RealNames]‘) and OBJECTPROPERTY(id, N’IsView’) = 1) drop view [dbo].[dtav_RealNames]
GO
 
CREATE PROCEDURE [dbo].[dtasp_PurgeAllCompletedTrackingData]
AS
BEGIN

 –If you don’t have a MessageInstances table it means that this database has already been upgraded so we should not
 –run this stored procedure or it will just throw wierd errors
 if not exists (select * from dbo.sysobjects where id = object_id(N’[dbo].[dta_MessageInstances]‘) and OBJECTPROPERTY(id, N’IsUserTable’) = 1)
 BEGIN
  RAISERROR(‘The database schema has been upgraded and this stored procedure is no longer functional’, 10, 1)
  return
 END

 –If you are doing this we assume it is because you have a huge, old db so it is just faster for us to
 –find things which are not done and hold onto them then the other way around.
 –if we crashed after grabbing these uncompleted instances but before reinserting them, we are okay
 –because we have a unique constraint on the serviceinstanceid identity column so we will just ignore dupes
 –Note that if you run this, you need to have the tracking host stopped so that no new data is being inserted while this runs.
 –This hard purge assumes that inserts have stopped so that we can do unlogged operations like truncate table and not hold locks for
 –long periods of time. Make sure if the system crashes while running this, you get a full clean run before restarting the tracking service or
 –you will end up in a non-deterministic state.

 INSERT INTO dta_ServiceInstancesTemp (
  uidServiceInstanceId,
  uidActivityId,
  uidServiceId,
  uidAgentSrvId,
  uidServiceClassId,
  dtStartTime,
  dtEndTime,
  HRESULT,
  ErrorInfo,
  nHostId,
  nMessageBoxId,
  nGroupId,
  nServiceStateId,
  bExceptionsOccurred
  )
 SELECT  uidServiceInstanceId,
  uidActivityId,
  uidServiceId,
  uidAgentSrvId,
  uidServiceClassId,
  dtStartTime,
  dtEndTime,
  HRESULT,
  ErrorInfo,
  nHostId,
  nMessageBoxId,
  nGroupId,
  nServiceStateId,
  bExceptionsOccurred
 FROM dta_ServiceInstances WHERE dtEndTime IS NULL

 INSERT INTO dta_MessageInOutEventsTemp (
  uidActivityId,
  uidServiceInstanceId,
  uidMessageInstanceId,
  nAdapterId,
  nDecryptionSubjectId,
  nSigningSubjectId,
  strCorrelationToken,
  nUrlId,
  nPartyId,
  nPortId,
  dtTimestamp,
  nStatus
  )
 SELECT  mioe.uidActivityId,
  mioe.uidServiceInstanceId,
  mioe.uidMessageInstanceId,
  mioe.nAdapterId,
  mioe.nDecryptionSubjectId,
  mioe.nSigningSubjectId,
  mioe.strCorrelationToken,
  mioe.nUrlId,
  mioe.nPartyId,
  mioe.nPortId,
  mioe.dtTimestamp,
  mioe.nStatus
 FROM dta_MessageInOutEvents mioe
 JOIN dta_ServiceInstancesTemp si ON mioe.uidServiceInstanceId = si.uidServiceInstanceId AND mioe.uidActivityId = si.uidActivityId

 INSERT INTO dta_MessageInstancesTemp (
  [uidMessageInstanceId],
  [nSchemaId],
  [nPartCount],
  [nMessageSize]
  )
 SELECT  mi.[uidMessageInstanceId],
  mi.[nSchemaId],
  mi.[nPartCount],
  mi.[nMessageSize]
 FROM dta_MessageInstances mi
 JOIN dta_MessageInOutEventsTemp mioe ON mioe.uidMessageInstanceId = mi.uidMessageInstanceId

 INSERT INTO dta_MessageFieldValuesTemp (
  [uidMessageInstanceId],
  [nMessageFieldsId],
  [nSchemaId],
  [vtValue],
  [nValueIndex]
  )
 SELECT  mfv.[uidMessageInstanceId],
  mfv.[nMessageFieldsId],
  mfv.[nSchemaId],
  mfv.[vtValue],
  mfv.[nValueIndex]
 FROM dta_MessageFieldValues mfv
 JOIN dta_MessageInstancesTemp mi ON mi.uidMessageInstanceId = mfv.uidMessageInstanceId

 –for now we have to hardcode the orchestration guid. We dont really want the callchain information for anything but
 –orchestrations and for MSMQt it is really bad since this just grows and grows
 INSERT INTO dta_CallChainTemp (
  [uidServiceInstanceId],
  [vtCallersActionId],
  [uidCallersServiceId],
  [nCallersServiceSequence],
  [uidCalleesServiceId],
  [nCalleesServiceSequence]
  )
 SELECT  cc.[uidServiceInstanceId],
  cc.[vtCallersActionId],
  cc.[uidCallersServiceId],
  cc.[nCallersServiceSequence],
  cc.[uidCalleesServiceId],
  cc.[nCalleesServiceSequence]
 FROM dta_CallChain cc
 JOIN dta_ServiceInstancesTemp sit ON cc.uidServiceInstanceId = sit.uidServiceInstanceId AND sit.uidServiceClassId = ‘{226FC6B9-0416-47A4-A8E8-4721F1DB1A1B}’

 INSERT INTO dta_DebugTraceTemp (
  [uidServiceInstanceId],
  [uidServiceId],
  [vtInstructionId],
  [nServiceSequence],
  [nInternalSequence],
  [nAction],
  [dtTimeStamp],
  [vtContext]
  )
 SELECT  dt.[uidServiceInstanceId],
  dt.[uidServiceId],
  dt.[vtInstructionId],
  dt.[nServiceSequence],
  dt.[nInternalSequence],
  dt.[nAction],
  dt.[dtTimeStamp],
  dt.[vtContext]
 FROM dta_DebugTrace dt
 JOIN dta_ServiceInstancesTemp sit ON sit.uidServiceInstanceId = dt.uidServiceInstanceId

 –I can’t truncate these tables without first dropping the views since they have schemabindings
 exec dtasp_DropViews

 TRUNCATE TABLE dta_ServiceInstances
 TRUNCATE TABLE dta_MessageInstances
 TRUNCATE TABLE dta_MessageFieldValues
 TRUNCATE TABLE dta_CallChain
 TRUNCATE TABLE dta_MessageInOutEvents
 TRUNCATE TABLE dta_DebugTrace
 TRUNCATE TABLE dta_RulesAgendaUpdates
 TRUNCATE TABLE dta_RulesConditionEvaluation
 –TRUNCATE TABLE dta_RuleSetEngineAssociation
 TRUNCATE TABLE dta_RulesFactActivity
 TRUNCATE TABLE dta_RulesFired
 TRUNCATE TABLE Tracking_Spool1
 TRUNCATE TABLE Tracking_Parts1
 TRUNCATE TABLE Tracking_Fragments1
 TRUNCATE TABLE Tracking_Spool2
 TRUNCATE TABLE Tracking_Parts2
 TRUNCATE TABLE Tracking_Fragments2

 INSERT INTO dta_ServiceInstances (
  uidServiceInstanceId,
  uidActivityId,
  uidServiceId,
  uidAgentSrvId,
  uidServiceClassId,
  dtStartTime,
  dtEndTime,
  HRESULT,
  ErrorInfo,
  nHostId,
  nMessageBoxId,
  nGroupId,
  nServiceStateId,
  bExceptionsOccurred
  )
 SELECT  uidServiceInstanceId,
  uidActivityId,
  uidServiceId,
  uidAgentSrvId,
  uidServiceClassId,
  dtStartTime,
  dtEndTime,
  HRESULT,
  ErrorInfo,
  nHostId,
  nMessageBoxId,
  nGroupId,
  nServiceStateId,
  bExceptionsOccurred
 FROM dta_ServiceInstancesTemp

 INSERT INTO dta_MessageInOutEvents (
  [uidActivityId],
  [uidServiceInstanceId],
  [uidMessageInstanceId],
  [nAdapterId],
  [nDecryptionSubjectId],
  [nSigningSubjectId],
  [strCorrelationToken],
  [nUrlId],
  [nPartyId],
  [nPortId],
  [dtTimestamp],
  [nStatus]
  )
 SELECT  [uidActivityId],
  [uidServiceInstanceId],
  [uidMessageInstanceId],
  [nAdapterId],
  [nDecryptionSubjectId],
  [nSigningSubjectId],
  [strCorrelationToken],
  [nUrlId],
  [nPartyId],
  [nPortId],
  [dtTimestamp],
  [nStatus]
 FROM dta_MessageInOutEventsTemp

 INSERT INTO dta_MessageInstances (
  [uidMessageInstanceId],
  [nSchemaId],
  [nPartCount],
  [nMessageSize]
  )
 SELECT  [uidMessageInstanceId],
  [nSchemaId],
  [nPartCount],
  [nMessageSize]
 FROM dta_MessageInstancesTemp

 INSERT INTO dta_MessageFieldValues (
  [uidMessageInstanceId],
  [nMessageFieldsId],
  [nSchemaId],
  [vtValue],
  [nValueIndex]
  )
 SELECT  [uidMessageInstanceId],
  [nMessageFieldsId],
  [nSchemaId],
  [vtValue],
  [nValueIndex]
 FROM dta_MessageFieldValuesTemp

 INSERT INTO dta_CallChain (
  [uidServiceInstanceId],
  [vtCallersActionId],
  [uidCallersServiceId],
  [nCallersServiceSequence],
  [uidCalleesServiceId],
  [nCalleesServiceSequence]
  )
 SELECT  [uidServiceInstanceId],
  [vtCallersActionId],
  [uidCallersServiceId],
  [nCallersServiceSequence],
  [uidCalleesServiceId],
  [nCalleesServiceSequence]
 FROM dta_CallChainTemp

 INSERT INTO dta_DebugTrace (
  [uidServiceInstanceId],
  [uidServiceId],
  [vtInstructionId],
  [nServiceSequence],
  [nInternalSequence],
  [nAction],
  [dtTimeStamp],
  [vtContext]
  )
 SELECT  [uidServiceInstanceId],
  [uidServiceId],
  [vtInstructionId],
  [nServiceSequence],
  [nInternalSequence],
  [nAction],
  [dtTimeStamp],
  [vtContext]
 FROM dta_DebugTraceTemp

 TRUNCATE TABLE dta_ServiceInstancesTemp
 TRUNCATE TABLE dta_MessageInstancesTemp
 TRUNCATE TABLE dta_MessageInOutEventsTemp
 TRUNCATE TABLE dta_MessageFieldValuesTemp
 TRUNCATE TABLE dta_DebugTraceTemp
 TRUNCATE TABLE dta_CallChainTemp

 exec dtasp_CreateMessageFactsFindMsgViews
 exec dtasp_CreateRealNamesView
 exec dtasp_CreateServiceFactsView
END

GO

exec dtasp_PurgeAllCompletedTrackingData
GO

  • Reducimos(Shrink) la bbdd
  • Reducimos el log de bbdd y le pusimos un límite de crecimiento.

 

 

Posteado por: terum | abril 23, 2008

Configuración del cubo de Project Server 2007

En un proyecto reciente tuve que configurar el cubo de Project Server 2007.

En realidad lo que hay que indicarle a Analysis Services es cual es el repositorio de datos para generar todos los cubos de Project Server y hay que crear una base de datos de metadatos, con un script.

Los datos para los cubos de Project Server son obtenidos de la BBDD de Reporting de Project Server.

He seguido los pasos que me indicaban las páginas de Microsoft, pero siempre me faltaba algo. Es por eso que he decidido escribir este artículo y explicar un poco mi experiencia.

Los pasos que he seguido son los siguientes:

1) Instalar el sp2 de sqlserver tanto para el DataBase Engine, como para Analisis Services y Reporting

2) Instalar los componentes :  Native Cliente (sqlncli.msi)
    Management Objects Collection (sqlserver2005_xmo.msi)
    (sqlserver_oledb9.msi)

3) Ponemos al usuario del SSP (que es NT AUTHORITY\NETWORK SERVICE) en el grupo local SQLServer2005MSOLAPUser$SERVIDOR$OFFICESERVERS ,del servidor de Analysis Services

4) Ponemos al usuario del SSP (que es NT AUTHORITY\NETWORK SERVICE) como miembro de un rol en el servidor de Analysis Services.

5) Creamos el repositorio de metadatos y configuramos el Analysis Services para que use ese repositorio.
 
 5.1) Nos conectamos con el SQL Server Management Studio a la instancia (OFFICESERVERS) del Database Engine de SQL.

 5.2) Creamos una nueva BBDD que será nuestro repositorio.

 5.3) La llamamos Project Server Repository (con todas las opciones por defecto).

 5.4) Agregamos un Login al Servidor de BBDD que será el grupo SQLServer2005MSOLAPUser$SERVIDOR$OFFICESERVERS (verificar que en Object Type tengamos Group seleccionado, para añadirlo).

 5.5) Vamos al User Mappings y seleccionamos para mapear Project Server Repository y le ponemos el role membership en db_owner.
 
 5.6) Ejecutamos la siguiente consulta sobre Project Server Repository (botón derecho sobre esa BBDD y click en New Query)
  CREATE TABLE [dbo].[OlapObjects] (

             [ID] [varchar] (36) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,

             [ParentID] [varchar] (36) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,

             [ObjectName] [nvarchar] (150) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,

             [ClassType] [int] NOT NULL ,

             [ObjectDefinition] [ntext] COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,

             [LastUpdated] [datetime] NULL ,

             [Changed] [bit] NULL ,

             [Version] [int] NULL

  ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

  GO
  CREATE TABLE [dbo].[Server] (

             [ObjectDefinition] [ntext] COLLATE SQL_Latin1_General_CP1_CI_AS NULL

  ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

 
6) Configuramos Analysis Services para que use el repositorio Project Server Repository
   (Esto modificará el archivo de configuración del DSO)
 6.1) Nos conectamos con el SQL Server Management Studio a la instancia (OFFICESERVERS) del Analysis Services de SQL.

 6.2) En el panel Object Explorer, click botón derecho en el nombre del servidor de Analisys Services y elegimos Properties.

 6.3) En las Propiedades, en la página General, seleccionamos Show Advanced (All) Properties.

 6.4) Seleccionamos DSO\RepositoryConnectionString de la lista Name.

 6.5) En el value click en el botón y establecemos :

   Provider : Native OLE DB\SQL Native Client.

   Server Name : SERVIDOR\OFFICESERVERS (donde tenemos la BBDD Project Server Repsitory).

   En Logon to the server : Use Windows Authentication.

   En Connect to database : Project Server Repository.

 

 6.6) Seleccionamos DSO\RemoteRepositoryConnectionString de la lista Name y ponemos lo mismo que en el paso 6.5.

 
 6.7) Click en OK para cerrar las propiedades.
7) Permitir a la cuenta del servicio de Analysis Services el accesso a la BBDD de Project Server Reporting con role db_DataReader

 7.1) Nos conectamos con el SQL Server Management Studio al Database Engine a la instancia (OFFICESERVERS)
 7.3) En la carpeta Security click derecho y New Login
 7.3) On the General page, enter the Windows Authenticated account for the user running the SQL Server Analysis Services service (es el Local System).
 7.4) Click User Mapping.
 7.5) En la lista de Bases de datos elegimos PWA_Reporting_… marcamos el check Map.
 7.6) In the Database role membership for: ProjectServer_Reporting section, select db_datareader.

 

 

 

Posteado por: terum | abril 11, 2008

Campos Personalizados en Project Server 2007

Al crear campos personalizados tanto desde PWA como desde Project Professional he tenido problemas en el momento de validar las fórmulas de los mismos.

En algunos casos si las fórmulas las había introducido desde PWA luego Project Prfessional no me las mostraba.

El problema se ha solucionado al instalar el SP1 de Project Professional.

Luego postearé, la forma que tenemos de subir Enterprise Custom Fields.

Posteado por: terum | septiembre 8, 2007

Problema con Llamada a Servicio Web desde Biztalk 2004

He tenido que llamar a un servicio web desde una orquestación de biztalk 2004.

  •  He agregado la referencia web, me ha generado los esquemas perfectamente
    (ya que el web service tenía datos complejos, si no no genera los xsd, si solamente tiene datos simples)
  •  He hecho el mapeo para crear el mensaje de llamada al web service.
  •  He creado el puerto configurado para el servicio web.
  •  En la orquestación he creado 2 mensajes del tipo ServicioWebRequest y ServicioWebResponse
  •  También he agregado una “caja” de send y otra de “receive” para enviar y recibir el mensaje hacia y
    desde el web service.
  •  He conectado las “cajas” de send y receive con la operación del puerto correspondiente al método web
    que quiero llamar.

He compilado, enlazado los puertos y hecho el deploy y hasta aquí todo bien.

Pero el servicio web nunca era llamado desde la orquestación, me daba un problema que en el EventLog
me decía que el mensaje no era correcto y que el adaptador SOAP había suspendido el envío hacia el
servicio web.

Tras muchos “golpes” veo que el puerto está mal creado, entonces:

  •  Borré el puerto existente para el web service
  •  He creado el puerto configurado, indicándole que use un tipo de puerto existente
    y seleccionando el tipo de puerto web que se correspondía con el web service.

Ok, ahora que tengo esto configurado bien hago el deploy nuevamente (tuve que reiniciar el servicio de
biztalk también)

Peeeero, la llamada al servicio web sigue dando el mismo problema.

Tras otros muchos “golpes” doy con el problema.

El problema en sí es que el mensaje está mal hecho, ya que el esquema del web service indicaba
unos campos “obligatorios” o sea que el minoccurs=1, y estos datos estaban vacíos en el mensaje
que se le enviaba.

Cómo dí con el problema?

Depurando la orquestación cuando llegué al momento del send hacia el servicio web, miro
el mensaje que le envío (busco el valor del part) y lo guardo como xml.
Luego, miré la descripción del web service y noté que esos campos son obligatorios.
Cuanod decido hacer una prueba de validación del esquema, con el archivo xml que guardé,
VOILÁ!!! la validación me da error, pero Visual Studio me dice cual es el problema.
Moraleja : Validar siempre los mensajes con los esquemas, para no tener problemas.

Posteado por: terum | julio 9, 2007

Biztalk 2006 Mapeo a schemas envelope

Me he encontrado con un problema al intentar mapear desde un esquema que no es sobre (envelope) a un esquema sobre (envelope).

El problema : Aplicando el mapeo directamente en un puerto, NO mapea.

La solución: Aplicar el mapeo dentro de una orquestación.

Resulta que el mapeo funciona correctamente desde Visual Studio (i.e. : En las propiedades del mapa le he indicado un archivo de origen y uno de destino y luego al “comprobar el mapa” , el archivo de salida era correcto), pero cuando lo aplicaba en el puerto, no me mapeaba. 

Luego de buscar por internet cuál sería el problema, he encontrado una respuesta en un foro que me recomendaba probar el mapeo desde una orquestación en vez de aplicarlo directamente en el puerto, ya que aparentemente no tiran del mismo ensamblado(¿¿¿¿?????).

Resulta que esa recomendación ha  funcionado correctamente, o sea que “Problema solucionado”.

Posteado por: terum | junio 3, 2007

Comienzo del Blog

Este espacio está creado para ir compartiendo mi aprendizaje y conocimientos sobre tecnologías, en especial sobre la solución EPM de Microsoft y también Biztalk Server.

Cualquier comentario al respecto será bienvenido.

Categorías

Seguir

Get every new post delivered to your Inbox.