martes, 7 de marzo de 2017

ERROR ASP.NET 4: UnobtrusiveValidationMode de WebForms requiere un ScriptResourceMapping para 'jquery'


 PROBLEMA 

Error en ASP.NET 4 al ejecutar:

UnobtrusiveValidationMode de WebForms requiere un ScriptResourceMapping para 'jquery'. Agregue un ScriptResourceMapping con nombre jquery(distinguir mayúsculas de minúsculas).

 

 SOLUCIÓN 

  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="false" />
    <add key="ValidationSettings:UnobtrusiveValidationMode" value="None" />
  </appSettings>


martes, 7 de febrero de 2017

Como recuperar un objeto de une entidad derivada en ADO.NET Entity Framework con LINQ to Entities.


Cuando tenemos una clase correspondiente a una entidad del ADO.NET Entity Framework y una o varias clases derivadas de ésta y toda la jerarquía se mapea en una sola tabla física, entonces para obtener objetos de una clase derivada mediente LINQ to Entities debemos filtrar por la clase derivada.


En el ejemplo tenemos una clase Animales que se mapea en la tabla AnimalesSet, y una clase derivada Perro. Para obtener un objeto de la clase Perro debemos hacer lo siguiente:


Código en VB.NET :
Dim queryPerro As ObjectQuery(Of Perro) =
        From animalAux As Perro In contexto.AnimalesSet.OfType(Of Perro)()
        Where animalAux.nombre = "Goofy"
        Select animalAux




lunes, 6 de julio de 2015

LINQ to Entities. Problema al utilizar entidades derivadas. LINQ to Entities sólo admite la conversión a tipos de enumeración o primitivos de EDM.


 PROBLEMA 

ERROR EN EJECUCIÓN: No se pudo convertir el tipo 'EntidadX' al tipo 'EntidadY'. LINQ to Entities sólo admite la conversión a tipos de enumeración o primitivos de EDM


Ocurre porque se intenta utilizar una entidad derivada procedente del modelo de datos EDM (cuando estamos haciendo corresponder una tabla con toda unajerarquía de entidades) y que, por tanto, no corresponde exáctamente con una conjunto de datos de nuestras tablas. En nuestro caso la entidad base es EntidadX y la entidad derivada es EntidadY. El conjunto de datos (tabla) correspondientes a las dos entidades (ya que forman una única jerarquía) sería EntidadXSet.


Se mostrará el error de arriba, si intentamos hacer esta consulta:

  Dim qElementosY As ObjectQuery(Of EntidadY) =
            From objetoY As EntidadY In context.EntidadXSet _
            Select objetoY
  Dim listado = qElementosY.ToList)



 SOLUCIÓN 

Deberemos realizar la consulta de la siguiente manera (subrayo las diferencias):


  Dim qElementosY As ObjectQuery(Of EntidadX) =
            From objetoY As EntidadX In context.EntidadXSet.OfType(Of EntidadY)() _
            Select objetoY
  Dim listado = qElementosY.ToList)




martes, 16 de diciembre de 2014

ADO.NET Entity Framework. No se guarda algún campo de una entidad dentro de una jerarquía al ejecutar el método AddObject.


 PROBLEMA 

No se guarda algún campo de una entidad que pertenece a una jerarquía de clases al ejecutar el método AddObject, sin embargo éste no da ningún error, en .NET 4.0 VS2010 con modelo de datos ADO.NET Entity Framework.


 SOLUCIÓN 

Ocurre porque las propiedades correspondientes dos clases pertenecientes a la misma jerarquía tienen valores diferentes en la propiedad ‘Acepta valores NULL’ o tienen un valor diferente que la restricción en la tabla de la base de datos.
Se resuelve unificando los valores en dicha propiedad a (ninguno) o al valor que tiene  la restricción en la tabla de la base de datos.

martes, 14 de octubre de 2014

ERROR Visual Studio 2012: No se puede editar 'http ... .css'. La hoja de estilos debe formar parte del proyecto ...


 PROBLEMA 

Durante el desarrollo en Microsoft Visual Studio 2012 surge el siguiente error:
No se puede editar 'http ... .css'. La hoja de estilos debe formar parte del proyecto actual y este debe ser un proyecto de sitio o aplicación web.



El problema aparece en Visual Studio 2012 cuando en una página aspx se tiene un enlace a un CSS externo del tipo <link href="http ... .css" type="text/css" rel="stylesheet"/> que no puede ser editado.
 

 SOLUCIÓN 

Hay que decirle a Visual Studio 2012 que no intente editar dicho archivo CSS, añadiendo el modificador 'nofollow' en el atributos rel del enlace, tal y como se muestra en el siguiente ejemplo.

<link href="http ... .css" type="text/css" rel="stylesheet nofollow"/>



martes, 22 de julio de 2014

ASP.NET ERROR del analizador. La clase base incluye el campo ..., pero su tipo no es comparible ...


 PROBLEMA 

Durante la ejecución surge el error siguiente de Microsoft Visual Studio:
Error del analizador
La clase base incluye el campo 'XXXXX', pero su tipo no es compatible con el tipo del control (_ASP.YYYYY_ascx).


El problema aparece en Visual Studio 2010 al tener como nombre de la clase parcial de un formulario aspx, el mismo que en la clase parcial de un componente ascx. 
 

 SOLUCIÓN 

Revisa los nombres de las clases parciales de los formularios aspx para que no se repitan como nombre de ninguna otra clase.



martes, 6 de mayo de 2014

ASP.NET ERROR en tiempo de ejecución de Javascript: No se puede obtener la propiedad 'UI'...


 PROBLEMA 

Durante la ejecución surge el error siguiente de Microsoft Visual Studio:
Error en tiempo de ejecución de Javascript: No se puede obtener la propiedad 'UI' de referencia nula o sin definir.




El problema aparece en Visual Studio 2012 al usar el control CollapsiblePanelExtender de Ajax Control Toolkit usando el ScriptManager de la extensión de Visual Studio para Ajax en lugar del ToolkitScriptManager de Ajax Control Toolkit.
 

 SOLUCIÓN 

Quitar el control ScriptManager y poner el control ToolkitScriptManager.



jueves, 30 de enero de 2014

VB.NET ¿Cómo encontrar un elemento en una lista genérica?


Para encontrar un elemento de una determinada clase en una lista genérica podemos usar una función delegada como se muestra a continuación. En el ejemplo tenemos una lista de usuarios (clase 'Usuario') y deseamos encontrar uno conociendo su login (atributo 'login' de la clase 'Usuario').

Código en VB.NET:
Dim listUsuarios As List(Of Usuario
Dim loginUsuario As String 
Dim encontrado As Boolean  

......

If listUsuarios.Exists(Function(usu As Usuario) usu.login = loginUsuario) Then
    encontrado = True
End If

viernes, 20 de septiembre de 2013

ASP.NET ERROR en ValidatorCalloutExtender. "El control extensor 'xxx' no es un control extensor registrado."


 PROBLEMA 

Durante la ejecución surge el error siguiente:
El control extensor 'vce1_ValidatorCalloutExtender' no es un control extensor registrado. Los controles extensores deben registrarse mediante RegisterExtenderControl() antes de llamar a RegisterScriptDescriptors(). Nombre del parámetro: extenderControl

siendo vc1_ValidatorCalloutExtender el nombre de nuestro ValidatorCalloutExtender .

El problema aparece al usar un ValidatorCalloutExtender dentro de una sección div (o similar) que tenga el atributo visible="false".
 

 SOLUCIÓN 

Este bug puede ser evitable si dejamos el atributo visible de la sección div a true (su valor por defecto), e introducimos la acción de ocultar la sección div en el code behind, por ejemplo en el evento de página PreRenderComplete. Para ello habrá que introducir en la etiqueta div los atributos runat=server y id=div1 para que sea accedible desde el code behind.

Código en C#:
<div ID="div1" runat="server">


----

protected void Page_PreRenderComplete(Object sender, EventArgs e)
{
div1.visible= false;
}

jueves, 14 de febrero de 2013

ADO.NET ERROR. "En EntityDataSource, se debe especificar bien Type o bien DbType ..."


 PROBLEMA 

Durante la ejecución surge el error siguiente:
En EntityDataSource, se debe especificar bien Type o bien DbType (pero no ambos) para cada Parameter.

El problema aparece al usar la propiedad Where de un EntityDataSorce,
 

 SOLUCIÓN 

Vemos en la imagen de abajo, el editor de expresiones para la propiedad Where de un EntityDataSource. En la caja de la expresión establecemos la igualdad entre el atributo ID de la Entidad con un valor idTramite pasado por parámetro. Dicho parámetro se establece con el valor de la variable de sesión IDTRAMITE. Esto se configura en la parte inferior derecha, pero nosotros no hemos indicado en ningún sitio el tipo de datos del parámetro, y esto precisamente es lo que causa el error.

Para resolver el error basta con entrar en "Mostrar propiedades avanzadas" y establecer el tipo de datos en la propiedad 'Type' con el valor que corresponda, por ejemplo, Int32.



jueves, 24 de enero de 2013

ADO.NET Entity Framework y Oracle OTN. Error en ejecución "El valor especificado no es una instancia de tipo 'Edm.Decimal'".


 PROBLEMA 

Durante la ejecución surge el error siguiente “El valor especificado no es una instancia de tipo 'Edm.Decimal'. Nombre del parámetro: value”. Sin embargo, no existe ninguna propiedad de tipo Decimal en ninguna entidad del modelo de Entity Framework.

El error es causado por una propiedad de tipo Int32 que mapea un campo de tipo NUMBER (sin especificar longitud ni escala) en la tabla correspondiente.
 

 SOLUCIÓN 

Se arregla especificando longitud y escala de forma que el tipo del campo en la tabla sea NUMBER (10,2).

martes, 6 de noviembre de 2012

WF.NET. y WCF.NET. "ERROR: No se puede encontrar la cadena de conexión para el nombre de conexión 'ApplicationServerWorkflowInstanceStoreConnectionString'."



 PROBLEMA 

Al acceder a un Web Service de Flujo de Trabajo (.xamlx) en IIS con AppFabric habiendo establecido el almacén de persistencia de flujo de trabajo por defecto (defaultSqlPersistenceStore) se obtiene el siguiente error "ERROR: No se puede encontrar la cadena de conexión para el nombre de conexión 'ApplicationServerWorkflowInstanceStoreConnectionString'."


 SOLUCIÓN 

Hay que poner la propiedad  "Habilitar aplicaciones de 32 bits" (Enable 32-bit application) del grupo de aplicaciones (Application Pools) correspondiente al Web Service que falla, a False.


Para cambiar dicha propiedad en IIS7, localiza 'Application Pools' en el 'IIS Manager':




Entra en el grupo de aplicaciones correspondiente al servicio que está fallando:





Cambia el valor de la propiedad 'Enable 32-bit Applications' a False.







martes, 2 de octubre de 2012

ADO.NET Entity Framework. Error "... mientras se actualizaban las entradas." debido a problema en la propiedad StoreGeneratedPattern


 PROBLEMA 

Se produce el error de abajo al depurar una aplicación .NET 4.0 VS2010 con modelo de datos ADO.NET Entity Framework, teniendo un atributo clave de entidad con la propiedad StoreGeneratedPattern con valor "Identity". Utilizamos StoreGeneratedPattern= "Identity" cuando dicho atributo clave se mapea con un campo de la tabla definido como clave primaria y que cuyo valor se establece automáticamente mediante un trigger en la base de datos. Por lo que no deseamos que el modelo ADO.NET establezca el valor del atributo.

System.ServiceModel lanza la siguiente excepción:
"Se produjo un error mientras se actualizaban las entradas. Vea la excepción interna para obtener detalles."

 SOLUCIÓN 

Parece que se debe a un defecto bug en el ADO.NET Entity Framework.

El problema radica en que el diseñador de modelos Entity Framework no establece automáticamente la propiedad StoreGeneratedPattern= "Identity" en la sección del modelo de almacenamiento (SSDL) mientras que sí lo hace en el modelo conceptual (CSDL). Esto se puede comprobar y corregir en el archivo EDMX del modelo, editándolo con el editor de xml.

En el siguiente ejemplo observamos como en el diseñador de modelos hemos establecido el atributo id de la entidad TarjetaMovil con la propiedad StoreGeneratedPattern= "Identity".


Si editamos el archivo .edmx correspondiente a dicho modelo observarermos los siguiente, siendo TEL_TARJETAS_MOVIL la tabla que se asigna a la entidad TarjetaMovil. La definicion de StoreGeneratedPattern aparece en su sitio en el modelo CSDL pero no en el modelo SSDL.
 
<edmx:StorageModels>
        .....
<EntityType Name="TEL_TARJETAS_MOVIL">
<Key><PropertyRef Name="ID" /></Key>
<Property Name="ID" Type="number" Nullable="false" />
        .....
        .....
<edmx:ConceptualModels>
<Key><PropertyRef Name="id" /></Key>
<EntityType Name="TarjetaMovil">
        .....
<Property Type="Int32" Name="id" Nullable="false" annotation:StoreGeneratedPattern="Identity" >


Para resolver el problema bastará con añadir StoreGeneratedPattern="Identity" (ATENCIÓN: sin incluir annotation:) en el lugar correspondiente del modelo de almacenamiento como se ve a continuación:

<edmx:StorageModels>
        .....
<EntityType Name="TEL_TARJETAS_MOVIL">
<Key><PropertyRef Name="ID" /></Key>
<Property Name="ID" Type="number" Nullable="false" StoreGeneratedPattern="Identity" />


martes, 11 de septiembre de 2012

VB.NET ¿Como ordenar una lista genérica de objetos sin modificar la clase a la que pertenecen?


Para ello es necesario que la clase de los objetos a ordenar implementen la interfaz IComparable. Si no podemos o no deseamos modificar la clase de los objetos en cuestión y esta no implementa el interfaz IComparable, podremos usar el método Sort, al cual se le pasa como parámetro una función delegada con el método de comparación. En el método de comparación utilizaremos algún atributo de la clase original cuyo tipo implemente el método CompareTo.


En el ejemplo deseamos ordenar una lista genérica de objetos de la clase 'Persona', para ello utilizaremos el atributo 'dni' que es tipo integer.

Código en VB.NET:
Dim listaPersonas As List(Of ClasePersona)

----

listaPersonas.Sort(Function(persona1 As ClasePersona, persona2 As ClasePersona)
    
persona1.dni.CompareTo(persona2.dni))

miércoles, 25 de enero de 2012

En Visual Studio ha desaparecido la opción "release" en "configuraciones de soluciones"


 PROBLEMA 

En Visual Studio 2005, 2008 o 2010 ha desaparecido la opción "release" en el desplegable de "configuraciones de soluciones" en una solución.

Sólo aparece la opción "debug" en el desplegable de "configuraciones de soluciones" pero no la opción "release".




 SOLUCIÓN 

Editar el archivo .sln de la solución con un editor de texto. Comprobar que aparece la línea resaltada abajo y en caso contrario añadirla a mano.


GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection




martes, 20 de septiembre de 2011

No se pueden enviar correos electrónicos desde combinar correspondencia con Word 2003

 PROBLEMA 

No se puede enviar correos electrónicos con formato HTML desde "combinar correspondencia" en Word 2003 usando Outlook 2007.

Word 2003 no dá ningún mensaje de error, simplemente no se envían los correos electrónicos generados en la combinación de correspondencia.




 SOLUCIÓN 

Instalar Word 2007. El envío de correos de tipo HTML en combinar correspondencia desde Word 2007 y Outlook 2007 funciona perfectamente.


viernes, 3 de junio de 2011

VBScript. Script para la realización diaria de copias de seguridad. Esquema Hijo-Padre-Abuelo.

Un método ideal para mantener diferentes versiones de copia de seguridad de nuestros códigos fuente durante el proceso de desarrollo.

El esquema de copia de seguridad Hijo-Padre-Abuelo permite mantener multitud de versiones diarias de copia de seguridad de una forma óptima. Los diferentes volúmenes de copia se identifican en 3 tipos: Hijo, Padre y Abuelo. Una implementación posible consta de la siguiente configuración de copias. Volumen Hijo: Copia de seguridad diaria (se realiza una copia de seguridad incremental). Volumen Padre: Copia semanal (se realiza una copia diferencial). Volumen Abuelo: Copia mensual (se realiza una copia completa).
Con este esquema se consigue mantener versiones diarias de todos los archivos, de forma que se pueda recuperar la copia de un día determinado mediante un máximo de dos pasos: 1º recuperación de copia completa (abuelo), 2º recuperación de copia incremental (padre) y 3º recuperación de copia diferencial (hijo). Por otra parte, este esquema hace un uso óptimo del espacio de almacenamiento, pudiéndose reutilizar o deshechar las cinco copias Hijo semanalmente, las cuatro copias Padre mensualmente, y las copias Abuelo anualmente, en función de la cantidad de versiones que deseemos mantener.

- Copia completa. Copia de todos los archivos.
- Copia incremental. Copia de los cambios realizados respecto de la última copia completa.
- Copia diferencial. Copia de los cambios realizados respecto de la última copia completa o incremental.

Otra implementación posible mantiene los siguientes tipos de copia. Volumen Hijo: Copia de seguridad diaria (se realiza una copia de seguridad diferencial). Volumen Padre: Copia semanal (se realiza una copia completa). Volumen Abuelo: Copia mensual (se realiza una copia completa). Esta implementación, aunque tiene mayores requerimientos de espacio, solo requiere dos pasos para la recuperación de cualquier copia. A continuación se muestra el código en vbScript que implementa este esquema.


Código en VBScript:
'Copias:
'    LUNES.         Copia HIJO. Incremental.
'    MARTES.        Copia HIJO. Completa.
'    MIERCOLES.    Copia HIJO. Incremental.
'    JUEVES.        Copia HIJO. Incremental.
'    PRIMER VIERNES DEL MES.    Copia ABUELO. Completa.
'    RESTO VIERNES DEL MES.    Copia PADRE. Completa.

option explicit

dim fso, ws
dim CarpetaOrigen, CarpetaDestino

'LECTURA DE ARGUMENTOS
if Wscript.Arguments.Count <> 2 then
    msgBox("Parámetros incorrectos")
    WScript.quit 1
end if
CarpetaOrigen = WScript.Arguments(0)
CarpetaDestino = WScript.Arguments(1)

set fso=CreateObject("Scripting.FileSystemObject")
set ws=CreateObject("WScript.Shell")

'Martes COPIA HIJO [COMPLETA]
if weekday(now)=3 then  
    if msgbox("¿Desea realizar la copia COMPLETA-HIJO del Martes para " & CarpetaOrigen & "?",4)=6 then
        'Borrar carpeta anterior
        if ws.Run("cmd.exe /C rd " & CarpetaDestino & "\HI_" & weekdayname(weekday(now),true) & " /S /Q",1,True) then
             'OK
        end if
        'HACER COPIA COMPLETA
        if ws.Run("xcopy """ & CarpetaOrigen & """ """ & CarpetaDestino & "\HI_" & weekdayname(weekday(now),true) & "\"" /C /Y /E /H",1,True) then
             'OK 
        end if        
    end if

'Viernes COPIA PADRE [COMPLETA]  
elseif weekday(now)=6 and not ((day(now)\7)+1)=1 then  
    if msgbox("¿Desea realizar la copia COMPLETA-PADRE del Viernes para " & CarpetaOrigen & "?",4)=6 then
        if ws.Run("cmd.exe /C rd " & CarpetaDestino & "\PA_" & ((day(now)\7)+1) & " /S /Q",1,True) then
              'OK
        end if
        'HACER COMPLETA  
        if ws.Run("xcopy """ & CarpetaOrigen & """ """ & CarpetaDestino & "\PA_" & ((day(now)\7)+1) & "\"" /C /Y /E /H",1,True) then
              'OK
        end if
    end if
  
'Primer viernes del mes COPIA ABUELO [COMPLETA]  
elseif weekday(now)=6 and ((day(now)\7)+1)=1 then      
    if msgbox("¿Desea realizar la copia COMPLETA-ABUELO del mes actual" & month(now) & " para " & CarpetaOrigen & "?",4)=6 then
        if ws.Run("cmd.exe /C rd " & CarpetaDestino & "\AB_" & month(now) & " /S /Q",1,True) then
             'OK
        end if
        'HACER COPIA COMPLETA  
        if ws.Run("xcopy """ & CarpetaOrigen & """ """ & CarpetaDestino & "\AB_" & month(now) & "\"" /C /Y /E /H",1,True) then
              'OK
        end if
    end if
  
'Lunes [INCREMENTAL], Miercoles [INCREMENTAL], Jueves [INCREMENTAL]
elseif weekday(now)=2 or weekday(now)=4 or weekday(now)=5 then  
    if msgbox("¿Desea realizar la copia INCREMENTAL-HIJO del día para " & CarpetaOrigen & "?",4)=6 then
        if ws.Run("cmd.exe /C rd " & CarpetaDestino & "\HI_" & weekdayname(weekday(now),true) & " /S /Q",1,True) then
             'OK
        end if
        'HACER COPIA INCREMENTAL
        if ws.Run("xcopy """ & CarpetaOrigen & """ """ & CarpetaDestino & "\HI_" & weekdayname(weekday(now),true) & "\"" /M /C /Y /S",1,True) then
             'OK
        end if
    end if
end if
WScript.Quit



viernes, 8 de abril de 2011

Libros de ingeniería de programación


He abierto una nueva página en el blog para relacionar aquellos libros que me han ofrecido conocimientos interesantes en el campo de la ingeniería de programación. Compartiré allí mis opiniones sobre su contenido, así como, lo que me han aportado para mi trabajo diario.

Libros imprescindibles sobre ingeniería de software y metodologías de desarrollo.

La guía completa del Proceso Unificado escrita por sus creadores.
Ivar Jacobson, Grady Booch, James Rumbaugh.

viernes, 25 de marzo de 2011

Metodologías de desarrollo software para proyectos de Un-Solo-Trabajador. Problemática.



Los proyectos de software realizados por un sólo programador que hace las funciones de especificador, analista, diseñador de interfaces de usuario, arquitecto y programador, y que probablemente también atenderá los proyectos de mantenimiento tras la entrega, se enfrentan a no menos problemas de calidad que los proyectos más grandes realizados por grupos completos de desarrollo. Pero, además, estos proyectos de Un-Sólo-Trabajador caen con mayor facilidad en la falta de metodología y como consecuencia en incumplimientos de plazos, falta de documentación y dificultades de certificación o estandarización.

La mayoría de las metodologías bien definidas para proyectos de cierta envergadura y grupos de trabajo lo suficientemente grandes como para que permitan la asignación de diferentes roles no se suelen ajustar a los proyectos de Un-Sólo-Trabajador. Además en estos proyectos el programador, actuando como jefe de proyecto, raramente perjudicará su rendimiento, como generador de líneas de código, asignándose tareas de especificación de casos de uso, análisis o diseño de interfaces, todas ellas tareas cuyo producto final son textos y gráficos (nada más lejos de su objetivo primigenio).

Pero a pesar de todo ello, y sin contar con la ayuda de un departamento de calidad del software, el objetivo final de estos proyectos de Un-Sólo-Trabajador es el mismo que el de cualquier proyecto enorme, es decir:
  • Que el software final cumpla los requerimientos y expectativas del cliente.
  • Que el mantenimiento, en sus vertientes de rectificación, adaptación y mejora sean fácilmente afrontables, así como las posibles ampliaciones futuras.
  • Que se cumplan los plazos de tiempo y presupuesto.
En próximos artículos presentaré una posible implementación del Proceso Unificado de Desarrollo de Software para proyectos de Un-Sólo-Trabajador. Algo que llamaré PU-UST.

Licencia Creative Commons
Metodología de desarrollo de software para proyectos de Un-Solo-Trabajador por Jorge Ignacio Jover Bou se encuentra bajo una Licencia Creative Commons Reconocimiento-NoComercial-SinObraDerivada 3.0 Unported.

miércoles, 23 de marzo de 2011

ASP.NET. Error en postback. Error de la validación del estado de vista MAC.

 PROBLEMA 

Se produce el siguiente error al efectuar un postback tras un cierto tiempo de inactividad:

"Error de la validación del estado de vista MAC. Si un clúster o una batería de servidores Web alojan esta aplicación, asegúrese de que la configuración <machinekey> especifica la misma validationKey y el mismo algoritmo de validación. AutoGenerate no se puede utilizar en un clúster."

 SOLUCIÓN 

Poner el atributo enableViewStateMac del elemento pages de web.config a false.
<pages enableViewStateMac="false">

Más información en http://technet.microsoft.com/es-es/library/cc739441(WS.10).aspx.