Вы находитесь на странице: 1из 30

Desarrollo paso a paso de un programa en

Gambas 3
Dani el Cal l ej a Amaro
GOLES; LA PASIN DEL FTBOL
Paso a paso en Gambas 3
Gambas es mara reg!s"rada de Beno!" #!n!s!n!

No"a$sta es la versin Pdf de los artculos publicados en blog
gambeando.wordpress.com
Se distribuye bajo los trminos de la licencia General pblica !reative
!ommons. "sted puede copiarla o distribuirla# siempre y cuando
mencione al autor y lo $aga sin fines de lucro# en forma libre y gratuita.
ndice de contenido
Goles# la pasin del ftbol...................................................................................................................%
!reando la base de datos......................................................................................................................&
interfase y an'lisis................................................................................................................................(
)erminando la interfa*........................................................................................................................++
,eutili*ando cdigo............................................................................................................................+%
Sigamos avan*ando............................................................................................................................+-
"n pe.ue/o cambio a la base de datos...............................................................................................+(
Sumando puntos.................................................................................................................................+0
1/adiendo 2uncionalidades...............................................................................................................3+
4istando etapas o 2ec$as.................................................................................................................33
Goles% la pas!&n del '("bol
5ien# aprovec$ando todo lo .ue $emos ido aprendiendo sobre base de datos vamos a empe*ar un
nuevo y algo m's ambicioso proyecto# Goles# la pasin del ftbol.
6st' reali*ado en base a la liga de mi pas# "ruguay# donde militan diecisis e.uipos# pero la idea es
.ue pueda adaptarse f'cilmente a cual.uier otra. 4a premisa# b'sicamente# consiste en anotar los
resultados en un formulario al efecto y .ue autom'ticamente sume puntos# goles a favor y goles en
contra# y guarde los resultados de la fec$a en una base de datos. 6sto nos permitir' m's adelante
buscar resultados por fec$a o o por e.uipo.7 .ue adem's genere las tablas de posiciones fec$a tras
fec$a.
8amos a trabajar por primera ve* con Gambas 3# la ltima versin del mismo.
1nali*emos los re.uisitos. Primero .ue nada necesitamos una base de datos con algunas tablas. "na
tabla llamada e.uipos con los siguientes 9tems: 6.uipo# puntaje# gf;goles a favor<Gc;goles en
contra<. =tra tabla llamada fec$as donde guardaremos los resultados# con los items fec$a# e.uipo
+# goles+#e.uipo3# goles3. 8amos a necesitar .ue el programa anali*e los resultados y en base a esto
asigne los puntos# tres al ganador # uno en caso de empate y > en caso de derrota.
6n una segunda etapa# la idea es poder llevar tabla de goleadores y tarjetas amarillas y rojas# y .ue
nos alerta al llegar a cinco amarillas;suspensin autom'tica<. Pero esto ser' a futuro.
8amos a ver algunas cosas nuevas como cdigo comn para varios controles# copiar controles y
reali*ar c'lculos numricos.
)reando la base de da"os
8amos a empe*ar por crear las base datos necesaria para este proyecto. Podemos usar el gestor de
bases de datos# de gambas. 7o use el s.lite database browser# os dejo unas capturas de pantalla del
mismo. 6s muy intuitivo y no precisa mayores e?plicaciones.Si no lo tenemos lo podemos instalar
desde sinaptic o como en mi caso# desde el centro de software de "buntu.
8amos a 2ile@new database# elegimos el nombre y luego creamos las tablas# .ue en principio van a
ser solo dos. 6.uipos y 2ec$as.

**A"en!+n,, 4as bases de datos distinguen entre mayAsculas y minAsculas# tanto en los
nombre de tablas y campos como en los datos. Bay .ue ser cuidadoso con esto por.ue sino puede
ser un verdadero .uebradero de cabe*a.
5ien nuestras tablas deben .uedar con la estructura .ue se ve el la imagen final o sea:
Tabla E-u!pos
!on los campos 6.uipos ;te?to<#Punteje;entero<Gf ;entero< Gc;entero< Conde Gf son los
goles a favor y Gc los goles en contra. 4o .ue va entre parDntesis es el tipo de dato.

Tabla Fe.as
!on loscampos 2ec$a;te?to<#local;te?to<glocal;entero<#8isitante;te?to<#gvisita;entero<. Conde
fec$a es el orden de las mismas ;fec$a+#fec$a3< y no un campo del tipo date.glocal son los goles del
local y gvisita son los goles del visitante. =s dejo un par de capturas de ambas tablas con las dos
primeras fec$as.
.
!uando carguemos la primera tabla en nuestro programa vamos a .uerer .ue nos ordene la
tabla por puntaje de mayor a menor# para eso vamos a usar la orden s.l order 5y pero eso ya lo
veremos durante la construccin del programa. 6n el pr?imo post vamos a construir la interfase y
estudiar los nuevos desafos .ue se presentan para codificar.

!n"er'ase / an0l!s!s
Siempre es bueno# antes de comen*ar a construir la interfase # anali*ar .ue precisamos
.ue sta contenga. 6n nuestro caso# precisamos cargar e.uipos# resultados# nmero de fec$a y como
no# listar la tabla de posiciones .
Para ver la tabla# vamos a colocar un columview # al .ue llamaremos precisamente tabla o
cvtabla.
Para cargar la fec$a #un listbo? al .ue denominaremos lbfechas y +E listbo? para cargar los
e.uipos a los .ue llamaremos simplemente lb1,lb2 y as sucesivamente $asta lb16.
,ecordemos .ue los nombres los ponemos desde la ventana de propiedades en la propiedad
name.
1dem's vamos a precisar %3 value bo? .ue ser'n donde pondremos los goles de cada
e.uipo y donde el programa asignara los puntajes correspondientes. 8eamos su aspecto en tiempo
de dise/o.
2main en tiempo de dise/o con todos sus controles visibles
7 en tiempo de ejucuciFn con algunos controles ocultos y la tabla cargada
Si observamos con atencin veremos .ue faltan algunos controles. 6s .ue en realidad los
$emos ocultado poniendo su propiedad visibleGfalse# ya .ue el usuario no necesita interactuar con
stos ni ver su contenido. 1dem's evitamos .ue por accidente cargue algn valor incorrecto.
H!mo podemos $acer para .ue la construccin de una interfase con tantos controles sea m's
f'cil y r'pidaI
8e'moslo con un ejemplo.
1rrastrando y pegando creamos el primer listbo? y le cambiamos el nombre a lb+. 4uego
seleccionamos el control recin creado# botn derec$o del mouse# copiar y luego pinc$ando con el
botn derec$o sobre el formulario le damos pegar. 8eremos .ue el nuevo control se crea ya con el
nombre lb3 y aparece en la es.uina superior i*.uierda del formulario.
4o arrastramos a su lugar # y con control +v;atajo de teclado para pegar< creamos el resto de los
listbo?. 4os iremos colocando por pares# de i*.uiera a derec$a. Puede guiarse por la imagen de la
interfase .ue aparece m's arriba. Para alinearlos los selecciones por fila y usando la propiedad J de
los mismos los alineamos verticalmente.8ea la imagen.
4uego podemos alinearlos $ori*ontalmente mediante la propiedad Y.
1$ora de la misma manera crearemos los valuebo?# llamando al original vb+.4os iremos
colocando por pares a la derec$a de cada listbo?. 6s fundamental colocarlos en el orden correcto
para facilitar la codificacin posterior
.
Term!nando la !n"er'a1
8amos a necesitar un botn .ue asigne los puntos;btnasignar<#otro .ue los sume
;btnsumar<# uno m's para guardar la fec$a jugada;btnguardar<# un botn para agregar los
e.uipos;btnnuevo<# y por supuesto uno para cerrar el programa;btnsalir<. 4a imagen del post
anterior nos da una idea# pero es a gusto de consumidor. Ki idea de cmo colocar los botones sigue
dos premisas b'sicas# .ue resulte cmodo para el usuario y los que llevan alguna secuencia estn
en orden. 7a veremos en breve a .u me refiero con ste ltimo punto. Cebemos agregar tambin
un columview al .ue llamaremos tabla
8amos a necesitar .ue al empe*ar el programa se carguen los datos .ue vamos a utili*ar#o sea
la tabla con los e.uipos. Para eso vamos a tener .ue conectar a la base de datos mediante un objeto
connection.
1l principio de fmain.class declaramos las variables comunes a todo el formulario:
Private $conn 1s !onnection
Private $resul 1s ,esult
4uego creamos el procedimiento de coneccin:
Public 2unction !onectar5ase;< 1s 5oolean
if $conn LM Null )$en ,eturn 2alse
$conn G New !onnection
$conn.Bost G "ser.Bome OP .goles+
$conn.name G 2utbol
$conn.type G s.lite%Q
)ry $conn.=pen;<
9f 6rror )$en
$conn G Null
Kessage.6rror;error al conectar con la base<
,eturn )rue
6ndif
,eturn 2alse
6nd
!omo podemos ver es el mismo cdigo .ue 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 .ue se
conecte y en caso contrario nos de error. 8emos .ue el path o ruta es:
$conn.Bost G "ser.Bome OP .goles+Q o sea la carpeta de usuario y dentro de la misma# la
carpeta oculta .goles+.
H!mo nos aseguramos .ue la misma est a$IPrimero# incluyndolo en la carpeta Da"os de nuestro
programa ;botn derec$o sobre datos#nuevo# e?istente# navegamos $asta la carpeta donde lo
tenemos y le damos aceptar<.
4uego# en el evento open de fmain agregamos el siguiente cdigo:
9f Not 6?ist;"ser.Bome OP .goles+P2utbol<
)ry KRdir "ser.Bome OP .goles+Q
!opy 2utbol )o "ser.Bome OP .goles+P2utbol
6ndif
6ste mtodo comprueba si e?iste la base# si no crea la carpeta y copia en ella la base .ue viene con
el programa. Sencillo.1 continuacin todo el cdigo del 2ormSopen:
Cim !lave 1s String
9f Not 6?ist;"ser.Bome OP .goles+P2utbol<
)ry KRdir "ser.Bome OP .goles+Q
!opy 2utbol )o "ser.Bome OP .goles+P2utbol
6ndif
tabla.!lear Tlimpiar tabla
9f !onectar5ase;< )$en ,eturn
tabla.!olumns.!ount G -
tabla.!olumnsU>V.te?t G 6.uipo
tabla.!olumnsU>V.Widt$ G 30>
tabla.!olumnsU>V.1lignment G 1lign.!enter
tabla.!olumnsU+V.te?t G Puntaje
tabla.!olumnsU+V.1lignment G 1lign.!enter
tabla.!olumnsU+V.Widt$ G E>
tabla.!olumnsU3V.te?t G Gf
tabla.!olumnsU3V.Widt$ G &>
tabla.!olumnsU3V.1lignment G 1lign.!enter
tabla.!olumnsU%V.te?t G Gc
tabla.!olumnsU%V.1lignment G 1lign.!enter
tabla.!olumnsU%V.Widt$ G &>
tabla.!olumnsU&V.te?t G *dif
tabla.!olumnsU&V.1lignment G 1lign.!enter
tabla.!olumnsU&V.Widt$ G &>
$resul G $conn.6?ec;Select X from 6.uipos< Tconsulta s.l
Co W$ile $resul.1vailable
!lave G $resulUY6.uipoYV
tabla.1dd;!lave# !lave<
tablaU!laveVU+V G $resulUYPuntajeYV
tablaU!laveVU3V G $resulUYGfYV
tablaU!laveVU%V G $resulUYGcYV
tablaU!laveVU&V G $resulUY*difYV
$resul.KoveNe?t;<
4oop
l!s"ar
blo-ueabo"ones
6nd
4o .ue est' en negr!"a es nuevo# lo anterior comprueba la cone?in y carga los datos en el
columview. 6l procedimiento blo-ueabo"ones es sumamente sencillo y ste es su cdigo:
Public Sub blo.ueabotones;<
5tnasignar.enabled G 2alse
btnsumar.enabled G 2alse
btnfec$a.enabled G 2alse
6nd
HPor .u lo $acemos as en lugar de poner el cdigo directamente en el procedimiento openI Por.ue
vamos a necesitar $acer lo mismo en m's de una ocasin y esto nos permite utili*ar el mismo
cdigo sin necesidad de reescribirlo# simplemente lo llamamos por su nombre. 6n este caso
particular es un cdigo de apenas tres lneas y puede no parecer muy til# pero imagine en los casos
en .ue las lneas sean +> o m's y debas llamarlas varias veces a lo largo del programa. 6n el
pr?imo post comentaremos listar y por primera ve* $aremos uso de funciones con par'metros.
2eu"!l!1ando &d!go
Babamos visto en el capitulo anterior como llamar a un procedimiento o funcin desde distintos
lugares para evitar escribirlo muc$as veces. 6?perimentando rato despes me di cuenta .ue el
procedimiento usado para rellenar el columview lo iba a tener .ue llamar m's de una ve* durante el
programa# por lo .ue me convena encontrar una manera de no tener .ue reescribirlo. 6sta fue la
solucin:
7 as .ued el cdigo del evento open de fmain# muc$o m's corto:

Bemos agregado en la sentencia s.l un par de clasulas para .ue nos ordene la
lista#resaltado en negrita :
$resul G $conn.6?ec;Select X from e.uipos order b/ Pun"a3e DES)% 1d!' DES) <
order b/;ordene por< pun"a3e DES) ;puntaje de mayor a menor< 1d!' DES);diferencia de goles
de mayor a menor<
6sto nos permite ordener la tabla de pocisiones desde el de m's puntaje# si $ay dos con el mismo
puntaje va primero el .ue tenga mayor diferencia de goles. 9ncluso podramos agregarle a la
sentencia s.l una tercera condicin # G' DES) para .ue en caso de .ue estuvieran empatados en
puntos y saldo de goles pusiese primero el .ue tuviera m's goles a favor.
Necesitamos .ue cuando inicie el programa nos cargue en los +E listbo? la lista de e.uipos para
poder seleccionarlos y no tener .ue escribir uno ? uno. 1dem's de la comodidad .ue esto implica#
nos permite evitar errores al tipear los nombres. ,ecordemos brevemente la sinta?is utili*ada para
cargar los mismos:
listbo?.add;lo .ue .uieras<
1$ora# imaginemos $acer esto para +E listbo? con +E e.uipos cada uno. 6s muc$o cdigo. 1dem's.
si cambiamos de liga o $ay ascensos y descensos cambiar e.uipos nos implicara meter mano en el
cdigo. 4o .ue vamos a $acer es .ue cada listbo? se cargue desde la base de datos# mediante un
select y un procedimiento creado al efecto: el procedimiento listado con el par'metro l!s"a as
listbo?;lista como listbo?<
Prim
ero como siempre declaramos las variables# Cim clave as String# luego agregamos esta sentencia al
principio de la lista ;l!s"a4Add56El!ge un e-u!po78< para obligarnos a seleccionar un e.uipo en
cada lista. 6sto nos evita .ue alguno de los listbo? .uede con valor Null al no modificar la
seleccin. 1 continuacin comprobamos .ue la base est conectada y seleccionamos los e.uipos en
orden alfabtico order by 6.uipo 1S! y mediante el Co w$ile@loop recorremos e.uipo por
e.uipo. Pero#Hdonde cargamos la listaI
6n cada uno de los listbo? mediante el llamado al procedimiento listado con el par'metro del
nombre de cada uno de los listbo?# en el sub listar:
listado;lb+<
@@@@@@.
listado;lb+E<
S!gamos a9an1ando
5ien# ya $emos visto como usar el mismo cdigo en varias partes de nuestro programa y
como llamarlo desde diferentes procedimientos.
1$ora nos encontramos con la fase en .ue# tras escribir nosotros los resultados el programa
calcule y asigne los puntos a cada uno. !omo ya sabemos el empate da un punto a cada uno#la
victoria tres y la derrota cero punto. Por tanto# necesitamos .ue el programa compare en cada
partido los goles del local# los del visitante y en virtud de eso asigne los puntos. 8amos a crear una
funcin .ue nos devuelva en una variable el resultado de esa comparacin. 8eamos como:
Private 2unction compara;goleslocal 1s 8alue5o?# golesvisita 1s 8alue5o?< 1s 9nteger
Cim estado 1s 9nteger G >
9f goleslocal.value G golesvisita.value )$en
estado G +
6lse
9f goleslocal.value M golesvisita.value )$en
estado G 3
6lse
estado G %
6ndif
6ndif
,eturn estado
6nd
Primero declaramos la variable 6stado como integer;entero< y la iniciali*amos con un valor de
cero# luego reali*amos la comparacin con una sentencia condicional if..t$en..else if#else y
devolvemos el estado mediante la sentencia return estado
4o siguiente es crear el procedimiento asignar
Public Sub asignar;goleslocal 1s 8alue5o?# puntoslocal 1s 8alue5o?# golesvisita 1s 8alue5o?#
puntosvisita 1s 8alue5o?<
Select !ase compara;goleslocal# golesvisita<
!ase +
puntoslocal.8alue G +
puntosvisita.8alue G +
!ase 3
puntoslocal.8alue G %
puntosvisita.8alue G >
!ase %
puntoslocal.8alue G >
puntosvisita.8alue G %
6nd Select
6nd Sub
Segn el estado de la 'un!&n ompara se asignan los puntos. Solo nos resta pasarle los
par0me"ros para .ue sepa .ue valores comparar y cuales asignar. Para eso en el evento l!: del
botn b"nas!gnar llamamos al procedimiento $omnimo ;as!gnar<
Public Sub 5tnasignarS!licR;<
asignar;vb+# vb3# vb%# vb&<
asignar;vb-# vbE# vb(# vb0<
asignar;vbZ# vb+># vb++# vb+3<
asignar;vb+%# vb+&# vb+-# vb+E<
asignar;vb+(# vb+0# vb+Z# vb3><
asignar;vb3+# vb33# vb3%# vb3&<
asignar;vb3-# vb3E# vb3(# vb30<
asignar;vb3Z# vb%># vb%+# vbv%3<
btnsumar.enabled G )rue
5tnasignar.enabled G 2alse
6nd
Para .ue se entienda esto : asignar;vb3Z# vb%># vb%+# vbv%3< e.uivale a asignar;goleslocal 1s
8alue5o?# puntoslocal 1s 8alue5o?# golesvisita 1s 8alue5o?# puntosvisita 1s 8alue5o?<
vb3ZG goleslocal vb%>Gpuntos local vb%+Ggolesvisita vb%3Gpuntosvisita#
!omo podemos ver el cdigo repite el procedimiento para cada cuarteta de valuebo?# lo cual nos
evita reescribir el procedimiento de comparacin y asignacin para cada partido.
Por ltimo se blo.uea el botn asignar;btnasignar< .ue ya cumpli su funcin y se $abilita el botn
sumar puntos ;btnsumar<# .ue es lo pr?imo .ue debemos $acer. 6s un procedimiento algo
complejo# ya .ue $ay .ue seleccionar e.uipo por e.uipo# abrir la tabla en modo edicin# sumar
puntos y goles# actuali*ar diferencia de goles y pasar al siguiente e.uipo. Por tanto# para no
embarullar muc$o# .ueda para m's adelante.
;n pe-ue<o amb!o a la base de da"os
!uando comenc a crear el procedimiento para mostrar las fec$as jugadas# encontr un error
al .uerer cargar la tabla correspondiente. Ke apareca un error en s.l# diciendo .ue el ndice estaba
repetido. 4a verdad me cost bastante encontrar el error#pelo lo consegu. 6l problema .ue al crear
las tablas no les $aba puesto un ndice y s.litebrowser $aba creado un ndice nico para ambas
tablas.
Ke fue imposible modificarlas as .ue las cre de nuevo agregando un nuevo campo a cada una#
id para la tabla e-u!pos e rowid para la tabla 'e.as4 1mbas son autonumricas y # por poco lgico
.ue resulte en la sentencia Insert into $ay .ue darles un valor de Null;nulo< para .ue se llenen
autom'ticamente.
5ien# $abamos .uedado en el punto de crear el procedimiento para sumar puntos y goles. 8amos
a necesitar abrir los registros uno por uno en modo edicin para poder $acerlo.8amos a agregar un
nuevo formulario al .ue llamaremos fdata. 8eamos su aspecto en tiempo de dise/o con todos sus
controles visibles@
fdata+ en tiempo de dise/o
7 en tiempo de ejecucin mostrando solo el label@
fdata+ en tiempo de ejecucin
4os controles .uedan ocultos puesto .ue el usuario no debe interactuar con ellos# forman parte de
un proceso automati*ado.
4os controles a colocar son :- te?tbo? ;t?te.uipo#t?tpuntos#t?tgf#t?tgc#t?tdif< #
% valuebo?;vbgf#vbgc#vbpuntos< un control timer y un label. 1 todos los controles# e?cepto al label
y al timer $ay .ue ponerle su propiedad visible a false desde la ventana de propiedades. 6l label
por.ue es el nico .ue va a .uedar visible y el timer por.ue es invisible de por s. 1l timer le
ponemos su propiedad enabled a True y le damos un delay de 2 milisegundos. 1 continuacin el
cdigo de fdata+!
"rivate hconn #s $onnection
"rivate hresul #s %esult
"rivate editando #s &oolean
"ublic 'ub runedit(data #s %esult)
hresul * data
editando * True
t+tequipo.te+t * hresul,-.quipo-/
t+tpuntos.te+t * hresul,-"unta0e-/
t+tgf.te+t * hresul,-1f-/
T+tgc.te+t * hresul,-1c-/
t+tdif.te+t * hresul,-2dif-/
3e.'ho43odal
.nd
"ublic 'ub Timer15Timer()
6im dif #s 7nteger
7f editando Then
Try hresul,-.quipo-/ * t+tequipo.te+t
Try hresul,-"unta0e-/ * 8al(t+tpuntos.te+t) + vbpuntos.value
Try hresul,-1f-/ * 8al(t+tgf.te+t) + vbgf.value
Try hresul,-1c-/ * 8al(T+tgc.te+t) + vbgc.8alue
Try hresul,-2dif-/ * (8al(t+tgf.te+t) + vbgf.value) 9 (8al(T+tgc.te+t) + vbgc.8alue)
Try hresul.:pdate
.lse
.ndif
3e.$lose()
$atch
3essage..rror(;imposible guardar datos;)
.nd
!omo siempre declaramos primero las variables# luego el procedimiento runedit;.ue se dispara
desde el formulario principal# lo veremos m's adelante<nos carga los valores para el e.uipo
correspondiente# necesarios para reali*ar las cuentas.
4uego el evento timer nos dispara la actuali2aci<n, suma puntos, goles a favor y en contra, hace la
diferencia de goles y carga todo en la tabla, cerrando posteriormente el formulario.
Sumando pun"os
Babamos creado el procedimiento de edicin para poder sumar los puntos y goles. 5ien# a$ora
vamos a $acerlo interactuar con el formulario principal. 7a $emos creado las rutinas .ue comparan
los goles y asignan el puntaje en funcin de esto.
6n =main vamos a lan*ar el procedimiento de ediciFn en el evento activate de la tabla. 6ste evento
se dispara cuando $acemos doble clicR sobre la misma o cuando $acemos enter con el foco en la
tabla.
Public Sub tablaS1ctivate;<
Cim $resul 1s ,esult
9f tabla.!urrent G Null )$en ,eturn
9f !onectar5ase;< )$en ,eturn
$resul G $conn.6dit;e.uipos# 6.uipoGO+Q#
tabla.!urrent.[ey<
fdata+.runedit;$resul<T6S)1 49N61 41N\1 64 ,"N6C9) 6N 2C1)1+
tabla.!urrentU>V G $resulUY6.uipoYV
tabla.!urrentU+V G $resulUYPuntajeYV
tabla.!urrentU3V G $resulUYGfYV
tabla.!urrentU%V G $resulUYGcYV
6nd
Pero# para activar la tabla con los par'metros correspondientes vamos a crear el procedimiento
sumar5puntos# observe los comentarios destacados en mayscula a la derec$a del cdigo.,ecuerde
.ue los comentarios empie*an con =
Public Sub sumarSpuntos;lista 1s 4istbo?# vbp 1s 8aluebo?# vbgf 1s 8aluebo?# vbcg 1s 8aluebo?<
T6S)=S S=N 4=S P1,]K6),=S
Cim !lave 1s String TC6!41,1K=S 81,91546S
Cim filtro 1s String
filtro G lista.!urrent.)e?t T1^"_ 646G9K=S 64 6^"9P= 1!)"14
tabla.!lear Tlimpiar tabla
9f !onectar5ase;< )$en ,eturn
tabla.!olumns.!ount G -
tabla.!olumnsU>V.te?t G 6.uipo
tabla.!olumnsU>V.Widt$ G 30>
tabla.!olumnsU>V.1lignment G 1lign.!enter
tabla.!olumnsU+V.te?t G Puntaje
tabla.!olumnsU+V.1lignment G 1lign.!enter
tabla.!olumnsU+V.Widt$ G E>
tabla.!olumnsU3V.te?t G Gf
tabla.!olumnsU3V.Widt$ G &>
tabla.!olumnsU3V.1lignment G 1lign.!enter
tabla.!olumnsU%V.te?t G Gc
tabla.!olumnsU%V.1lignment G 1lign.!enter
tabla.!olumnsU%V.Widt$ G &>
tabla.!olumnsU&V.te?t G *dif
tabla.!olumnsU&V.1lignment G 1lign.!enter
tabla.!olumnsU&V.Widt$ G &>
$resul G $conn.6?ec;Select X from e.uipos w$ere 6.uipo liRe T O filtro O T< TS6N)6N!91
!=NC9!9=N14 S^4
Co W$ile $resul.1vailable
!lave G $resulUY6.uipoYV
tabla.1dd;!lave# !lave< T!1,G1K=S )1541
tablaU!laveVU+V G $resulUYPuntajeYV
tablaU!laveVU3V G $resulUYGfYV
tablaU!laveVU%V G $resulUYGcYV
tablaU!laveVU&V G $resulUY*difYV
$resul.KoveNe?t;<
4oop
fdata+.vbgc.8alue G vbcg.value T1^"9 1S9GN1K=S 4=S 814=,6S C6 P"N)=S 7 G=46S
fdata+.vbgf.8alue G vbgf.8alue
fdata+.vbpuntos.8alue G vbp.value
tabla.Set2ocus TP=N6K=S 64 2=!= 6N 41 )1541
CesRtop.Send[eys;`n< T6N891K=S "N 6N)6, P1,1 41N\1, 64 686N)= )1541
1!)981)6
6nd
=bserve .ue para referirnos a un control de otro formulario antepones el nombre del formulario al
del control ;fdata+.vbgc.8alue< fdataGnombre formulario avbgcGnombre controla value Gvalor.
Para recorrer cada uno de los e.uipos vamos a lan*ar el procedimiento sumarSpuntos pas'ndole los
par'metros de la siguiente maneraaen el evento clic> de btnsumar
Public Sub btnsumarS!licR;<
sumarSpuntos;lb+# vb3# vb+# vb%<
Wait >.+
sumarSpuntos;lb3# vb&# vb%# vb+<
Wait >.+
sumarSpuntos;lb%# vbE# vb-# vb(<
Wait >.+
sumarSpuntos;lb&# vb0# vb(# vb-<
Wait >.+
sumarSpuntos;lb-# vb+># vbZ# vb++<
Wait >.+
sumarSpuntos;lbE# vb+3# vb++# vbZ<
Wait >.+
sumarSpuntos;lb(# vb+&# vb+%# vb+-<
Wait >.+
sumarSpuntos;lb0# vb+E# vb+-# vb+%<
Wait >.+
sumarSpuntos;lbZ# vb+0# vb+(# vb+Z<
Wait >.+
sumarSpuntos;lb+># vb3># vb+Z# vb+(<
Wait >.+
sumarSpuntos;lb++# vb33# vb3+# vb3%<
Wait >.+
sumarSpuntos;lb+3# vb3&# vb3%# vb3+<
Wait >.+
sumarSpuntos;lb+%# vb3E# vb3-# vb3(<
Wait >.+
sumarSpuntos;lb+&# vb30# vb3(# vb3-<
Wait >.+
sumarSpuntos;lb+-# vb%># vb3Z# vb%+<
Wait >.+
sumarSpuntos;lb+E# vbv%3# vb%+# vb3Z<
Wait >.+
pocisiones
btnsumar.enabled G 2alse
btnfec$a.enabled G )rue
6nd
6l Wait >.+ es para .ue el procedimiento se lance con +>> milisegundos de Celay entre uno y otro.
No se si es estrictamente necesario# pero $asta .ue lo puse el programa se colgaba a.u. 1l final
volvemos a cargar la tabla de pocisiones completa # blo.ueamos el botFn de sumar para evitar
sumar de nuevo por error y $abilitamos el botn .ue guarda la fec$a completa en la tabla
correspondiente.
A<ad!endo Fun!onal!dades
5ien# ya tenemos lo b'sico del programa. = casi. Nos $ara falta poder agregar o .uitar e.uipos
desde el mismo programa sin necesidad de usar un administrador e?terno de base de datos.6n la
interfase podemos ver un botn con la leyenda nuevo e.uipo llamado 5tnnuevo# cuyo cdigo es
el siguiente:
Public Sub 5tnnuevoS!licR;<
9f !onectar5ase;< )$en ,eturn
fdata.runnew;$conn<
2ormS=pen;<
6nd
Si lo lan*amos a$ora veremos .ue el programa da un error# pues fdata an no e?iste. Por tanto
vamos al 'rbol de la i*.uierda y desde la carpeta fuentes# botn derec$o#nuevo# formulario y lo
nombramos fdata. Su interfase es muy sencilla y no re.uiere e?plicaciones
"n te?tbo? ;t+tnombre< y dos botones ;btnaceptar y btncancelar< y su cdigo# muy sencillo
Private $conn 1s !onnection
Private $resul 1s ,esult
Public Sub runnew;data 1s !onnection<
$conn G data
Ke.S$owKodal
6nd
Public Sub btncancelarS!licR;<
Ke.!lose;<
6nd
Public Sub btnaceptarS!licR;<
9f t?tnombre.)e?t G )$en
Kessage.Warning;)eclee un nombre<
6lse
)ry $conn.6J6!;insert into e.uipos values ;O+#O3#O%#O&<# t?tnombre.te?t# >Q# >Q# >Q<
Ke.!lose;<
!atc$
Kessage.6rror;9mposible introducir los datos solicitados<
6ndif
6nd
!omo podemos ver# el mtodo runne4 lan*ado desde fmain se abre en forma modal# es decir#
$asta .ue no interactuemos con l no se cerrar' y no podr's seguir adelante con el programa.
!uando damos aceptar controlamos .ue el te?tbo? no est vaco y tratamos de introducir los
datos;es el cdigo destacado en rojo< y si no podemos lan*amos el mensaje de error. 4os tres ceros
entrecomillados son para los campos correspondientes a puntaje# goles a favor y goles en contra.
Para borrar $emos creado el siguiente procedimientoa
Public Sub tablaS[ey,elease;<
9f [ey.!ode G [ey.Celete )$en
9f tabla.current G Null )$en ,eturn
9f tabla.!urrent.Selected G 2alse )$en ,eturn
9f !onectar5ase;< )$en ,eturn
)ry $conn.e?ec;delete from e.uipos w$ere 6.uipoGO+Q# tabla.!urrent.[ey<
9f 6rror )$en
Kessage.6rror;9mposible borrar el registro<
6lse
tabla.!urrent.Celete;<
6ndif
6ndif
6nd
"samos el evento [eyrelease y si la tecla presionada es suprimir o delete eliminamos el e.uipo
seleccionado. 6l problema de este procedimiento es .ue este tipo de acciones no se pueden
des$acer. Para ello modificamos el cdigo agregando una variable a la .ue llamaremos pregunta a
la .ue declaramos al principio del procedimiento# y luego agregamos un cuadro de mensaje con dos
opciones. 4a primera opcin vale +Q y la segunda 3Q. Ce acuerdo al valor de esta variable
podemos cancelar el borrado del registro si $emos pulsado delete por error. Pongo el cdigo nuevo
con las modificaciones en a*ul.
Public Sub tablaS[ey,elease;<
Cim pregunta 1s 9nteger
9f [ey.!ode G [ey.Celete )$en Tcomprueba la tecla pulsada
9f tabla.current G Null )$en ,eturn
9f tabla.!urrent.Selected G 2alse )$en ,eturn
9f !onectar5ase;< )$en ,eturn
pregunta G message.Warning;H6sta seguro de eliminar el registroI# Si# No<
9f pregunta G + )$en
)ry $conn.e?ec;delete from e.uipos w$ere 6.uipoGO+Q# tabla.!urrent.[ey<
9f 6rror )$en
Kessage.6rror;9mposible borrar el registro<
6lse
tabla.!urrent.Celete;<
6ndif
6ndif
6ndif
6nd

L!s"ando e"apas o 6Fe.as7
1claro#por.ue .ui*' en otros pases no sea igual# .ue a.u llamamos fec$as a las etapas del
campeonato de ftbol. Baba .uedado pendiente crear el formulario donde ver en la fec$a y desde el
cual poder buscar los resultados de tu e.uipo o de determinada fec$a.
5ien# antes .ue nada # recordemos .ue en el formulario principal $ay un botn para guardar
las fec$as en la tabla al efecto .ue se $abilita luego de sumar los puntos. 6ste es su cdigo:
Public Sub btnfec$aS!licR;<
guardarfec$a;lbfec$as# lb+# vb+# lb3# vb%<Tpar'metros entre parntesis
guardarfec$a;lbfec$as# lb%# vb-# lb&# vb(<
guardarfec$a;lbfec$as# lb-# vbZ# lbE# vb++<
guardarfec$a;lbfec$as# lb(# vb+%# lb0# vb+-<
guardarfec$a;lbfec$as# lbZ# vb+(# lb+># vb+Z<
guardarfec$a;lbfec$as# lb++# vb3+# lb+3# vb3%<
guardarfec$a;lbfec$as# lb+%# vb3-# lb+&# vb3(<
guardarfec$a;lbfec$as# lb+-# vb3Z# lb+E# vb%+<
6nd
4o .ue $ace es lan*ar el procedimiento guardarfecha# pas'ndole los distintos par'metros.
,ebobinando un poco# para evitar reescribir cdigo creamos un procedimiento o funcin al .ue
luego le pasamos los par'metros. 8eamos a$ora el cdigo del mismo:
Public Sub guardarfec$a;lfec$a 1s 4istbo?# lloc 1s 4istbo?# gloc 1s 8aluebo?# lvis 1s 4istbo?# gvis
1s 8aluebo?<T1.ui declaramos los par'metros por tipo
TPrimero declaramos las variables
Cim fec$a 1s String
Cim local 1s String
Cim glocal 1s 9nteger
Cim visita 1s String
Cim gvisita 1s 9nteger
T4uego asignamos valores a las variables
fec$a G lfec$a.!urrent.te?t
local G lloc.!urrent.te?t
glocal G gloc.value
visita G lvis.!urrent.te?t
gvisita G gvis.8alue
T2inalmente insertamos los valores en la base de datos
)ry $conn.e?ec;9nsert into 2ec$as values;O+#O3#O%#O&#O-#OE<# Null# fec$a# local# glocal# visita#
gvisita<
blo.ueabotones T y blo.ueamos los botones
6nd
4os comentarios# resaltados en rojo e?plican lo .ue $ace cada parte del programa# el null en a*ul es
necesario para .ue el campo autonmerico ro4id se incremente en una unidad en cada nuevo
registro guardado.
8amos a$ora a crear el formulario para ver las tablas y reali*ar las bs.uedas. !omo ya es l tercer
proyecto no vamos a e?plicar ni como agregar el formulario ni como dibujar los controles. 6n la
imagen $emos incluido los nombres y en algn caso el tipo de control.
2orm + en tiempo de dise/o
Ke .ued con el nombre por defecto# 2orm+#pero sera un nombre m's adecuado frmfechas. 4o
abrimos desde 'ma!n $aciendo clicR en btnlistar ;listar fec$as<.
1$ora el cdigo de form+:
Private $conn 1s !onnection
Private $resu 1s ,esult T Gambas class file
Public 2unction !onectar5ase;< 1s 5oolean
9f $conn LM Null )$en ,eturn 2alse
$conn G New !onnection
$conn.Bost G "ser.Bome OP .goles+Q
$conn.name G 2utbol
$conn.type G s.lite%Q
)ry $conn.=pen;<
9f 6rror )$en
$conn G Null
Kessage.6rror;error al conectar con la base<
,eturn )rue
6ndif
,eturn 2alse
6nd
Public Sub 2ormS=pen;<
Cim palabra 1s String
tabla.!lear Tlimpiar tabla
9f !onectar5ase;< )$en ,eturn
tabla.!olumns.!ount G E
tabla.!olumnsU>V.te?t G id
tabla.!olumnsU>V.Widt$ G %>
tabla.!olumnsU>V.1lignment G 1lign.!enter
tabla.!olumnsU+V.te?t G 4ocal
tabla.!olumnsU+V.1lignment G 1lign.!enter
tabla.!olumnsU+V.Widt$ G +->
tabla.!olumnsU3V.te?t G glocal
tabla.!olumnsU3V.Widt$ G E>
tabla.!olumnsU3V.1lignment G 1lign.!enter
tabla.!olumnsU%V.te?t G 8isitante
tabla.!olumnsU%V.1lignment G 1lign.!enter
tabla.!olumnsU%V.Widt$ G +->
tabla.!olumnsU&V.te?t G gvisita
tabla.!olumnsU&V.1lignment G 1lign.!enter
tabla.!olumnsU&V.Widt$ G E>
tabla.!olumnsU-V.te?t G 2ec$a
tabla.!olumnsU-V.1lignment G 1lign.!enter
tabla.!olumnsU-V.Widt$ G +>>
$resu G $conn.6?ec;Select X from 2ec$as order by 2ec$a 1S!<
Co W$ile $resu.1vailable
palabra G $resuUYrowidYV
tabla.1dd;palabra# palabra<
tablaUpalabraVU+V G $resuUY4ocalYV
tablaUpalabraVU3V G $resuUYGlocalYV
tablaUpalabraVU%V G $resuUY8isitanteYV
tablaUpalabraVU&V G $resuUYGvisitaYV
tablaUpalabraVU-V G $resuUY2ec$aYV
$resu.KoveNe?t;<
4oop
2Kain.listado;lbe.uipo<
modcargar.cargar3
6nd
Public Sub btnbuscarS!licR;<
Cim palabra 1s String
Cim filtro 1s String
tabla.!lear Tlimpiar tabla
9f !onectar5ase;< )$en ,eturn
tabla.!olumns.!ount G E
tabla.!olumnsU>V.te?t G id
tabla.!olumnsU>V.Widt$ G %>
tabla.!olumnsU>V.1lignment G 1lign.!enter
tabla.!olumnsU+V.te?t G 4ocal
tabla.!olumnsU+V.1lignment G 1lign.!enter
tabla.!olumnsU+V.Widt$ G +->
tabla.!olumnsU3V.te?t G glocal
tabla.!olumnsU3V.Widt$ G E>
tabla.!olumnsU3V.1lignment G 1lign.!enter
tabla.!olumnsU%V.te?t G 8isitante
tabla.!olumnsU%V.1lignment G 1lign.!enter
tabla.!olumnsU%V.Widt$ G +->
tabla.!olumnsU&V.te?t G gvisita
tabla.!olumnsU&V.1lignment G 1lign.!enter
tabla.!olumnsU&V.Widt$ G E>
tabla.!olumnsU-V.te?t G 2ec$a
tabla.!olumnsU-V.1lignment G 1lign.!enter
tabla.!olumnsU-V.Widt$ G +>>
filtro G lbe.uipo.!urrent.)e?t
$resu G $conn.6?ec;Select X from 2ec$as w$ere 4ocal liRe T O filtro O T =r 8isitante 4iRe T O
filtro O T< Tconsulta s.l
Co W$ile $resu.1vailable
palabra G $resuUYrowidYV
tabla.1dd;palabra# palabra<
tablaUpalabraVU+V G $resuUY4ocalYV
tablaUpalabraVU3V G $resuUYGlocalYV
tablaUpalabraVU%V G $resuUY8isitanteYV
tablaUpalabraVU&V G $resuUYGvisitaYV
tablaUpalabraVU-V G $resuUY2ec$aYV
$resu.KoveNe?t;<
4oop
6nd
Public Sub btnresetS!licR;<
2ormS=pen
6nd
Public Sub btnbuscarfec$aS!licR;<
Cim palabra 1s String
Cim filtro 1s String
tabla.!lear Tlimpiar tabla
9f !onectar5ase;< )$en ,eturn
tabla.!olumns.!ount G E
tabla.!olumnsU>V.te?t G id
tabla.!olumnsU>V.Widt$ G %>
tabla.!olumnsU>V.1lignment G 1lign.!enter
tabla.!olumnsU+V.te?t G 4ocal
tabla.!olumnsU+V.1lignment G 1lign.!enter
tabla.!olumnsU+V.Widt$ G +->
tabla.!olumnsU3V.te?t G glocal
tabla.!olumnsU3V.Widt$ G E>
tabla.!olumnsU3V.1lignment G 1lign.!enter
tabla.!olumnsU%V.te?t G 8isitante
tabla.!olumnsU%V.1lignment G 1lign.!enter
tabla.!olumnsU%V.Widt$ G +->
tabla.!olumnsU&V.te?t G gvisita
tabla.!olumnsU&V.1lignment G 1lign.!enter
tabla.!olumnsU&V.Widt$ G E>
tabla.!olumnsU-V.te?t G 2ec$a
tabla.!olumnsU-V.1lignment G 1lign.!enter
tabla.!olumnsU-V.Widt$ G +>>
filtro G lbfec$as.!urrent.)e?t
$resu G $conn.6?ec;Select X from 2ec$as w$ere 2ec$a liRe T O filtro O T< Tconsulta s.l
Co W$ile $resu.1vailable
palabra G $resuUYrowidYV
tabla.1dd;palabra# palabra<
tablaUpalabraVU+V G $resuUY4ocalYV
tablaUpalabraVU3V G $resuUYGlocalYV
tablaUpalabraVU%V G $resuUY8isitanteYV
tablaUpalabraVU&V G $resuUYGvisitaYV
tablaUpalabraVU-V G $resuUY2ec$aYV
$resu.KoveNe?t;<
4oop
6nd
Public Sub 5tncerrarS!licR;<
Ke.!lose
6nd
8amos a e?playarnos sobre algunos fragmentos de cdigo .ue aparecen a.u y no $abamos
visto antes. Cados .ue los e.uipos alternan la locala # cuando buscamos los resultados de un e.uipo
debemos buscar en ambos campos# tenemos una sentencia s.l con dos variables a considerar unidas
por el operador lgico or# .ue literalmente significa o.
$resu G $conn.6?ec;Select X from 2ec$as w$ere 4ocal liRe T O filtro O T =r 8isitante 4iRe T O
filtro O T<
!reo .ue el resto del cdigo se e?plica bastante por s solo# salvo la sentencia modcargar.cargar2#
donde modcargar es un mdulo del programa y modcargar 3 es una funcin escrita en el misma.
8eamos el cdigo:
Public Sub cargar;<
2Kain.lbfec$as.1dd;6lige fec$a<
2Kain.lbfec$as.1dd;fec$a >+Q<
2Kain.lbfec$as.1dd;fec$a >3Q<
2Kain.lbfec$as.1dd;fec$a >%Q<
2Kain.lbfec$as.1dd;fec$a >&Q<
2Kain.lbfec$as.1dd;fec$a >-Q<
2Kain.lbfec$as.1dd;fec$a >EQ<
2Kain.lbfec$as.1dd;fec$a >(Q<
2Kain.lbfec$as.1dd;fec$a >0Q<
2Kain.lbfec$as.1dd;fec$a >ZQ<
2Kain.lbfec$as.1dd;fec$a +>Q<
2Kain.lbfec$as.1dd;fec$a +>Q<
2Kain.lbfec$as.1dd;fec$a +3Q<
2Kain.lbfec$as.1dd;fec$a +%Q<
2Kain.lbfec$as.1dd;fec$a +&Q<
2Kain.lbfec$as.1dd;fec$a +-Q<
6nd
Public Sub cargar3;<
2orm+.lbfec$as.1dd;6lige fec$a<
2orm+.lbfec$as.1dd;fec$a >+Q<
2orm+.lbfec$as.1dd;fec$a >3Q<
2orm+.lbfec$as.1dd;fec$a >%Q<
2orm+.lbfec$as.1dd;fec$a >&Q<
2orm+.lbfec$as.1dd;fec$a >-Q<
2orm+.lbfec$as.1dd;fec$a >EQ<
2orm+.lbfec$as.1dd;fec$a >(Q<
2orm+.lbfec$as.1dd;fec$a >0Q<
2orm+.lbfec$as.1dd;fec$a >ZQ<
2orm+.lbfec$as.1dd;fec$a +>Q<
2orm+.lbfec$as.1dd;fec$a +>Q<
2orm+.lbfec$as.1dd;fec$a +3Q<
2orm+.lbfec$as.1dd;fec$a +%Q<
2orm+.lbfec$as.1dd;fec$a +&Q<
2orm+.lbfec$as.1dd;fec$a +-Q<
6nd

Por a.u estara completa esta primera versin del programa. Por dudas# sugerencias o
comentarios en el blog $ttp:PPgambeando.wordpress.com o al correo dapeca3E>0bya$oo.com.ar.
Basta la pr?ima.
Caniel !alleja 1maro # Kontevideo# cunio de 3>+3.

Вам также может понравиться