lunes, 9 de mayo de 2022

Páginas en blanco al exportar a PDF un Informe con matrices

 Problema

En MS SQL Report Server, al exportar un PDF que incluye matrices  se producen páginas en blanco.

Solución

Establece en Cierto la propiedad ConsumeContainerWhitespace  del informe mismo.

Agradecimientos

Respuesta de Nicholas Roeder en StackOferflow

viernes, 21 de enero de 2022

Formulario en muddialog en linea y parpadeos

 Sintomas

Usas el componente Dialog de MudBlazor para abrir un formulario simple, el problema es que cada vez que teclean algo el formulario parpadea.

Detalles

  • El código del dialogo lo has incluido en línea, usando la propiedad visible del componente
  • Los campos tiene validación simple (requerido y máxima longitud).

Motivo

Por algún motivo al validar cada tecla se lanza un renderizado de página y el dialogo realiza la transición de apertura.

Solución (o parche)

Debes detener el renderizado con una variable y sobrecargando el evento 

        private bool _renderizar = true;
        protected override bool ShouldRender()
        {
            return _renderizar && base.ShouldRender();
        }

El valor de _renderizar debe cambiar a falso después de haber renderizado el dialogo, para lo que usamos el evento IsVisibleChanged del componente muddialog

<MudDialog IsVisible="@visible" Options="opcionesDlg" IsVisibleChanged="CambioVisibleDialogo">...

private void CambioVisibleDialogo(bool visible)
{
    if (visible) _renderizar = false;
}

Deberemos reactivar el renderizado antes de ocultar el dialogo, por ejemplo:

<MudIconButton Icon="@Icons.Material.Outlined.Cancel 
       OnClick="@(()=>{_renderizar=true; visible=false;})"/>


miércoles, 5 de enero de 2022

Mayúsculas, Minúsculas y "Exception: '<' is an invalid start of a value" en ReadFromJsonAsync (Blazor)

 Sintomas

La operación de conversión JSON a Objeto 

_datos = await q.Content.ReadFromJsonAsync<EdiProyecto.Edicion>()

Provoca el error 

"Exception: '<' is an invalid start of a value"

Por experiencia supones que está recibiendo Html en lugar de JSON, revisas la petición

var q = await Http.GetAsync($"API/Proyectos/{Id}");

Escribes en el navegador  loalhost:23234API/proyectos/ 22 y recibes JSON

¿Qué pasa?

Causa y Solución

El nombre de controlador en la URL de WEBAPI debe estar en minúsculas.

var q = await Http.GetAsync($"API/proyectos/{Id}");


martes, 30 de noviembre de 2021

Error al usar await q.Content.ReadFromJsonAsync

 Sintomas:

En Blazor WASM  se produce un error  

Microsoft.AspNetCore.Components.WebAssembly.Rendering.WebAssemblyRenderer[100]       Unhandled exception rendering component: Each parameter in the deserialization constructor on type 'CRM.Shared.Models.Notas.FilaTabla' must bind to an object property or field on deserialization. Each parameter name must match with a property or field on the object. The match can be case-insensitive.

Al convertir la respuesta de JSON a un objeto C# mediante q.Content.ReadFromJsonAsync .

Lo que te sorprende es que la clase esta definida en el proyecto Shared usado tanto por el proyecto Server del controlador Web API que envia la respuesta como por la parte del cliente donde se realiza la llamada a Content.ReadFromJsonAsync. Entonces, ¿por qué difieren los nombres?

Solución:

La clase no tiene un constructor vacio.

Observaciones

Es fácil olvidarse del constructor vacío cuando creas un construtor con parametro un entidad de EF.

viernes, 12 de noviembre de 2021

Error "Data is Null. This method or property cannot be called on Null values" en Entity Framework 6

 Descripción del problema

Acabas de instalar VS2022 y .NET6 SDK, creas un proyecto que accede a una base de datos  Para generar los modelos y mapeos usas ingeniería inversa, por ejemplo Entity Framework Generator

Creas un controlador API Get para obtener una lista de fabricas desde Blazor. ¡Oh sorpresa! La cosa no funciona. 

El mensaje de error es: "Data is Null. This method or property cannot be called on Null values"

Resolución

Debes deshabilitar Admite valores NULL en Compilación/general del proyecto donde tienes los modelos y dbcontext para acceder a la base de datos.

Explicación

En C#8 cuando habilitas la característica NRT debes usar string? para una propiedad de cadena que admita nulos y string para una que no los admita.

EF6 CORE implementa NRT mediante anotaciones, pero los generadores databasefirst no asocian el tipo string? a las propiedades mapeadas a columnas varchar nullables.


lunes, 25 de enero de 2021

No se inicia la depuraración blazor Wasm con Chrome desde VS2019

Síntomas

En Visual Studio 2019 al iniciar la depuración de una solución blazor WebAssembly .net core hospedada salta una ventana que dice:
No se puede iniciar el depurador .
Habla de un error en microsoft.visualstudio.shared.vscode debug protocol.protocolexception 

Dándole vueltas

La solución podía depurarse hasta que aparece el error ,entonces la única solución es cambiar de browser. 
El problema aparece en los navegadores de la familia chromium (Chrome, Edge,...).
Sin embargo se puede depurar con Firefox. 
Ocurre con otro tipo de soluciones aparte de Blazor Wasm

Solución

Eliminar el archivo en /.vs/[project name]/config/debuggerConfiguration-{guid}.json de la solución
Si tienes Chrome abierto cierralo.
Ya puedes depurar durante un rato.

Consejo:

Deja abierta la carpeta /.vs/[project name]/config/ para ir eliminando el archivo cada cierto tiempo.

jueves, 7 de noviembre de 2019

QRCode.js y Code Length OverFlow Error

El problema

Estoy generando QRCodes mediante  QRCode.js
https://github.com/davidshimjs/qrcodejs
Sin embargo según el contenido algunos se visualizan y otros no.
Mirando en la ventana del navegador veo:
Code Length Overflow Error
por algún problema en el código de QRCode.js

Solución

Usar la bifurcación del proyecto que realizó la compañía Keepx
https://github.com/KeeeX/qrcodejs
dado que el proyecto original no tiene mantenimiento desde hace años.

Referencias

https://github.com/davidshimjs/qrcodejs/issues/78#issuecomment-278567765

vcard, acentos y eñes.

El problema

Creas una página web desde donde pueden descargarse archivos VCard para importarlos y crear contactos en Outlook.
Todo funciona bien salvo que tildes, eñes u otros carácteres  no usados en inglés no se visualizan bien.
Por ejemplo Dª Estefanía se importa como D? Estefan?a

Contexto

El problema me apareció en un desarrollo C# MVC ASP.NET usando la librería MixERP.Net.VCards pero la solución tiene aplicación en otros contextos,

Solución

Hay que codificar con "ISO-8859-1".

Usando un controlador ASP.NET MVC el código es:

        [HttpPost]
        public ActionResult VCard(Simple cto)
        {
            var _VCard = cto.GetComplejo().getVcard(); //genera Vcard en formato MixERP.Net.VCards
            Response.Clear();
            Response.AddHeader(
                $"Content-Disposition",
                $"attachment; filename={_VCard.FormattedName }.vcf;"
                );
            var serializedvCard = _VCard.Serialize();
            return File(
                Encoding.GetEncoding("ISO-8859-1").GetBytes(serializedvCard),
                "text/x-vcard; charset=ISO-8859-1"
                );
        }

martes, 30 de octubre de 2018

Insertar HTML en el cuerpo de un mensaje Outlook 2016

Situación

Quieres insertar el contenido de un archivo HTML en un mensaje de Outlook.
No ves la opción buscas en la web y dicen que cuando adjuntas un archivo tienes un desplegable para elegir entre adjuntar o insertar como texto. Pero en la versión 365 de Outlook no ves el desplegable.

Solución 

En la barra de titulo de la ventana del mensaje hay accesos rápidos, añade el acceso rápido para adjuntar un archivo.
Cuando uses este acceso rápido para adjuntar un archivo veras que el botón insertar es un botón desplegable con la opción deseada.
(desde una respuesta en Comunidad de Microsoft

jueves, 9 de agosto de 2018

Las GPO no se aplican al arrancar

Sintomas

Últimamente mi Windows 10 no aplica las GPO por lo que entre otras no se mapean las unidades de
red y aparecen eventos 1110.

Solución

Arrancar el servicio net logon que está detenido y colocarlo en automático.

¿Por qué se ha detenido el servicio Net Logon? ¿Por qué está en manual?

El asistente de soporte de DELL establece el arranque en manual porque piensan que todos los usuarios son domésticos y no necesitan el servicio net logon.
https://www.dell.com/community/SupportAssist/Dell-SupportAssistant-sets-Netlogon-service-to-manual/td-p/6083752
😡😡😡😡😡😡😡😡😡 😡😡😡😡😡😡

jueves, 19 de abril de 2018

Dos Helpers Razor para postear diccionarios en forms y Json

Descripción

El modelo de una página Razor incluye propiedades del tipo diccionario que queremos postear como campos ocultos o mediante Json.

Solución

Para camposOcultos

@helper OcultoDictionary(Dictionary<int, int> dicc, string nombre)
    {
        var i = 0;
        foreach (var d in dicc)
        {
            <input type="hidden" value="@d.Key" name="@string.Format("{0}[{1}].Key",nombre,i)" />
            <input type="hidden" value="@d.Value" name="@string.Format("{0}[{1}].Value",nombre,i)" />
            i++;
        }
}

Ejemplo de resultados

<input type="hidden" value="1" name="ExperienciasEspecificas[0].Key" />
<input type="hidden" value="1" name="ExperienciasEspecificas[0].Value" />
<input type="hidden" value="2" name="ExperienciasEspecificas[1].Key" />
<input type="hidden" value="1" name="ExperienciasEspecificas[1].Value" />
<input type="hidden" value="3" name="ExperienciasEspecificas[2].Key" />
<input type="hidden" value="1" name="ExperienciasEspecificas[2].Value" />

Para Json

@helper JsonDiccionario(Dictionary<int, int> dic, string n)
    {
        var i = 0;
        foreach (var d in dic)
        {
            @Html.Raw($"'{n}[{i}].Key':{d.Key},")
            @Html.Raw($"'{n}[{i}].Value':{d.Value},")
            i++;
        }
}

Ejemplo de resultados

{
...
'ExperienciasEspecificas[0].Key':1,
'ExperienciasEspecificas[0].Value':1,
'ExperienciasEspecificas[1].Key':2,
'ExperienciasEspecificas[1].Value':1,
'ExperienciasEspecificas[2].Key':3,
'ExperienciasEspecificas[2].Value':1,
...
}

viernes, 1 de diciembre de 2017

Outlook no conecta pero no pide contraseña

Hace poco activé OAuth2 en mi organización Exchange de Office 365, para ello usé:
Set-OrganizationConfig -OAuth2ClientProfileEnabled $true

Al cabo de unos dias el Outlook de uno de mis usuarios dejo de sincronizar. Probé todos los métodos clásicos (crear perfiles, borrar credenciales,...etc) pero no había forma de resolverlo.

Cuando intentaba crear un perfil nuevo desde Outlook se abría una caja blanca que desaparecía inmediatamente. Leí en foros que mucha gente lo resolvía formateando el ordenador, por mi parte me "limité" a borrar el perfil del usuario Windows y volverlo a crearlo.

Pocos días después era el Outlook en mi ordenador el que daba el problema, y yo no estaba dispuesto a borrar el perfil de usuario, tengo demasiadas cosas y personalizaciones.

Después de repetir sin éxito todas los diagnósticos de Office, borrar credenciales y perfiles, desinstalar e instalar Office recordé la activación de OAuth2 y la desactivé
Set-OrganizationConfig -OAuth2ClientProfileEnabled $false

¡Problema resuelto!,...en mi ordenador, puesto que  al día siguiente el usuario al que había recreado el perfil me llama porque no se actualizaba su buzón.

Examinando los registros HKCU:\Software\Microsoft\Office\15.0\Common\Identity en su máquina y en la mía descubrí que en el perfil recién creado faltaba una clave Dword DisablePreferLiveOAuth que en mi perfil mas antiguo estaba establecida a 1.

Creando la entrada en el nuevo perfil de mi usuario, Outlook volvió a poder conectarse.

Imagino que también funcionaría a la inversa cambiar la organización para usar OAuth2 y eliminar la clave  en todas las máquinas y perfiles de usuario.


lunes, 21 de agosto de 2017

Errores Piwik al cargar plugins con sitio de mucho tráfico para periodo largo

Síntomas:

Piwik da un error en los componentes del panel que dice algo así como:
Ooops!! Hubo un problema durante la solicitud. Tal vez el servidor tenía un problema temporal, o tal vez solicitó un informe con demasiados datos,...
En inglés
Oops… there was a problem during the request. Maybe the server had a temporary issue, or maybe you requested a report with too much data,...

Solución:

Puede haber otras causas pero a mí me ha bastado con aumentar la memoria de script PHP
Archivo: /etc/php/7.0/apache2/php.ini
; Maximum amount of memory a script may consume (128MB)
; http://php.net/memory-limit
memory_limit = 384M

Recuerda regargar php.ini con sudo apachectl graceful

martes, 9 de mayo de 2017

Problemas en la sincronización de contactos Office365, Android, Outlook App y contactos de teléfono o WhatsApp

Los problemas:

Parece una buena idea usar la app Outlook para acceder a tu correo en Office 365, al fin y al cabo Outlook es el cliente de correo Microsoft ¿no? Sin embargo puede resultar un quebradero de cabeza la sincronización de los contactos.

Primer problema

Una vez instalada la aplicación veras los contactos de Office 365 en Outlook pero no en los contactos del teléfono.
Lo que es peor, en las llamadas telefónicas y chats de WhatsApp se ven números en lugar de nombres.
Entonces en los ajustes de la cuenta que usa Outlook ves una opción "Sincronizar contactos", la activas y ¡oh maravilla! ya tienes nombres en el ¡WhatsApp!
No te engañes porque ahora viene el segundo problema

Segundo problema

Ahora resulta que te han llamado o chateado desde un nuevo número y lo añades como contacto con nombre. Verás que al cabo de unos minutos el nuevo contacto ha desaparecido y en el registro de llamadas solo aparece el número.
Resulta que la sincronización de contactos que activaste antes solo se realiza en una dirección desde Office 365 hacia los contactos del teléfono y no al revés.

Las soluciones

En breve: Debe crearse una cuenta Microsoft Exchange Active Sync para sincronizar los contactos.

En mi teléfono los pasos a seguir son:
 
1.       En la aplicación Outlook
a.       Id a configuración (rueda dentada arriba derecha)
b.       Pulsad en vuestra cuenta de correo (la dirección)
c.       Si está activado Sincronizar contactos DESACTIVADO. (puede estar ya desactivado, pero…)
2.       En  los contactos del teléfono
a.       Id a ajustes (tres puntos en vertical arriba derecha)
b.       Elegid contactos (segunda opción)
c.       En la lista que aparece al final está cuentas, dadle
d.       Ahora pulsad Añadir cuenta
e.       Elegid Microsoft Exchange ActiveSync
f.        Escribid vuestra dirección de correo y contraseña
                  g.    Aceptar todo en las pantallas siguientes
Pero ya sabéis que en cada teléfono las cosas las hacen distintas, en algunos tendrás que entrar por ajustes.

viernes, 23 de septiembre de 2016

Actualización a Windows 10 edición aniversario con WSUS

Escribo esto por si algún otro hispano parlante está sufriendo los problemas que yo he pasado ayer y hoy.Imagino que MS corregirá la KB.

Resulta que para distribuir la actualización de Windows 10 aniversario mediante WSUS hay que instalar al servidor WSUS la actualización  KB3159706  distribuida mediante windows update.
No solo eso sino que despues de instalarla debes realizar unas tareas manuales descritas en la KB3159706 correspondiente.
Si no lees el articulo, no realizas la tareas posteiores y apruebas las actualizaciones el WSUS se quedará  en un estado incoherente.
Como puedes imaginar hay mucha gente que ha caído en la trampa.

Finalmente Microsoft publicó ayer una solución pasa por aplicar una serie de scripts PowerShell y TSQL descritos en la KB3194588

Desgraciadamente el script que suministran solo funciona  en versiones inglesas y aquellas lenguas donde versión se escriba version. En portugués tampoco debe ir.

El problema está en una línea que busca en la descripción de las actualizaciones 
$1607Updates = $s.SearchUpdates(“version 1607”)

Esta línea no devuelve los updates en español que usan la palabra versión con tilde.
Y luego el T-SQL tampoco hacen nada por supuesto.

Hay que usar
$1607Updates = $s.SearchUpdates(“versión 1607”)

Una vez reparado el WSUS probablemente tendrás que dar una limpieza al cliente de windows update tal como indica la KB

Acceder a la Base de datos de WSUS

Problema:

Has usado la base de datos interna de Windows para WSUS y tienes que acceder para aplicar TSQL de una KB. ¿Como abrirla desde SQL Server Management Studio (instalado en la misma maquina)

Solución:

Ejecutar  SQL Server Management Studio en modo administrador y abrir copiando y pegando:
    \\.\pipe\MICROSOFT##WID\tsql\query


jueves, 10 de marzo de 2016

jquery.validation de un tinyMCE en un paso de jquery.steps

Sumario:

Tienes una página construida con plugin jquery.steps para asistentes (Wizards). Uno de los pasos es un texto HTML editado con tinyMCE. El elemento textarea que corresponde al este editor esta marcado como requerido para la validación mediante jquery.validation:
id= "CuerpoHTML" data-val="true" data-val-required="El campo Cuerpo de la noticia es obligatorio."
Sin embargo la validación no funciona: cuando dejas el texto vacio puedes pasar al siguiente paso.

Solución:

Tienes que hacer dos cosas cuando avanzas al siguiente paso del texto enriquecido.
  • Guardar el texto editado con tinyMCE.triggerSave()
  • Habilitar la validación de campos oculto
Para abreviar copio el código


        var stepTinyMCE = 1; // (manual pero puede automatizarse) Recordar que empieza en cero
        var form = $('form');
        form.children("div").steps({
            headerTag: "h2",
            bodyTag: "section",
            transitionEffect: "slideLeft",
            onStepChanging: function (event, currentIndex, newIndex) {
                if (currentIndex > newIndex)
                {
                    return true
                }
                else if (currentIndex == stepTinyMCE)  //paso del tinyMCE
                {
                    form.validate().settings.ignore = "";
                    tinymce.triggerSave();
                    return $('#CuerpoHTML').valid();
                } else 
                {
                    form.validate().settings.ignore = ":disabled,:hidden";
                    return form.valid();
                }
            },
            onFinishing: function (event, currentIndex) {
                form.validate().settings.ignore = ":disabled";
                return form.valid();
            },
            onFinished: function (event, currentIndex) {
                alert("Submitted!");
            }
        });

jueves, 29 de octubre de 2015

Perdida intellisense en Visual Studio 2015

Síntomas

En una vista parcial razor escribes @Model y no es reconocido. Tampoco los helpers en @Html

Solución

Ejecuta %PROGRAMFILES(x86)%\Microsoft Visual Studio 14.0\Common7\IDE\devenv /resetuserdata

CUIDADO

Pierdes todos las extensiones que has añadido

domingo, 6 de septiembre de 2015

Tamaño de letra en el editor de texto enriquecido de umbraco

Problema

El tamaño de letra en el editor de texto enriquecido de umbraco es demasiado pequeño (11px)

Solución

Edita umbraco\lib\tinymce\skins\umbraco\content.min.css y cambia el tamaño de body.mce-content-body (si de paso lo minimizas mejor)

lunes, 24 de agosto de 2015

RSAT para Windows se instala pero no se vé

Contexto:

A final de Agosto de 2010 Microsoft a puesto a disposición de los administrators lel paquete RSAT que permite administrar los servidores de directorio activo, DNS,...etc.
Digo Administrators porque como es habitual en Microsoft solo ha suministrado la versión en-US del paquete.
Esto no seria problema si el paquete se instalar con textos en inglés o si al menos advirtiera que del problema.
Pero no. Después de instalas, no encuentras los programas, ¡ni siquiera con el mágico Cortana!
Cada vez que veo las fotos multiraciales de la publicidad de Microsoft me entran ganas de soltarles una pedorreta

Solución:

Antes de instalar RSAT, debes añadir el lenguaje Inglés (americano) desde el panel de control. No te olvides de entrar en las opciones y descargar el paquete.
Establece este idioma por defecto, cierra sesión instala y recupera tu idioma.