Pronosticador de Loterias

Debo confesar que desde que vi la catedra de estadistica en el Tecnologico deje a un lado los juegos de azar. Sin embargo, cuando “jugaba triples y terminales” cree un programa que me permitiera obtener aciertos de manera frecuente. Los resultados no fueron muy alentadores, pero debo confesar que algunas oportunidades el programa acertaba determinada loteria. Pues bien, he traducido el codigo a Gambas y aqui se los dejo para que lo estudien, y quien sabe, si lo ponen en practica quizas ganen un dinerito extra… nunca esta demas…

Paso 1: El Formulario

loteria

Paso 2: El Codigo

‘ Gambas class file

PUBLIC Control AS Boolean
PUBLIC Control2 AS Boolean

PUBLIC SUB Visibles()

TextBox5.Visible = TRUE
TextBox6.Visible = TRUE
TextBox7.Visible = TRUE
TextBox8.Visible = TRUE
TextBox9.Visible = TRUE
TextBox10.Visible = TRUE

END

PUBLIC SUB NoNumerico()

IF IsNumber(Val(TextBox2.Text)) = FALSE OR IsNumber(Val(TextBox3.Text)) = FALSE OR IsNumber(Val(TextBox4.Text)) = FALSE THEN
Message.Info(“Solo se aceptan Valores numericos”)
Control2 = TRUE
Limpiar
TextBox1.SetFocus
ELSE
Control2 = FALSE
END IF

END

PUBLIC SUB Invisibles()

TextBox5.Visible = FALSE
TextBox6.Visible = FALSE
TextBox7.Visible = FALSE
TextBox8.Visible = FALSE
TextBox9.Visible = FALSE
TextBox10.Visible = FALSE

END

PUBLIC SUB Validacion()

IF TextBox2.Text = “” OR TextBox3.Text = “” OR TextBox4.Text = “” THEN
Control = TRUE
Message.Info(“Existen casillas vacias”)
Limpiar
TextBox2.SetFocus
ELSE
Control = FALSE
END IF

END

PUBLIC SUB Limpiar()

TextBox1.Text = “”
TextBox2.Text = “”
TextBox3.Text = “”
TextBox4.Text = “”
TextBox5.Text = “”
TextBox6.Text = “”
TextBox6.Text = “”
TextBox7.Text = “”
TextBox8.Text = “”
TextBox9.Text = “”
TextBox10.Text = “”

END

PUBLIC SUB Form_Open()
Invisibles
END

PUBLIC SUB Button1_Click()

ME.Close

END

PUBLIC SUB Button2_Click()
Limpiar
label7.Text = “”
TextBox1.SetFocus
Invisibles
END

PUBLIC SUB Button3_Click()
Validacion
NoNumerico
IF Control = FALSE AND Control2 = FALSE THEN
Visibles
Label7.Text = “Para la Loteria de ” & TextBox1.Text

TextBox5.Text = Int(Rnd(0, Val(TextBox2.Text) + 1))
TextBox6.Text = Int(Rnd(0, Val(TextBox3.Text) + 1))
TextBox7.Text = Int(Rnd(0, Val(TextBox4.Text) + 1))
TextBox8.Text = Int(Rnd(9, Val(TextBox2.Text) + 1))
TextBox9.Text = Int(Rnd(9, Val(TextBox3.Text) + 1))
TextBox10.Text = Int(Rnd(9, Val(TextBox4.Text) + 1))
END IF

END

La Torre de Hanoi

En esta oportunidad les presento el famoso problema de la torre de Hanoi, pero con la particularidad que se maneja como un juego donde debemos hacer click sobre los anillos que conforman la torre para moverla de un lugar a otro. Este programa es bastante completo e incorpora elementos que hasta ahora no habiamos estudiado en este blog, como por ejemplo, slider, LCDnumber, DrawingArea, etc. Este programa no es de mi propiedad, fue enviado por un visitante de este foro a mi correo electronico. Muy agradecido por su aporte.

El formulario: Torre de Hanoi

El codigo del Formulario:

myHanoi AS Chanoi
myTower AS Integer[]
myTowerDep AS Integer
myTowerArr AS Integer
turn AS Integer
start AS Boolean
starttxt AS String
stoptxt AS String
movetxt AS String
towdeptxt AS String

PUBLIC SUB form_open()

myHanoi = NEW Chanoi

start = FALSE
turn = 1
myTowerDep = 0
myTowerArr = 0

slider1_change()

END

PUBLIC SUB Slider1_change()

DIM i AS Integer
DIM j AS Integer

LCDNumber1.Value = slider1.Value
drawTowers()

j = slider1.Value – 2

FOR i = 0 TO (slider1.Value) – 1
drawdisk(1, i + 1, (slider1.Value) – i)
NEXT

END

PUBLIC SUB Quit_Click()

DIM choice AS Integer

choice = Message.Question((“Are you sure ?”), (“&Yes”), (“&No”))

IF choice = 1 THEN
ME.Close
ENDIF

END

PUBLIC SUB Button1_Click()

IF start = TRUE THEN
start = FALSE
turn = 1
button1.Text = (“Start”)
TextLabel1.text = (“Choose the number of disks then press Start”)
slider1.Enabled = TRUE
slider1_change
RETURN
ENDIF

start = TRUE
button1.Text = (“Stop”)
TextLabel1.text = (“Move”) & ” ” & turn & ” ” & (“: choose the starting tower”)
slider1.Enabled = FALSE
myHanoi.init(slider1.value)

END

PUBLIC SUB DrawingArea1_MouseDown()

DIM X AS Integer
DIM y AS Integer
DIM Bckgd AS Integer

IF start = FALSE THEN
RETURN
ENDIF

X = (Mouse.X / 210) + 1

IF myTowerDep = 0 THEN
myTowerDep = X
TextLabel1.text = (“Move”) & ” ” & turn & ” ” & (“: choose the destination tower”)
RETURN
ENDIF

IF myTowerDep = X THEN
myTowerDep = 0
TextLabel1.text = (“Move”) & ” ” & turn & ” ” & (“: choose the starting tower”)
RETURN
ENDIF

myTowerArr = X

IF NOT myHanoi.moveDisk(myTowerDep, myTowerArr) THEN
Bckgd = DrawingArea1.Background
TextLabel1.Background = color.Red
TextLabel1.text = (“Move”) & ” ” & turn & ” ” & (“: illegal move !”)
WAIT 2
TextLabel1.Background = Bckgd
TextLabel1.text = (“Move”) & ” ” & turn & ” ” & (“: choose the starting tower”)
myTowerDep = 0
myTowerArr = 0
RETURN
ENDIF

moveTowers()

IF ((myHanoi.getTower(3)).length = slider1.Value) THEN
win()
RETURN
ENDIF

myTowerDep = 0
myTowerArr = 0
INC (turn)

TextLabel1.text = (“Move”) & ” ” & turn & ” ” & (“: choose the starting tower”)

END

PRIVATE PROCEDURE moveTowers()

DIM i AS Integer
DIM j AS Integer
DIM k AS Integer

drawTowers()

FOR i = 1 TO 3
myTower = myHanoi.getTower(i)

IF myTower.length THEN
FOR j = 1 TO myTower.length
drawDisk(i, j, myTower[j - 1])
NEXT
ENDIF
NEXT

END

PRIVATE PROCEDURE win()

message.Info((“Congratulation !\nYou have win in”) & ” ” & turn & ” ” & (“moves.”), (“&Ok”))
button1_click()

END

PRIVATE PROCEDURE drawTowers()

‘ the three empty towers

DIM i AS Integer

DrawingArea1.clear
DrawingArea1.Border = Border.Sunken
DRAW.Begin(DrawingArea1)
DRAW.ForeColor = color.Black
DRAW.FillStyle = fill.Solid
DRAW.FillColor = color.DarkRed

FOR i = 0 TO 2
DRAW.rect(5 + (i * 205), 160, 200, 20)
DRAW.Rect(102 + (i * 205), 5, 6, 155)
NEXT

DRAW.End

END

PRIVATE PROCEDURE drawDisk(tower AS Integer, pos AS Integer, size AS Integer)

DIM myX AS Integer
DIM myY AS Integer
DIM myL AS Integer
DIM myEp AS Integer
DIM mySpace AS Integer
DIM tower2tower AS Integer

tower2tower = 205
mySpace = 2
myEp = 13
myX = 100 – ((size – 1) * 10) + tower2tower * (tower – 1)
myY = 160 – ((mySpace + myEp) * pos)
myL = 10 + ((size – 1) * 20)

DRAW.Begin(DrawingArea1)
DRAW.ForeColor = color.Black
DRAW.FillStyle = fill.Solid
DRAW.FillColor = color.Blue
DRAW.rect(myX, myY, myL, myEp)
DRAW.End

END

El codigo de la Clase que llamaremos Chanoi (si… aqui vamos a crear una clase… fantastico no?)

PRIVATE tower1 AS NEW Integer[]
PRIVATE tower2 AS NEW Integer[]
PRIVATE tower3 AS NEW Integer[]
PRIVATE height AS Integer

PUBLIC SUB init(h AS Integer)

DIM i AS Integer

tower1.Clear
tower2.Clear
tower3.Clear
height = h

FOR i = h TO 1 STEP -1
tower1.Push(i)
NEXT

END

PUBLIC FUNCTION getTower(t AS Integer) AS Integer[]

SELECT t
CASE 1
RETURN tower1
CASE 2
RETURN tower2
CASE 3
RETURN tower3
END SELECT

END

PUBLIC FUNCTION moveDisk(st AS Integer, ar AS Integer) AS Boolean

DIM tw1 AS Integer[]
DIM tw2 AS Integer[]

SELECT st
CASE 1
tw1 = tower1
CASE 2
tw1 = tower2
CASE 3
tw1 = tower3
END SELECT

SELECT ar
CASE 1
tw2 = tower1
CASE 2
tw2 = tower2
CASE 3
tw2 = tower3
END SELECT

IF tw1.Length = 0 THEN
RETURN FALSE
ENDIF

IF tw2.Length = 0 THEN
tw2.Push(tw1.Pop())
RETURN TRUE
ENDIF

IF tw2[tw2.Length - 1] < tw1[tw1.Length - 1] THEN
RETURN FALSE
ENDIF

tw2.Push(tw1.Pop())
RETURN TRUE

END

GambasLinux.tk

A veces queremos contar a un amigo sobre algun blog interesante, pero debido a lo extenso del nombre, no recordamos o si recordamos damos el nombre del sitio a medias. Gracias a un amigo me presento una web que te permite obtener un dominio .tk y agregarlo a tu sitio. Desdes ahora pueden tambien ingresar a este blog tipeando: www.gambaslinux.tk.

Mucho mas facil de recordar…

By Julio Montaño Publicado en Noticias

Ordenación Por Metodo de la Burbuja

La tecnica de ordenación por burbuja compara elementos consecutivos de la lista, de modo que si en una pasada no ocurrieran intercambios, significaria que la lista esta ordenada. Este metodo es muy clasico y sencillo, y por lo general es uno de los primeros ejercicios que les colocan a los estudiantes de informatica y computacion cuando ven el capitulo que corresponde a vectores.

A continuacion les coloco un programa que realiza ordenacion por metodo de la burbuja bajo Gambas. Esta hecho como un programa de consola.

PUBLIC SUB Main()
DIM Columna AS Integer
DIM N, i, j, Aux AS Integer
DIM Limite AS Integer

DIM vector AS Integer[]
vector = NEW Integer[]

PRINT “Ingrese el limite maximo a leer el vector:”
INPUT Limite

FOR Columna = 0 TO Limite
PRINT “Ingresa un Numero “
INPUT N
vector.Add(N)
NEXT
‘Este es el Procedimiento Burbuja
‘para ordenar los datos que contiene el vector
FOR i = 0 TO Limite – 1
FOR j = 0 TO Limite – 1
IF Vector[j] > vector[j + 1] THEN
‘En esta parte se realiza el intercambio
Aux = vector[j]
vector[j] = vector[j + 1]
vector[j + 1] = Aux
END IF
NEXT
NEXT

PRINT
‘Por ultimo procedemos a imprimir el vector
FOR j = 0 TO Limite
PRINT vector[j]
NEXT
END

Uso de Vectores

Gambas tiene predefinidas matrices unidimensionales dinamicas de todos los tipos de datos, excepto Boolean. Con el siguiente ejemplo veremos el uso de vectores del cual se desconoce el tamaño o dimension. vale recordar que al declarar un vector se reserva una cantidad de memoria en relacion con la cantidad de datos que este posea. En el caso de las matrices dinamicas el limite seria la cantidad de memoria que posea el Pc.

Ejemplo de lectura y escritura de un vector dinamico (programa tipo consola)

PUBLIC SUB Main()
DIM Columna AS Integer
DIM N, j AS Integer
DIM Limite AS Integer

DIM vector AS Integer[]
vector = NEW Integer[]

PRINT “Ingrese el limite maximo a leer el vector:”
INPUT Limite

FOR Columna = 0 TO Limite
PRINT “Ingresa un Numero “
INPUT N
vector.Add(N)
NEXT

FOR j = 0 TO Limite
PRINT vector[j]
NEXT
END

Guardar, Buscar, Editar y Eliminar con MYSQL en Gambas

En esta oportunidad les coloco un ejemplo tipico de creacion de un formulario para agregar, buscar, editar y eliminar usuarios de un sistema utilizando mysql como base de datos y Gambas. El codigo es un poco largo, porque en realidad esta pantalla forma parte de un sistema para control de cibercafe (en desarrollo aun), pero se puede implementar facilmente a otros pogramas que realicen. Una de las modificaciones que se han realizado a este formulario (que se colocaran en un proximo post), es que la conexion a la BD se hace desde un modulo, de manera de reutilizar el codigo en otros formularios.

el aspecto del formulario es el siguiente:

operadores.png

El codigo que debe llevar el formulario es el siguiente:

PUBLIC cn AS NEW Connection
PUBLIC rs AS Result
PUBLIC actStatus AS String
PUBLIC Controlador AS Boolean

PRIVATE SUB SetEnabledFormField(status AS Boolean)

textbox1.Enabled = status
texto2.Enabled = status
texto3.Enabled = status

END

PRIVATE SUB SetEnabledNavButton(status AS Boolean)

BtnFirst.Enabled = status
BtnPrev.Enabled = status
BtnNext.Enabled = status
BtnLast.Enabled = status

END

PRIVATE SUB SetEnabledActButton(status AS Boolean)

BtnGuardar.Enabled = status
BtnEditar.Enabled = status
BtnBuscar.Enabled = status
BtnEliminar.Enabled = status

END

PRIVATE SUB lockFormField(status AS Boolean)

textbox1.ReadOnly = status
texto2.ReadOnly = status
texto3.ReadOnly = status

END

PRIVATE SUB updateFieldValue()

textbox1.Text = rs!usuario
texto2.Text = rs!pass

END

PRIVATE SUB clearField()

textbox1.Text = “”
texto2.Text = “”
texto3.Text = “”
textbox1.SetFocus

END

PUBLIC SUB Erroneos()

IF texto2.Text <> texto3.Text THEN
Message.Warning(“Claves Erroneas”)
texto2.Text = “”
texto3.Text = “”
texto2.SetFocus
Controlador = TRUE
ELSE
Controlador = FALSE
END IF
END

PUBLIC SUB Form_Open()

WITH cn
.type = “mysql”
.host = “localhost”
.login = “root”
.password = “102172″
.name = “cibercafe”

TRY .OPEN
IF ERROR THEN
Message.Error(“Error abriendo la base de datos!!!\n” & Error.Text)
SetEnabledFormField(FALSE)
ME.Close
ELSE
rs = cn.Exec(“SELECT * FROM usuarios”)
lockFormField(TRUE)
textbox1.ReadOnly = FALSE
rs.MoveFirst
IF rs.Available = TRUE THEN
updateFieldValue()
END IF
END IF
END WITH

END

PUBLIC SUB TextBox1_GotFocus()

BtnBuscar.Default = TRUE

END

PUBLIC SUB TextBox1_LostFocus()

BtnBuscar.Default = FALSE

END

PUBLIC SUB BtnBuscar_Click()

DIM i AS Integer
DIM found AS Boolean
rs.MoveFirst
found = FALSE
i = 1
WHILE 1 <= rs.Count
IF rs!usuario LIKE “*” & textbox1.Text & “*” THEN
found = TRUE
EXIT
END IF
rs.MoveNext
i = i + 1
WEND
IF found = TRUE THEN
updateFieldValue()
ELSE
Message.Warning(“Error en la data!!”)
END IF

END

PUBLIC SUB Form_Close()

cn.Close

END

PUBLIC SUB BtnFirst_Click()

rs.MoveFirst
IF rs.Available = TRUE THEN
updateFieldValue()
END IF

END

PUBLIC SUB BtnPrev_Click()

rs.MovePrevious
IF rs.Available = TRUE THEN
updateFieldValue()
END IF

END

PUBLIC SUB BtnNext_Click()

rs.MoveNext
IF rs.Available = TRUE THEN
updateFieldValue()
END IF

END

PUBLIC SUB BtnLast_Click()

rs.MoveLast
IF rs.Available = TRUE THEN
updateFieldValue()
END IF

END

PUBLIC SUB BtnAdd_Click()

lockFormField(FALSE)
SetEnabledNavButton(FALSE)
SetEnabledActButton(FALSE)
BtnGuardar.Enabled = TRUE
BtnCancel.Enabled = TRUE
clearField()

actStatus = “ADD”

END

PUBLIC SUB BtnGuardar_Click()

DIM xresult AS Result
DIM xQuery AS String
DIM xParam AS Integer
Erroneos()
IF Controlador = TRUE THEN
RETURN
ELSE
SELECT CASE actStatus
CASE “ADD”
xresult = cn.Create(“usuarios”)
xresult!usuario = Trim(UCase(textbox1.Text))
xresult!pass = Val(Trim(texto2.Text))
xresult.Update
Message.Info(“Datos Guardados”)
IF ERROR THEN Message.Error(Error.Text)
CASE “EDIT”
xParam = texto2.Text
xQuery = “pass = ” & texto2.Text

cn.Begin
xresult = cn.Edit(“usuarios”, xQuery)
xresult!usuario = Trim(UCase(textbox1.Text))
xresult!pass = Val(Trim(texto2.Text))
xresult.Update
cn.Commit
Message.Info(“Datos editados”)
IF ERROR THEN Message.Error(Error.Text)
CASE “DEL”
xParam = texto2.Text
xQuery = “pass = ” & xParam
cn.Begin
xresult = cn.Edit(“usuarios”, xQuery)
xresult.Delete
cn.Commit
Message.Info(“Datos eliminados”)
IF ERROR THEN Message.Error(Error.Text)
CASE ELSE
END SELECT
rs = cn.Exec(“SELECT * FROM usuarios”)
rs.MoveFirst
SetEnabledNavButton(TRUE)
SetEnabledActButton(TRUE)
‘clearField()
END IF
END

PUBLIC SUB BtnCerrar_Click()

ME.Close

END

PUBLIC SUB BtnEditar_Click()

lockFormField(FALSE)
SetEnabledNavButton(FALSE)
SetEnabledActButton(FALSE)
BtnGuardar.Enabled = TRUE
BtnCancel.Enabled = TRUE

actStatus = “EDIT”

END

PUBLIC SUB BtnEliminar_Click()

lockFormField(FALSE)
SetEnabledNavButton(FALSE)
SetEnabledActButton(FALSE)
BtnGuardar.Enabled = TRUE
BtnCancel.Enabled = TRUE

actStatus = “DEL”

END

PUBLIC SUB BtnCancel_Click()

lockFormField(TRUE)
SetEnabledNavButton(TRUE)
SetEnabledActButton(TRUE)

END

GAMBAS… Levantate y Habla!!!

Cuando programaba en Visual Basic con Guindos, la forma mas sencilla de hacer que una aplicación ejecuta sonido, era grabando la voz y luego reproducirla con algunos comandos en el sistema. Esto tenia como desventaja principal que el programa o sistema desarrollado se hacia lento.

Andando por la red, encontre un articulo donde se indica como hacer hablar a un pc utilizando la aplicación eSpeak , que funciona con Alsa (el sistema de sonido de GNU/Linux). Luego, decidi implimentarla enGambas y el resultado es que el sistema “habla” lo cual nos permite colocar en un sistema, mensajes de bienvenida, clave erronea, etc.

Un ejemplo de como hacer “hablar” a tu sistema seria el siguiente:

1) creas un formulario y colocar dos botones, uno para Ejecutar y otro para Cerrar.

2) Crear un modulo llamado Voces. En este modulo colocas este codigo:

PUBLIC SUB Bienvenido()
EXEC ["aoss", "espeak", "-ves", "-s130", "?Bienvenido,a,Gambas,ya,puedo,hablar"]
END

PUBLIC SUB Salida()
EXEC ["aoss", "espeak", "-ves", "-s130", "?Gracias,por,usar,Gambas,vuelva,pronto"]
END

3) Ahora haces doble click en el boton Ejecutar y escribes: Voces.Bienvenido(). En el boton Cerrar haces doble click y escribes: Voces.Salida() y mas abajo de esta instruccion: Me.close

Y Listo, ya tienes a Gambas hablando!!!

Nota: Todo lo que quieras que la pc diga debe ir entre comillas y separado por comas, como esta en el ejemplo. “-ves” significa que el idioma es Español, quiere decir que tambien podemos usar otros lenguajes. “-s130″ es la velocidad con que se ejecuta la lectura. Se recomienda entre 120 y 170 para el idioma español.

Lanzado Gambas 2.0.0

El pasado 02 de enero de 2008, fue lanzado oficialmente Gambas 2.0.0. En su sitio oficial se puede realizar la descarga de esta version. Entre ls novedades mas importantes que incluye esta version, esta la mejora en la mayoria de todos los componentes que funcionaba con la version 1.x.x, ademas de la incorporacion del componente gb.vb, que permite implementar clases y componentes que funcionan bajo Visual Basic.

En su sitio, ya esta planteado continuar con el desarrollo del lenguaje para llevarlo a Gambas 3.0. Excelente avance para la programacion visual bajo GNU/Linux

Sitio de Gambas:  http://gambas.sourceforge.net/

Sitio de descarga de Gambas 2.0.0: http://gambas.sourceforge.net/download.html

Tambien estan disponibles los paquetes para Ubuntu Edgy/Feisty/Gutsy y Guadalinex v4.1 . En el siguiente link estan las indicaciones como modificar su repositorio e instalar gambas2 de una manera un poco mas facil y sin complicaciones.

By Julio Montaño Publicado en Noticias

Sobre el Sistema Administrativo Para GNU/Linux

En el dia de ayer se realizo una reunión preliminar entre el grupo de desarrolladores de la Cooperativa Tecnologia Bolivariana R. L. Alli se definieron quienes estaran a cargo de las pruebas del sistema asi como la estrategia de servicios.

En primera instancia, se decidio que todas aquellas personas que deseen una copia de la version beta, prevista a mas tardar para el 15-02-2007, dejen un comentario en este blog o nos escriban al correo electronico: jjmoncar@gmail.com

By Julio Montaño Publicado en Noticias

¿Como Imprimir una Factura?

Realmente es muy sencillo. Debemos colocar un boton que realice la función de imprimir lo que se ha ingresado en el formulario. Una vez que se realiza el pago se imprime y listo. Ahora,  internamente lo que hacemos es crear un archivo temporal y con la ayuda de HTML generamos un reporte que muestre y capture los datos que se ingresaron en el formulario. A continuacion les dejo el codigo de ejemplo.

PUBLIC SUB BTNImprimir_Click()

DIM Factura AS File
DIM Contador AS Integer = 0

OPEN “/tmp/Reporte.html” FOR CREATE AS #Factura
PRINT #Factura, “<html>”
PRINT #Factura, ” <head><title>Reporte de Sophia – Creado por Pedro Perez -</title></head>”
PRINT #Factura, ” <body topmargin = ’0′ leftmargin=’0′ onload=’window.print()’>”
PRINT #Factura, “   <table align = ‘center’ width = 500 border = ’1′ cellpadding=’0′ cellspacing=’0′>”
PRINT #Factura, “     <caption><h1>MiniS&uacuteper Joselyn</h1></caption>”
PRINT #Factura, “     <tr>”
PRINT #Factura, “       <td align = ‘center’><b>Cliente</b></td>”
PRINT #Factura, “       <td align = ‘center’><b>Tipo de pago</b></td>”
PRINT #Factura, “       <td align = ‘center’><b>N&uacutemero</b></td>”
PRINT #Factura, “       <td align = ‘center’><b>Fecha</b></td>”
PRINT #Factura, “     </tr>”
PRINT #Factura, “     <tr>”
PRINT #Factura, “       <td align = ‘center’>” & CMBCliente.Text & “</td>”
PRINT #Factura, “       <td align = ‘center’>” & CMBTipoPago.Text & “</td>”
PRINT #Factura, “       <td align = ‘center’>” & TBXNumeroFac.Text & “</td>”
PRINT #Factura, “       <td align = ‘center’>” & DTBFecha.Value & “</td>”
PRINT #Factura, “   </table>”
PRINT #Factura, “   <hr>”
PRINT #Factura, “   <table align = ‘center’ border = ’1′ width=’1008′ cellpadding=’0′ cellspacing=’0′>”
PRINT #Factura, “     <tr>”
PRINT #Factura, “       <td align = ‘center’><b>C&oacutedigo</b></td>”
PRINT #Factura, “       <td align = ‘center’><b>Descripci&oacuten</b></td>”
PRINT #Factura, “       <td align = ‘center’><b>Cantidad</b></td>”
PRINT #Factura, “       <td align = ‘center’><b>Precio</b></td>”
PRINT #Factura, “       <td align = ‘center’><b>Gravado</b></td>”
PRINT #Factura, “       <td align = ‘center’><b>Subtotal</b></td>”
PRINT #Factura, “     </tr>”
WHILE Contador < LSBCodigo.Count
PRINT #Factura, “     </tr>”
PRINT #Factura, “       <td align = ‘center’>” & LSBCodigo[Contador].Text & “</td>”
PRINT #Factura, “       <td align = ‘center’>” & LSBDescripcion[Contador].Text & “</td>”
PRINT #Factura, “       <td align = ‘center’>” & LSBCantidad[Contador].Text & “</td>”
PRINT #Factura, “       <td align = ‘center’>” & LSBPrecio[Contador].Text & “</td>”
IF LSBGravado[Contador].Text = “T” THEN
PRINT #Factura, “       <td align = ‘center’> TRUE</td>”
ELSE
PRINT #Factura, “       <td align = ‘center’>FALSE</td>”
END IF
PRINT #Factura, “       <td align = ‘center’>” & LSBSubTotal[Contador].Text & “</td>”
PRINT #Factura, “     </tr>”
INC Contador
WEND
PRINT #Factura, “   </table>”
PRINT #Factura, “   <hr>”
PRINT #Factura, “   <table align = ‘center’ border = ’1′ cellpadding=’0′ cellspacing=’0′>”
PRINT #Factura, “     <tr>”
PRINT #Factura, “       <td align = ‘center’><b>Cancelada</b></td>”
PRINT #Factura, “       <td align = ‘center’><b>Monto bruto</b></td>”
PRINT #Factura, “       <td align = ‘center’><b>Descuento</b></td>”
PRINT #Factura, “       <td align = ‘center’><b>Impuesto</b></td>”
PRINT #Factura, “       <td align = ‘center’><b>Monto a pagar</b></td>”
PRINT #Factura, “     </tr>”
PRINT #Factura, “     </tr>”
IF CKBCancelada.Value = TRUE THEN
PRINT #Factura, “       <td align = ‘center’>TRUE</td>”
ELSE
PRINT #Factura, “       <td align = ‘center’>FALSE</td>”
END IF
PRINT #Factura, “       <td align = ‘center’>” & TBXBruto.Text & “</td>”
PRINT #Factura, “       <td align = ‘center’>” & TBXDescuento.Text & “</td>”
PRINT #Factura, “       <td align = ‘center’>” & TBXImpuesto.Text & “</td>”
PRINT #Factura, “       <td align = ‘center’>” & TBXMonto.Text & “</td>”
PRINT #Factura, “     </tr>”
PRINT #Factura, “   </table>”
PRINT #Factura, ” </body>”
PRINT #Factura, “</html>”
CLOSE #Factura
FRMListado.Visible = TRUE