Goles Paso a Paso

download Goles Paso a Paso

of 30

Transcript of Goles Paso a Paso

  • Desarrollo paso a paso de un programa en Gambas 3Daniel Calleja Amaro

  • GOLES; LA PASIN DEL FTBOL

    Paso a paso en Gambas 3Gambas es marca registrada de Benoit Minisini

    Nota:sta es la versin Pdf de los artculos publicados en blog gambeando.wordpress.comSe distribuye bajo los trminos de la licencia General pblica Creative Commons. Usted puede copiarla o distribuirla, siempre y cuando mencione al autor y lo haga sin fines de lucro, en forma libre y gratuita.

  • ndice de contenido

    Goles, la pasin del ftbol...................................................................................................................3Creando la base de datos......................................................................................................................4interfase y anlisis................................................................................................................................7Terminando la interfaz........................................................................................................................11Reutilizando cdigo............................................................................................................................13Sigamos avanzando............................................................................................................................15Un pequeo cambio a la base de datos...............................................................................................17Sumando puntos.................................................................................................................................18Aadiendo Funcionalidades...............................................................................................................21Listando etapas o Fechas.................................................................................................................22

    Goles, la pasin del ftbol

    Bien, aprovechando todo lo que hemos ido aprendiendo sobre base de datos vamos a empezar un nuevo y algo ms ambicioso proyecto, Goles, la pasin del ftbol.

    Est realizado en base a la liga de mi pas, Uruguay, donde militan diecisis equipos, pero la idea es que pueda adaptarse fcilmente a cualquier otra. La premisa, bsicamente, consiste en anotar los resultados en un formulario al efecto y que automticamente sume puntos, goles a favor y goles en contra, y guarde los resultados de la fecha en una base de datos. Esto nos permitir ms adelante buscar resultados por fecha o o por equipo.Y que adems genere las tablas de posiciones fecha tras fecha.

    Vamos a trabajar por primera vez con Gambas 3, la ltima versin del mismo.

    Analizemos los requisitos. Primero que nada necesitamos una base de datos con algunas tablas. Una tabla llamada equipos con los siguientes Items: Equipo, puntaje, gf(goles a favor)Gc(goles en contra). Otra tabla llamada fechas donde guardaremos los resultados, con los items fecha, equipo 1, goles1,equipo2, goles2. Vamos a necesitar que el programa analize los resultados y en base a esto asigne los puntos, tres al ganador , uno en caso de empate y 0 en caso de derrota.

    En una segunda etapa, la idea es poder llevar tabla de goleadores y tarjetas amarillas y rojas, y que nos alerta al llegar a cinco amarillas(suspensin automtica). Pero esto ser a futuro.

    Vamos a ver algunas cosas nuevas como cdigo comn para varios controles, copiar controles y realizar clculos numricos.

  • Creando la base de datos

    Vamos a empezar por crear las base datos necesaria para este proyecto. Podemos usar el gestor de bases de datos, de gambas. Yo use el sqlite database browser, os dejo unas capturas de pantalla del mismo. Es muy intuitivo y no precisa mayores explicaciones.Si no lo tenemos lo podemos instalar desde sinaptic o como en mi caso, desde el centro de software de Ubuntu.

    Vamos a Filenew database, elegimos el nombre y luego creamos las tablas, que en principio van a ser solo dos. Equipos y Fechas.

  • Atencin!! Las bases de datos distinguen entre maysculas y minsculas, tanto en los nombre de tablas y campos como en los datos. Hay que ser cuidadoso con esto porque sino puede ser un verdadero quebradero de cabeza.

    Bien nuestras tablas deben quedar con la estructura que se ve el la imagen final o sea:

    Tabla Equipos

    Con los campos Equipos (texto),Punteje(entero)Gf (entero) Gc(entero) Donde Gf son los goles a favor y Gc los goles en contra. Lo que va entre parntesis es el tipo de dato.

    Tabla Fechas

    Con loscampos Fecha(texto),local(texto)glocal(entero),Visitante(texto),gvisita(entero). Donde fecha es el orden de las mismas (fecha1,fecha2) y no un campo del tipo date.glocal son los goles del local y gvisita son los goles del visitante. Os dejo un par de capturas de ambas tablas con las dos

    primeras fechas.

  • . Cuando carguemos la primera tabla en nuestro programa vamos a querer que nos ordene la tabla por puntaje de mayor a menor, para eso vamos a usar la orden sql order By pero eso ya lo veremos durante la construccin del programa. En el prximo post vamos a construir la interfase y estudiar los nuevos desafos que se presentan para codificar.

  • interfase y anlisis

    Siempre es bueno, antes de comenzar a construir la interfase , analizar que precisamos que sta contenga. En nuestro caso, precisamos cargar equipos, resultados, nmero de fecha y como no, listar la tabla de posiciones .

    Para ver la tabla, vamos a colocar un columview , al que llamaremos precisamente tabla o cvtabla.

    Para cargar la fecha ,un listbox al que denominaremos lbfechas y 16 listbox para cargar los equipos a los que llamaremos simplemente lb1,lb2 y as sucesivamente hasta lb16.

    Recordemos que los nombres los ponemos desde la ventana de propiedades en la propiedad name.

    Adems vamos a precisar 32 value box que sern donde pondremos los goles de cada equipo y donde el programa asignara los puntajes correspondientes. Veamos su aspecto en tiempo de diseo.

    Fmain en tiempo de diseo con todos sus controles visibles

  • Y en tiempo de ejucucin con algunos controles ocultos y la tabla cargada

    Si observamos con atencin veremos que faltan algunos controles. Es que en realidad los hemos ocultado poniendo su propiedad visible=false, ya que el usuario no necesita interactuar con stos ni ver su contenido. Adems evitamos que por accidente cargue algn valor incorrecto.

    Cmo podemos hacer para que la construccin de una interfase con tantos controles sea ms fcil y rpida?

    Vemoslo con un ejemplo.

  • Arrastrando y pegando creamos el primer listbox y le cambiamos el nombre a lb1. Luego seleccionamos el control recin creado, botn derecho del mouse, copiar y luego pinchando con el botn derecho sobre el formulario le damos pegar. Veremos que el nuevo control se crea ya con el nombre lb2 y aparece en la esquina superior izquierda del formulario.

    Lo arrastramos a su lugar , y con control +v(atajo de teclado para pegar) creamos el resto de los listbox. Los iremos colocando por pares, de izquiera a derecha. Puede guiarse por la imagen de la interfase que aparece ms arriba. Para alinearlos los selecciones por fila y usando la propiedad X de los mismos los alineamos verticalmente.Vea la imagen.

  • Luego podemos alinearlos horizontalmente mediante la propiedad Y.

    Ahora de la misma manera crearemos los valuebox, llamando al original vb1.Los iremos colocando por pares a la derecha de cada listbox. Es fundamental colocarlos en el orden correcto para facilitar la codificacin posterior

    .

  • Terminando la interfaz Vamos a necesitar un botn que asigne los puntos(btnasignar),otro que los sume (btnsumar), uno ms para guardar la fecha jugada(btnguardar), un botn para agregar los equipos(btnnuevo), y por supuesto uno para cerrar el programa(btnsalir). La imagen del post anterior nos da una idea, pero es a gusto de consumidor. Mi idea de cmo colocar los botones sigue dos premisas bsicas, que resulte cmodo para el usuario y los que llevan alguna secuencia estn en orden. Ya veremos en breve a qu me refiero con ste ltimo punto. Debemos agregar tambin un columview al que llamaremos tabla

    Vamos a necesitar que al empezar el programa se carguen los datos que vamos a utilizar,o sea la tabla con los equipos. Para eso vamos a tener que conectar a la base de datos mediante un objeto connection.

    Al principio de fmain.class declaramos las variables comunes a todo el formulario:

    Private hconn As ConnectionPrivate hresul As Result

    Luego creamos el procedimiento de coneccin:

    Public Function ConectarBase() As Boolean

    if hconn Null Then Return False

    hconn = New Connectionhconn.Host = User.Home &/ .goles1hconn.name = Futbolhconn.type = sqlite3 Try hconn.Open() If Error Thenhconn = NullMessage.Error(error al conectar con la base) Return TrueEndif Return FalseEnd

    Como podemos ver es el mismo cdigo que usamos en los ejemplos anteriores(agenda y juego), donde indicamos la ubicacin de la base, el tipo y nombre de la misma y le pedimos que se conecte y en caso contrario nos de error. Vemos que el path o ruta es:

    hconn.Host = User.Home &/ .goles1 o sea la carpeta de usuario y dentro de la misma, la carpeta oculta .goles1.

    Cmo nos aseguramos que la misma est ah?Primero, incluyndolo en la carpeta Datos de nuestro programa (botn derecho sobre datos,nuevo, existente, navegamos hasta la carpeta donde lo tenemos y le damos aceptar).

    Luego, en el evento open de fmain agregamos el siguiente cdigo:

    If Not Exist(User.Home &/ .goles1/Futbol) Try Mkdir User.Home &/ .goles1 Copy Futbol To User.Home &/ .goles1/FutbolEndif

  • Este mtodo comprueba si existe la base, si no crea la carpeta y copia en ella la base que viene con el programa. Sencillo.A continuacin todo el cdigo del Form_open:

    Dim Clave As String

    If Not Exist(User.Home &/ .goles1/Futbol)Try Mkdir User.Home &/ .goles1Copy Futbol To User.Home &/ .goles1/FutbolEndif

    tabla.Clear limpiar tabla

    If ConectarBase() Then Return

    tabla.Columns.Count = 5

    tabla.Columns[0].text = Equipotabla.Columns[0].Width = 280tabla.Columns[0].Alignment = Align.Centertabla.Columns[1].text = Puntajetabla.Columns[1].Alignment = Align.Centertabla.Columns[1].Width = 60tabla.Columns[2].text = Gftabla.Columns[2].Width = 40tabla.Columns[2].Alignment = Align.Centertabla.Columns[3].text = Gctabla.Columns[3].Alignment = Align.Centertabla.Columns[3].Width = 40tabla.Columns[4].text = zdiftabla.Columns[4].Alignment = Align.Centertabla.Columns[4].Width = 40

    hresul = hconn.Exec(Select * from Equipos) consulta sql

    Do While hresul.AvailableClave = hresul["Equipo"]tabla.Add(Clave, Clave)tabla[Clave][1] = hresul["Puntaje"]tabla[Clave][2] = hresul["Gf"]tabla[Clave][3] = hresul["Gc"]tabla[Clave][4] = hresul["zdif"]hresul.MoveNext()Loop listar bloqueabotones

    End

    Lo que est en negrita es nuevo, lo anterior comprueba la conexin y carga los datos en el columview. El procedimiento bloqueabotones es sumamente sencillo y ste es su cdigo:

    Public Sub bloqueabotones()

    Btnasignar.enabled = Falsebtnsumar.enabled = Falsebtnfecha.enabled = False

    End

  • Por qu lo hacemos as en lugar de poner el cdigo directamente en el procedimiento open? Porque vamos a necesitar hacer lo mismo en ms de una ocasin y esto nos permite utilizar el mismo cdigo sin necesidad de reescribirlo, simplemente lo llamamos por su nombre. En este caso particular es un cdigo de apenas tres lneas y puede no parecer muy til, pero imagine en los casos en que las lneas sean 10 o ms y debas llamarlas varias veces a lo largo del programa. En el prximo post comentaremos listar y por primera vez haremos uso de funciones con parmetros.

    Reutilizando cdigo

    Habamos visto en el capitulo anterior como llamar a un procedimiento o funcin desde distintos lugares para evitar escribirlo muchas veces. Experimentando rato despes me di cuenta que el procedimiento usado para rellenar el columview lo iba a tener que llamar ms de una vez durante el programa, por lo que me convena encontrar una manera de no tener que reescribirlo. Esta fue la solucin:

  • Y as qued el cdigo del evento open de fmain, mucho ms corto:

    Hemos agregado en la sentencia sql un par de clasulas para que nos ordene la lista,resaltado en negrita :

    hresul = hconn.Exec(Select * from equipos order by Puntaje DESC, zdif DESC )

    order by(ordene por) puntaje DESC (puntaje de mayor a menor) zdif DESC(diferencia de goles de mayor a menor)

    Esto nos permite ordener la tabla de pocisiones desde el de ms puntaje, si hay dos con el mismo puntaje va primero el que tenga mayor diferencia de goles. Incluso podramos agregarle a la sentencia sql una tercera condicin , Gf DESC para que en caso de que estuvieran empatados en puntos y saldo de goles pusiese primero el que tuviera ms goles a favor.

    Necesitamos que cuando inicie el programa nos cargue en los 16 listbox la lista de equipos para poder seleccionarlos y no tener que escribir uno x uno. Adems de la comodidad que esto implica, nos permite evitar errores al tipear los nombres. Recordemos brevemente la sintaxis utilizada para cargar los mismos:

    listbox.add(lo que quieras)

    Ahora, imaginemos hacer esto para 16 listbox con 16 equipos cada uno. Es mucho cdigo. Adems. si cambiamos de liga o hay ascensos y descensos cambiar equipos nos implicara meter mano en el cdigo. Lo que vamos a hacer es que cada listbox se cargue desde la base de datos, mediante un select y un procedimiento creado al efecto: el procedimiento listado con el parmetro lista as listbox(lista como listbox)

  • Primero como siempre declaramos las variables, Dim clave as String, luego agregamos esta sentencia al principio de la lista (lista.Add(Elige un equipo)) para obligarnos a seleccionar un equipo en cada lista. Esto nos evita que alguno de los listbox quede con valor Null al no modificar la seleccin. A continuacin comprobamos que la base est conectada y seleccionamos los equipos en orden alfabtico order by Equipo ASC y mediante el Do whileloop recorremos equipo por equipo. Pero,donde cargamos la lista?

    En cada uno de los listbox mediante el llamado al procedimiento listado con el parmetro del nombre de cada uno de los listbox, en el sub listar:

    listado(lb1).listado(lb16)

  • Sigamos avanzando

    Bien, ya hemos visto como usar el mismo cdigo en varias partes de nuestro programa y como llamarlo desde diferentes procedimientos.

    Ahora nos encontramos con la fase en que, tras escribir nosotros los resultados el programa calcule y asigne los puntos a cada uno. Como ya sabemos el empate da un punto a cada uno,la victoria tres y la derrota cero punto. Por tanto, necesitamos que el programa compare en cada partido los goles del local, los del visitante y en virtud de eso asigne los puntos. Vamos a crear una funcin que nos devuelva en una variable el resultado de esa comparacin. Veamos como:

    Private Function compara(goleslocal As ValueBox, golesvisita As ValueBox) As Integer Dim estado As Integer = 0If goleslocal.value = golesvisita.value Thenestado = 1Else If goleslocal.value > golesvisita.value Thenestado = 2 Elseestado = 3 EndifEndifReturn estadoEnd Primero declaramos la variable Estado como integer(entero) y la inicializamos con un valor de cero, luego realizamos la comparacin con una sentencia condicional if..then..else if,else y devolvemos el estado mediante la sentencia return estado

    Lo siguiente es crear el procedimiento asignar

    Public Sub asignar(goleslocal As ValueBox, puntoslocal As ValueBox, golesvisita As ValueBox, puntosvisita As ValueBox)Select Case compara(goleslocal, golesvisita) Case 1puntoslocal.Value = 1puntosvisita.Value = 1 Case 2puntoslocal.Value = 3puntosvisita.Value = 0Case 3puntoslocal.Value = 0puntosvisita.Value = 3 End SelectEnd Sub

    Segn el estado de la funcin compara se asignan los puntos. Solo nos resta pasarle los parmetros para que sepa que valores comparar y cuales asignar. Para eso en el evento click del botn btnasignar llamamos al procedimiento homnimo (asignar)

  • Public Sub Btnasignar_Click()asignar(vb1, vb2, vb3, vb4)asignar(vb5, vb6, vb7, vb8)asignar(vb9, vb10, vb11, vb12)asignar(vb13, vb14, vb15, vb16)asignar(vb17, vb18, vb19, vb20)asignar(vb21, vb22, vb23, vb24)asignar(vb25, vb26, vb27, vb28)asignar(vb29, vb30, vb31, vbv32)btnsumar.enabled = TrueBtnasignar.enabled = FalseEnd

    Para que se entienda esto : asignar(vb29, vb30, vb31, vbv32) equivale a asignar(goleslocal As ValueBox, puntoslocal As ValueBox, golesvisita As ValueBox, puntosvisita As ValueBox)

    vb29= goleslocal vb30=puntos local vb31=golesvisita vb32=puntosvisita,

    Como podemos ver el cdigo repite el procedimiento para cada cuarteta de valuebox, lo cual nos evita reescribir el procedimiento de comparacin y asignacin para cada partido.

    Por ltimo se bloquea el botn asignar(btnasignar) que ya cumpli su funcin y se habilita el botn sumar puntos (btnsumar), que es lo prximo que debemos hacer. Es un procedimiento algo complejo, ya que hay que seleccionar equipo por equipo, abrir la tabla en modo edicin, sumar puntos y goles, actualizar diferencia de goles y pasar al siguiente equipo. Por tanto, para no embarullar mucho, queda para ms adelante.

  • Un pequeo cambio a la base de datos

    Cuando comenc a crear el procedimiento para mostrar las fechas jugadas, encontr un error al querer cargar la tabla correspondiente. Me apareca un error en sql, diciendo que el ndice estaba repetido. La verdad me cost bastante encontrar el error,pelo lo consegu. El problema que al crear las tablas no les haba puesto un ndice y sqlitebrowser haba creado un ndice nico para ambas tablas.

    Me fue imposible modificarlas as que las cre de nuevo agregando un nuevo campo a cada una, id para la tabla equipos e rowid para la tabla fechas. Ambas son autonumricas y , por poco lgico que resulte en la sentencia Insert into hay que darles un valor de Null(nulo) para que se llenen automticamente.

    Bien, habamos quedado en el punto de crear el procedimiento para sumar puntos y goles. Vamos a necesitar abrir los registros uno por uno en modo edicin para poder hacerlo.Vamos a agregar un nuevo formulario al que llamaremos fdata. Veamos su aspecto en tiempo de diseo con todos sus controles visibles

    fdata1 en tiempo de diseo

    Y en tiempo de ejecucin mostrando solo el label

    fdata1 en tiempo de ejecucin

    Los controles quedan ocultos puesto que el usuario no debe interactuar con ellos, forman parte de un proceso automatizado.Los controles a colocar son :5 textbox (txtequipo,txtpuntos,txtgf,txtgc,txtdif) ,3 valuebox(vbgf,vbgc,vbpuntos) un control timer y un label. A todos los controles, excepto al label y al timer hay que ponerle su propiedad visible a false desde la ventana de propiedades. El label porque es el nico que va a quedar visible y el timer porque es invisible de por s. Al timer le

  • ponemos su propiedad enabled a True y le damos un delay de 200 milisegundos. A continuacin el cdigo de fdata1:

    Private hconn As ConnectionPrivate hresul As Result Private editando As Boolean

    Public Sub runedit(data As Result)

    hresul = dataeditando = Truetxtequipo.text = hresul["Equipo"]txtpuntos.text = hresul["Puntaje"]txtgf.text = hresul["Gf"]Txtgc.text = hresul["Gc"]txtdif.text = hresul["zdif"]Me.ShowModal

    End

    Public Sub Timer1_Timer()Dim dif As IntegerIf editando Then

    Try hresul["Equipo"] = txtequipo.textTry hresul["Puntaje"] = Val(txtpuntos.text) + vbpuntos.valueTry hresul["Gf"] = Val(txtgf.text) + vbgf.valueTry hresul["Gc"] = Val(Txtgc.text) + vbgc.ValueTry hresul["zdif"] = (Val(txtgf.text) + vbgf.value) (Val(Txtgc.text) + vbgc.Value)Try hresul.Update

    ElseEndif

    Me.Close()CatchMessage.Error(imposible guardar datos)End

    Como siempre declaramos primero las variables, luego el procedimiento runedit(que se dispara desde el formulario principal, lo veremos ms adelante)nos carga los valores para el equipo correspondiente, necesarios para realizar las cuentas.

    Luego el evento timer nos dispara la actualizacin, suma puntos, goles a favor y en contra, hace la diferencia de goles y carga todo en la tabla, cerrando posteriormente el formulario.

  • Sumando puntos

    Habamos creado el procedimiento de edicin para poder sumar los puntos y goles. Bien, ahora vamos a hacerlo interactuar con el formulario principal. Ya hemos creado las rutinas que comparan los goles y asignan el puntaje en funcin de esto.

    En Fmain vamos a lanzar el procedimiento de edicin en el evento activate de la tabla. Este evento se dispara cuando hacemos doble click sobre la misma o cuando hacemos enter con el foco en la tabla.

    Public Sub tabla_Activate()

    Dim hresul As Result

    If tabla.Current = Null Then Return

    If ConectarBase() Then Return

    hresul = hconn.Edit(equipos, Equipo=&1,tabla.Current.Key)fdata1.runedit(hresul)ESTA LINEA LANZA EL RUNEDIT EN FDATA1tabla.Current[0] = hresul["Equipo"]tabla.Current[1] = hresul["Puntaje"]tabla.Current[2] = hresul["Gf"]tabla.Current[3] = hresul["Gc"]

    End

    Pero, para activar la tabla con los parmetros correspondientes vamos a crear el procedimiento sumar_puntos, observe los comentarios destacados en mayscula a la derecha del cdigo.Recuerde que los comentarios empiezan con

    Public Sub sumar_puntos(lista As Listbox, vbp As Valuebox, vbgf As Valuebox, vbcg As Valuebox) ESTOS SON LOS PARMETROS

    Dim Clave As String DECLARAMOS VARIABLES Dim filtro As String

    filtro = lista.Current.Text AQU ELEGIMOS EL EQUIPO ACTUALtabla.Clear limpiar tabla

    If ConectarBase() Then Return

    tabla.Columns.Count = 5

    tabla.Columns[0].text = Equipotabla.Columns[0].Width = 280tabla.Columns[0].Alignment = Align.Centertabla.Columns[1].text = Puntajetabla.Columns[1].Alignment = Align.Centertabla.Columns[1].Width = 60tabla.Columns[2].text = Gftabla.Columns[2].Width = 40tabla.Columns[2].Alignment = Align.Centertabla.Columns[3].text = Gc

  • tabla.Columns[3].Alignment = Align.Centertabla.Columns[3].Width = 40tabla.Columns[4].text = zdiftabla.Columns[4].Alignment = Align.Centertabla.Columns[4].Width = 40

    hresul = hconn.Exec(Select * from equipos where Equipo like & filtro & ) SENTENCIA CONDICIONAL SQL

    Do While hresul.AvailableClave = hresul["Equipo"]tabla.Add(Clave, Clave) CARGAMOS TABLAtabla[Clave][1] = hresul["Puntaje"]tabla[Clave][2] = hresul["Gf"]tabla[Clave][3] = hresul["Gc"]tabla[Clave][4] = hresul["zdif"]hresul.MoveNext()Loopfdata1.vbgc.Value = vbcg.value AQUI ASIGNAMOS LOS VALORES DE PUNTOS Y GOLESfdata1.vbgf.Value = vbgf.Valuefdata1.vbpuntos.Value = vbp.value

    tabla.SetFocus PONEMOS EL FOCO EN LA TABLADesktop.SendKeys(\n) ENVIAMOS UN ENTER PARA LANZAR EL EVENTO TABLA ACTIVATEEndObserve que para referirnos a un control de otro formulario antepones el nombre del formulario al del control (fdata1.vbgc.Value) fdata=nombre formulario ;vbgc=nombre control; value =valor.

    Para recorrer cada uno de los equipos vamos a lanzar el procedimiento sumar_puntos pasndole los parmetros de la siguiente manera;en el evento click de btnsumar

    Public Sub btnsumar_Click()

    sumar_puntos(lb1, vb2, vb1, vb3)Wait 0.1sumar_puntos(lb2, vb4, vb3, vb1)Wait 0.1sumar_puntos(lb3, vb6, vb5, vb7)Wait 0.1sumar_puntos(lb4, vb8, vb7, vb5)Wait 0.1sumar_puntos(lb5, vb10, vb9, vb11)Wait 0.1sumar_puntos(lb6, vb12, vb11, vb9)Wait 0.1sumar_puntos(lb7, vb14, vb13, vb15)Wait 0.1sumar_puntos(lb8, vb16, vb15, vb13)Wait 0.1sumar_puntos(lb9, vb18, vb17, vb19)Wait 0.1sumar_puntos(lb10, vb20, vb19, vb17)Wait 0.1sumar_puntos(lb11, vb22, vb21, vb23)Wait 0.1

  • sumar_puntos(lb12, vb24, vb23, vb21)Wait 0.1sumar_puntos(lb13, vb26, vb25, vb27)Wait 0.1sumar_puntos(lb14, vb28, vb27, vb25)Wait 0.1sumar_puntos(lb15, vb30, vb29, vb31)Wait 0.1sumar_puntos(lb16, vbv32, vb31, vb29)Wait 0.1

    pocisionesbtnsumar.enabled = Falsebtnfecha.enabled = TrueEnd

    El Wait 0.1 es para que el procedimiento se lance con 100 milisegundos de Delay entre uno y otro. No se si es estrictamente necesario, pero hasta que lo puse el programa se colgaba aqu. Al final volvemos a cargar la tabla de pocisiones completa , bloqueamos el botn de sumar para evitar sumar de nuevo por error y habilitamos el botn que guarda la fecha completa en la tabla correspondiente.

    Aadiendo Funcionalidades

    Bien, ya tenemos lo bsico del programa. O casi. Nos hara falta poder agregar o quitar equipos desde el mismo programa sin necesidad de usar un administrador externo de base de datos.En la interfase podemos ver un botn con la leyenda nuevo equipo llamado Btnnuevo, cuyo cdigo es el siguiente:Public Sub Btnnuevo_Click()

    If ConectarBase() Then Returnfdata.runnew(hconn)Form_Open()End

    Si lo lanzamos ahora veremos que el programa da un error, pues fdata an no existe. Por tanto vamos al rbol de la izquierda y desde la carpeta fuentes, botn derecho,nuevo, formulario y lo nombramos fdata. Su interfase es muy sencilla y no requiere explicaciones

  • Un textbox (txtnombre) y dos botones (btnaceptar y btncancelar) y su cdigo, muy sencillo

    Private hconn As ConnectionPrivate hresul As Result

    Public Sub runnew(data As Connection)

    hconn = dataMe.ShowModal

    End

    Public Sub btncancelar_Click()

    Me.Close()

    End

    Public Sub btnaceptar_Click()

    If txtnombre.Text = ThenMessage.Warning(Teclee un nombre)Else Try hconn.EXEC(insert into equipos values (&1,&2,&3,&4), txtnombre.text, 0, 0, 0)

    Me.Close()CatchMessage.Error(Imposible introducir los datos solicitados)Endif

    End

    Como podemos ver, el mtodo runnew lanzado desde fmain se abre en forma modal, es decir, hasta que no interactuemos con l no se cerrar y no podrs seguir adelante con el programa.

    Cuando damos aceptar controlamos que el textbox no est vaco y tratamos de introducir los datos(es el cdigo destacado en rojo) y si no podemos lanzamos el mensaje de error. Los tres ceros entrecomillados son para los campos correspondientes a puntaje, goles a favor y goles en contra.

    Para borrar hemos creado el siguiente procedimiento;

    Public Sub tabla_KeyRelease()

    If Key.Code = Key.Delete Then

    If tabla.current = Null Then ReturnIf tabla.Current.Selected = False Then Return

    If ConectarBase() Then Return

    Try hconn.exec(delete from equipos where Equipo=&1, tabla.Current.Key)If Error ThenMessage.Error(Imposible borrar el registro)Elsetabla.Current.Delete()EndifEndif

    End

    Usamos el evento Keyrelease y si la tecla presionada es suprimir o delete eliminamos el equipo seleccionado. El problema de este procedimiento es que este tipo de acciones no se pueden deshacer. Para ello modificamos el cdigo agregando una variable a la que llamaremos pregunta a

  • la que declaramos al principio del procedimiento, y luego agregamos un cuadro de mensaje con dos opciones. La primera opcin vale 1 y la segunda 2. De acuerdo al valor de esta variable podemos cancelar el borrado del registro si hemos pulsado delete por error. Pongo el cdigo nuevo con las modificaciones en azul.

    Public Sub tabla_KeyRelease()Dim pregunta As IntegerIf Key.Code = Key.Delete Then comprueba la tecla pulsada

    If tabla.current = Null Then ReturnIf tabla.Current.Selected = False Then Return

    If ConectarBase() Then Return pregunta = message.Warning(Esta seguro de eliminar el registro?, Si, No) If pregunta = 1 ThenTry hconn.exec(delete from equipos where Equipo=&1, tabla.Current.Key)If Error ThenMessage.Error(Imposible borrar el registro)Elsetabla.Current.Delete()EndifEndifEndifEnd

    Listando etapas o Fechas

    Aclaro,porque quiz en otros pases no sea igual, que aqu llamamos fechas a las etapas del campeonato de ftbol. Haba quedado pendiente crear el formulario donde ver en la fecha y desde el cual poder buscar los resultados de tu equipo o de determinada fecha.

    Bien, antes que nada , recordemos que en el formulario principal hay un botn para guardar las fechas en la tabla al efecto que se habilita luego de sumar los puntos. Este es su cdigo:

    Public Sub btnfecha_Click()

    guardarfecha(lbfechas, lb1, vb1, lb2, vb3)parmetros entre parntesisguardarfecha(lbfechas, lb3, vb5, lb4, vb7)guardarfecha(lbfechas, lb5, vb9, lb6, vb11)guardarfecha(lbfechas, lb7, vb13, lb8, vb15)guardarfecha(lbfechas, lb9, vb17, lb10, vb19)guardarfecha(lbfechas, lb11, vb21, lb12, vb23)guardarfecha(lbfechas, lb13, vb25, lb14, vb27)guardarfecha(lbfechas, lb15, vb29, lb16, vb31)

    End

    Lo que hace es lanzar el procedimiento guardarfecha, pasndole los distintos parmetros.

    Rebobinando un poco, para evitar reescribir cdigo creamos un procedimiento o funcin al que luego le pasamos los parmetros. Veamos ahora el cdigo del mismo:

  • Public Sub guardarfecha(lfecha As Listbox, lloc As Listbox, gloc As Valuebox, lvis As Listbox, gvis As Valuebox)Aqui declaramos los parmetros por tipo

    Primero declaramos las variablesDim fecha As StringDim local As StringDim glocal As IntegerDim visita As StringDim gvisita As IntegerLuego asignamos valores a las variablesfecha = lfecha.Current.textlocal = lloc.Current.textglocal = gloc.valuevisita = lvis.Current.textgvisita = gvis.Value

    Finalmente insertamos los valores en la base de datos Try hconn.exec(Insert into Fechas values(&1,&2,&3,&4,&5,&6), Null, fecha, local, glocal, visita, gvisita)bloqueabotones y bloqueamos los botonesEnd

    Los comentarios, resaltados en rojo explican lo que hace cada parte del programa, el null en azul es necesario para que el campo autonmerico rowid se incremente en una unidad en cada nuevo registro guardado.

    Vamos ahora a crear el formulario para ver las tablas y realizar las bsquedas. Como ya es l tercer proyecto no vamos a explicar ni como agregar el formulario ni como dibujar los controles. En la imagen hemos incluido los nombres y en algn caso el tipo de control.

  • Form 1 en tiempo de diseo

    Me qued con el nombre por defecto, Form1,pero sera un nombre ms adecuado frmfechas. Lo abrimos desde fmain haciendo click en btnlistar (listar fechas).

    Ahora el cdigo de form1:

    Private hconn As ConnectionPrivate hresu As Result Gambas class file

    Public Function ConectarBase() As Boolean

    If hconn Null Then Return False

    hconn = New Connectionhconn.Host = User.Home &/ .goles1hconn.name = Futbolhconn.type = sqlite3Try hconn.Open()If Error Thenhconn = NullMessage.Error(error al conectar con la base)Return TrueEndifReturn False

  • End

    Public Sub Form_Open()

    Dim palabra As String

    tabla.Clear limpiar tabla

    If ConectarBase() Then Return

    tabla.Columns.Count = 6

    tabla.Columns[0].text = idtabla.Columns[0].Width = 30tabla.Columns[0].Alignment = Align.Centertabla.Columns[1].text = Localtabla.Columns[1].Alignment = Align.Centertabla.Columns[1].Width = 150tabla.Columns[2].text = glocaltabla.Columns[2].Width = 60tabla.Columns[2].Alignment = Align.Centertabla.Columns[3].text = Visitantetabla.Columns[3].Alignment = Align.Centertabla.Columns[3].Width = 150tabla.Columns[4].text = gvisitatabla.Columns[4].Alignment = Align.Centertabla.Columns[4].Width = 60tabla.Columns[5].text = Fechatabla.Columns[5].Alignment = Align.Centertabla.Columns[5].Width = 100

    hresu = hconn.Exec(Select * from Fechas order by Fecha ASC)

    Do While hresu.Availablepalabra = hresu["rowid"]tabla.Add(palabra, palabra)tabla[palabra][1] = hresu["Local"]tabla[palabra][2] = hresu["Glocal"]tabla[palabra][3] = hresu["Visitante"]tabla[palabra][4] = hresu["Gvisita"]tabla[palabra][5] = hresu["Fecha"]hresu.MoveNext()LoopFMain.listado(lbequipo)modcargar.cargar2End

    Public Sub btnbuscar_Click()

    Dim palabra As StringDim filtro As Stringtabla.Clear limpiar tabla

    If ConectarBase() Then Return

    tabla.Columns.Count = 6

    tabla.Columns[0].text = idtabla.Columns[0].Width = 30tabla.Columns[0].Alignment = Align.Center

  • tabla.Columns[1].text = Localtabla.Columns[1].Alignment = Align.Centertabla.Columns[1].Width = 150tabla.Columns[2].text = glocaltabla.Columns[2].Width = 60tabla.Columns[2].Alignment = Align.Centertabla.Columns[3].text = Visitantetabla.Columns[3].Alignment = Align.Centertabla.Columns[3].Width = 150tabla.Columns[4].text = gvisitatabla.Columns[4].Alignment = Align.Centertabla.Columns[4].Width = 60tabla.Columns[5].text = Fechatabla.Columns[5].Alignment = Align.Centertabla.Columns[5].Width = 100filtro = lbequipo.Current.Texthresu = hconn.Exec(Select * from Fechas where Local like & filtro & Or Visitante Like & filtro & ) consulta sql

    Do While hresu.Availablepalabra = hresu["rowid"]tabla.Add(palabra, palabra)tabla[palabra][1] = hresu["Local"]tabla[palabra][2] = hresu["Glocal"]tabla[palabra][3] = hresu["Visitante"]tabla[palabra][4] = hresu["Gvisita"]tabla[palabra][5] = hresu["Fecha"]hresu.MoveNext()Loop

    End

    Public Sub btnreset_Click()

    Form_Open

    End

    Public Sub btnbuscarfecha_Click()

    Dim palabra As StringDim filtro As Stringtabla.Clear limpiar tabla

    If ConectarBase() Then Return

    tabla.Columns.Count = 6

    tabla.Columns[0].text = idtabla.Columns[0].Width = 30tabla.Columns[0].Alignment = Align.Centertabla.Columns[1].text = Localtabla.Columns[1].Alignment = Align.Centertabla.Columns[1].Width = 150tabla.Columns[2].text = glocaltabla.Columns[2].Width = 60tabla.Columns[2].Alignment = Align.Centertabla.Columns[3].text = Visitante

  • tabla.Columns[3].Alignment = Align.Centertabla.Columns[3].Width = 150tabla.Columns[4].text = gvisitatabla.Columns[4].Alignment = Align.Centertabla.Columns[4].Width = 60tabla.Columns[5].text = Fechatabla.Columns[5].Alignment = Align.Centertabla.Columns[5].Width = 100filtro = lbfechas.Current.Texthresu = hconn.Exec(Select * from Fechas where Fecha like & filtro & ) consulta sql

    Do While hresu.Availablepalabra = hresu["rowid"]tabla.Add(palabra, palabra)tabla[palabra][1] = hresu["Local"]tabla[palabra][2] = hresu["Glocal"]tabla[palabra][3] = hresu["Visitante"]tabla[palabra][4] = hresu["Gvisita"]tabla[palabra][5] = hresu["Fecha"]hresu.MoveNext()Loop

    End

    Public Sub Btncerrar_Click()

    Me.Close

    End Vamos a explayarnos sobre algunos fragmentos de cdigo que aparecen aqu y no habamos visto antes. Dados que los equipos alternan la locala , cuando buscamos los resultados de un equipo debemos buscar en ambos campos, tenemos una sentencia sql con dos variables a considerar unidas por el operador lgico or, que literalmente significa o.

    hresu = hconn.Exec(Select * from Fechas where Local like & filtro & Or Visitante Like & filtro & )

    Creo que el resto del cdigo se explica bastante por s solo, salvo la sentencia modcargar.cargar2, donde modcargar es un mdulo del programa y modcargar 2 es una funcin escrita en el misma. Veamos el cdigo:

    Public Sub cargar()

    FMain.lbfechas.Add(Elige fecha)FMain.lbfechas.Add(fecha 01)FMain.lbfechas.Add(fecha 02)FMain.lbfechas.Add(fecha 03)FMain.lbfechas.Add(fecha 04)FMain.lbfechas.Add(fecha 05)FMain.lbfechas.Add(fecha 06)FMain.lbfechas.Add(fecha 07)FMain.lbfechas.Add(fecha 08)FMain.lbfechas.Add(fecha 09)FMain.lbfechas.Add(fecha 10)FMain.lbfechas.Add(fecha 10)FMain.lbfechas.Add(fecha 12)FMain.lbfechas.Add(fecha 13)

  • FMain.lbfechas.Add(fecha 14)FMain.lbfechas.Add(fecha 15)End

    Public Sub cargar2()Form1.lbfechas.Add(Elige fecha)Form1.lbfechas.Add(fecha 01)Form1.lbfechas.Add(fecha 02)Form1.lbfechas.Add(fecha 03)Form1.lbfechas.Add(fecha 04)Form1.lbfechas.Add(fecha 05)Form1.lbfechas.Add(fecha 06)Form1.lbfechas.Add(fecha 07)Form1.lbfechas.Add(fecha 08)Form1.lbfechas.Add(fecha 09)Form1.lbfechas.Add(fecha 10)Form1.lbfechas.Add(fecha 10)Form1.lbfechas.Add(fecha 12)Form1.lbfechas.Add(fecha 13)Form1.lbfechas.Add(fecha 14)Form1.lbfechas.Add(fecha 15)

    End

    Por aqu estara completa esta primera versin del programa. Por dudas, sugerencias o comentarios en el blog http://gambeando.wordpress.com o al correo [email protected].

    Hasta la prxima.

    Daniel Calleja Amaro , Montevideo, Junio de 2012.

    Desarrollo paso a paso de un programa en GOLES; LA PASIN DEL FTBOLPaso a paso en Gambas 3Gambas es marca registrada de Benoit Minisini Nota:sta es la versin Pdf de los artculos publicados en blog gambeando.wordpress.comGoles, la pasin del ftbolCreando la base dedatos interfase y anlisisTerminando la interfazReutilizando cdigoSigamos avanzandoUn pequeo cambio a la base de datosSumando puntosAadiendo FuncionalidadesListando etapas o Fechas