“No se pudo cargar el informe” – se ha alcanzado el máximo de número de tareas. Crystal Reports

Al lanzar varios informes de Crystal, me encuentro con este error y su solución:

Crystal solo permite generar 75 reportes

Por tanto, modificar con regedit:

HKEY_LOCAL_MACHINE\SOFTWARE\SAP BusinessObjects\Crystal Reports for .NET Framework 4.0\Report Application Server\InProcServer\PrintJobLimit

y cambiar valor de 75 a -1 (ilimitado).

PERO!! lo que realmente tenemos que hacer es utilizar los métodos Close y Dispose, ya que con esto vamos marcando los reports para que GC los elimine de memoria y podremos generar tantos como necesitemos.

El problema no es tanto de Crystal, sino de la mala gestión de los recursos que podamos hacer en nuestro código.

🙂

 

Anuncios

Entity Framework Performance with Bulk Operations

EF tiene un grave problema por resolver al que, según parece, en EF Core se dará solución: Bulk Operations.

Hacer un INSERT, un DELETE o un UPDATE de tan solo 20k registros se puede tomar minutos ya que por cada registro se llama a la DB (imaginemos para cientos de miles o millones de registros) y esto es una muy mala idea, no solo por la velocidad de nuestro proceso, sino porque se puede estar molestando a otros procesos al llamar continuamente a la DB.

Para corregir este problema hay soluciones de pago: http://entityframework-extensions.net/#pro

Y proyectos Open Source, uno en codeplex y otro en Github y ambos se instalan con Nuget:

🙂

The default DbConfiguration instance was used by the Entity Framework before the ‘xxxxxxxConfiguration’ type was discovered. An instance of ‘xxxxxxxConfiguration’ must be set at application start before using any Entity Framework features or must be registered in the application’s config file.

A la hora de configurar el EntityFramework para añadir algún tipo de estrategia o configuración adicional, debemos indicar en el Web.config, dónde está dicha configuración, por lo que no deberemos olvidar añadir el atributo  codeConfigurationType=”[name space], [assembly name]” a la etiqueta entityFramework.

Si no lo hacemos así, nos aparecerá el error del título.

🙂

 

JavaScript: pasar números a letras (usando matrices)

Mismo caso que el anterior, pasar números a letras pero en este caso usando 3 matrices para ver su uso.

var gUnidad = ["", "uno", "dos", "tres", "cuatro", "cinco", "seis", "siete", "ocho", "nueve"];
var gDecena = [
    10, "diez", 11, "once", 12, "doce", 13, "trece",
    14, "catorce", 15, "quince", 20, "veinte",
    30, "treinta", 40, "cuarenta", 50, "cincuenta",
    60, "sesenta", 70, "setenta", 80, "ochenta",
    90, "noventa"
];
var gCentena = [
    "ciento", "doscientos", "trescientos", "cuatrocientos", "quinientos", "seiscientos", "setecientos", "ochocientos",
    "novecientos"
];


function formatearALetra() {
    var num = document.getElementById("numero").value;
    console.log(formatNumeroToString(num));
};

function formatNumeroToString(numero) {
    if (isNaN(numero) || numero < 1 || numero > 99999)
        throw "número no válido";
    return decenamillar(numero);
}

function decenamillar(numero) {
    if (numero < 10)
        return unidad(numero);
    if (numero < 99)
        return decena(numero);
    if (numero < 999)
        return centena(numero);
    if (numero < 9999)         
        return millar(numero);
    if (numero > 99999)
        throw "decena millar no válido";

    var mil = numero.toString().substring(0, 2);
    return decena(mil) + " mil " + centena(numero.toString().substring(2));
}

function millar(numero) {
    if (numero < 10)
        return unidad(numero);
    if (numero < 99)
        return decena(numero);
    if (numero < 999)         
       return centena(numero);     
    if (numero > 9999)
        throw "decena no válido";

    var mil = numero.toString().substring(0, 1);


    return mil !== "1"
        ? unidad(mil) + " mil " + centena(numero.toString().substring(1))
        : "mil " + centena(numero.toString().substring(1));
}

function centena(numero) {

    if (numero < 10)
        return unidad(numero);
    if (numero < 99)         
        return decena(numero);     
    if (numero > 999)
        throw "centena no válido";
    if (numero === "100")
        return "cien";

    var cen = numero.toString().substring(0, 1);

    return gCentena[cen - 1] + " " + decena(numero.toString().substring(1));
}

function decena(numero) {
    numero = parseInt(numero, 10);
    if (numero < 10)         
        return unidad(numero);     
    if (numero > 99)
        throw "decena no válido";
    if (gDecena.indexOf(numero) >= 0)
        return gDecena[gDecena.indexOf(numero) + 1];
   
    var uni = numero.toString().substring(numero.toString().length - 1);
    return decenaRara(numero) + unidad(uni);
   
};

function decenaRara(num) {
    var primero = num.toString().substring(0, 1);
    switch (primero) {
    case "1":
        return "dieci";
    case "2":
        return "veinti";
    default:
        return decena(primero + "0") + " y ";
    }
}

function unidad(numero) {
    numero = parseInt(numero, 10);
    if (numero < 0 || numero > 9)
        throw "unidad no válido";

    return gUnidad[numero];
}

JavaScript: pasar número a letras (switch)

Este sería un bonito código con switch para pasar tus números a letras, admite del 1 al 99.999, pero es muy sencillo de ir ampliando.

function formatearALetra() {
//en el HTML podéis poner este elemento con el input del usuario
    var num = document.getElementById("numero").value;
    console.log(formatNumeroToString(num));
};

function formatNumeroToString(numero) {
    if (isNaN(numero) || numero < 1 || numero > 99999)
        throw "número no válido";
    return decenamillar(numero);
}

function decenamillar(numero) {
    if (numero < 10)
        return unidad(numero);
    if (numero < 99)
        return decena(numero);
    if (numero < 999)
        return centena(numero);
    if (numero < 9999)                  
        return millar(numero);          
    if (numero > 99999)
        throw "decena millar no válido";

    var mil = numero.toString().substring(0, 2);
    return decena(mil) + " mil " + centena(numero.toString().substring(2));
}

function millar(numero) {
    if (numero < 10)
        return unidad(numero);
    if (numero < 99)
        return decena(numero);
    if (numero < 999)                  
        return centena(numero);          
    if (numero > 9999)
        throw "millar no válido";

    var mil = numero.toString().substring(0, 1);

    return mil !== "1"
        ? unidad(mil) + " mil " + centena(numero.toString().substring(1))
        : "mil " + centena(numero.toString().substring(1));
}

function centena(numero) {

    if (numero < 10)
        return unidad(numero);
    if (numero < 99)                  
        return decena(numero);     
    if (numero > 999)
        throw "centena no válido";
    if (numero === "100")
        return "cien";
    var cen = numero.toString().substring(0, 1);
    switch (cen) {
    case "1":
        cen = "ciento";
        break;
    case "2":
        cen = "doscientos";
        break;
    case "3":
        cen = "trescientos";
        break;
    case "4":
        cen = "cuatrocientos";
        break;
    case "5":
        cen = "quinientos";
        break;
    case "6":
        cen = "seiscientos";
        break;
    case "7":
        cen = "setecientos";
        break;
    case "8":
        cen = "ochocientos";
        break;
    case "9":
        cen = "novecientos";
        break;

    };
    return cen + " " + decena(numero.toString().substring(1));
}

function decena(numero) {
    numero = parseInt(numero, 10);
    if (numero < 10)                  
        return unidad(numero);      
    if (numero > 99)
        throw "decena no válido";

    switch (numero) {
    case 10:
        return "diez";
    case 11:
        return "once";
    case 12:
        return "doce";
    case 13:
        return "trece";
    case 14:
        return "catorce";
    case 15:
        return "quince";
    case 20:
        return "veinte";
    case 30:
        return "treinta";
    case 40:
        return "cuarenta";
    case 50:
        return "cincuenta";
    case 60:
        return "sesenta";
    case 70:
        return "setenta";
    case 80:
        return "ochenta";
    case 90:
        return "noventa";
    default:
        var uni = numero.toString().substring(numero.toString().length - 1);
        return decenaExcepcion(numero) + unidad(uni);
    }
};

function decenaExcepcion(num) {
    var primero = num.toString().substring(0, 1);
    switch (primero) {
    case "1":
        return "dieci";
    case "2":
        return "veinti";
    default:
        return decena(primero + "0") + " y ";
    }
}

function unidad(numero) {
    numero = parseInt(numero, 10);
    if (numero < 0 || numero > 9)
        throw "unidad no válido";

    switch (numero) {
    case 1:
        return "uno";
    case 2:
        return "dos";
    case 3:
        return "tres";
    case 4:
        return "cuatro";
    case 5:
        return "cinco";
    case 6:
        return "seis";
    case 7:
        return "siete";
    case 8:
        return "ocho";
    case 9:
        return "nueve";
    default:
        return "";
    }
}