понедельник, 30 июня 2014 г.

Автоматическое добавление * (asterisk) в поле поиска в Dynamics CRM 2013

Зайдите на сервере в папку
C:\Program Files\Microsoft Dynamics CRM\CRMWeb\_static\_common\scripts\

Откройте файл "stage.js" и измените строку:
sFindCriteria=Trim(findCriteria.value.replace(/[\*]+/,"*"));findCriteria.value=sFindCriteria;
и замените на:
sFindCriteria=Trim(findCriteria.value.replace(/[\*]+/,"*"));if (sFindCriteria != "" && sFindCriteria.substr(0, 1) != "*") sFindCriteria = "*" + sFindCriteria;findCriteria.value=sFindCriteria;

Сбросьте кеш в браузере. Теперь, при вводе в поле поиска значения автоматически будет добавляться в начале знак *, если его там нет.

пятница, 25 апреля 2014 г.

100% CPU после установки Workflow Manager 1.0

Столкнулся с такой проблемой: после установки апдейтов на Workflow Manager 1.0 ушёл в 100% процессор и логи заспамили ошибками типа:

Failed SQL command after 1 tries with error '229'. Exception: System.Data.SqlClient.SqlException (0x80131904): The EXECUTE permission was denied on the object 'InsertTrackingAndStatus', database 'WFInstanceManagementDB', schema 'dbo'.
   at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
   at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
   at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
   at System.Data.SqlClient.SqlCommand.CompleteAsyncExecuteReader()
   at System.Data.SqlClient.SqlCommand.EndExecuteNonQueryInternal(IAsyncResult asyncResult)
   at System.Data.SqlClient.SqlCommand.EndExecuteNonQuery(IAsyncResult asyncResult)
   at Microsoft.Workflow.Management.ExecuteNonQueryAsyncResult.OnEndExecuteSql(IAsyncResult result)
   at Microsoft.Workflow.Management.ExecuteSqlAsyncResult.EndAsyncResult(IAsyncResult result)
   at Microsoft.Workflow.Common.BackoffRetryAsyncResult.IsolateWithRetry(IAsyncResult result)
   at Microsoft.Workflow.Common.AsyncResult.AsyncCompletionWrapperCallback(IAsyncResult result)
ClientConnectionId:03eb9da5-56d7-4023-8802-d7844811bac2  Command Details:   SQL Text          : InsertTrackingAndStatus
  SQL Parameters    : 
    > @StatusRecords = Microsoft.Workflow.Management.SqlDataAccessProvider+InstanceStatusValuesCollection
    > @MetadataWithInstanceId = Microsoft.Workflow.Management.SqlDataAccessProvider+MetadataValuesWithInstanceIdCollection
    > @Variables = Microsoft.Workflow.Management.SqlDataAccessProvider+VariablesCollection
    > @TrackingRecords = 
    > @StatusHistoryRecords = 
    > @DebugTraceRecords = Microsoft.Workflow.Management.SqlDataAccessProvider+DebugTraceRecordValuesCollection
    > @RollingStatusHistoryWindowSize = 1000
    > @RollingDebugTraceWindowSize = 5000

Чинится просто, нужно выполнить скрипт на БД WFInstanceManagementDB и WFResourceManagementDB, этим мы дадим необходимые права для роли, под которой действует учётка Workflow Manager 1.0:

IF  EXISTS (SELECT * FROM sys.database_principals WHERE name = N'WFServiceOperators' AND type = 'R')
    BEGIN
                   -- Grant all permissions of stored procedures and tables
                   DECLARE @ObjectName sysname, @ObjectType char(20), @Cmd varchar(300)
                   DECLARE ObjectCursor CURSOR LOCAL FAST_FORWARD
                   FOR SELECT name, type FROM sys.objects UNION SELECT name, 'WFUDT' FROM sys.types WHERE is_user_defined = 1

                   OPEN ObjectCursor
                   FETCH ObjectCursor INTO @ObjectName, @ObjectType
                   WHILE (@@fetch_status <> -1)
                   BEGIN                              
                                  SET @Cmd =
                                    CASE @ObjectType
                                                  WHEN 'P' THEN N'GRANT EXECUTE ON [' + @ObjectName + N'] TO [WFServiceOperators]'  
                                                  WHEN 'WFUDT' THEN N'GRANT CONTROL, REFERENCES ON TYPE::[' + @ObjectName + N'] TO [WFServiceOperators]'  
                                                  ELSE ''
                                    END

                                  IF @Cmd <> ''
                                  BEGIN
                                                 EXEC(@Cmd)
                                  END
                                  FETCH ObjectCursor INTO @ObjectName, @ObjectType
                   END
                   CLOSE ObjectCursor
                   DEALLOCATE ObjectCursor
    END
    GO

суббота, 15 марта 2014 г.

Адовое собрание дразнилок

Перебранка

— пошли!
— куда?
— тащить лошадь из пруда я руками за узду а ты губами за пизду

сёдня суббота девочкам работа мальчикам лежать сосочку сосать
мальчики встали автоматы взяли девочек убили розы положили

лысый сходи пописай
лохматый сходи покакай

Сравнение систем хранения кода в TFS: TFVC vs Git

Microsoft TFS 2012 и 2013 стал поддерживать две системы хранения кода.
TFVC -  Team Foundation Version Control, стандартная для TFS централизованная система хранения кода. Все изменения фиксируются на сервере, в том числе и branch. Т.е. актуальный код всегда в TFS.
Git - это DVCS (Distributed Version Control System), это означает, что как такового центрального репозитария нет и TFS в данном случае выступает как "один из" репозитариев. Причём репозитарием может быть даже машина разработчика. Следствием этого мы поулчаем самую разрекламирвоанную фишку Git - разработчик может на своей машине делать бесконечное количетство branch, не тревожа TFS.

Побробнее свои изыскания изобразил на mind map, но у меня абсолютный перекос на TFVC, так что не судите строго. Ещё дублируютя доводы: если есть недостатки в одной системе, это значит, что есть такие же преимущества в другой.

http://www.mindmeister.com/389407396/tfvc-vs-git