Algunos preguntan ¿en esta vida que es perdurable? Ya que otros tantos aseveran... "que las palabras se las lleva el viento"
"que las promesas son solo palabras" y que "las reglas estan hechas para transgredirse"
Pero entonces, ¿que es duradero en una persona? ¿Que es aquello que se puede prender en un ser humano y permanecer en el a traves del tiempo?
!las emociones! Pequeñas o grandes generadoras de recuerdos y que despiertan y agitan las fibras mas sensibles de una persona. Eso amigos mios es lo verdaderamente inolvidable, claro esta que las hay buenas y malas por eso esforcemonos en generar en los demas solo gratos sentimientos pues podemos estar seguros que aquello que plantemos ya no se ira...
Blog dedicado a la recopilación de experiencias en el desarrollo de software con tecnologías DotNet, Sql Server y otras hierbas.
jueves, 13 de febrero de 2014
Efimeras
lunes, 9 de diciembre de 2013
Obtener el nodo de un Xml (Cfdi) con todo y que tenga la nomenclatura ns:elemento, en 2 pataditas con LINQ. [LINQ TO XML]
Que tal pues nada que como parte de mi trabajo me vi en la necesidad de obtener el nodo del complemento TimbreFiscalDigital desde una factura CFDi que como bien sabran es un XML. Pues bien tras intentarlo con XPATH, y demas… siempre obtenia un error de Espacio de Nombres, y es que estos archivos poseen una nomenclatura basada en NameSpace y aun administrandolos no conseguia mi cometido.
Sin embargo he aqui como lo solucione extremadamente facil, claro esta con LINQ.
Espero que les sea de utilidad.
| |
1: Dim xdoc = XDocument.Load(pArchivoXmlCfdiGenerado)
2: Dim timbreFiscal = (From item In xdoc.Descendants
3: Where item.Name.LocalName = "TimbreFiscalDigital"
4: Select item).First()
5: 6: pHistoricoTimbreCFDi.FechaTimbrado = Convert.ToDateTime(timbreFiscal.Attribute("FechaTimbrado").Value)
7: pHistoricoTimbreCFDi.UUID = timbreFiscal.Attribute("UUID").Value
8: pHistoricoTimbreCFDi.NoCertificadoSAT = timbreFiscal.Attribute("noCertificadoSAT").Value
9: pHistoricoTimbreCFDi.SelloCFD = timbreFiscal.Attribute("selloCFD").Value
10: pHistoricoTimbreCFDi.SelloSAT = timbreFiscal.Attribute("selloSAT").Value
11: pHistoricoTimbreCFDi.Version = timbreFiscal.Attribute("version").Value
12: pHistoricoTimbreCFDi.Esquemas = timbreFiscal.Parent.ToStringjueves, 31 de octubre de 2013
Posteando desde android con soffice
Pues nada, aqui probando la edicion de blogs desde android con Soffice. Que para ser desde un celular me parece sencillo en cuanto al manejo; pero con muy buenas opciones sobre todo en lo que respecta a la inserción de elementos.
La pega que le veo es que solo es posible editar las entradas agregadas desde el dispositivo por lo que olvidate de querer modificar tus demas posts.
En conclusión recomendado en definitiva, pues me parece que de las alternativas es la mejor para mobiles.
miércoles, 30 de octubre de 2013
Como llamar un Constructor Base desde una clase Heredada, en Vb y C#
Escribo esta entrada porque algunos colegas tal vez no estan al tanto de las diferencias que implica el lenguaje al momento de llamar un constructor Base desde la clase que la hereda.
C#
En la Firma del constructor de la clase heredada, especificamos a que constructor base debe llamar y que parametros se enviaran al mismo.
1: public AtmException(object pOrigen,string pMensaje)
2: : base(pMensaje)
3: {4: Data.Add("ObjectSource", pOrigen);
5: Data.Add("Mensaje", pMensaje);
6: } 7: }Vb.Net
En este caso utilizaremos el objeto MyBase para llamar al constructor deseado, en la linea inmediata a la firma del Constructor de la clase derivada.
1: Public Class ExceptionNumeroRegistrosExcedido
2: Inherits Exception
3: 4: Sub New(pMensajeExcepcion As String)
5: MyBase.New(pMensajeExcepcion)
6: End Sub
7: End Class
Bien pues como siempre espero que les sea de utilidad.
Happy Coding… KarlozArba
miércoles, 31 de octubre de 2012
Deshabilitar que la tecla ENTER dispare el evento Button.Click
Este caso aunque la solución llegue a ser sencilla en implementación, no me parece que este al alcance de quienes tenemos un conocimiento básico, intermedio de DotNet. En fin, cuando necesitemos que un botón dispare su evento click al pulsar la tecla ENTER cuando esté enfocado, deberemos forzosamente crear nuestro propio botón heredándolo de otro botón claro esta, en mi caso lo he hecho a partir de uno de DevExpress.
Una vez hecho esto, sobrescribir el método ProcessCmdKey tal como muestro más abajo.
Para mi caso muy particular se requería que si se detectara a tecla y de ser ENTER se enviara el foco al siguiente control, lo cual realice mediante un PreviewKeyDown.
Public Class iBotonDx Inherits DevExpress.XtraEditors.SimpleButton Protected Overrides Function ProcessCmdKey(ByRef msg As Message, ByVal keyData As Keys) As Boolean Return keyData = Keys.Enter OrElse MyBase.ProcessCmdKey(msg, keyData) End Function Private Sub iBotonDx_PreviewKeyDown(sender As System.Object, e As System.Windows.Forms.PreviewKeyDownEventArgs) Handles Me.PreviewKeyDown If e.KeyCode = Keys.Enter Then SendKeys.Send("{TAB}") End If End Sub
End ClassBien es todo en este entrada. Como siempre espero sea de utilidad.
Happy Coding… KarlozArba
lunes, 15 de octubre de 2012
La propiedad EditValue de un TextEdit de DevExpress devuelve error en su método GET si no se tiene un valor inicial.
Bueno pues resulta que si no hemos asignado mediante código un valor inicial para la propiedad EditValue en un TextEdit de DevExpress este nos tira un error de referencia nula. Y este error se dispara aun cuando validemos el contenido de la propiedad con IsNothing o String.IsNullOrEmpty.
Bien la solución es bastante sencilla, lo único que debemos hacer es configurar en tiempo de diseño dicha propiedad, estableciendo el tipo de dato que contendrá y el valor que almacenara cuando nosotros no establezcamos nada de forma predeterminada.
Espero que les sea de utilidad.
Happy Coding…. KarlozArba
viernes, 5 de octubre de 2012
Binding de los valores de una ENUMERATION en el DataSource de un Control.
El día de hoy, muy brevemente comentare que cuando nos sea necesario cargar los valores de una enumeración en el DataSource de un control [ej. Combo, List, etc] quizá nuestra primera intensión sea recorrer la enumeración sin embargo la solución que les recomiendo es la siguiente:
cbEstatus.Properties.DataSource = System.Enum.GetValues(GetType(Dominio.Enumeraciones.EnEstatus))
Con lo cual cargaran inmediatamente los valores, ahorrándonos un poco de trabajo y alguno que otra contratiempo.
Bien como dije la entrada de hoy ha pecado de breve, pero como siempre espero que sea de utilidad para la comunidad.
Happy Coding... Karloz Arba
viernes, 14 de septiembre de 2012
Crear Custom Control Panel mediante un User Control.
Que tal, ya después de un largo tiempo sin agregar entradas a mi modesto blog, quiero dar una pequeña aportación, pero que espero este llena de posibilidades para todos.
Bien pues ¿que tal tener nuestro propio Control Panel? ¿Porqué? o ¿Para que?, las respuestas las hay de todas, en mi caso en la consultora para la que “laburro”, tenemos un conjunto de controles de usuario a los que se les han agregado algunas funciones de dibujo que permiten simular que cada control esta dentro de un panel con bordes redondeados [ese código esta pendiente para otra entrada], bueno pues hay casos en los que necesitamos tener varios controles agrupados en un solo Panelote, así que creamos un User Control que no tiene más que las funciones de dibujo, y así conseguimos nuestro Panel con bordes redondeados para agrupar otros controles, pero nada!! que es solo un farol pues en realidad no agrupa nada. ¿Porqué?, bueno pues porque si bien en cierto que los UC implementan IContainer tambien en cierto que solo funcionan de esta forma en modo de diseño. Pero bueno después de este largo preámbulo verán que la forma de crear su control contenedor es tan fácil que raya en lo ridículo.
1. Crear un proyecto de Librería de Controles
2. Por defecto nos agrega un control de usuario denominado UserControl1, renombrarlo como mejor nos parezca.
3. Agregamos los siguientes Namespace, pues necesitaremos un atributo para nuestra clase que se encuentra en ellos:
System.ComponentModelSystem.ComponentModel.Design
4. Marcamos nuestra clase con el atributo:
<Designer ("System.Windows.Forms.Design.ParentControlDesigner, System.Design", GetType(IDesigner))>Esto proveerá la magia para que nuestro UC pueda comportarse como un control del tipo ParentControl o contenedor.
Nuestra Clase debería quedarnos más o menos así:
Bien ha sido todo por hoy, como siempre espero que les sea de utilidad.
Happy Coding... Karloz Arba
jueves, 5 de julio de 2012
CREATE FILE encountered operating system error 5(Access is denied.)
En el caso de que desinstales tu instancia de sql server express, y quieras realizar un Attach de las bd que tenias anteriormente, es posible que te encuentres con el siguiente mensaje, al momento de adjuntarlas:
CREATE FILE encountered operating system error 5(Access is denied.) while attempting to open or create the physical file 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\MyDataBase.mdf'. (Microsoft SQL Server, Error: 5123)
Bueno pues la solución pasa simplemente por:
* En un explorador de windows abrir las propiedades de cada archivo .mdf y .ldf que necesites adjuntar, en la pestaña de seguridad agrega “Todos”, o “Everyone” según el idioma de tu SO, dale todos los permisos, y listo!! podras adjuntar sin problemas.
Happy Coding... Karloz Arba
lunes, 14 de mayo de 2012
Montículo, Pila, Tipos por Valor y por Referencia WTF??
Cuando declaramos una variable, antes que nada debemos estar consientes de que esta formada por tres elementos:
1. Nombre de la variable.
2. Tipo de Datos de la variable.
3. Valor de la variable,
Ahora bien, dependiendo del tipo de la variable que usemos, esta se guardara en uno u otro tipo de memoria, ya que para este fin existen dos tipos: la Pila [Stack] y el Montículo [Heap].
El compilador almacena las variables de tipos primitivos en la Pila, que es una estructura de tipo LIFO [Last InFirst Out], esta memoria es mucho mas ágil aunque Estática, que su contraparte, sin embargo tiene una limitante en cuanto al tamaño que es de 1024 kb. No obstante es posible modificarla mediante opciones de compilación, pero esa es otra historia.
Por otra parte cuando ocupamos tipos Referencia [Clases, Objetos, Interfaces, Delegados, etc.] estos son almacenados en el Heap, que es otro segmento o tipo de memoria, que se asigna de forma dinámica a través de un administrador de la misma, que en DotNet se denomina: Garbage Collector o Recolector de Basura, que hay que decir que es quien se encarga de liberar la memoria que ya no es ocupada. Es importante mencionar que aun cuando el objeto referencia se encuentra en el Heap, en el Stack se crea un Apuntador, que almacena precisamente la dirección donde puede localizar el contenido de esa variable referencia, por esa razón cuando asignamos un objeto a otro, en realidad lo que estamos haciendo es copiar a su apuntador la misma dirección de memoria donde se localiza el objeto.
Hemos dicho que los tipos primitivos se copian en el Stack, sin embargo como toda regla tiene su excepción y esta es que si estas variables son miembros o propiedades de objetos, estas se almacenan también en el Heap y solo cuando son variables locales dentro de sus métodos estas van al Stack, ¿por que? porque son variables temporales de las que el compilador solo deberá almacenar su valor de forma breve para realizar algunas operaciones, y esto ademas agilizara la ejecución de la aplicación.
Bueno de momento esto ha sido todo, espero no liarlos mucho con tantas letras, pero muchas ocaciones estos detalles que suelen ser teóricos y en apariencia muy basicos, pueden hacer la diferencia dentro de nuestros desarrollos.
Happy Coding... Karloz Arba
Imprimir pantalla y pantalla actual en vb.net
El como tratarla lo veremos después, aunque la solución es tan sencillo como mandarla a un Image.
' en un botón o donde queramos establecer la impresión colocamos los siguiente:
SendKeys.Send("{PRTSC}") ' para la pantalla completa
SendKeys.Send("%{PRTSC }") ' para la pantalla activa.
Espero que les sea de utilidad. karlozarba... Happy coding!
miércoles, 9 de mayo de 2012
Desde Windows phone
lunes, 26 de marzo de 2012
Activar los Comentarios XML de documentación en VB.Net cuando han dejado de trabajar.
Que, tal.
En esta ocasión quiero comentar una situación que me trajo un buen rato de cabeza, y es que mientras desarrollamos generalmente documentamos nuestros métodos haciendo uso de los comentarios en XML que nos proporciona VS, sin embargo llega el momento en que esta herramienta solo esta disponible en proyectos de C# y por alguna razón en VB.Net simplemente no aparecen, aun cuando pulsemos una y otra vez ''' que es la combinación que nos permite visualizarlas.
Pues bien la solución es bastante extraña pues en las propiedades del proyecto debemos dirigirnos al apartado de compilación y CHECKEAR la opción “Generar documentación XML”. Puede suceder, como a mi me paso, que la opción estaba checkeada, pero el control se encontraba en un estado similar a deshabilitado, bueno pues simplemente desmarcar y marcar y con eso bastara.

Bueno espero como siempre, que les sea de utilidad.
Que la Fuerza del código les acompañe.
Saludos
karloz arba
miércoles, 7 de marzo de 2012
Obtener el registro seleccionado en un GridLookupEdit de DevExpress
Bueno ya tiene un muy buen rato que no agregaba nada al blog, espero como siempre que a todos los que ocupan la Suite de Dx para Windows Forms les sea de utilidad.
// Asignamos el valor “Visible” del Contenedor en alguna variable aunque esto claro esta es mejorable
string valor = lueVerBd.EditValue.ToString(); //El control tiene un método que a partir de ese valor seleccionado nos devolverá el registro al que pertenece.
// Claro que este valor lo busca en el campo identificado como Campo Llave.
DataRowView dr;
dr = (DataRowView) lueVerBd.Properties.GetDataSourceRowByKeyValue(valor);
Bien pues por el momento es todo….
Happy Coding!!
karlozarba
miércoles, 23 de noviembre de 2011
Parser Error Message: Could not create type
Que tal, el día de hoy comentare algo que me tuvo al borde de botar la maquina y dispararle, pues si googleas el mensaje de error “Parser Error Message: Could not create type” encuentras soluciones que no necesariamente te ayudan.
En fin, el caso es el siguiente:
1. Tienes un Web Service que generalmente cuando agregas un proyecto de este tipo, esta configurado como AnyCPU
2. Corres el Ws y resulta que funciona correctamente
3. Requieres cambiar la aplicación para que se compile como x86
4. Ejecutas nueva e ingenuamente la aplicación, y… Sorpresa!!! te tira el error: “Parser Error Message: Could not create type” que como mencione, las soluciones encontradas en internet, comentan un error relacionado con un cambio de nombre o de namespace en tu clase, lo cual puede hacerte perder un buen rato tratando de decifrar, sobre todo cuando no has hecho el maldito cambio de nombre o algo parecido.
5. Para empeorar las cosas, si lo regresas como Any, resulta que si jala ![]()
Bien pues la solución es la siguiente para el caso descrito…
Resulta que cuando compilas tu WebService como ANY, el resultado se genera en la carpeta BIN\ pero cuando configuras para x86 el VS te genera una nueva estructura de directorios identificadas bajo x86\ y por alguna razón que no me explico el IIS es incapaz de leer, por lo que jamás encuentra los ensamblados para construir los objetos.
De tal suerte que la solución pasa por dirigirnos a las propiedades del proyecto, en la pestaña COMPILE en la opción “Build output path” debemos mantener el valor: “bin\”, así que si tiene otro valor deberás modificarlo.
A continuación corremos el proyecto y listo!!!
Nuestro Web Service trabaja correctamente.
Como siempre espero que les sea de utilidad.
Best regards And Happy coding.
KarlozArba
lunes, 14 de noviembre de 2011
ACTUALIZAR EL @@SERVERNAME DE UNA INSTANCIA SQL SERVER
Bien pues aquí un aporte más que seguro les podrá evitar mas de un dolor de cabeza.
En ocasiones contamos con un equipo sea, Pc o Servidor completamente instalado y este cuenta con una instancia de Sql Server, sin embargo por alguna causa [ej. estandarización de nombres de red, en la empresa… como es mi caso
] es posible que deba ser cambiado el nombre del equipo, tras lo cual seguramente tendremos problemas para conectarnos a nuestra servidor de Sql Server ya que para el motor de Bd el nombre registrado simplemente ya no se encuentra.
Bien pues aquí una forma de repararlo.
1. Hacer una consulta a la vista de sistema: sys.servers:
SELECT * FROM sys.servers
| server_id | name | product | provider | data_source |
| 0 | JCAB\DENALIXPS | SQL Server | SQLNCLI | JCAB\DENALIXPS |
como vemos el nombre registrado originalmente fue: JCAB
2. Eliminaremos el servidor registrado
EXEC sp_dropserver ‘JCAB\DENALIXPS’
3. Ahora registramos el nuevo nombre de servidor:
EXEC sp_addserver 'ABP-LAP-002\DENALIXPS','LOCAL'
Es importante notar el parametro ‘LOCAL’ pues indica si se trata de una instancia local.
4. Una vez registrado, es necesario ajustar sus opciones de Servidor para que sea accesible, lo cual conseguimos mediante:
EXEC sp_serveroption 'ABP-LAP-002\DENALIXPS','data access','true'
5. A modo de comprobación podemos consultar nuevamente sys.servers y adicionalmente @@servername
Pues espero que les sea útil, hasta aquí por el día de hoy.
Best regards And Happy coding.
KARLOZARBA
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