viernes, 17 de diciembre de 2010

PadLeft en SQL SERVER

Desafortunadamente SQL SERVER 2008 y versiones anteriores no tiene esta función por lo que podríamos crear una consulta de la sig forma

SELECT ISNULL(REPLICATE('0', 5 - len(ISNULL('2' ,0))), '') + '2'

La cual regresaría 00002

¿Cómo Funciona?
La función replicate duplica un carácter el número de veces que le indiquemos,
aplicamos la fórmula para determinar el tamaño de la replicación, esto sería
replicacion=longitud total del campo-longitud actual de la cadena de caracteres
una vez que obetenemos la replicación simplemente sumamos la cadena de carácteres

Ahora si se ocupa muchas veces podríamos hacer una función

CREATE FUNCTION [dbo].[PadLeft]
(@Secuencia varchar(16),
@caracter char(1),
@longitud int
)
RETURNS varchar(16) AS
BEGIN
DECLARE @curSeq varchar(16)
SELECT @curSeq = ISNULL(REPLICATE(@caracter, @longitud - len(ISNULL(@Secuencia ,0))), '') + @Secuencia
RETURN @curSeq
END

La podemos probar de la sig. forma

SELECT dbo.PadLeft('9','0',5)
SELECT dbo.PadLeft('10','0',5)

--Util para manejo de folios

Diferencias CHAR,VARCHAR Y TEXT en MYSQL

La mayoría de veces que trabajamos con cadenas en MYSQL no nos ponemos a pensar cuando utilizar uno u otro tipo de dato, pues bueno aquí les van las diferencias más básicas.

El tipo char se debe de usar para cadenas con un tamaño fijo: por ejemplo folios, claves, matrículas.
Que es lo que pasa  si por ejemplo declaro un char de 5 y solo ocupo 2 espacios, pues el manejador de base de datos lo rellena por lo que se podría decir que 3 espacios quedan desperdiciados

El tipo varchar se debe usar para cadenas cuyo tamaño es variable.

La principal diferencia entre el tipo text y varchar es que el tipo text no acepta valores default o predeterminados.

Consideremos que una de las mejores prácticas es tratar siempre de trabajar con valores NO NULOS, ya que el manejador de base de datos tiene que hacer un proceso especial para trabajar con estos valores, aparte te ahorras tiempo quitandote la validacion  IFNULL equivalente a ISNULL en sql server

martes, 23 de noviembre de 2010

Poner el foco en un control con .net con un Scriptmanager de un Masterpage

Si se va utilizar más de tres veces por ejemplo en validaciones recomiendo crear una función como la siguiente:

    Public Sub enfocar(ByVal ctrl As Control)
        Dim tsm As AjaxControlToolkit.ToolkitScriptManager

       'Id del ScriptManager en la masterPage
        tsm = Master.FindControl("ToolkitScriptManager1")
        tsm.SetFocus(ctrl)
    End Sub


Nota el ToolScriptManager es contenido en el ajax control toolkit sin embargo brinda la misma funcionalidad del scriptmanager(por lo que debería de funcionar con un scriptmanager solo que la declaración sería  dim sm as ScriptManager), de hecho lo hereda la principal diferencia es que el ToolScriptManager según reduce el tráfico de red

Por ultimo sería llamar a la función

enfocar(txtcajadetexto)
'Tambien debería de funcionar con otros controles

Poner el foco en un control con .net

Generalmente cuando programamos en .net es necesario poner el foco en un determinado control, bueno pues esto es muy sencillo cuando utilizas un control ScriptManager simplemente hay que mandarlo llamar de la siguiente forma:

Scriptmanager.setFocus(txtcajatexto)

domingo, 21 de noviembre de 2010

Paseando por el museo de la caricatura

Bueno pues hace unos días pase por el museo de la caricatura y encontre una imagen que me pareció bastante graciosa, tuve la fortuna de que me hiciera una caricatura un caricaturista del periódico Excelsior, el cual muy amablemente me proporciono sus datos y me mostro algunos de sus trabajos, dejo su página para que se den un quemón http://luisxaviercartones.blogspot.com/

Y tu que tipo de Paradigma de desarrollo utlizas????

Bueno este video lo vi hace ya tiempo en la certificación de desarrollador de 5 estrellas que lleve, la quinta estrella en el módulo 2 de arquitectura de software es para mi uno de los más importantes y de lo cuales llamaron más mi atención, desafortunadamente en la página de desarrollador 5 estrellas el material ya no esta disponible así que encontre un link el cual contiene información sobre la arquitectura de software, paradigmas y muchas otras cosas, estan wmv y pueden verlos espero que les sirva http://juank.solocodigo.com/5%20Estrella/Videos%20Arquitectura/

martes, 16 de noviembre de 2010

Agregar, Eliminar Cambiar tipo de dato en columnas sql server

Para Agregar una columna
------------------------------
ALTER TABLE table_name
ADD column_name datatype
------------------------------
Para Eliminar una columna
------------------------------
ALTER TABLE table_name
DROP COLUMN column_name ------------------------------
Para cambiar tipo de datos
------------------------------
ALTER TABLE table_name
ALTER COLUMN column_name datatype

Cargar o Subir un archivo de Excel extension xls o xlsx en vb .net

Este código lo encontre ya hace tiempo googleando sin embargo era muy extenso lo simplifique lo más que pude y bueno aquí lo dejo:
Imports System.Data
Imports System.Data.OleDb
Imports System.IO
Imports System.Configuration
  Public Sub CargarArchivoX()
        If FileUpload1.HasFile Then
            Dim FileName As String = Path.GetFileName(FileUpload1.PostedFile.FileName)
            Dim Extension As String = Path.GetExtension(FileUpload1.PostedFile.FileName)
            Dim FilePath As String = Server.MapPath("../../Upload/") & FileUpload1.FileName
            FileUpload1.SaveAs(Server.MapPath("../../Upload/") & FileUpload1.FileName)
            extraedatosX(FilePath, Extension, "Yes")
        End If
    End Sub
    Public Sub extraedatosX(ByVal FilePath As String, ByVal Extension As String, ByVal isHDR As String)
        Dim conStr As String = ""
        Select Case Extension
            Case ".xls"
                'Excel 97-03
                'conStr = ConfigurationManager.ConnectionStrings("Excel03ConString").ConnectionString()
                conStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties='Excel 8.0;HDR={1}'"
                Exit Select
            Case ".xlsx"
                'Excel 07
                 'conStr = ConfigurationManager.ConnectionStrings("Excel07ConString").ConnectionString
                conStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 8.0;HDR={1}'"
                Exit Select
        End Select
        conStr = String.Format(conStr, FilePath, isHDR)
        Dim connExcel As New OleDbConnection(conStr)
        Dim cmdExcel As New OleDbCommand()
        Dim oda As New OleDbDataAdapter()
        Dim dt As New DataTable()
        cmdExcel.Connection = connExcel
        'Get the name of First Sheet
        connExcel.Open()
        Dim dtExcelSchema As DataTable
        dtExcelSchema = connExcel.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, Nothing)
        'dtExcelSchema.Rows.C()
        Dim SheetName As String = dtExcelSchema.Rows(0)("TABLE_NAME").ToString()
        connExcel.Close()
        'Read Data from First Sheet
        connExcel.Open()
        cmdExcel.CommandText = "SELECT * From [" & SheetName & "]"
        oda.SelectCommand = cmdExcel
        oda.Fill(dt)
        connExcel.Close()
        grdgenerico.Caption = Path.GetFileName(FilePath)
        grdgenerico.DataSource = dt
        grdgenerico.DataBind()
    End Sub


Tomando en cuenta que tienen un boton o un link button que al darle click simplemente debe mandar llamar la función CargarArchivoX() y que se debe contar con un FileUpload llamado FileUpload1 y por último un gridview llamado grdgenerico y una carpeta llamada Upload dos niveles arriba de la Aplicacion con permisos de escritura

viernes, 12 de noviembre de 2010

Identificar la llave primaria de una tabla(Primary Key)

Algunas veces debido a que las relaciones entre tablas no estan bien hechas es necesario conocer el nombre de la tabla que tiene un campo o columna identity, por ejemplo supongamos que tengo una tabla con un campo id_banco que hace referencia a otra tabla, desafortunadamente como no tengo una relación, esto no lo puedo ver en los diagramas, en un post anterior hice un store procedure que busca campos y texto buscar un campo en la base de datos, pero se pierde mucho tiempo bueno pues aquí dejo una consulta que a partir del nombre de la columna puede obtener el nombre de la tabla

SELECT 
    TC.TABLE_NAME, 
    TC.CONSTRAINT_NAME, 
    KCU.COLUMN_NAME, 
    KCU.ORDINAL_POSITION 
FROM 
    INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC
    INNER JOIN
    INFORMATION_SCHEMA.KEY_COLUMN_USAGE KCU
    ON TC.CONSTRAINT_NAME = KCU.CONSTRAINT_NAME 
WHERE
    TC.CONSTRAINT_TYPE = 'PRIMARY KEY'
    AND COLUMN_NAME='Id_Banco'
    -- AND T.TABLE_NAME = 'table_name'
ORDER BY
    TC.TABLE_NAME,
    KCU.ORDINAL_POSITION

martes, 26 de octubre de 2010

Bloquear una pantalla con css(Tipo Modal)

Algunas veces es necesario hacer un bloqueo de una pantalla en forma modal, este código lo he probado en Firefox 3 e Internet Explorer 6,7,8 y va dentro de las etiquetas style o si lo prefieren en una hoja de estilo externa.
   #Bloquear{
      background:#000000;
      width: 100%;
      height: 100%;
      filter:alpha(opacity=50);
      opacity:0.5;
       margin: 0px;
      position: absolute;
      left: 0px;
      top: 0px;
      right: 0px;
      z-index:1000;
      cursor: wait;  
      margin: 0px;
      padding: 0px;
      /* display: none;*/
    }


Tomando en cuenta que debería de existir un div así <div id="Bloquear"></div>

Algunas veces el bloqueo de la pantalla no lo hace completamente en Internet explorer 8 por lo que habría que agregarle las siguiente línea a la hoja de estilo en cascada.

html
{
    padding: 0;
    margin: 0;
    height: 100%;
    width: 100%;
}

Todos los internet explorer IETESTER

Algunas veces es necesario probar alguna página en diferentes versiones de Internet Explorer por lo menos 6,7,8, afortunadamente existe una herramienta que nos permite hacer esto IETESTER.

lunes, 25 de octubre de 2010

viernes, 22 de octubre de 2010

Tipos de Jefes

Encuentre a su jefe:

El “toma rehenes”: le atrapa en su cubículo y habla hasta que se le caen las orejas
El “fraudulento”: recurre a vigorosos gestos de asentimiento para simular comprensión.
El “embustero motivador”: no tiene idea de lo que usted hace pero le dice que es el mejor o la estrella del equipo verdad MIGUEL RUIZ un saludo.
El “sobre ascendido”: intenta ocultar su incompetencia con una pobre comunicación.
El “comadreja”: se acredita el duro trabajo que hizo usted.
El “moises”: se pasa la vida esperando señales claras de arriba.
El “jefe perfecto”: fallece por causas naturales un jueves por la tarde.
Tomado del Libro: El principio de Dilbert de Scott Adams.

viernes, 15 de octubre de 2010

Extraer texto de una imagen o convertir una imagen a texto

No se si les ha pasado alguna vez que tienen una imagen y esta le quieren extraer el texto, por ejemplo una imagen de un documento escandeado del que se requiera extraer el texto para hace un reporte bueno pues generalmente necesitan un programa OCR, afortundamente existe una herramienta en linea que hace esto espero y les sirva http://www.free-ocr.com/

jueves, 14 de octubre de 2010

Talento

Todos los viernes trataré de poner una tira como esta.

Diferencia Paso por Referencia y Paso por valor

Bueno algunas veces me hacen algunos compas esa pregunta, y pues es algo muy sencillo cuando se envía por valor se hace una copia del valor de la variable, al ser una copia esta se le pueden asignar multiples valores que no afectaran el valor de la original. Bueno les dejo una liga del compa guille el explica esto más a detalle, así como conversiones entre vb.net y c# Equivalencias el guille.
Y dejo un ejemplito


 Public Sub pasaparametro(ByRef a, ByVal b)
        a = 1
        b = 333 'Esta variable es una copia pirata
 End Sub  

'Cuando la llamamos
Dim a as integer=0
Dim b as integer=0

pasaparametro(a,b)
'Ahora a tiene 1
'Y b sigue con su 0

Y que tiene esto de maravilloso, pues que los parametros por referencia en vb.net nos sirven como parametros de salida, es decir que de una función o procedimiento puedo retornar muchos parametros de salida,rompiendo la limitante de retornar solo un parametro.

martes, 12 de octubre de 2010

Tomando nota en las Juntas

La ardua tarea de tomar nota, afortunadamente nunca he visto un caso así.

Punto de contacto

Una cosa va encadenada a otra cosa :s

Críticando a la empresa

No se si les ha pasado que a veces alguien tiene una idea, y nadie lo pela en la empresa, y algunas veces le dan ganas de contarselo alguien o bien escribirlo, con esto no quiere decir que este criticando donde trabajo, bueno pues una imagen habla por sí sola.

Nueva Categoría en el blog Diversión

Bueno no se que animalillo me ha picado he leido algunos libros estos ultimos meses, y pues buscando que leer en la red me encontre con una serie de comics que me ha hecho morir de risa y reflexionar un poco, y pues me hice la pregunta ¿porque no pongo una categoría de entretenimiento?, y pues bueno, creo que a veces jugando támbien se aprende.

lunes, 11 de octubre de 2010

Problema Release / Debug modo no estan disponibles vs2005

Hay veces que el modo de compilación no aparece en vs2005, pues bien para que aparezca hay que seguir estos sencillos pasos.
Ir al menu de herramientas->Opciones->Expandir proyectos y soluciones, click en general y seleccionar
Mostrar configuraciones de generacion avanzadas.

Convertir numero a Texto en SQL SERVER

Continuando con el post anterior solo comente algunas líneas, y listo
 --http://lafabricadesoftware.blogspot.com/
CREATE FUNCTION [dbo].[fn_numeroa_Texo](@Numero NUMERIC(20,2))
RETURNS VARCHAR(700)
BEGIN
 DECLARE @letras VARCHAR(700)
  DECLARE @lnEntero INT,
    @lcRetorno VARCHAR(512),
    @lnTerna INT,
    @lcMiles VARCHAR(512),
    @lcCadena VARCHAR(512),
    @lnUnidades INT,
    @lnDecenas INT,
    @lnCentenas INT,
    @lnFraccion INT
 ---Uso SELECT dbo.rh_fn_Dinero_a_Texo(200)
  SELECT @lnEntero = CAST(@Numero AS INT),
    @lnFraccion = (@Numero - @lnEntero) * 100,
    @lcRetorno = '',
    @lnTerna = 1

  WHILE @lnEntero > 0
  BEGIN /* WHILE */

    -- Recorro columna por columna
    SELECT @lcCadena = ''
    SELECT @lnUnidades = @lnEntero % 10
    SELECT @lnEntero = CAST(@lnEntero/10 AS INT)
    SELECT @lnDecenas = @lnEntero % 10
    SELECT @lnEntero = CAST(@lnEntero/10 AS INT)
    SELECT @lnCentenas = @lnEntero % 10
    SELECT @lnEntero = CAST(@lnEntero/10 AS INT)

    -- Analizo las unidades
    SELECT @lcCadena =
    CASE /* UNIDADES */
      WHEN @lnUnidades = 1 AND @lnTerna = 1 THEN 'UNO ' + @lcCadena
      WHEN @lnUnidades = 1 AND @lnTerna <> 1 THEN 'UN ' + @lcCadena
      WHEN @lnUnidades = 2 THEN 'DOS ' + @lcCadena
      WHEN @lnUnidades = 3 THEN 'TRES ' + @lcCadena
      WHEN @lnUnidades = 4 THEN 'CUATRO ' + @lcCadena
      WHEN @lnUnidades = 5 THEN 'CINCO ' + @lcCadena
      WHEN @lnUnidades = 6 THEN 'SEIS ' + @lcCadena
      WHEN @lnUnidades = 7 THEN 'SIETE ' + @lcCadena
      WHEN @lnUnidades = 8 THEN 'OCHO ' + @lcCadena
      WHEN @lnUnidades = 9 THEN 'NUEVE ' + @lcCadena
      ELSE @lcCadena
    END /* UNIDADES */

    -- Analizo las decenas
    SELECT @lcCadena =
    CASE /* DECENAS */
      WHEN @lnDecenas = 1 THEN
        CASE @lnUnidades
          WHEN 0 THEN 'DIEZ '
          WHEN 1 THEN 'ONCE '
          WHEN 2 THEN 'DOCE '
          WHEN 3 THEN 'TRECE '
          WHEN 4 THEN 'CATORCE '
          WHEN 5 THEN 'QUINCE '
          ELSE 'DIECI' + @lcCadena
        END
      WHEN @lnDecenas = 2 AND @lnUnidades = 0 THEN 'VEINTE ' + @lcCadena
      WHEN @lnDecenas = 2 AND @lnUnidades <> 0 THEN 'VEINTI' + @lcCadena
      WHEN @lnDecenas = 3 AND @lnUnidades = 0 THEN 'TREINTA ' + @lcCadena
      WHEN @lnDecenas = 3 AND @lnUnidades <> 0 THEN 'TREINTA Y ' + @lcCadena
      WHEN @lnDecenas = 4 AND @lnUnidades = 0 THEN 'CUARENTA ' + @lcCadena
      WHEN @lnDecenas = 4 AND @lnUnidades <> 0 THEN 'CUARENTA Y ' + @lcCadena
      WHEN @lnDecenas = 5 AND @lnUnidades = 0 THEN 'CINCUENTA ' + @lcCadena
      WHEN @lnDecenas = 5 AND @lnUnidades <> 0 THEN 'CINCUENTA Y ' + @lcCadena
      WHEN @lnDecenas = 6 AND @lnUnidades = 0 THEN 'SESENTA ' + @lcCadena
      WHEN @lnDecenas = 6 AND @lnUnidades <> 0 THEN 'SESENTA Y ' + @lcCadena
      WHEN @lnDecenas = 7 AND @lnUnidades = 0 THEN 'SETENTA ' + @lcCadena
      WHEN @lnDecenas = 7 AND @lnUnidades <> 0 THEN 'SETENTA Y ' + @lcCadena
      WHEN @lnDecenas = 8 AND @lnUnidades = 0 THEN 'OCHENTA ' + @lcCadena
      WHEN @lnDecenas = 8 AND @lnUnidades <> 0 THEN 'OCHENTA Y ' + @lcCadena
      WHEN @lnDecenas = 9 AND @lnUnidades = 0 THEN 'NOVENTA ' + @lcCadena
      WHEN @lnDecenas = 9 AND @lnUnidades <> 0 THEN 'NOVENTA Y ' + @lcCadena
      ELSE @lcCadena
    END /* DECENAS */

    -- Analizo las centenas
    SELECT @lcCadena =
    CASE /* CENTENAS */
      WHEN @lnCentenas = 1 AND @lnUnidades = 0 AND @lnDecenas = 0 THEN 'CIEN ' + @lcCadena
      WHEN @lnCentenas = 1 AND NOT(@lnUnidades = 0 AND @lnDecenas = 0) THEN 'CIENTO ' + @lcCadena
      WHEN @lnCentenas = 2 THEN 'DOSCIENTOS ' + @lcCadena
      WHEN @lnCentenas = 3 THEN 'TRESCIENTOS ' + @lcCadena
      WHEN @lnCentenas = 4 THEN 'CUATROCIENTOS ' + @lcCadena
      WHEN @lnCentenas = 5 THEN 'QUINIENTOS ' + @lcCadena
      WHEN @lnCentenas = 6 THEN 'SEISCIENTOS ' + @lcCadena
      WHEN @lnCentenas = 7 THEN 'SETECIENTOS ' + @lcCadena
      WHEN @lnCentenas = 8 THEN 'OCHOCIENTOS ' + @lcCadena
      WHEN @lnCentenas = 9 THEN 'NOVECIENTOS ' + @lcCadena
      ELSE @lcCadena
    END /* CENTENAS */

    -- Analizo los millares
    SELECT @lcCadena =
    CASE /* TERNA */
      WHEN @lnTerna = 1 THEN @lcCadena
      WHEN @lnTerna = 2 AND (@lnUnidades + @lnDecenas + @lnCentenas <> 0) THEN @lcCadena + ' MIL '
      WHEN @lnTerna = 3 AND (@lnUnidades + @lnDecenas + @lnCentenas <> 0) AND
        @lnUnidades = 1 AND @lnDecenas = 0 AND @lnCentenas = 0 THEN @lcCadena + ' MILLON '
      WHEN @lnTerna = 3 AND (@lnUnidades + @lnDecenas + @lnCentenas <> 0) AND
        NOT (@lnUnidades = 1 AND @lnDecenas = 0 AND @lnCentenas = 0) THEN @lcCadena + ' MILLONES '
      WHEN @lnTerna = 4 AND (@lnUnidades + @lnDecenas + @lnCentenas <> 0) THEN @lcCadena + ' MIL MILLONES '
      ELSE ''
    END /* MILLARES */

    -- Armo el retorno columna a columna
    SELECT @lcRetorno = @lcCadena + @lcRetorno
    SELECT @lnTerna = @lnTerna + 1

  END /* WHILE */

  IF @lnTerna = 1
    SELECT @lcRetorno = 'CERO'

  SELECT @letras=RTRIM(@lcRetorno)
--SELECT @letras=RTRIM(@lcRetorno) + ' PESOS ' + CASE WHEN LEN(LTRIM(STR(@lnFraccion,2))) = 1 THEN '0'+LTRIM(STR(@lnFraccion,2))
--                                               ELSE LTRIM(STR(@lnFraccion,2)) END + ' CENTAVOS M.N.'
 RETURN @letras
END
Ejemplo de uso:
 SELECT dbo.fn_numeroa_Texo(778)
 

Convertir dinero o moneda a Texto en SQLSERVER

Alguna vez necesite utilizar un sp que me convertiera una cantidad expresada en dinero a texto, pues encontre una store procedure que hacía esto no recuerdo de que página copie el código, pero bueno lo converti en una función escalar esperando que sea de ayuda
--http://lafabricadesoftware.blogspot.com/
CREATE FUNCTION [dbo].[fn_Dinero_a_Texo](@Numero NUMERIC(20,2))
RETURNS VARCHAR(700)
BEGIN
 DECLARE @letras VARCHAR(700)
  DECLARE @lnEntero INT,
    @lcRetorno VARCHAR(512),
    @lnTerna INT,
    @lcMiles VARCHAR(512),
    @lcCadena VARCHAR(512),
    @lnUnidades INT,
    @lnDecenas INT,
    @lnCentenas INT,
    @lnFraccion INT
 ---Uso SELECT dbo.rh_fn_Dinero_a_Texo(200)
  SELECT @lnEntero = CAST(@Numero AS INT),
    @lnFraccion = (@Numero - @lnEntero) * 100,
    @lcRetorno = '',
    @lnTerna = 1

  WHILE @lnEntero > 0
  BEGIN /* WHILE */

    -- Recorro columna por columna
    SELECT @lcCadena = ''
    SELECT @lnUnidades = @lnEntero % 10
    SELECT @lnEntero = CAST(@lnEntero/10 AS INT)
    SELECT @lnDecenas = @lnEntero % 10
    SELECT @lnEntero = CAST(@lnEntero/10 AS INT)
    SELECT @lnCentenas = @lnEntero % 10
    SELECT @lnEntero = CAST(@lnEntero/10 AS INT)

    -- Analizo las unidades
    SELECT @lcCadena =
    CASE /* UNIDADES */
      WHEN @lnUnidades = 1 AND @lnTerna = 1 THEN 'UNO ' + @lcCadena
      WHEN @lnUnidades = 1 AND @lnTerna <> 1 THEN 'UN ' + @lcCadena
      WHEN @lnUnidades = 2 THEN 'DOS ' + @lcCadena
      WHEN @lnUnidades = 3 THEN 'TRES ' + @lcCadena
      WHEN @lnUnidades = 4 THEN 'CUATRO ' + @lcCadena
      WHEN @lnUnidades = 5 THEN 'CINCO ' + @lcCadena
      WHEN @lnUnidades = 6 THEN 'SEIS ' + @lcCadena
      WHEN @lnUnidades = 7 THEN 'SIETE ' + @lcCadena
      WHEN @lnUnidades = 8 THEN 'OCHO ' + @lcCadena
      WHEN @lnUnidades = 9 THEN 'NUEVE ' + @lcCadena
      ELSE @lcCadena
    END /* UNIDADES */

    -- Analizo las decenas
    SELECT @lcCadena =
    CASE /* DECENAS */
      WHEN @lnDecenas = 1 THEN
        CASE @lnUnidades
          WHEN 0 THEN 'DIEZ '
          WHEN 1 THEN 'ONCE '
          WHEN 2 THEN 'DOCE '
          WHEN 3 THEN 'TRECE '
          WHEN 4 THEN 'CATORCE '
          WHEN 5 THEN 'QUINCE '
          ELSE 'DIECI' + @lcCadena
        END
      WHEN @lnDecenas = 2 AND @lnUnidades = 0 THEN 'VEINTE ' + @lcCadena
      WHEN @lnDecenas = 2 AND @lnUnidades <> 0 THEN 'VEINTI' + @lcCadena
      WHEN @lnDecenas = 3 AND @lnUnidades = 0 THEN 'TREINTA ' + @lcCadena
      WHEN @lnDecenas = 3 AND @lnUnidades <> 0 THEN 'TREINTA Y ' + @lcCadena
      WHEN @lnDecenas = 4 AND @lnUnidades = 0 THEN 'CUARENTA ' + @lcCadena
      WHEN @lnDecenas = 4 AND @lnUnidades <> 0 THEN 'CUARENTA Y ' + @lcCadena
      WHEN @lnDecenas = 5 AND @lnUnidades = 0 THEN 'CINCUENTA ' + @lcCadena
      WHEN @lnDecenas = 5 AND @lnUnidades <> 0 THEN 'CINCUENTA Y ' + @lcCadena
      WHEN @lnDecenas = 6 AND @lnUnidades = 0 THEN 'SESENTA ' + @lcCadena
      WHEN @lnDecenas = 6 AND @lnUnidades <> 0 THEN 'SESENTA Y ' + @lcCadena
      WHEN @lnDecenas = 7 AND @lnUnidades = 0 THEN 'SETENTA ' + @lcCadena
      WHEN @lnDecenas = 7 AND @lnUnidades <> 0 THEN 'SETENTA Y ' + @lcCadena
      WHEN @lnDecenas = 8 AND @lnUnidades = 0 THEN 'OCHENTA ' + @lcCadena
      WHEN @lnDecenas = 8 AND @lnUnidades <> 0 THEN 'OCHENTA Y ' + @lcCadena
      WHEN @lnDecenas = 9 AND @lnUnidades = 0 THEN 'NOVENTA ' + @lcCadena
      WHEN @lnDecenas = 9 AND @lnUnidades <> 0 THEN 'NOVENTA Y ' + @lcCadena
      ELSE @lcCadena
    END /* DECENAS */

    -- Analizo las centenas
    SELECT @lcCadena =
    CASE /* CENTENAS */
      WHEN @lnCentenas = 1 AND @lnUnidades = 0 AND @lnDecenas = 0 THEN 'CIEN ' + @lcCadena
      WHEN @lnCentenas = 1 AND NOT(@lnUnidades = 0 AND @lnDecenas = 0) THEN 'CIENTO ' + @lcCadena
      WHEN @lnCentenas = 2 THEN 'DOSCIENTOS ' + @lcCadena
      WHEN @lnCentenas = 3 THEN 'TRESCIENTOS ' + @lcCadena
      WHEN @lnCentenas = 4 THEN 'CUATROCIENTOS ' + @lcCadena
      WHEN @lnCentenas = 5 THEN 'QUINIENTOS ' + @lcCadena
      WHEN @lnCentenas = 6 THEN 'SEISCIENTOS ' + @lcCadena
      WHEN @lnCentenas = 7 THEN 'SETECIENTOS ' + @lcCadena
      WHEN @lnCentenas = 8 THEN 'OCHOCIENTOS ' + @lcCadena
      WHEN @lnCentenas = 9 THEN 'NOVECIENTOS ' + @lcCadena
      ELSE @lcCadena
    END /* CENTENAS */

    -- Analizo los millares
    SELECT @lcCadena =
    CASE /* TERNA */
      WHEN @lnTerna = 1 THEN @lcCadena
      WHEN @lnTerna = 2 AND (@lnUnidades + @lnDecenas + @lnCentenas <> 0) THEN @lcCadena + ' MIL '
      WHEN @lnTerna = 3 AND (@lnUnidades + @lnDecenas + @lnCentenas <> 0) AND
        @lnUnidades = 1 AND @lnDecenas = 0 AND @lnCentenas = 0 THEN @lcCadena + ' MILLON '
      WHEN @lnTerna = 3 AND (@lnUnidades + @lnDecenas + @lnCentenas <> 0) AND
        NOT (@lnUnidades = 1 AND @lnDecenas = 0 AND @lnCentenas = 0) THEN @lcCadena + ' MILLONES '
      WHEN @lnTerna = 4 AND (@lnUnidades + @lnDecenas + @lnCentenas <> 0) THEN @lcCadena + ' MIL MILLONES '
      ELSE ''
    END /* MILLARES */

    -- Armo el retorno columna a columna
    SELECT @lcRetorno = @lcCadena + @lcRetorno
    SELECT @lnTerna = @lnTerna + 1

  END /* WHILE */

  IF @lnTerna = 1
    SELECT @lcRetorno = 'CERO'

  SELECT @letras=RTRIM(@lcRetorno) + ' PESOS (' + CASE WHEN LEN(LTRIM(STR(@lnFraccion,2))) = 1 THEN '0'+LTRIM(STR(@lnFraccion,2))
                                               ELSE LTRIM(STR(@lnFraccion,2)) END + '/100) M.N.'
--SELECT @letras=RTRIM(@lcRetorno) + ' PESOS ' + CASE WHEN LEN(LTRIM(STR(@lnFraccion,2))) = 1 THEN '0'+LTRIM(STR(@lnFraccion,2))
--                                               ELSE LTRIM(STR(@lnFraccion,2)) END + ' CENTAVOS M.N.'
 RETURN @letras
END
Ejemplo de uso
SELECT dbo.fn_Dinero_a_Texo(55250.55)

jueves, 7 de octubre de 2010

Resetear o reiniciar una columna identity(autoincrementable) en SQL SERVER

Cuando se llega a eliminar todos los datos de una tabla y la columna es identity autoincrementable esta se queda con el ultimo valor del ultimo renglon insertado como se pude ver a continuación

DBCC CHECKIDENT (nombre_tabla, NORESEED)

pues para reinicializarla se podría aplicar el siguiente comando

DBCC CHECKIDENT (nombre_tabla, RESEED, 0)

esto indica que el siguiente registro a insertar comenzaría en 1 ya que el valor actual es reseteado a 0.

miércoles, 6 de octubre de 2010

Cachar el error de un webservice en asp.net

Muchas veces cuando se trabaja con webservices en asp.net y existe un error estos regresan algo asi System.Web.Services.Protocols.SoapException: Error al Ejecutar la Consulta , No se puede insertar una fila de clave duplicada en el objeto 'dbo.Personas' con índice único.Talvez en un ambiente de desarrollo esto sea bueno cuando se requiere saber de que webservice viene el error sin embargo es tedioso estar leyendo todo el encabezado que se va formando, la razon de que esto pase es que la excepcion del webservice se va construyendo de un mensaje el nombre del webservice y otros datos. La forma correcta de atrapar el error de un webservice es la siguiente.

Imports System.Web.Services.Protocols
 
Try
Catch ex As SoapException
End Try

He creado una funcion que elimina el encabezado del webservice y que arroja solo el error


 Private Function wmensaje(ByVal ex As SoapException) As String
        Dim men As String = ex.Detail.InnerXml
        Dim i = men.LastIndexOf("</ErrorMessage>") - 15 - men.LastIndexOf("<ErrorMessage>")
        If (ex.Detail.InnerXml.IndexOf("<ErrorMessage>") <> -1 Or ex.Detail.InnerXml IsNot Nothing) Then
            men = men.Substring(ex.Detail.InnerXml.IndexOf("<ErrorMessage>") + 14, i)
        Else
            men = ex.Message
        End If
        Return men
    End Function

'El uso en el catch sería

Try
Catch ex As SoapException
 wmensaje(ex)
End Try

sábado, 2 de octubre de 2010

Creando un menu flotante con css, la propiedad fixed y la propiedad z-index

Hace unos días a un compañero le surguió una pequeña duda de como hacer que un grupo de elementos flotará,
en alguna ocasión ya había yo hecho algo así sin embargo mi mala memoria no me ayudaba, ya que cuando
dejas de usar las cosas por mucho tiempo y no me refiero a mi memoria jajaja, pues simplemente se te olvida
aun asi recuerdo que lo había hecho con hojas de estilo en cascada y efectivamente con solo colocar esta
propiedad al estilo de un objeto este simulará que flota position:fixed pero ¿porque? , los bloques en posición fixed no se mueven cuando el documento es desplazado,ahora muy bien ya flota,pero
puede ocurrir que los otros objetos se superpongan, lo que támbien es conocido como capas, bueno pues
para eso sirve la propiedad z-index para definir que objetos pueden ir enfrente de otros objetos, es decir el
orden de los elementos en el eje z, esta propiedad solo funciona cuando se indica el posicionamiento absolute
y fixed para mayor información sobre los tipos de posicionamiento aquí dejo una liga posicionamiento con css y para la propiedad z-index y pues como era de esperar dejo el código de ejemplo.


<head>
<title>http://lafabricadesoftware.blogspot.com</title>
<style>

.flotante 
{position:fixed;
 z-index:100;
  /*Aqui tenemos arriba las dos principales propiedades el z-index
  100 indica que el objeto se va a sobreponer encima de todos los objetos*/ 
 width:100px;
 background:yellow;
 border:1px solid green;
}
.capa
{
 background-color:blue;
 background:pink;
 border:1px solid green;
}
</style>
</head>
<body>
<div class="flotante">
Este es el ejemplo de un menu que flota como ves es mas sencillo de lo que te imaginas
</div>
<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
<div class="capa"><h3>Seccion de en medio</h3></div>
<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
<div class="capa"><h3>Ultima seccion de la pagina</h3></div>
</body>

martes, 28 de septiembre de 2010

Restringir el valor de una columna como única

La mayor parte de las veces que se crea una tabla en la base de datos, se crea con id y una clave, sin embargo esa clave no se debería de repetir, lo más fácil sería crear esa clave como llave primaria sin embargo para darle mantenimiento y trabajar con ella es un poco más talachuda, pues bien existen dos formas de decirle a la base de datos que no queremos que esa clave se repita, la primera y para mi la más fácil sería mediante el siguiente código:

ALTER TABLE nombre_tabla

ADD CONSTRAINT nombre_restriccion --támbien conocida como constraint

UNIQUE(nombre_columna)


O la segunda forma es mediante el Management Studio

   1. Abrir el Management Studio
   2. Abrir el Modificar de la tabla
   3. Click derecho en la columna donde dice Indexes/Keys.
   4. Agregar una restricción
   5. Seleccionar el campo de la tabla y el valor Unico



Bueno espero y les sirva sino aquí dejo un manual Integridad de Datos

Contar registros Duplicados

Cuando queremos registros NO duplicados se puede utilizar la clausula SELECT DISTINCT, pero que
pasa cuando necesitamos conocer Aquellos registros que se duplican.

SELECT Nombre_Columna,COUNT(Nombre_Columna) FROM Nombre_Tabla
GROUP BY Nombre_Columna HAVING COUNT(Nombre_Columna)>1

 Y ahora si quiero conocer los ids de los registros duplicados aplicaría la siguiente consulta

 SELECT Id_Columna, Nombre_Columna FROM Nombre_Tabla
WHERE Nombre_Columna IN

(SELECT Nombre_Columna FROM Nombre_Tabla
GROUP BY Nombre_Columna HAVING COUNT(Nombre_Columna)>1)

lunes, 27 de septiembre de 2010

Cambiar el lenguaje de los mensajes de error de la base de datos MYSQL

Muchas veces queremos mostrar el error por ejemplo al insertar o actualizar una clave que ya existe
Entrada duplicada '0001' para la clave 'cve_articulo',  
sin embargo la base de datos por default viene configurada en idioma ingles, 
bueno pues para cambiar la configuración hay que irse al directorio
de instalación c:\archivos de programa\mysql o en caso de usar XAMPP el 
directorio de instalación c:\ xammp\mysql\bin, solo hay que localizar el archivo 
my.ini, ahora en la sección [mysqld]  agregar la siguiente línea
language="spanish" 
Ahora la base de datos mostrará los errores en español 

martes, 14 de septiembre de 2010

Data Mapper DMZ

Hace unos dias comence a trabajar con codeigniter, generalmente he trabajado con stored procedures del lado de la de la bd en este caso MYSQL, sin embargo me surgió la tentación de trabajar con alguna librería o Framework ORM,lo primero que hice fue ver propel y doctrine, me gusto mas propel, sin embargo para consultas un poco mas complejas segun leí doctrine era mejor, debido a la cantidad de versiones que rondan en la red vi dificil la instalacion hasta que encontre Data Mapper wooooooooo, todo parecía perfecto hasta que llegue a la conversión a json ahi tendría que hacer una función, pero me encontre con una version mejorada Data Mapper OverZealous Edition, parecia el ORM de en sueño, menos codigo, convertia a json, hasta que trate de ejecutar un vil delete en el modo query $objeto->query($sql) como el update no regresa registros me marcaba un error, bueno pues tuve que hacer un nuevo metodo, en la parte de library en datamapper.php abajo de la linea 2566 agregue este codigo y todo se resolvio cabe mencionar que estoy trabajando con datamaper DMZ 1.7.1, de cualquier forma he enviado un correo al autor para que incluya esta mejora, de esta forma se podrían ejecutar INSERTS, DELETE y UPDATES, en SQL alternativos a los que provee el Framework $objeto->non_query($sql).
    // --------------------------------------------------------------------
    public function non_query($sql, $binds = FALSE)
    {
        // Get by objects properties
        $query = $this->db->query($sql, $binds);
    }

lunes, 13 de septiembre de 2010

Mascara de fecha con jquery

Después de hacer algunas implementaciones de fechas con calendarios como el que tiene el ajax toolkit, y telerik radcontrols, algunos usuarios no comformes solo pidieron un control de captura, ya que según esto agilizaría su trabajo, tome el código del jquery Mask de digitalbrush, sin embargo la validación de la fecha se tenía que hacer desde el servidor, hace unos días tome el mismo plugin y lo modifique permitiendome hacer la validación de la fecha conforme se capture, para ver el ejemplo favor de bajarlo de MascaradeFecha el formato forzoso es dd/mm/aaaa por el momento, favor de ver el ejemplo.

jueves, 9 de septiembre de 2010

Agregar autenticaciones de windows en windows 7

Bueno algunas veces es necesario agregar un tipo de autenticacion en windows 7 , para agregarlas a windows 7 solo hay que ir a Panel de control-> programas caracteristicas y dar click en Activar/desactivar caracteristicas de Windows

lunes, 23 de agosto de 2010

Seleccionar todos los elementos con un checkbox

Bueno hace unos días un amiguito tuvo un problemilla con un script mal hecho que debería de hacer esto correctamente, desafortunadamente no funciono, bueno pues hice este pequeño script, le agregue la funcion live para que funcione en .net, la función live requiere jquery 1.4 o posterior.

<html>
<head>
<title>lafabricadesoftware.blogspot.com</title>
<script src="jquery-1.4.2.min.js"></script>
<script type="text/javascript">
//http://lafabricadesoftware.blogspot.com/
$(document).ready(function(){
$(".seleccionatodos").live('click',function(){
$('.s').attr('checked', $(".seleccionatodos").is(':checked'));
});
$(".s").live('click',function(){
var total=$(".s").length;
var seleccionados=$(".s:checked").length;
if (total!=seleccionados){$('.seleccionatodos').attr('checked',false);}
else{$('.seleccionatodos').attr('checked',true);}
});
});
</script>
</head>
<body>
<label>Seleccionar Todos</label>
<input type="checkbox" class="seleccionatodos">
<br>
<label>Uno</label>
<input type="checkbox" class="s">
<br>
<label>Dos</label>
<input type="checkbox" class="s">
<br>
<label>Tres</label>
<input type="checkbox" class="s">
</body>
</html>

Javascript con Jquery

Todos los ejemplos mostrados aquí, utilizarán el framework de jquery el cual puede ser descargado de http://jquery.com/, porque jquery pues existen muchismas razones pero solo mencionaré dos, es ligero y escribes menos.

viernes, 20 de agosto de 2010

Cambiar el password de un login en SQL SERVER

' http://lafabricadesoftware.blogspot.com/
ALTER LOGIN sa ENABLE ;
GO
ALTER LOGIN sa WITH PASSWORD = 'nuevo' ;
GO

jueves, 19 de agosto de 2010

Estilo a un foco con css

Con este ejemplito en css, muestro como darle formato a un foco el código es el siguiente:
 utilizando la pseudoclase focus.

//http://lafabricadesoftware.blogspot.com/

Eliminar solo fila seleccionada GridView

 Similar al post anterior solo que sin el for
Protected Sub grdIngresosdetalle_RowDeleting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewDeleteEventArgs) Handles grdIngresosdetalle.RowDeleting  
        Dim renglon As Integer, dt As DataTable
        Dim tamaniopag As Integer 'Numero de Registros por pagina
        Dim pagina As Integer
        Dim dr As Data.DataRow
        pagina = grdIngresosdetalle.PageIndex
        tamaniopag = grdIngresosdetalle.PageSize
        'Indice actual es igual al tamanio de la pag por pagina mas indice
        renglon = (pagina * tamaniopag) + e.RowIndex  'o usar 'grdIngresosdetalle.SelectedRow.RowIndex
        dt = Session("dtIngresos")
        dr = dt.Rows(renglon)
        dt.Rows.Remove(dr)
        Session("dtIngresos") = dt
        grdIngresosdetalle.DataSource = dt
        grdIngresosdetalle.DataBind()
    End Sub

Eliminar todo lo que esta abajo de una fila seleccionada en un Gridview

La logica es un poquito similar a una pila, este código es util cuando los datos van encadenados digamos un escalafón

 Protected Sub grdIngresosdetalle_RowDeleting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewDeleteEventArgs) Handles grdIngresosdetalle.RowDeleting  
        Dim renglon As Integer, total As Integer = 0, dt As DataTable
        Dim tamaniopag As Integer 'Numero de Registros por pagina
        Dim pagina As Integer
        Dim dr As Data.DataRow
        pagina = grdIngresosdetalle.PageIndex
        tamaniopag = grdIngresosdetalle.PageSize
        'Indice actual es igual al tamanio de la pag por pagina mas indice
        renglon = (pagina * tamaniopag) + e.RowIndex  'o usar 'grdIngresosdetalle.SelectedRow.RowIndex
        dt = Session("dtIngresos")'Esta session tiene un datatable
        total = dt.Rows.Count
        For i As Integer = renglon To total - 1
            dr = dt.Rows(renglon)
            dt.Rows.Remove(dr)
        Next
        Session("dtIngresos") = dt
        grdIngresosdetalle.DataSource = dt
        grdIngresosdetalle.DataBind()
    End Sub

Diferencias entre ISDBNULL y IS NOTHING

IS NOTHING se utiliza para especificar que un tipo de referencia que no apunta a nada.
 DBNull Value es un producto único objeto que se utiliza para indicar que un tipo de base de datos tiene un valor de base de datos de Null.

 Ejemplo 

 Sub Main ()
        Dim P As Object Dim P As Object
        Dim I As Integer Dim I As Integer

        Debug.Print( "1. P is not set to anything." ) Debug.Print ("1. P no está en ninguna parte.")
        Debug.Print( "P Is Nothing: " & (P Is Nothing )) Debug.Print ("P es nada:" & (P Is Nothing))
        Debug.Print( "P Is DBNull.Value: " & (P Is DBNull.Value)) Debug.Print ("P ¿Es DBNull.Value:" & (P ¿Es DBNull.Value))
        Debug.Print( "----------" ) Debug.Print ("----------")

        P = New Object () P = new Object ()

        Debug.Print( "2. P is set to a new object." ) Debug.Print ("2. P se establece en un nuevo objeto.")
        Debug.Print( "P Is Nothing: " & (P Is Nothing )) Debug.Print ("P es nada:" & (P Is Nothing))
        Debug.Print( "P Is DBNull.Value: " & (P Is DBNull.Value)) Debug.Print ("P ¿Es DBNull.Value:" & (P ¿Es DBNull.Value))
        Debug.Print( "----------" ) Debug.Print ("----------")

        P = DBNull.Value P = DBNull.Value

        Debug.Print( "3. P is pointing to the special singleton class DBNull." ) Debug.Print ("3. P apunta a la clase singleton DBNULL especiales.")
        Debug.Print( "P Is Nothing: " & (P Is Nothing )) Debug.Print ("P es nada:" & (P Is Nothing))
        Debug.Print( "P Is DBNull.Value: " & (P Is DBNull.Value)) Debug.Print ("P ¿Es DBNull.Value:" & (P ¿Es DBNull.Value))
        Debug.Print( "----------" ) Debug.Print ("----------")

        I = Nothing I = Nada

        Debug.Print( "4. I is not set to anything." ) Debug.Print ("4. No se establece en algo.")
        Debug.Print( "I Is Nothing: " & (IsNothing(I))) Debug.Print ("Yo no es nada:" & (IsNothing (I)))
        Debug.Print( "I Is DBNull.Value: " & (IsDBNull(I))) Debug.Print ("I Ain't DBNull.Value:" & (IsDBNull (I)))

    End Sub End Sub

1. 1. P is not set to anything. P no está en ninguna parte.
P Is Nothing: True P ¿Es Nada: Verdadero
P Is DBNull.Value: False P ¿Es DBNull.Value: Falso
---------- ----------
2. 2. P is set to a new object. P se establece en un nuevo objeto.
P Is Nothing: False P ¿Es Nada: Falso
P Is DBNull.Value: False P ¿Es DBNull.Value: Falso
---------- ----------
3. 3. P is pointing to the special singleton class DBNull. P apunta a la clase singleton DBNULL especiales.
P Is Nothing: False P ¿Es Nada: Falso
P Is DBNull.Value: True P ¿Es DBNull.Value: Verdadero
---------- ----------
4. 4. I is not set to anything. No se establece en algo.
I Is Nothing: False Yo no es nada: Falso
I Is DBNull.Value: False I ¿DBNull.Value: Falso 
  

Para finalizar existe 2 formas de usar isnothing ejemplo

'http://lafabricadesoftware.blogspot.com/
If IsNothing(myObject) then
End If
If myObject Is Nothing then
End If

 

Tomado de referencia de http://www.devblog.com/2007/11/nothing-and-null-in-vbnet.html

miércoles, 18 de agosto de 2010

Diferencias entre ISDBNULL y ISNULLOREMPTY

Bueno pues la principal diferencia que encontre a simple vista, es la siguiente ISDBNULL se debe de utilizar para los elementos contenedores de datos como: datatables, datasets, columnas, renglones, grids IsDBNull(dt.Rows(i).Item(j)) mientras IsNullOrEmpty se utiliza para cadenas String.IsNullOrEmpty(txtnombre.text)

Convertir moneda(money) a double

Algunas veces en .net necesitamos convertir una cantidad expresada en tipo moneda a doble, y bueno como haríamos esto pues es simple:

        'http://lafabricadesoftware.blogspot.com/
        Dim dinero As String Dim dinerod As Double
        Dim ci As New System.Globalization.CultureInfo("es-MX")
        dinero = "$12,555.55"
        dinerod = Double.Parse(dinero.Replace("$", ""), ci)

martes, 17 de agosto de 2010

Actualización o UPDATE de varias Tablas

Bueno pues creo que esmuy simple, el código habla por si solo

--http://lafabricadesoftware.blogspot.com/
DECLARE @tablaUno table(Id_Uno INT IDENTITY,campo varchar(100),campod varchar(100))
DECLARE @tablaDos table(Id_Uno INT IDENTITY,campo varchar(100),campod varchar(100))
DECLARE @tablaTres table(Id_Uno INT IDENTITY,campo varchar(100),campoy varchar(100))

INSERT INTO @tablaUno (campo, campod )
VALUES  ('a','b')
INSERT INTO @tablaUno (campo, campod )
VALUES  ('c','d')
INSERT INTO @tablaUno (campo, campod )
VALUES  ('x','y')

INSERT INTO @tablaDos (campo, campod )
VALUES  ('I','I')
INSERT INTO @tablaDos (campo, campod )
VALUES  ('I','I')
INSERT INTO @tablaDos (campo, campod )
VALUES  ('I','I')

INSERT INTO @tablaTres(campo, campoy )
VALUES  ('o','o')
INSERT INTO @tablaTres(campo, campoy)
VALUES  ('c','d')
INSERT INTO @tablaTres(campo, campoy)
VALUES  ('x','y')
INSERT INTO @tablaTres(campo, campoy)
VALUES  ('x','yt')

UPDATE @tablaTres SET campo=tu.campo, campoy=td.campod
FROM @tablaTres te INNER JOIN @TablaUno tu ON te.Id_Uno = tu.id_uno
INNER JOIN @tablaDos td ON td.Id_Uno=tu.id_uno

SELECT * FROM @tablaTres
 


Uso facilito de una transacción

No se, si les ha pasado que alguna vez quieren hacer un query sencillito por ejemplo actualizar el nombre de una persona llamada roman, pero necesitan hacer una transaccion sencillita nada mas para trabajar con el query o la consulta, bueno pues aquí un ejemplito:

--http://lafabricadesoftware.blogspot.com/
BEGIN TRANSACTION 
UPDATE persona SET Nombre='Juan'
SELECT * FROM persona
ROLLBACK 
SELECT * FROM persona

lunes, 16 de agosto de 2010

Buscar un campo o algun nombre en un Stored Procedure SQL SERVER 2005

Hace algún tiempo tuve un problema, había que cambiar muchos campos de una tabla dentro de unos cuantos cientos de procedimientos almacenados en sql server 2005, una compañera de trabajo, encontro un poco de código googleando y pues yo igual, junte el código
adaptandolo a nuestras necesidades y sugió este procedimiento almacenado, que encuentra texto en los objetos de la base de datos manejada por sql server 2005,
espero les sirva.
------------------jefedigi-----------------------------------------------
-------busca un texto o cadena en los objetos de la bd-------------------
----------http://lafabricadesoftware.blogspot.com/-----------------------
CREATE PROCEDURE [dbo].[buscaTextoObjetosBD]
@SearchText AS VARCHAR(100)
AS
BEGIN
--DECLARE @SearchText AS VARCHAR(100)
--SET @SearchText = 'JEFEDIGI'
--Consulta de los procedimeintos que contienen dicho texto
SELECT DISTINCT USER_NAME(o.uid) + '.' + OBJECT_NAME(c.id) AS 'Object name',
CASE
WHEN OBJECTPROPERTY(c.id, 'IsReplProc') = 1
THEN 'Replication stored procedure'
WHEN OBJECTPROPERTY(c.id, 'IsExtendedProc') = 1
THEN 'Extended stored procedure'
WHEN OBJECTPROPERTY(c.id, 'IsProcedure') = 1
THEN 'Stored Procedure'
WHEN OBJECTPROPERTY(c.id, 'IsTrigger') = 1
THEN 'Trigger'
WHEN OBJECTPROPERTY(c.id, 'IsTableFunction') = 1
THEN 'Table-valued function'
WHEN OBJECTPROPERTY(c.id, 'IsScalarFunction') = 1
THEN 'Scalar-valued function'
WHEN OBJECTPROPERTY(c.id, 'IsInlineFunction') = 1
THEN 'Inline function'
WHEN OBJECTPROPERTY(c.id, 'IsView') = 1
THEN 'View'
END AS 'Object type'
FROM syscomments c
INNER JOIN
sysobjects o
ON c.id = o.id
WHERE c.text LIKE '%'+@SearchText+'%' AND
encrypted = 0 AND
( OBJECTPROPERTY(c.id, 'IsReplProc') = 1 OR
OBJECTPROPERTY(c.id, 'IsExtendedProc') = 1 OR
OBJECTPROPERTY(c.id, 'IsProcedure') = 1 OR
OBJECTPROPERTY(c.id, 'IsTrigger') = 1 OR
OBJECTPROPERTY(c.id, 'IsTableFunction') = 1 OR
OBJECTPROPERTY(c.id, 'IsScalarFunction') = 1 OR
OBJECTPROPERTY(c.id, 'IsInlineFunction') = 1 OR
OBJECTPROPERTY(c.id, 'IsView') = 1 )
union
SELECT TABLE_NAME,'Table' FROM INFORMATION_SCHEMA.tables
WHERE table_name LIKE '%'+@SearchText+'%'
UNION
SELECT COLUMN_NAME,'COLUMN' FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME LIKE '%'+@SearchText+'%'
ORDER BY [Object type], 'Object name'
END

miércoles, 11 de agosto de 2010

Dos frases

A lo mejor y esto que escribo no tieene mucha importancia pero bueno, el día de hoy escuche dos frases, en el trayecto de mi casa hacia mi trabajo, estas frases me latieron un buen.
Una de ellas las expreso el director de la universidad TECMILENIO de puebla, haciendo alusión al lado o enfoque humanista y tecnológico de la universidad: "DE QUE SIRVE UN PATAN CON CONOCIMIENTO ", y bueno mientras oía esa frase una persona comento definitivamente "CONOCIMIENTO QUE NO SE COMPARTE NO SIRVE DE NADA".

viernes, 6 de agosto de 2010

El elemento fieldset (Frames en winforms pero en html)

Bueno pues por lo que me he dado cuenta casi nadie conoce esta etiqueta, no se si les ha pasado pero cuando trabaja uno en vb6, o winforms de vb.net hay un elemto que te crea marcos llamado frames, bueno pues en html se puede hacer exactamente lo mismo casi nadie conoce esta etiqueta pero bueno aquí les dejo un ejemplo:

<form>
<fieldset>
<legend>Personalia:</legend>
Name: <input size="30" type="text">
Email: <input size="30" type="text">
Date of birth: <input size="10" type="text">
</fieldset>
</form>

Lo que da como resultado



Persona:
Nombre:
Email:

Algo sencillo, declaración de variables e inicialización en línea

Según http://emilio.aesinformatica.com/2009/09/18/visual-basic-net-variables-y-constantes/ para declarar variables en vb.net lo podemos hacer de la siguiente forma:

dim c as integer, d as intenger
dim c,d as integer
dim h as integer, f as string
dim j,k as integer, s,  nombre as string
dim z as object
dim z (sólo funcionaría si option strict está a off)
dim c,d as integer = 8 (Esto no lo permite, no sabe a cual asignarselo)
dim c as integer=10, n1,n2 as intege

Pero que pasa si estamos acostumbrados a una programción un poco más lineal u horizontal

Ejemplo:

dim a as integer, b as intenger, c as integer
'Ahora para inicializarlos en linea lo podriamos hacer de la siguiente forma
a=1:b=2:c=a

Los : nos ayudan a tener menos lineas de codigo vertical mejorando considerablemente
la visibilidad en nuestro editor de código

Lo que no es este Blog

Navegando por la red encontre esta fábula, támbien conocida como los cangrejos mexicanos y dice más o menos así.
Un mexicano fue al mercado de mariscos y despues de comer unos tacos de pescado, decidio comprar unos cangrejos, de esos que venden vivos y los tienen en canastas. Pasó al primer puesto y el encargado le enseñó unos cangrejos dentro de una canasta bastante alta, la cual estaba tapada con una tabla, el mexicano le preguntó:

“Por qué están tapados con una tabla?”, Ah!, -dijo el vendedor- es que son cangrejos gringos, y si no los tapo, pues empieza uno a escalar hasta que por esfuerzo propio salta de la canasta y se escapa, y si no los tapo, pues me quedo sin cangrejos!!.

Umh! -expresó el mexicano y se fue al siguiente puesto-, ahí estaba una canasta mucho más alta y tapada con una tabla y dos ladrillos. Como resultado de la misma pregunta el vendedor dijo:

“Son cangrejos japoneses y cuando uno se quiere escapar, empieza a apoyarse en los demás, y éstos van empujándolo hacia arriba apoyados en otros y así sucesivamente, de tal manera que se forma una pirámide hasta el borde y entonces el cangrejo se escapa.

Oh!, que bien -pensó el mexicano y se fue al último puesto-, ahí estaba una canasta de cangrejos con un pequeño borde y destapada. Y esta por qué está tan desprotegida, no le da miedo que se le vayan a escapar?? -pregunta al vendedor-

No, no hay problema -dice éste- son cangrejos mexicanos, cuando uno está tratando de sobresalir, entre todos se encargan de jalarlo pa’bajo.

Hijole es una lastima que México no tenga una visión global, por eso estamos como estamos, si fueramos un poquito más concientes que actualmente no solo competitimos entre nosotros sino con el resto de otros países, tal vez nuestra mentalidad cambiaría un poquito, es una lastima encontrar gente muy egocentrica que piensa que lo sabe todo, y pues tal vez si sepa y no comparta su conocimiento o no explote su potencial, y es cuando llegan a decir los demas compañeros, no pues juanito si sabe pero no le quiero preguntar porque es un cooley, y aveces surge la pregunta, ¿Si sabe tanto porque la empresa esta como esta o porque sigue en esta empresa?, pues bien he de admitir que a veces yo siento que las puedo de todas a todas, sin embargo creo que es importante tener humildad y reconocer cuando uno no puede, así como humildad para reconocer el trabajo de los demas, espero que los que lean este blog compartan el poco conocimiento y no se sumen más al tipo de CANGREJO MEXICANO.

Sobre este Blog

Hace algún tiempo un compañero en el trabajo me enseño un video en youtube llamado linux prodigio me llamo la atención mucho una frase de este video que dice: "recabar información es el primer paso hacia la sabiduría, compartirla es el paso hacia la comunidad". El objetivo de este blog es proporcionar información, herramientas, así como resolver algunos problemas en la vida cotidiana de un programador o desarrollador, principalmente con algunos lenguajes de programación como javascript, C#, vb.net, SQL SERVER, UML, MYSQL, PHP, la idea de este blog surgio por la necesidad de compartir información. Es muy satisfactorio. Espero que este blog más que gustar sirva alguien, con una sola persona que le sirva este blog habrá valido la pena.