viernes, 28 de octubre de 2011

Obtener la Collation [Intercalación] del Servidor o de una Base de Datos en Sql Server

 

Hola después de mucho tiempo estoy aquí con una nueva aportación esperando como siempre que les sea de utilidad.

 

En muchas ocasiones por cuestiones de Regionalización o codificación de los caracteres manejados por nuestras aplicaciones, requerimos determinar la intercalación ya sea del Servidor o de las Bases de Datos, bien pues aquí una forma muy sencilla de hacerlo.

 

SELECT CONVERT(sysname, SERVERPROPERTY('collation'));
GO

SELECT DATABASEPROPERTYEX('NombreBaseDatos,'collation');
GO

Bien pues por el momento es todo.

 

Best regards And Happy coding.

KarlozArba

lunes, 20 de junio de 2011

Recorrer un Dictionary con C#

 

Que tal, el  día de hoy escribiré muy brevemente como realizar el recorrido de un Dictionary en C#, quizá sea algo muy básico pero hoy al tratar de hacerlo hubo un momento en el que no supe como hacerlo pues no es una lista solo de items sino de pares.

En fin espero que aun cuando se trata de algo sencillo le pueda servir a alguien.

 

Dictionary<string,string> ConceptosCertificado)                       
StringBuilder CertBuilder = new StringBuilder();      
// Recorre los pares           
foreach (KeyValuePair<string,string> Par in ConceptosCertificado)
{
CertBuilder.AppendLine(string.Format("{0}:{1}",Par.Key,Par.Value));
}

// Recorre solo los valores
foreach (string Valor in ConceptosCertificado.Values) 
{ 
CertBuilder.AppendLine(Par.Value); 
} 

Saludos


 


Happy coding!!!

jueves, 3 de marzo de 2011

Validación de campos XML vacíos en SqlServer 2008

 

Saludos a todos, el día de hoy después de mucho agregare una entrada al blog, por más que me prometo a mi mismo que escribiré, bueno pues termino sin hacerlo.

En fin, entrando en materia muchas veces necesitamos validar que un campo de tipo XML en SqlServer 2008 contenga o no un valor, y en muchas más ocasiones XPATH no nos funciona o no queremos ocuparlo, bueno pues para estos casos la solución encontrada es la siguiente:


select top(500) xml_arch, * from crm.sis_arch with(nolock) where cast(xml_arch as varchar(max))=''

select top(500) xml_arch, * from crm.sis_arch with(nolock) where cast(xml_arch as varchar(max))<>''

Como verán es una solución muy sencilla pero funcional, además nos permite lógicamente realizar cualquier tipo de comparación o búsqueda en la cadena del XML, se que esta no es la forma natural de hacerlo en este tipo de campos pero seguro que se toparan con casos donde lo apliquen, como en el mío.

Como siempre espero que les sea de utilidad…

Best regards And Happy coding.

karlozarba

lunes, 18 de octubre de 2010

Acceder a Métodos, Controles o propiedades de un formulario hijo a uno padre. [Windows Forms] C# VB.Net

El día de hoy comentare sobre un caso muy usual al trabajar con aplicaciones WindowsForms, por lo menos para mi en .Net 2003, 2005 y 2008.

En el caso que revisare mediante un ejemplo muy sencillo tenemos:

a) Un formulario principal, que alberga un GridControl, y un método de agregado de filas al DataTable que alimenta ese GrigControl.

b) Un formulario secundario que se crea como un objeto desde el formulario principal, y desde el cuál se invocara el método de agregado de filas del GridControl del formulario principal.

1. Como dije, tenemos un DataTable a nivel de clase:

Private dt As New DataTable()

2. Y en el Evento Load del Formulario principal, armamos la estructura de la tabla y agregamos unos registros de prueba :

Try
           dt.Columns.Add(New DataColumn("a"))
           dt.Columns.Add(New DataColumn("b"))
           dt.Columns.Add(New DataColumn("c"))

           dt.Rows.Add("1", "2", "3")
           dt.Rows.Add("4", "5", "6")
           dt.Rows.Add("7", "8", "9")
           dt.Rows.Add("10", "11", "12")

           gc1.DataSource = dt

       Catch ex As Exception
           MsgBox(ex.Message)
       End Try

3. Como dije anteriormente, tenemos un método para agregar nuevos registros al DataTable:

Public Sub addRow(ByVal val1 As String, ByVal val2 As String, ByVal val3 As String)
        Try
            dt.Rows.Add(val1, val2, val3)

        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub

4. Ahora bien, si este método es llamado desde el formulario principal pues todo va bien, pero si instanciamos un nuevo formulario:

Dim f As New Form4
        f.Owner = Me
        f.Show()

lo más seguro es que estando en el formulario secundario, estemos tentados a invocar al método, de la siguiente manera:

Form2.addRow(TextBox3.Text, TextBox4.Text, TextBox5.Text)

con lo cual, en tiempo de compilación no tendremos ningún problema, sin embargo cuando realicemos el compilado de la aplicación, al ejecutar la aplicación, el método no funciona correctamente. ¿Porqué?

Bueno, pues porque no podemos acceder a los formulario y sus propiedades hacia arriba de forma directa, por lo que es necesario realizar un <casting> obteniendo el nombre del formulario principal, de la propiedad “owner”:

CType(Me.Owner, Form2).addRow(TextBox3.Text, TextBox4.Text, TextBox5.Text)

con lo cual el problema queda resuelto.

Como siempre espero que en algún momento les sea de utilidad

Best regards And Happy coding.

KarlozArba

miércoles, 13 de octubre de 2010

Formateo de campos Fecha–Hora para Sql Server desde .Net

Este post pretendo que sea breve ya que solo es para comentar que en ocasiones nos encontramos el problema de insertar o actualizar datos Datetime desde aplicaciones hechas con Vb.Net o C# y estos marcan error si no son recibidos como parámetros Sql debido a que llevan el formato 01-10-2010 02:30 p.m. por lo que SQL Server no puede interpretar las cadenas (a.m. | p.m.).

Esta situación la podemos solvertar de la siguiente forma:

VarriableDateTime.ToString("yyyyMMdd hh:mm:ss")

en un Ejemplo sencillo:

string sql = "UPDATE zabp_tareas_ogerp ";
sql += string.Format(" SET TIEMPO_INICIO = '{0}', TIEMPO_FIN = '{1}',HORA_LIBERACION = {2}",P_Hora_Inicio.ToString("yyyyMMdd hh:mm:ss"), P_Hora_Fin.ToString("yyyyMMdd hh:mm:ss"), P_Duracion);
sql += string.Format(" WHERE FOLIO={0}",P_Folio);

Donde podemos observar como se formatea de la forma: 20101001 14:30:00 con lo que eliminamos el problema.

Como siempre espero que les sea de utilizada.

Best regards And Happy coding.

KarlozArba

viernes, 8 de octubre de 2010

Crear tabla en sql server desde una instruccion select

 

En esta ocasión quiero compartirles algo que suele ser muy necesario cuando queremos respaldar los datos de una tabla especifica, sin tener que hacer backup de la BD completa, o cuando necesitamos guardar solo ciertos datos pero no conocemos a priori la estructura que tendrán esos datos e incluso quizá este proceso deba hacerse de forma dinámica por lo que ni siquiera sabemos en que momento se generara.

Bueno la forma es muy sencilla y es la siguiente:

SELECT [*|| campo1, campo2, campo3… campo(n)]

INTO NombreTablaNuevaOTemporal

FROM TablaOrigen

La explicación más sencilla aún:

Realizamos un SELECT tal y como lo necesitemos pero después del listado del campos necesarios, usaremos la palabra reservada INTO que permite la creación de una tabla con el nombre que señalemos a continuación de dicha instrucción. Quizá la pregunta sea: ¿´Qué pasa cuando la tabla ya existe y contiene datos?, bueno pues, esa tabla y datos son respetados, agregando únicamente los nuevos registros.

Bien, para finalizar un ejemplo sencillo:

SELECT t.FOLIO, t.ASUNTO

INTO test_table FROM zabp_tareas_ogerp t

WHERE  t.PARA='Desarrollo-Carlos Armenta'

Debido a que todo se hace desde un SELECT, podemos hacerlo tan complejo como sea necesario.

Best regards And Happy coding.

KarlozArba

jueves, 6 de mayo de 2010

Cambiar nombre a un campo, en Sql Server 2008

 

 

 

 

 

Bueno este es mi segundo post, y en esta ocasión mencionare algo que es muy sencillo pero que no en muchas ocasiones sabemos como hacerlo, bueno me refiero a: “Cambiar el nombre de un Campo en una tabla de Sql Server 2008”.

 

Realmente es una trabajo muy sencillo, basta con ejecutar el siguiente Store Procedure:

 

 

sp_rename [ @objname = ] 'nombre_objeto , [ @newname = ] 'nuevo_nombre' [ ,

[ @objtype = ] 'tipo_objeto ]

 

Donde:

nombre_objeto: se refiere al objeto al que necesitamos cambiar el nombre.

nuevo_nombre: nuevo identificador para el objeto.

tipo_objeto: es el tipo del objeto que deseamos renombrar.

 

Como se pueden imaginar este SP nos es útil para cambiar el nombre de Columnas, Indices, Tipos de Datos de Usuario, Bases de Datos y cualquier cosa que este en sys.objects.

 

Para nuestro caso usaremos algo como:

 

EXEC sp_rename 'CO.tbl_chk_out_hst.id_chk_out', 'id_chk_out_hst', 'COLUMN';

GO

 

Algo que les recomiendo es que aunque no sea obligatorio el uso de Schema.Tabla, ustedes lo utilizen a fin de que los nombres de objetos puedan estar bien calificados.

 

Finalizando y como recomendación, recordar que si modifican el nombre de una campo, deberan revisar a priori el impacto sobre otros objetos de la BD como vistas, stores, etc, así como sus aplicaciones.

 

Bien pues espero que les sea de utilidad.

 

"May the force be with you, and happy coding".