Gerando arquivos HTML a partir de seu Banco de Dados


Ninguém mais pode duvidar da importância da Internet como meio de troca de informações e serviços no mundo atual. Na verdade parece que caminhamos para uma utilização tão abrangente da Internet que qualquer previsão por mais futurística que seja já nasce desatualizada.

No início era preciso conhecer HTML seus tags, e, usando o velho Notepad fazer na unha as páginas para exibição na Web, hoje com alguns cliques gera-se um site completo sem conhecer nada do que anda pelos bastidores da linguagem; e é VBScript e JavaScript e Perl e CGI e ASP e ....

Bem, nosso intuito com este artigo é bem modesto , trivial para ser mais exato. Queremos apenas gerar arquivos no padrão HTML com os dados de nossas tabelas. É isso mesmo !.

Imagine que você tem uma tabela com 500 produtos cadastrados em um banco de dados Access e precisa gerar um catálogo on-line com intencão de divulgar seus produtos na internet. O que você faria ? Criar uma tabela usando HTML é fácil !! e digitar o nome e o preço dos seus produtos ? Seria um trabalho intenso , não é mesmo ?

Bem , vamos mostrar , através de um código simples, usando algumas funções já pouco usadas do VB , que podemos gerar tal tabela no formato HTML usando o Visual Basic e resolver nosso problema com apenas um clique. Então vamos em frente.

Nosso projeto é simples , ele deve fazer basicamente o seguinte:

1-Receber a informação do nome do banco de dados Access e mostrar todas as tabelas deste banco de dados. 2-Receber o nome de arquivo com extensão HTM , o qual será o nome arquivo de saída gerado pelo Visual Basic com os dados da tabela selecionada. 3-Após gerar a página iremos acionar o Browser e mostrar a página gerada.( perfumarias...)

Vamos criar um projeto com nome de db_html.vbp o qual é composto dos seguintes controles:

O projeto em tempo de execução deverá ter a seguinte aparência:

Após selecionar a tabela basta clicar no botão que dispara a rotina para gerar o arquivo HTML e no final o sistema indica quantos registros foram processados.

Ao terminar a geração do arquivo HTML acionamos o browser via código VB para mostrar a página gerada.

O código para o projeto está descrito abaixo:

Código do modulo db_html.bas

'API para chamar a url
Private Declare Function ShellExecute Lib "shell32.dll" _
Alias "ShellExecuteA" (ByVal hwnd As Long, _
ByVal lpOperation As String, ByVal lpFile As String, _
ByVal lpParameters As String, ByVal lpDirectory As String, _
ByVal nShowCmd As Long) As Long

Private Const SW_SHOWNORMAL = 1

'Aciona o browser e mostra a página gerada
Public Sub abre_webpage(frm As Form, url As String)
Dim lret As Long
lret = ShellExecute(frm.hwnd, "open", url, vbNull, vbNullString, SW_SHOWNORMAL)

End Sub

Código da seção General Declarations do form db_html.frm: declara as variáveis visíveis em todo o Formulário.

Option Explicit
Dim db As Database
Dim caminho As String
Dim tabela As String

Código do botão que chama a caixa de diálogo para selecionar a base de dados:

Private Sub Command3_Click()

With CommonDialog1
.filename = ""
.Filter = "Arquivo de Dados (*.mdb)|*.mdb|Todos *.*|*.*"
.FilterIndex = 1
.ShowOpen
End With

caminho = CommonDialog1.filename
txtbase.Text = caminho

End Sub

Código do botão de comando que mostra o nome das tabelas no ListBox

Private Sub Command4_Click()
Dim tbl As TableDef

On Error GoTo tabela_error

Set db = DBEngine.Workspaces(0).OpenDatabase(caminho)

List1.Clear
For Each tbl In db.TableDefs
List1.AddItem tbl.Name
Next
Exit Sub

tabela_error:
Select Case Err.Number
Case 3031
MsgBox "O banco de dados possui Senha , não pode ser aberto ! ", vbExclamation, "JcmSoft"
Exit Sub
Case Else
MsgBox Err.Description, vbExclamation, "JcmSoft"
End Select
End Sub

Código do evento Form Load (Carga do formulário)

Private Sub Form_Load()

caminho = App.Path
If Right$(caminho, 1) <> "\" Then _
caminho = caminho & "\"
txtbase.Text = caminho
txtHTML.Text = caminho & "arquivo.htm"

End Sub

Código do botão que gera o arquivo HTML e aciona o browser para mostrar o arquivo gerado.

Private Sub Command1_Click()
Dim fnum As Integer
Dim rs As Recordset
Dim num_fields As Integer
Dim i As Integer
Dim num_processados As Integer
Dim url As String

On Error GoTo MiscError

' Abre o arquivo de saida
fnum = FreeFile
Open txtHTML.Text For Output As fnum


' Escreve o cabeçalho da página HTML
Print #fnum, "<HTML>"
Print #fnum, "<HEAD>"
Print #fnum, "<TITLE>Informe aqui o titulo</TITLE>"
Print #fnum, "</HEAD>"

Print #fnum, ""
Print #fnum, "<BODY TEXT=#000000 BGCOLOR=#CCCCCC>"
Print #fnum, "<H1>Página gerada pelo Visual Basic 5.0</H1>"

' Inicia a geração da tabela HTML
Print #fnum, "<TABLE WIDTH=100% CELLPADDING=2 CELLSPACING=2 BGCOLOR=#00C0FF BORDER=1>"

' abre a base de dados
'Set db = opendatabase(txtDatabase.Text)

' Abre a tabela
Set rs = db.OpenRecordset("SELECT * FROM " & tabela)

' Usa o nome dos campos como cabeçalho das colunas
Print #fnum, " <TR>" ' inicia uma linha
num_fields = rs.Fields.Count
For i = 0 To num_fields - 1
Print #fnum, " <TH>";
Print #fnum, rs.Fields(i).Name;
Print #fnum, "</TH>"
Next i
Print #fnum, " </TR>"

' processa os registros da tabela
Do While Not rs.EOF
num_processados = num_processados + 1
' Começa uma nova linha
Print #fnum, " <TR>";

For i = 0 To num_fields - 1
Print #fnum, " <TD>";
Print #fnum, rs.Fields(i).Value;
Print #fnum, "</TD>"
Next i
Print #fnum, "</TR>";

rs.MoveNext
Loop

' Encerra a tabela
Print #fnum, "</TABLE>"
Print #fnum, "<P>"
Print #fnum, "<H3>" & _
Format$(num_processados) & _
" registros processados.</H3>"
Print #fnum, "<HR COLOR=C000C0>"
Print #fnum, "<A HREF=http://www.geocities.com/SiliconValley/Bay/3994>JcmSoft</A>."

Print #fnum, "</BODY>"
Print #fnum, "</HTML>"

' Fecha a tabela e a base de dados
rs.Close
db.Close
Close fnum

MsgBox "Foram Processados " & _
Format$(num_processados) & " registros.", vbExclamation, "JcmSoft"

url = App.Path & "\arquivo.htm"

abre_webpage Me, url

Exit Sub

MiscError:
MsgBox "Error " & Err.Number & _
vbCrLf & Err.Description
End Sub

O código associado ao evento click do controle ListBox. Ao clicar atribui o nome da tabela selecionada à variável tabela.

Private Sub List1_Click()

tabela = List1.List(List1.ListIndex)

End Sub

Fazendo este exemplo para uma tabela temos a visualização do arquivo HTML, algo como :

Nada mal !!!!

Bem , o que vale a pena comentar neste artigo são as funções de baixo nível que o Visual Basic possue para trabalhar com abertura e gravação em arquivos. Estes comandos são uma herança da linguagem BASIC da qual o VB é originário. É bom lembrar que podemos ter arquivos sequenciais (arquivos textos) , aleatórios ( arquivos com registros) e binários( arquivos EXE, DLL ,etc.) .

Vejamos as principais funções e comandos de baixo nível para arquivos:

Open e Freefile

O comando Freefile retorna um número inteiro que representa o número próximo arquivo disponível. sintaxe - var=Freefile ou Freefile(num. arquivo)

O comando OPEN abre um arquivo : sintaxe - Open "dados.txt" For OutPut As 1

No nosso exemplo temos : fnum=Freefile e em seguida Open txtHTML.Text For Output As fnum isto significa que obtivemos o número do próximo arquivo livre e atribuímos ao arquivo txtHTML.text esse número que o identificará no sistema.

Write e Print

Os comandos Write e Print escrevem dados nos arquivos .

Print #fnum, "<H1>Página gerada pelo Visual Basic 5.0</H1>" - Grava no arquivo identificado por fnum os dados entre aspas . Esta é a diferença entre PRINT e WRITE . Ao usar PRINT você tem que formatar seus dados , já o comando WRITE insere os caracteres de controle de final de arquivo, nova lina(newline), carriage return, etc.

FileLen, LOF

A função FileLen retorna o tamanho em bytes do arquivo especificado. Tamanho=Filelen("C:\dados.txt")

A função LOF retorna o tamanho do arquivo para arquivos abertos.

Get e Put

Get e Put servem para ler e escrever informações a partir de arquivos do tipo Random e Binary, e utilizam posições de número de registro como parâmetros. Ex : Put #1 , 1 , texto grava no arquivo 1, a partir da posição 1 e Get #1 , 2 , Texto - Lê os dados do arquivo 1 , da posição 2.

SeeK. Loc

Seek retorna a posição da próxima operação de leitura e/ou gravação. Ex Seek #1, numero do registro

Loc retorna a posição atual de leitura/gravação. Ex: posicao=Loc(1) - retorna a posição dentro do arquivo

Input e Line Input

Lêm linhas de dados de um arquivo sequêncial. As linhas são textos retornados com marca de fim de linha e alimentação de linha ( carriage return e line feed). Ex : Line Input # 1 , registro

Close, EOF

Encerra a entrada/saída dos arquivos cujos indicativos , se passado sem parâmetro fecha todos os arquivos.

Close #1 - fecha o arquivo 1.

Eof (1) - retorna true se alcançar o final do arquivo

Essas funções podem ser utilizadas para tratar arquivos textos e também para ler e armazenar dados. Em breve vamos dar um exemplo de uma agenda pessoal feita usando as funções de baixo nível , aguardem.

Vejamos a seguir a título de exemplo um pedaço de código que poderia ser usado para preencher uma combobox durante a abertura de um formulário:

Private Sub Form_Load()

Dim file as integer

dim nome as string

file = Freefile

Open App.Path & "c:\escola\alunos.txt" for input as #file

Do Until EOF(file)

Input #file , nome

Combo1.Additem nome

Loop

Close #file

End sub

Moral da história nunca diga : "Eu não vou precisar disto jamais ". Concorda ? Então pegue o projeto deste artigo: db_html.vbp


José Carlos Macoratti