martes, 26 de noviembre de 2013

Mostrar detalles horizontalmente Crystal Reports XI

En Crystal Reports (en este ejemplo la versión XI) lo que debemos hacer para que los detalles sean generados/mostrados de forma horizontal es lo siguiente:

1. Vamos al "Asistente de sección" del reporte


2. Seleccionamos la sección de detalles y le asignamos la propiedad "Formato de columnas múltiples"


3. En la pestaña que nos habrá aparecido de "Diseño" le asignamos el ancho de los campos y la separación entre los mismos.


4. Aplicamos los cambios y como podemos ver el resultado es el esperado.


Ante cualquier duda no dudéis en comentar.

Saludos.

lunes, 19 de noviembre de 2012

Validar RUC (Registro Unico Contribuyentes)

El RUC - Registro Único de Contribuyentes - es el registro informático a cargo de la SUNAT donde se encuentran inscritos los contribuyentes de todo Perú, así como otros obligados a inscribirse en él por mandato legal.

En esta entrada os dejo la función javascript que podemos utilizar para validarlo. Es la siguiente:
function validarRUC(valor) {
    valor = trim(valor)
    if (esnumero(valor)) {
        if (valor.length == 8) {
            suma = 0
            for (i = 0; i < valor.length - 1; i++) {
                digito = valor.charAt(i) - '0';
                if (i == 0) suma += (digito * 2)
                else suma += (digito * (valor.length - i))
            }
            resto = suma % 11;
            if (resto == 1) resto = 11;
            if (resto + (valor.charAt(valor.length - 1) - '0') == 11) {
                return true
            }
        } else if (valor.length == 11) {
            suma = 0
            x = 6
            for (i = 0; i < valor.length - 1; i++) {
                if (i == 4) x = 8
                digito = valor.charAt(i) - '0';
                x--
                if (i == 0) suma += (digito * x)
                else suma += (digito * x)
            }
            resto = suma % 11;
            resto = 11 - resto
            if (resto >= 10) resto = resto - 10;
            if (resto == valor.charAt(valor.length - 1) - '0') {
                return true
            }
        }
    }
    return false

domingo, 18 de noviembre de 2012

Transparencia CSS

Con esta clase en CSS le podemos añadir transparencia al objeto que deseemos, este código es compatible para todos los navegadores.

.transparente
{
    zoom: 1;
    /* Válido para Internet Explorer */
    filter: alpha(opacity=50);
    /* Firefox, Safari, Chrome, Opera, IE 9 o superior */
    opacity: 0.5; 
}

Servidor de imagenes gratuito (Blogger)

La mejor forma sin duda de subir una imagen a internet para poder acceder a ella online o reutilizarla para tu blog o tu página Web de una forma segura y gratuita es utilizando Blogger. En realidad esto no es una funcionalidad reconocida de Blogger sino una forma de aprovechar uno de los servicios de Blogger para poder guardar nuestras imagenes y poder acceder a ellas mediante una URL. El servicio en cuestión es el de poder guardar una entrada sin necesidad de publicarla.

Los pasos que debemos seguir para subir nuestras imagenes a la nube son los siguientes:


  1. Accedemos a nuestra cuenta de Blogger (si no la tenemos podemos creárnosla aquí).
  2. Una vez que tenemos nuestro blog creamos una nueva entrada e insertamos en ella la imagen en cuestión que deseamos subir a la nube.
  3. Cambiamos a la interfaz de edición HTML (botón 'HTML') y copiamos la ruta que nos ha generado a partir de la imagen subida.
  4. Guardamos la entrada sin publicarla.
  5. Ya tenemos nuestra imagen subida a la nube y accesible mediante la url que hemos obtenido. Disfrutar de este servicio gratuito!


jueves, 1 de marzo de 2012

Enviar correo con imagenes en ASP

Para enviar imagenes embebidas en un correo electrónico sin problemas desde ASP hay que añadirlas de una forma específica para que estén adjuntas al mensaje y no requieran descargarlas remotamente desde nuestro servidor. Para ello debemos de utilizar el siguiente fragmento de código:

Const CdoReferenceTypeName = 1
Dim objCDO, objBP
Set objCDO = Server.CreateObject("CDO.Message")
objCDO.MimeFormatted = True
objCDO.To = "you@yourdomain.com"
objCDO.From = "you@yourdomain.com"
objCDO.Subject = "Embedded image demo"
objCDO.HTMLBody = "<html>Mi imagen: <img src=""cid:myimage.gif""></html>"


Set objBP = objCDO.AddRelatedBodyPart(Server.MapPath("/images/myimage.gif"), "myimage.gif", CdoReferenceTypeName)


objBP.Fields.Item("urn:schemas:mailheader:Content-ID") = "<myimage.gif>"
objBP.Fields.Update

objCDO.Send

martes, 28 de febrero de 2012

Comparar cadenas en SQLServer

Si probamos a filtrar un listado de cadenas entre dos valores (desde, hasta) directamente en SQLServer (campoCadena>='010A' and campoCadena<='0100000') veremos que el resultado no es el esperado. Esto se puede solucionar creandonos la siguiente función:

CREATE FUNCTION [dbo].[compareCP] ( @cp varchar(50), @otroCP varchar(50) ) 

RETURNS int
    BEGIN
        DECLARE @position int;

        SET @position = 1

        IF(LEN(@cp)<LEN(@otroCP))
            RETURN -1
        ELSE IF(LEN(@cp)>LEN(@otroCP))
            RETURN 1
        ELSE BEGIN
            WHILE @position <= LEN(@cp)
            BEGIN   
                IF(ASCII(SUBSTRING(@cp, @position, 1))<ASCII(SUBSTRING(@otroCP, @position, 1)))
                    RETURN -1
                ELSE IF(ASCII(SUBSTRING(@cp, @position, 1))>ASCII(SUBSTRING(@otroCP, @position, 1)))
                    RETURN 1
       
                SET @position = @position + 1
            END
        END
       
        RETURN 0
    END
GO

En el ejemplo anterior damos solución a filtrar un listado de códigos postales (los cuales contienen letras) desde unos valores desde y hasta que introduzca el usuario.

Esta función devolverá 1 en el caso en el que @cp sea mayor que @otroCP, -1 en el caso contrario y 0 si són iguales.

Aquí tenemos el ejemplo de aplicación:

select codigoPostal from codigoPostal where dbo.compareCP(codigoPostal,'VALORDESDE')>=0 and dbo.compareCP(codigoPostal,'VALORHASTA')<=0

martes, 14 de febrero de 2012

Eliminar columna con restricciones en SQL Server

Para que no haya error y no tener que buscar el nombre de la restricción generada automáticamente por el sistema a una columna podemos utilizar la siguiente SQL:

declare @default sysname, @sql nvarchar(max)

select @default = name
from sys.default_constraints
where parent_object_id = object_id('MYTABLENAME')
AND type = 'D'
AND parent_column_id = (
select column_id
from sys.columns
where object_id = object_id('MYTABLENAME')
and name = 'MYCOLUMNNAME'
)

set @sql = N'alter table MYTABLENAME drop constraint ' + @default
exec sp_executesql @sql

alter table MYTABLENAME drop column MYCOLUMNNAME

go

Remplazar MYTABLENAME por el nombre de la tabla y MYCOLUMNSAME por el nombre de la columna.