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 abragente 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


retorna