Archivo de la categoría: Visual Basic 2005

Jugando con DataTables

Hace unos días veíamos una forma de trabajar con una relación m:n usando LINQ. En esta ocasión vamos a ver otra posibilidad y no voy a poner código, que ando mal de tiempo, así que a ver si consigo explicarme bien.

Supongamos que tengo dos tablas, Series y Personajes. Entre ellas hay una relación n:m (una serie tiene varios personajes, un personaje puede salir en varias series). La tabla que nos permite esta relación digamos que se llama PersonajesDeSerie y que sólo tiene dos campos: IdSerie e IdPersonaje. Por otra parte, en el formulario de personajes, que es donde podemos añadir las series donde aparece el mismo, queremos mostrar el título de la serie y el año de producción (podían ser más cosas, pero tampoco es plan de complicar el ejemplo). Para facilitar las cosas, nos creamos una vista en la base de datos que metemos como DataTable en el DataSet de Personajes. Es decir, tengo tres DataTable: Personajes, PersonajesDeSerie y vMisSeries, ésta última con los campos IdPersonaje, IdSerie, Titulo y Año. En mi caso, metidos en el mismo DataSet por comodidad.

Sigue leyendo

Depurando

Estoy terminando una aplicacioncita para el curro. Lo de terminando es, más bien, pretencioso. Digamos que está alcanzando un “nivel operativo mínimo”, que diría Ratchet: altas, bajas y modificaciones. Faltan las consultas y, sobre todo, que imprima. Pero, por lo pronto, da para ir pasando datos, que sin datos pocas consultas y pocos informes van a sacar. Así que ya tengo todo juntito y compila y… no funciona, claro. No funciona bien, vamos: no se bloquean las visitas cuando estoy dando de alta o modificando un cliente, me salta el error de validación de datos al pulsar el botón “Nuevo”, la búsqueda rápida hace lo que quiere…

Así que estoy depurando el código. Revisa línea por línea, ejecuta línea a línea. Cambia de sitio alguna línea, revisa la inicialización de esta variable, rastrea de dónde sale esta reacción cruzada…

Y son sólo un puñado de líneas, dos o tres mil, más las que haya generado automáticamente VB. Hacer esto en un proyecto grande tiene que ser un infierno infernal.

En fin, menos mal que funciona y lo que falla son detallitos.

¿Qué camión?

Llevo ya un par de días (si las incidencias con el programa de las tiendas me deja) programando la aplicacioncita para fábrica, empezando por generar los datasets, una vez dejado de lado LINQ to SQL, y las clases de acceso a datos correspondientes. Me encuentro ahora con que tengo que almacenar el valor máximo de la columna timestamp de ésta o aquella tabla para usarlo al actualizar el dataset, tal y como conté (creo) antes.

He estado toda la mañana pensando dónde meter el dichoso array de Bytes que guarda el valor del timestamp: ¿en la clase de acceso a datos? ¿Cómo Static? ¿Shared? ¿En el formulario? ¿Otras (por favor, indique…)?

Después de perder bastante tiempo con esto, me paro, respiro hondo, miro el explorador de soluciones… y se me queda cara de imbécil. Y me digo:

“Niño, ¿sabes lo que estás viendo? Un dataset tipado. ¿Sabes quién lo ha hecho? Tú. ¿Sabes que puedes añadir código personalizado al dataset tipado? Eso lo tienes que saber, es básico. Lo sabes, ¿verdad? ¿VERDAD? Pues entonces, ¿qué coño has estado haciendo toda la mañana, animal de bellota?”

Diez minutos después tengo en la datatable correspondiente una nueva propiedad para el timestamp y todo funcionando.

A veces uno se obceca, o se distrae, y no ve lo evidente, lo simple o, directamente, el toro o el camión que tiene delante de sus narices.

Jugando con valores timestamp

Tengo abandonado el blog. Ambos blogs, de hecho. El arranque tras las (cortas) vacaciones veraniegas está siendo lento. A esto hay que añadir que, en el curro, lo único que he hecho desde que he vuelto es trabajo administrativo. Ahora me toca volver con CNC (Control Numérico Computerizado) porque hay que retocar el armario para la nueva serie. Entre medias, espero sacar tiempo para terminar una aplicación a la que me queda depurarla y empezar una nueva que llevo preparando (la parte teórica y la documentación previa) desde principios del verano.

Para esta segunda conseguí sacar un ratito la semana pasada para probar el uso de marcas de tiempo y de versión para controlar la modificación de registros en la base de datos, con el fin de controlar más fácilmente los problemas de concurrencia. Tras probar varias opciones y posibilidades, lo último ha sido trabajar con el tipo de datos TIMESTAMP de SQL. No tenía pensado sacar ninguna entrada de estas pruebas pero, en fin, así parece que el blog no está abandonado y quizás a alguien le resulte útil.

Sigue leyendo

Impedir el cambiar de pestaña en un TabControl

Tengo la costumbre, inculcada por un profesor, de que, en una aplicación con acceso a datos, cuando se ven los datos no se pueden modificar y cuando estamos modificándolos (altas, edición) sólo podemos modificarlos (nada de abrir otra ventana, nada de cambiar de registro…). Estoy haciendo ahora una aplicacioncilla para el trabajo donde he preferido usar un único formulario que muestra los datos en distintas pestañas de un TabControl. De momento, clientes en una pestaña y las visitas de nuestros comerciales a esos clientes en otra pestaña (el resto, con calma). Así pues, y aplicando la filosofía antes mencionada (que se resumen en “el usuario es un manazas”), la idea es que el usuario no pueda cambiar de pestaña si está añadiendo o modificando un cliente o una visita.

En un principio pensé en hacerlo controlando el evento SelectedIndexChanged, pero no queda bien: se produce un molesto parpadeo cuando cambiamos de pestaña y el programa nos vuelve a mandar a la que estábamos. Así que me puse a revisar otros eventos que pudieran servir y encontré Selecting. De la referencia de Visual Studio:

“Se produce antes de que se seleccione una ficha, permitiendo que un controlador cancele el cambio de ficha.”

Efectivamente, sólo hay que indicar un e.Cancel = True para impedir el cambio de pestaña. En mi caso, si no estoy en modo “Ver Datos”, impido este cambio.

En fin, por lo menos he sacado algo útil en el día de hoy. Estoy tan espeso que casi todo el día llevo arreglando destrozos que yo mismo he hecho en partes que ya funcionaban.

El checkbox y yo

Me las traigo con algunos controles en Visual Basic. La última pelea ha sido con el chekbox. El motivo, controlar que no se pueda marcar o desmarcar la opción cuando estoy en modo “Ver datos”. Con los demás controles (todos textboxes, maskedtextboxes, comboboxes y listboxes) lo había hecho controlando el evento Enter del GroupBox en el que se encuentran, de forma que, en modo “Ver datos”, todos los intentos de acceder a un control dentro del GroupBox eran desviado a otro control, en este caso un listbox, podía haber sido un botón de navegación, etc. El problema surgió porque al marcar o desmarcar un checkbox no se pasa por el evento Enter, ni del chekbox ni del control que lo contiene. Lo mismo pasa con el numericupdown o el datetimepicker, pero con esos no he conseguido aún dar con la tecla (tampoco he tenido que usarlos de un tiempo a esta parte).

Sigue leyendo

La aplicación que no fue

Hará cosa de año y medio (¡cómo pasa el tiempo!) empecé con mi aplicación ColecciónAnime en Visual Basic 2005. Básicamente intentaba ser un front-end para una base de datos para controlar un poco el jaleo que tengo de series y, de paso, terminar de dar el salto de VB6 a VB2005 y.Net Framework. La base de datos pretendía recoger las series y las distintas versiones de éstas que tenía, los fansub que las habían sacado, los estudios que las habían hecho, sus personajes, los actores de doblaje y, de paso, a quién se las prestaba.

Empecé con ganas, pero al poco me puse a trabajar y la idea se quedó en el limbo: después de estar ocho horas al día delante de un ordenador, no me apetecía mucho ponerme a programar al llegar a casa. Algunos fines de semana le echaba un ratito y, así, poco a poco, la fui haciendo. Esta Semana Santa le metí un buen tute y conseguí solucionar dos problemas que arrastraba desde el principio (después de un tiempo empollando un tocho ladrillo, no hay nada como tener documentación). A saber:

  1. El formulario de series debía mostrar cada serie y, en un TabControl, cero o más pestañas con las distintas releases que tuviera de esa serie. Me daba problemas al modificar una release. Lo conseguí solucionar con un control de usuario hecho a medida.

  2. El otro foco de problemas era el formulario de tablas menores. Este formulario gestionaba (altas, bajas, modificaciones) una serie de tablas casi idénticas (Resolución, códecs de audio y vídeo, tipo de archivo, género, idiomas…): todas tenían los tres mismos campos (Id, nombre y comentarios), pocos registros y se relacionaban con series o releases. En vez de tener un formulario para cada una, creé uno solo y usé un dataset no tipado para poder trabajar con cualquiera de las tablas. Cuando diseñé la base de datos no pensé en hacer la gestión así, así que tuve algunos problemas añadidos (los nombres de los campos eran distintos, etc.) que me complicaron un poco la vida, otra vez con las modificaciones. En Semana Santa, después de pensar tranquilamente, lo corregí.

Así que me encontraba con que la aplicación casi permitía ya altas, bajas y modificaciones sin problemas (me quedaba controlar un par de cosas en el caso de que hubiera múltiples formularios abiertos) y estaba ya dándole vueltas a la parte de consultas cuando me pillé el libro de El Guille de VB2008 y descubrí LINQ.

Aplicación a la papelera.

Cambiamos a VB2008 y, de paso, cambiamos el motor de la base de datos, optando por Compact SQL en lugar de Access. La aplicación la voy a rehacer entera, más orientada a objetos, jugando ya con herencia e interfaces y más o menos en dos capas. Espero poder aprovechar bastante código de la anterior, pero también localizado un buen puñado de líneas que voy a jubilar gracias a LINQ y a lo que he aprendido desde que empecé con VB2005. En fin, veremos que sale, si sale algo.

Y a ver si consigo que funcione mínimamente para cuando salga Visual Basic 10, porque como mantenga el ritmo quiebra Microsoft antes de que la termine.