Estoy tratando de enviar a autorizar la entidad de puestos (con el usuario admin) que tiene una ruta de autorización donde el autorizador es el mismo admin que tiene un expediente activo. El servicio de gestor de flujos de autorización es válida la ruta.

System.Data.Entity.Core.EntityException: The underlying provider failed on Open. ---> System.Transactions.TransactionException: The operation is not valid for the state of the transaction.
 at System.Transactions.TransactionState.EnlistPromotableSinglePhase(InternalTransaction tx, IPromotableSinglePhaseNotification promotableSinglePhaseNotification, Transaction atomicTransaction, Guid promoterType)
 at System.Transactions.Transaction.EnlistPromotableSinglePhase(IPromotableSinglePhaseNotification promotableSinglePhaseNotification, Guid promoterType)
 at System.Transactions.Transaction.EnlistPromotableSinglePhase(IPromotableSinglePhaseNotification promotableSinglePhaseNotification)
 at System.Data.SqlClient.SqlInternalConnection.EnlistNonNull(Transaction tx)
 at System.Data.SqlClient.SqlInternalConnection.Enlist(Transaction tx)
 at System.Data.ProviderBase.DbConnectionInternal.ActivateConnection(Transaction transaction)
 at System.Data.ProviderBase.DbConnectionPool.PrepareConnection(DbConnection owningObject, DbConnectionInternal obj, Transaction transaction)
 at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection)
 at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection)
 at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection)
 at System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
 at System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource`1 retry)
 at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry)
 at System.Data.SqlClient.SqlConnection.Open()
 at System.Data.Entity.Infrastructure.Interception.InternalDispatcher`1.Dispatch[TTarget,TInterceptionContext](TTarget target, Action`2 operation, TInterceptionContext interceptionContext, Action`3 executing, Action`3 executed)
 at System.Data.Entity.Infrastructure.Interception.DbConnectionDispatcher.Open(DbConnection connection, DbInterceptionContext interceptionContext)
 at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.<>c__DisplayClass1.<Execute>b__0()
 at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func`1 operation)
 at System.Data.Entity.Core.EntityClient.EntityConnection.Open() --- End of inner exception stack trace ---
 at System.Data.Entity.Core.EntityClient.EntityConnection.Open()
 at System.Data.Entity.Core.Objects.ObjectContext.EnsureConnection(Boolean shouldMonitorTransactions)
 at System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Func`1 func, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction, Boolean releaseConnectionOnSuccess)
 at System.Data.Entity.Core.Objects.ObjectQuery`1.<>c__DisplayClass7.<GetResults>b__5()
 at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func`1 operation)
 at System.Data.Entity.Core.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption)
 at System.Data.Entity.Core.Objects.ObjectQuery`1.<System.Collections.Generic.IEnumerable<T>.GetEnumerator>b__0()
 at System.Data.Entity.Internal.LazyEnumerator`1.MoveNext()
 at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source)
 at Aseinfo.VH4.Infraestructura.Workflow.WorkflowFoundationEngine.AsociaInstanciaEntidad(String codigoInstancia, String codigoEntidad, String entitySetName)
 at Aseinfo.Infrastructure.Base.Entity.EntityServiceBase`2.AssociateEntityWithWorkflowInstance(T entity, IInstanciaRutaAutorizacion instanciaInicializada, IWorkflowEngine workflowEngine) in C:\vh4\Infrastructure\Base\Entity\EntityServiceBase.cs:line 808
 at Aseinfo.Infrastructure.Base.Entity.EntityServiceBase`2.InitializeWorkflowInEntity(IAuthorizationWorkflowManagedEntity entity, IInstanciaRutaAutorizacion instanciaQueSeReintenta) in C:\vh4\Infrastructure\Base\Entity\EntityServiceBase.cs:line 755
 at Aseinfo.Infrastructure.Common.Extensions.MvcExtensions.InicializaFlujoAutorizacion(SecuredExtendedControllerBase controller, IAuthorizationWorkflowManagedEntity entity, IAuthorizationWorkflowManagedEntityService service, IInstanciaRutaAutorizacion instanciaQueSeReintenta) in C:\vh4\Infrastructure\Common\Extensions\MvcExtensions.cs:line 579

El procedimiento antes de guardar estaba de la siguiente manera:

    ALTER procedure [eor].[puesto_antes_guardar]

    @codigo int,
    @entitysetname varchar(50),
    @accion varchar(10),
    @mensaje_validacion varchar(max) out
as
begin
    IF @accion='Update'
    BEGIN
        IF EXISTS (SELECT 1 FROM eor.pue_puestos WHERE pue_codigo=@codigo AND (pue_estado_workflow != 'Pendiente' OR pue_codigo_workflow IS NOT NULL))
            SET @mensaje_validacion = 'No es permitido modificar el puesto porque el estado del flujo no es Pendiente'
    END

    IF @accion='Update' OR @accion='Insert'
    BEGIN
        IF EXISTS (SELECT 1 FROM eor.pue_puestos WHERE pue_codigo=@codigo AND gen.get_pb_field_data_int(pue_property_bag_data, 'id_cargo') IS NULL)
            SET @mensaje_validacion = 'No se permite campo vacío en el campo Id Cargo'

        IF EXISTS (SELECT 1 FROM eor.pue_puestos WHERE pue_codigo=@codigo AND ISNULL(gen.get_pb_field_data(pue_property_bag_data, 'codigo_jobd'), '') = '')
            SET @mensaje_validacion = 'No se permite campo vacío en el campo Codigo de Job description'

        IF EXISTS (
                    SELECT 1 
                    FROM eor.pue_puestos 
                    WHERE pue_codigo != @codigo 
                        AND gen.get_pb_field_data_int(pue_property_bag_data, 'id_cargo') = (
                                                                                            SELECT gen.get_pb_field_data_int(pue_property_bag_data, 'id_cargo')
                                                                                            FROM eor.pue_puestos WHERE pue_codigo=@codigo
                                                                                            )
                        AND pue_estado='V' 
                        AND (pue_estado_workflow='Autorizado' OR pue_estado_workflow='Pendiente')
                        AND pue_codigo != ISNULL((SELECT vep_codpue_origen FROM tigo.vep_version_puestos WHERE vep_codpue=@codigo), 0)
                    )
            SET @mensaje_validacion = 'Existe otro cargo con el mismo ID del cargo'

        IF EXISTS (
                    SELECT 1 
                    FROM eor.pue_puestos 
                    WHERE pue_codigo != @codigo 
                        AND gen.get_pb_field_data(pue_property_bag_data, 'codigo_jobd') = (
                                                                                            SELECT gen.get_pb_field_data(pue_property_bag_data, 'codigo_jobd')
                                                                                            FROM eor.pue_puestos WHERE pue_codigo=@codigo
                                                                                            )
                        AND pue_estado='V' 
                        AND (pue_estado_workflow='Autorizado' OR pue_estado_workflow='Pendiente')
                        AND pue_codigo != ISNULL((SELECT vep_codpue_origen FROM tigo.vep_version_puestos WHERE vep_codpue=@codigo), '')
                    )
            SET @mensaje_validacion = 'Existe otro cargo con el mismo JOB Description'
    END

    IF @accion='Delete'
    BEGIN
        IF EXISTS (SELECT 1 FROM tigo.vep_version_puestos WHERE vep_codpue=@codigo OR vep_codpue_origen=@codigo)
            SET @mensaje_validacion = 'No es posible elminar debido a que el puesto ya fue Autorizado o ya existe una Copia Autorizada'
    END

end

asked 05 Dec '16, 11:38

Jimy%20Tobar's gravatar image

Jimy Tobar ♦♦
(suspended)
accept rate: 56%

edited 07 Dec '16, 08:47

Hola Jimy, Tratamos de reproducirlo pero no lo logramos, creo que necesitaremos más información para lograrlo. Hemos creado puestos con rutas que inician automáticamente y todo funciono bien

(05 Dec '16, 18:28) cgalan ♦♦ cgalan's gravatar image

Gracias Carlos, he revisado incluso el event viewer en el momento de enviarlo y no encuentro algún error

(06 Dec '16, 09:03) Jimy Tobar ♦♦ Jimy%20Tobar's gravatar image

El problema es causado por el procedimiento antes de guardar configurado, que tenía una instrucción como la siguiente

IF EXISTS (SELECT 1 FROM eor.pue_puestos WHERE pue_codigo=@codigo AND (pue_estado_workflow != 'Pendiente' OR pue_codigo_workflow IS NOT NULL))

El problema es que no le gustaba la siguiente parte

OR pue_codigo_workflow IS NOT NULL

no importando tampoco si esta así

 OR ISNULL(pue_codigo_workflow, '')!=''

La instrucción se compila bien en SQL. Al final me dí cuenta que no era necesario incluirlo.

link

answered 06 Dec '16, 10:52

Jimy%20Tobar's gravatar image

Jimy Tobar ♦♦
(suspended)
accept rate: 56%

Mira, pero la sintaxis estaría correcta indistintamente si se utiliza: not pue_codigo_workflow is null, pue_codigo_workflow not is null o isnull(pue_codigo_workflow, '') != ''

Las tres están correctas y no dan error en SQL.

(06 Dec '16, 12:31) Fernando Paz ♦♦ Fernando%20Paz's gravatar image

¿Me podrías enviar el procedimiento como estaba?, porque no creo que quitando ese OR se resolviera el problema.

Además que la pregunta correcta sobre si una entidad está en flujo es que su codigo_workflow no sea null. El estado no es buena comprobación, porque tiene más valores que 'Pendiente' y no por eso está en medio de un flujo sin terminar.

(06 Dec '16, 12:31) Fernando Paz ♦♦ Fernando%20Paz's gravatar image

En mi caso el estado pendiente del Flujo es el que me permite modificar (por que la entidad se guarda inicialmente como Vigente y el estado Anulado o Denegado del flujo esta bien que tampoco permita modificar), en caso haya sido enviado a flujo la propia entidad no permite modificar.

(07 Dec '16, 08:39) Jimy Tobar ♦♦ Jimy%20Tobar's gravatar image

Pareciera ser un problema de conexion (The underlying provider failed on Open)

Revisa los logs del appjob y del workflow service, tal vez aparezca algo mas concreto

link

answered 05 Dec '16, 14:31

sbarahona's gravatar image

sbarahona ♦♦
(suspended)
accept rate: 32%

Ni el log del appjob ni el archivo WorkflowService_20161205 muestran error

(05 Dec '16, 14:39) Jimy Tobar ♦♦ Jimy%20Tobar's gravatar image

El error solo puede estar loggeado del lado del ELMAH, porque aún no ha salido del website. Por eso no hay ningún error en el log del Workflow o del AppJob

La excepción se da en el momento en que inicializa las propiedades del workflow (código, estado, etc.)

(05 Dec '16, 17:46) Fernando Paz ♦♦ Fernando%20Paz's gravatar image

¿Le pusiste inicio automático a la ruta?

Pregunto por esa pantalla es de las 9 que no aceptan inicio automático.

(05 Dec '16, 17:54) Fernando Paz ♦♦ Fernando%20Paz's gravatar image

el campo Flujo Inicia Automáticamente de la entidad esta en false. incluso el ELMAH no captura el error

(06 Dec '16, 09:01) Jimy Tobar ♦♦ Jimy%20Tobar's gravatar image

He probado en la plaza con la misma ruta de autorización y me funcionó

(06 Dec '16, 09:20) Jimy Tobar ♦♦ Jimy%20Tobar's gravatar image
Your answer
toggle preview

Follow this question

By Email:

Once you sign in you will be able to subscribe for any updates here

By RSS:

Answers

Answers and Comments

Markdown Basics

  • *italic* or _italic_
  • **bold** or __bold__
  • link:[text](http://url.com/ "title")
  • image?![alt text](/path/img.jpg "title")
  • numbered list: 1. Foo 2. Bar
  • to add a line break simply add two spaces to where you would like the new line to be.
  • basic HTML tags are also supported

Evolution en BitBucket

En este sitio puede acceder al código fuente, centro de descargas y reportar bugs, propuestas y mejoras para Evolution.

Evolution en JIRA

En este sitio puedes sugerir nueva funcionalidad para Evolution, o puedes votar por la funcionalidad ya propuesta por otros usuarios.

Tags:

×26
×1

Asked: 05 Dec '16, 11:38

Seen: 918 times

Last updated: 07 Dec '16, 08:47

[Acerca de] [Preguntas Frecuentes] [Privacidad] [Soporte] [Contacto]
Copyright 2013-2018. Asesores en Informática