Access Avançado Formatação Avançada de Textos com Access Artigo para Access XP Pré-requisitos: Conhecimentos de Access e VBA Paulo Sergio Sarraino * Você já precisou formatar textos no Access como se estivesse no Word? Conseguiu imprimi-los e exibi-los na internet? A que custo? Independente da versão do Access, os campos de texto e memorando nunca permitiram trabalhar com textos mais elaborados visualmente, como negritos, sublinhados, cores e tantas outras opções que o Word, por exemplo, nos possibilita. Até que o estudo de outras ferramentas mostrou-me um caminho que poderia ajudar o Access atingir esse objetivo. UM POUCO DE ESTÓRIA Minha pesquisa sobre esse assunto se iniciou quando o tema foi abordado na revista nº 40 de Nov/Dez 2000. Naquela época, o controle utilizado (Microsoft Rich Textbox Control) permitia alguns recursos de formatação, mas só era possível trabalhar com formulários, já que o Access não entendia a estrutura do controle para disponibilizar relatórios com seus recursos. A formatação gerada era toda gravada em sintaxe RTF (Rich Text Format) que, por ser semelhante ao HTML (estrutura de tags), era aconselhável guardá-la em campos Memorando devido à sua grande capacidade de armazenamento. De qualquer forma, fiquei impressionado com as facilidades e possibilidades que poderiam ser acrescentadas ao Access. Trabalhei numa empresa (e presto consultoria ainda hoje) que atua como head-hunting de outras empresas, a Eigenheer & Associados – www.eigenheer.com.br - e lá desenvolvemos um complexo sistema de captação, disponibilização e gerenciamento de currículos, as avaliações e processos da empresa, e ainda seu banco de talentos totalmente em Access, conhecidos como EigPRO, EigNet e EigFast. Alguns relatórios gerados para seus clientes incluem o currículo de seus candidatos e, como essa informação é guardada normalmente com campos Memorando, não era possível realçar nenhuma parte do conteúdo disponibilizado. Eles também buscavam, há tempos, melhorias para essa tecnologia com o Access. Pois bem, se de um lado eu tinha campos Memorando com currículos gravados e nenhuma possibilidade de personalização, de outro tinha uma estrutura de formatação de textos em RTF, também usando campos Memorando, mas sem possibilidade de impressão. Meu desafio era pesquisar um meio de juntar esses dois ambientes e ainda mais, precisava disponibilizar relatórios, pesquisas e gerar um código HTML compatível para exibir esses dados no site da empresa que trabalhava. A BUSCA Na Internet, estudei algumas possibilidades. Uma delas é o “Total DISPONÍVEL PARA DOWNLOAD FATA.EXE (ACCESS XP, RTF2 1.8, RTF2HTML 3.03) Disponível para download em www.forumaccess.com.br 20 SETEMBRO/OUTUBRO 2005 - REVISTA Nº 69 Access Memo” da FMS (www.fmsinc.com), mas é pago (a partir de US$ 200,00) e não me geraria o código HTML que precisava. Continuando a pesquisa, achei no site do Lebans (www.lebans.com) um ActiveX muito interessante, o RTF2 1.8 (disponível para o Access 97 ou superior) que, além de gratuito, há muitas informações no site, algumas demos e me parecia ser de fácil adaptação. Ele também não gera o código HTML que precisava, mas, enquanto pensava nisso, localizei o site de Brady Hegberg (http://www2.bitstream.net/~bradyh/downloads/) que disponibiliza, gratuitamente, um código relativamente simples, o RTF2HTML 3.03 (arquivo rtf2html3.zip), de conversão do padrão RTF para o HTML (há mais informações e um demo na página rtf2htmlrm.html). Antes que me aprofunde mais, deixe-me explicar algumas situações que ocorreram nesta busca: procurando por ajuda (inclusive no GD da FórumAccess) recebi algumas sugestões para meu problema, como automatizar essa a tarefa com o Word e formatar o texto lá, porém essa alternativa era inviável. O currículo dos candidatos, por ser um campo memorando, estava inserido dentro de alguns relatórios do Access com outros campos do sistema e há ainda módulos de pesquisa e geração de conteúdo automático, por isso, ele deveria continuar dentro do sistema. Mesmo que eu utilizasse um controle acoplado de um objeto do Word, como controlaria as quebras de páginas desse controle dentro de um relatório do Access que também possui suas quebras de página? Também pensei em usar algum controle HTML para formatar os dados, mas, apesar de simplificar o processo eliminando a conversão de RTF para HTML, não conseguia disponibilizar a impressão. Identifiquei muitos problemas para algo que deveria ser tão simples quanto formatar um texto no Word. O PROJETO Bom, de posse do ActiveX RTF2 do Lebans, do código RTF2HTML do Brady e de mais alguns elementos que descreverei durante a matéria, consegui desenvolver um projeto para formatação e conversão de campos memorando usando os padrões RTF e HTML, juntando diversas tecnologias no Access XP (formato 2002 - não testei com o Access 2000). Com base no sistema do meu cliente, criei um sistema mais simples para a ilustração dessas tecnologias nesta matéria. A primeira coisa a fazer é baixar do site do Lebans, instalar o controle RTF2 e adicionar sua referência no arquivo MDB do sistema. Para isso, crie um módulo novo qualquer, selecione o menu Ferramentas / Referências e localize o “RTF2 ActiveX Control module”; senão estiver na lista, clique em Procurar, indique arquivos do tipo Controle ActiveX (*.ocx) e localize o arquivo RTF2.ocx, conforme a pasta que foi instalada o controle. Acrescente referências também para a “Microsoft Internet Controls” (para a visualização de página Web) e a “Microsoft Office 10.0 Object Library” (para a construção da barra de ferramentas de formatação personalizada). No final, sua tela de Referências deve ficar como a figura 1. WWW.FORUMACCESS.COM.BR Access Avançado Figura 1 – Tela de Referências Feche a tela do Editor do VBA e passemos ao projeto. Criei uma tabela (tbl_Candidatos) para o cadastramento dos candidatos com os campos abaixo: Campo Código Nome Endereço Bairro Cidade Estado CEP Telefone Celular Email DataNascimento Currículo Selecione o campo Currículo na propriedade Origem do Controle do ActiveX RTF2. Não se esqueça de inserir o controle dentro da página “Currículo formatado” do controle guia. Na segunda página (Código RTF), insira uma caixa de texto comum vinculada ao campo Currículo da tabela tbl_Candidatos. Defina sua propriedade Bloqueado como Verdadeiro para evitar alteração do seu conteúdo por esse caminho. Na terceira página (Código HTML), insira outra caixa de texto, porém nãovinculada à base, defina sua propriedade Bloqueado como Verdadeiro e ela terá, na sua propriedade Origem do Controle, a expressão “=rtf2html3(Currículo)”. Essa função encontra-se no módulo bas_RTF2HTML, que possui também diversas sub-rotinas para a conversão do código RTF para HTML (fiz algumas adaptações e correções a partir do arquivo disponível no site do Brady Hegberg conforme testava diversas opções de formatação). Devido à extensão do código desse módulo, ele não será transcrito na matéria. Por favor, analise-o diretamente no arquivo disponível no site da revista. Criei também, com o Assistente do Access, botões para a navegação de registros, acesso ao relatório e fechamento do formulário. Dimensione os controles de cada página e do formulário em geral de acordo a figura 3. Tipo/Tamanho Autonumeração (chave primária) Texto (50) Texto (255) Texto (50) Texto (20) Texto (2) Texto (9) Texto (14) Texto (14) Texto (50) Data Memorando Tabela 1 – Tbl_candidatos As outras propriedades dos campos da tabela foram assumidas como o padrão do Access. Construí um formulário (frm_Candidatos) para consulta e manutenção desses dados. Além dos campos da tabela tbl_Candidatos, criei uma guia com 3 páginas para ilustrar como ocorre o processo de formatação para o campo de Currículo. Na primeira página (Currículo formatado) da guia, temos o controle RTF2. Para inseri-lo, selecione-o a partir do menu Inserir / Controle ActiveX, conforme figura 2. Figura 3 - Dimensionando os controles de cada página e do formulário em geral Há um pequeno truque nesse formulário. O label Contato está na vertical, porém ele não é um label e sim uma imagem, já que construí essa legenda com o Paint do Windows. Apesar do Access apresentar uma propriedade chamada Vertical para as legendas e caixas de texto, na verdade essa propriedade rotaciona o texto 90º apenas no sentido horário. Na parte de código desse formulário, encontraremos diversas rotinas para controlar a navegação de registros, acesso ao relatório e um evento especial para o controle RTF2, o Change que, embora não apareça na estrutura do controle, é permitido na área de programação. Utilizamos esse evento para transmitir a barra de ferramentas personalizada “RTF Formatação”, os tipos de formatação aplicada ao texto, conforme se navega nos caracteres contidos no controle (Figura 4). Figura 2 -Inserindo Controle ActiveX Figura 4 – Controle Change FÓRUMACCESS SETEMBRO/OUTUBRO 2005 - REVISTA Nº 69 21 Access Avançado Access Avançado Para a formatação dos textos, segui a mesma idéia do Word, criando uma barra de ferramentas personalizada com as funções de formatação disponíveis. Baseei-me em um dos exemplos no site do Lebans (A2KRTF2Sample.zip), fiz alguns ajustes e acrescentei as combos para listar as fontes do sistema e os tamanhos possíveis. Para as combos iniciarem a indicação dos parâmetros de fonte e tamanho é necessário programar também o evento Load e Open do formulário frm_Candidatos. Private Sub Form_Load() Cada botão possui uma rotina própria registrada no módulo bas_RTF2ToolBar. Para as combos de nome e tamanho das fontes, fiz algo mais elaborado utilizando a matéria sobre barras de ferramentas personalizadas no Excel, citada no nº 66 de Mar/Abr 2005, e uma rotina para classificação de matrizes sem uso de tabelas temporárias (localizada em algum fórum através da pesquisa do Google), que está no módulo bas_ListaFontes. Segue os códigos dos botões da bas_RTF2ToolBar: Option Compare Database Option Explicit Me.ctlRTF.SetFocus SendKeys "{right}{left}" Public Function cbAlign(align As Integer) End Sub 'botões de Alinhamentos 'align = 1 (left), 2 (right), 3 (center), 4 (justify) On Error Resume Next Dim ctl As Object Set ctl = Screen.ActiveControl If Not ctl Is Nothing Then ctl.SelAlignment = Choose(align, rtfLeft, rtfRight, rtfCenter, rtfJustify) Set ctl = Nothing Private Sub Form_Open(Cancel As Integer) ctlRTF_Change DoCmd.ShowToolbar "RTF Formatação", acToolbarYes RTFCombosFonte End Sub End Function Para iniciar a construção da barra de ferramentas, selecione o menu Exibir / Barra de Ferramentas / Personalizar... Clique no botão “Nova...”, defina um nome e crie os botões necessários ou importe do arquivo desta matéria disponível no site da revista. As imagens dos botões foram obtidas com outro aplicativo, o V-Tools 1.66 da Skrol (www.skrol29.com) que, além de um vasto banco de imagens para botões, possui diversos outros recursos para um banco de dados Access. Public Function cbBold() 'botão de Negrito On Error Resume Next Dim ctl As Object Set ctl = Screen.ActiveControl If Not ctl Is Nothing Then ctl.FontBold = True Set ctl = Nothing End Function Figura 5 – RTF Formatação Public Function cbItalic() Temos rotinas para os botões de Recortar, Copiar, Colar, Desfazer, Cor de Fonte, Cor de Fundo, Superscrito e Subescrito, Listas Numeradas e de Marcadores, Espaçamento Entre Linhas, Tabulações, Página Web, Limpeza de Formatações, Nome de Fontes, Tamanho de Fonte, Negrito, Itálico, Sublinhado e Alinhamentos de Texto. Veja um exemplo de configuração de um dos botões da barra de ferramentas (Figura 6). 'botão de Itálico On Error Resume Next Dim ctl As Object Set ctl = Screen.ActiveControl If Not ctl Is Nothing Then ctl.FontItalic = True Set ctl = Nothing End Function Public Function cbUnderline() 'botão de Sublinhado On Error Resume Next Dim ctl As Object Set ctl = Screen.ActiveControl If Not ctl Is Nothing Then ctl.FontUnderline = True Set ctl = Nothing End Function Public Function cbCut() Figura 6 - Configuração de um dos botões da barra de ferramentas 22 SETEMBRO/OUTUBRO 2005 - REVISTA Nº 69 'botão de Cortar On Error Resume Next WWW.FORUMACCESS.COM.BR Access Avançado Dim ctl As Object Set ctl = Screen.ActiveControl If Not ctl Is Nothing Then ctl.Cut Set ctl = Nothing End Function Public Function cbCopy() 'botão de Copiar On Error Resume Next Dim ctl As Object Set ctl = Screen.ActiveControl If Not ctl Is Nothing Then ctl.Copy Set ctl = Nothing End Function Public Function cbPaste() 'botão de Colar On Error Resume Next Dim ctl As Object Set ctl = Screen.ActiveControl If Not ctl Is Nothing Then ctl.Paste Set ctl = Nothing End Function Public Function cbFont() 'combo de Fontes On Error Resume Next Dim ctl As Object, obj As Object Set ctl = Screen.ActiveControl If Not ctl Is Nothing Then Set obj = ctl.SelFont Set obj = Nothing End If Set ctl = Nothing Set ctl = Screen.ActiveControl If Not ctl Is Nothing Then Set obj = ctl.SelFontForeColor Set obj = Nothing End If Set ctl = Nothing End Function Public Function cbLineSpacing(space As Integer) 'botões de Espaçamento de Linha 'space = 0 (single), 1 (1.5), 2 (duplo) On Error Resume Next Dim ctl As Object Set ctl = Screen.ActiveControl If Not ctl Is Nothing Then ctl.ParagraphLineSpacing = Choose(space + 1, LineSpacingSingle, LineSpacingOneAndAHalf, LineSpacingDouble) Set ctl = Nothing End Function Public Function cbSubscript() 'botão de Subescrito On Error Resume Next Dim ctl As Object Set ctl = Screen.ActiveControl If Not ctl Is Nothing Then ctl.SelFontSubscript = True Set ctl = Nothing End Function Public Function cbSuperscript() 'botão de Superescrito On Error Resume Next Dim ctl As Object Set ctl = Screen.ActiveControl If Not ctl Is Nothing Then ctl.SelFontSuperscript = True Set ctl = Nothing End Function End Function Public Function cbFontBackColor() Public Function cbUndo() 'botão de Cor de Fundo On Error Resume Next Dim ctl As Object, obj As Object Set ctl = Screen.ActiveControl If Not ctl Is Nothing Then Set obj = ctl.SelFontBackColor Set obj = Nothing End If Set ctl = Nothing End Function Public Function cbFontForeColor() 'botão de Cor da Fonte On Error Resume Next Dim ctl As Object, obj As Object 'botão de Desfazer On Error Resume Next Dim ctl As Object Set ctl = Screen.ActiveControl If Not ctl Is Nothing Then ctl.Undo Set ctl = Nothing End Function Public Function cbClearFormat() 'botão de Limpar Formatação On Error Resume Next Dim ctl As Object Set ctl = Screen.ActiveControl If Not ctl Is Nothing Then ctl.PlainText = ctl.PlainText FÓRUMACCESS SETEMBRO/OUTUBRO 2005 - REVISTA Nº 69 23 Access Avançado Access Avançado hDC = GetDC(Application.hWndAccessApp) Set ctl = Nothing EnumFontFamilies hDC, vbNullString, AddressOf EnumFontFamProc, vFontes ReleaseDC Application.hWndAccessApp, hDC End Function Public Function cbTabs(ntab As Long) ReDim f(vFontes.Count) For i = 1 To vFontes.Count f(i) = vFontes(i) 'combo de Tabulações On Error Resume Next Dim ctl As Object Set ctl = Screen.ActiveControl If Not ctl Is Nothing Then ctl.TabIncrementalValue = ntab Set ctl = Nothing Next ArraySort f() 'reclassifica a matriz 'para criar a combo de Nome das Fontes 'Set cboFonte = CommandBars("RTF Formatação").Controls.Add(msoControlComboBox) End Function 'para atualizar a combo de Nome das Fontes Set cboFonte = CommandBars("RTF Formatação").Controls("RTFFontName") Public Function cbWeb() 'botão de Página Web On Error Resume Next Dim ctl As Object Set ctl = Screen.ActiveControl DoCmd.RunCommand acCmdSaveRecord If Not ctl Is Nothing Then DoCmd.OpenForm "frm_Web", , , , , , rtf2html3(Nz(ctl, "")) Set ctl = Nothing With cboFonte .Clear .Caption = "RTFFontName" .Style = msoComboNormal .TooltipText = "Fonte" .Width = 200 .DropDownLines = 8 .OnAction = "=cbFontName()" End Function For i = 1 To UBound(f) .AddItem f(i) Public Function cbFontName() Next End With 'combo de Nomes das Fontes On Error Resume Next Dim ctl As Object Set ctl = Screen.ActiveControl If Not ctl Is Nothing Then ctl.SelFontName = CommandBars.ActionControl.Text Set ctl = Nothing 'para criar a combo de Tamanho das Fontes 'Set cboTamanho = CommandBars("RTF Formatação").Controls.Add(msoControlComboBox) 'para atualizar a combo de Tamanho das Fontes Set cboTamanho = CommandBars("RTF Formatação").Controls("RTFFontSize") End Function With cboTamanho Public Function cbFontSize() 'combo de Tamanhos das Fontes On Error Resume Next Dim ctl As Object Set ctl = Screen.ActiveControl If Not ctl Is Nothing Then ctl.SelFontSize = CommandBars.ActionControl.Text Set ctl = Nothing .Clear .Caption = "RTFFontSize" .Style = msoComboNormal .TooltipText = "Tamanho da Fonte" .Width = 50 .DropDownLines = 8 .DropDownWidth = 0 .OnAction = "=cbFontSize()" End Function Public Function RTFCombosFonte() 'construção das combos de Nome e Tamanho de Fontes Dim cboFonte As CommandBarComboBox Dim cboTamanho As CommandBarComboBox Dim hDC As Long Dim vFontes As Variant Dim i As Integer Dim f() As String Set vFontes = New Collection 24 SETEMBRO/OUTUBRO 2005 - REVISTA Nº 69 .AddItem "8" .AddItem "9" .AddItem "10" .AddItem "11" .AddItem "12" .AddItem "14" .AddItem "16" .AddItem "18" .AddItem "20" .AddItem "22" .AddItem "24" .AddItem "26" WWW.FORUMACCESS.COM.BR Access Avançado .AddItem "28" .AddItem "36" .AddItem "48" .AddItem "72" 'Sinalizadores do campo ntmFlags Public Const NTM_REGULAR = &H40& Public Const NTM_BOLD = &H20& End With Public Const NTM_ITALIC = &H1& End Function 'Sinalizadores de tmPitchAndFamily Segue o código da bas_ListaFontes, que disponibiliza as fontes instaladas no micro classificadas alfabeticamente: Public Const TMPF_FIXED_PITCH = &H1 Public Const TMPF_VECTOR = &H2 Public Const TMPF_DEVICE = &H8 Public Const TMPF_TRUETYPE = &H4 Option Compare Database Option Explicit Public Const ELF_VERSION = 0 Public Const ELF_CULTURE_LATIN = 0 'Tipos de enumeração de fonte Public Const LF_FACESIZE = 32 Public Const LF_FULLFACESIZE = 64 Type LOGFONT 'Máscaras de EnumFonts Public Const RASTER_FONTTYPE = &H1 Public Const DEVICE_FONTTYPE = &H2 Public Const TRUETYPE_FONTTYPE = &H4 lfHeight As Long lfWidth As Long lfEscapement As Long Declare Function EnumFontFamilies Lib "gdi32" Alias "EnumFontFamiliesA" (ByVal hDC As Long, ByVal lpszFamily As String, ByVal lpEnumFontFamProc As lfOrientation As Long lfWeight As Long lfItalic As Byte Long, LParam As Any) As Long Declare Function GetDC Lib "User32" (ByVal hWnd As Long) As Long Declare Function ReleaseDC Lib "User32" (ByVal hWnd As Long, ByVal hDC lfUnderline As Byte lfStrikeOut As Byte lfCharSet As Byte As Long) As Long lfOutPrecision As Byte lfClipPrecision As Byte lfQuality As Byte ByVal FontType As Long, vFontes As Variant) As Long lfPitchAndFamily As Byte lfFaceName(LF_FACESIZE) As Byte End Type Type NEWTEXTMETRIC tmHeight As Long tmAscent As Long tmDescent As Long tmInternalLeading As Long tmExternalLeading As Long tmAveCharWidth As Long tmMaxCharWidth As Long Function EnumFontFamProc(lpNLF As LOGFONT, lpNTM As NEWTEXTMETRIC, Dim FaceName As String Dim FullName As String FaceName = StrConv(lpNLF.lfFaceName, vbUnicode) vFontes.Add Left$(FaceName, InStr(FaceName, vbNullChar) - 1) EnumFontFamProc = 1 End Function Function ListaFontes() As String Dim hDC As Long Dim vFontes As Variant tmWeight As Long tmOverhang As Long tmDigitizedAspectX As Long Dim i As Integer Dim strFontes As String, f() As String tmDigitizedAspectY As Long tmFirstChar As Byte tmLastChar As Byte Set vFontes = New Collection hDC = GetDC(Application.hWndAccessApp) EnumFontFamilies hDC, vbNullString, AddressOf EnumFontFamProc, vFontes tmDefaultChar As Byte tmBreakChar As Byte tmItalic As Byte ReleaseDC Application.hWndAccessApp, hDC ReDim f(vFontes.Count) tmUnderlined As Byte tmStruckOut As Byte tmPitchAndFamily As Byte For i = 1 To vFontes.Count f(i) = vFontes(i) Next tmCharSet As Byte ntmFlags As Long ntmSizeEM As Long ArraySort f() For i = 1 To UBound(f) ntmCellHeight As Long ntmAveWidth As Long End Type strFontes = strFontes & f(i) & ";" Next ListaFontes = Left(strFontes, Len(strFontes) - 1) FÓRUMACCESS SETEMBRO/OUTUBRO 2005 - REVISTA Nº 69 25 Access Avançado Access Avançado Para exibir uma página HTML no controle “Navegador Web da Microsoft”, localizei uma rotina durante as minhas pesquisas que deve ser usada no evento “Ao Carregar” do formulário frm_Web (lembre-se que é através do OpenArgs que o controle sabe qual o conteúdo HTML a exibir): End Function Sub ArraySort(vArray() As String) Dim lLoop1 As Long Dim lHold As Long Option Compare Database Dim lHValue As Long Dim lTemp As String Dim lUBound As Long, lLBound As Long Option Explicit Public strHTML As String lUBound = UBound(vArray) lLBound = LBound(vArray) Private Sub Form_Load() lHValue = lLBound strHTML = "" Do Dim s As String lHValue = 3 * lHValue + 1 Loop Until lHValue > lUBound Me.ctlWBrowser.Object.Navigate "about:blank" Do While Me.ctlWBrowser.Object.ReadyState <> READYSTATE_COMPLETE ' Do lHValue = lHValue / 3 For lLoop1 = lHValue + lLBound To lUBound loaded DoEvents Loop lTemp = vArray(lLoop1) lHold = lLoop1 Do While vArray(lHold - lHValue) > lTemp Me.ctlWBrowser.Object.Document.designMode = "On" Me.ctlWBrowser.Object.Document.execCommand "AbsolutePosition", False, vArray(lHold) = vArray(lHold - lHValue) lHold = lHold - lHValue If lHold < lHValue Then Exit Do True Me.ctlWBrowser.Object.Document.execCommand "2D-Position", False, True Loop vArray(lHold) = lTemp Next lLoop1 Do While Me.ctlWBrowser.Object.ReadyState <> READYSTATE_COMPLETE ' loaded Loop Until lHValue = LBound(vArray) DoEvents Loop End Sub Dim blTemp As Boolean Para verificar se o código HTML gerado será compatível com o browser, fiz ainda um formulário (frm_Web) com o ActiveX “Navegador Web da Microsoft”, disponível na janela Inserir Controle ActiveX do Access, para visualizar os currículos convertidos em HTML antes de enviar meu banco de dados para o provedor. O botão “Página Web” da barra de ferramentas chama esse formulário informando qual currículo estamos visualizando, através do parâmetro OpenArgs do formulário. Veja como ficaram os formulários criados com a barra de ferramentas (figura 7). blTemp = IsNull(Me.OpenArgs) If blTemp Then ' Use loaded About:Blank Document Exit Sub End If s = Me.OpenArgs ' Write the HTML to our Browser Me.ctlWBrowser.Object.Document.body.innerHTML = s Do While Me.ctlWBrowser.Object.ReadyState <> READYSTATE_COMPLETE ' loaded DoEvents Loop End Sub INTERNET Figura 7 - Formulários criados com a barra de ferramentas 26 SETEMBRO/OUTUBRO 2005 - REVISTA Nº 69 Como dito antes, estes currículos em RTF não podem ser visualizados no browser. Como temos as rotinas necessárias para a conversão desse código para HTML, utilizei a função rtf2html3() numa consulta para preparar os dados. A consulta qry_CV_html demonstra como realizei a conversão. Semelhante ao formulário frm_Web, uma página ASP que leia os currículos em formato HTML exibirá as formatações criadas no Access da melhor forma possível (figura 8). WWW.FORUMACCESS.COM.BR Access Avançado Veja um exemplo na figura 11. Figura 8 – qry_CV_html Veja uma página ASP como referência na figura 9. Figura 11 – Relatório de Currículos A MIGRAÇÃO No projeto original, quando essa solução ficou pronta, o banco de dados de currículos já era bem grande e estava num campo Memorando como texto simples. Não dava para pedir ao meu cliente a conversão do campo para a estrutura RTF em cada registro manualmente. Então, além dessa solução, fiz também um processo para realizar a leitura de toda a tabela, converter o currículo (copiando-o para um controle RTF2) e gravar o conteúdo convertido no banco de dados. Apenas como estatística, o sistema converteu 18.000 registros em 5 minutos aproximadamente. Figura 9 - Página ASP como referência CONCLUSÃO O RELATÓRIO O controle RTF2 do Lebans também pode ser usado em relatórios. Criei o relatório rpt_Candidatos para ilustrar sua capacidade de impressão com a formatação aplicada ao campo (figura 10). Como ele não possui a propriedade “Pode Ampliar”, que utilizamos em controles e seções nos relatórios do Access, devemos ajustar a altura do controle, conforme o conteúdo carregado através do evento Ao Formatar da seção Detalhe, e definir a propriedade “Pode Ampliar” da seção como Sim. Private Sub Detalhe_Format(Cancel As Integer, FormatCount As Integer) Disponibilizei essa solução em Abril/2005 e desde então meu cliente ficou muito satisfeito. Sabemos que não há 100% dos recursos de formatação, até porque isso não é o Microsoft Word, mas, para quem não conseguia fazer nem negritos, até que caprichamos bem. O desafio motivou a pesquisa que permitiu a construção dessa ferramenta com diversos componentes compartilhados. Espero que esta matéria motive também sua pesquisa para aprimorar seus projetos na busca de soluções para desafios aparentemente impossíveis. Fiquem à vontade para mandar idéias, sugestões e críticas. Bom estudo a todos! Me.ctlRTF.Height = Me.ctlRTF.RTFheight Para se aprofundar End Sub Site do Lebans (www.lebans.com) Site do Brady Hegberg (www2.bitstream.net/~bradyh/downloads/) * Paulo Sergio Sarraino ([email protected]) é sócio da Sarraino Systems. Possui graduação de Tecnologia em Processamento de Dados pela FASP (1997) e pós-graduação em Análise de Sistemas c/ Ênfase em Gerência de Projetos pela FIAP (2000). Atua como consultor em Análise e Desenvolvimento de Sistemas em ambiente MS Office e Internet (especialista em Access, VBA e ASP) há 10 anos. Acesse www.sarraino.com.br. Figura 10 – Criando rpt_Candidatos FÓRUMACCESS SETEMBRO/OUTUBRO 2005 - REVISTA Nº 69 27