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:

- Duas caixas de texto : uma para receber o nome da base de dados e a outra para receber o nome do arquivo HTML a ser gerado
- Quatro botões de comandos: um para abrir a caixa de diálogo para selecionar uma base de dados , outra para mostrar as tabelas da base , outra para disparar a rotina para gerar o arquivo HTML e a outra para sair.
- Um listbox para receber os nomes das tabelas da base de dados
- O controle CommonDialog para acionar a seleção da base de dados

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 f num = 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