Web – Rodando Flash sem o Flash!!

A notícia remete a uma façanha e tanto. Escrito por Chris Smoak, o Smokescreen é um “Flash player escrito em JavaScript”, que pega os objetos em Flash e os converte em JavaScript em tempo real.

Bom, o resultado disso, apesar de parecer pouco significativo, simplesmente dá a qualquer browser a façanha de poder executar animações em Flash sem precisar do famoso Flash Player instalado.

Pode parecer pouca coisa, mas se esta façanha tomar forma, o sonho de independência da plataforma Flash por parte de muitos fabricantes do mercado será realidade, uma vez que é preciso suportar apenas o padrão javascritp, o que qualquer engine de browser já faz. O impacto que a iniciativa traz é descomunal para o desenvolvimento Web e plataformas móveis, que sofrem por não suportar o padrão ou não tê-lo por parte da Adobe.

O Tablet iPad, da Apple é o caso mais recente de “não suporte” oficial e mais importante, não interesse. A Apple já disse não ter pretensões de suportar o Flash em seu novo produto.

Exemplos de animações feitas em Flash e transformadas pelo Smokescreen podem ser vistas no site oficial do autor:

http://smokescreen.us/

O resultado já é bem interessante, apesar de inicial. No browser Chrome, da Google, o desempenho é favorecido pelo motor de javascript.

Vídeo – Introdução ao Visual Basic Editor

Zanzando pela web, mais especificamente pelo YouTube, sempre procuro alguns vídeos bacanas que ajudaria a sanar algumas dúvidas muito frequentes do nosso fórum. Infelizmente, é um pouco raro encontrar algo realmente bom de Excel. Em português então é quase uma saga.

Bom, com alguma sorte, consegui chegar ao vídeo do link abaixo. Sob a autoria do site TreinaInfo, ele dá um panorama geral do Editor de código do Visual Basic.

Para aqueles que estão conhecendo o VBA, vale mesmo a pena conferir.

Bom proveito!

VBA – Encontrando a referência ao Microsoft Internet Controls

Em alguns dos artigos do blog e citações no fórum são colocados exemplos de código VBA que possibilitam a interação com o Internet Explorer. Dentre as opções do que pode ser feito, temos:

  • Acessar uma página na internet e ler seu conteúdo
  • Acessar uma página na internet, preenchendo automaticamente alguns campos
  • Baixa um determinado conteúdo de uma página
  • Verificar se um determinado conteúdo consta em uma página

A lista pode crescer muito, mas a  intenção até então era contextualizar. O fato é que, para conseguir interagir com o objeto, é preciso ter a referência a biblioteca Microsoft Internet Controls no VBA. Ela expõem o objeto Internet Explorer e outros que não vem ao caso no momento.

No VBA das versões até a 2003 do Office com a intalação do Internet Explorer 6, essa referência era vista automaticamente na caixa de diálogo de referências do VBA. Porém, em instalações do IE7 e 8, isso não ocorre. A biblioteca não deixou de existir, porém, digamos que foi para “outro lugar”. Antes (até o IE6), a dll que representava os controles era a:

C:\Windows\System32\ieframe.dll

Para adicionar a referência manualmente ao novo componente, é preciso referenciar o arquivos que está no seguinte caminho:

C:\Windows\System32\shdocvw.dll

No VBA, vá em Ferramentas->Referências, clique em procurar e abra o arquivo do caminho acima. Com isso, a referência voltará a funcionar.

Referências:

http://bit.ly/bNCV3v

T-SQL – Efetuando a busca de um texto em todas as tabelas do banco de dados

Mais uma da série canivete suíço. 😉

Como mais uma necessidade “doida” do dia a dia que vivemos, foi preciso procurar em todas as tabelas de um banco de dados SQL Server que continham uma determinada string. Pois bem, com várias opções em mãos, a menos complicada de enviar para um ambiente de produção sem a necessidade de um Application Server era uma query SQL que fizesse o trabalho.

Depois de muito suor e testes, o resultado foi a query abaixo:

DECLARE @SQL VARCHAR(8000)
DECLARE @filtro VARCHAR(200)
DECLARE @filtro_www VARCHAR(200)
 
-- inicia a declaração do sql
SET @SQL = ''
SET @filtro = '%texto_procurado%'
 
SELECT
   tabelas.name   AS Tabela 
  ,colunas.name   AS Coluna
  ,tipos.name     AS Tipo
  ,colunas.length AS Tamanho
INTO
  #result
FROM 
  sysobjects tabelas
  INNER JOIN syscolumns colunas
  ON colunas.id = tabelas.id
  --
  INNER JOIN systypes tipos
  ON tipos.xtype = colunas.xtype
WHERE 
  tabelas.xtype = 'u'
    AND
  -- colocar aqui os tipos de coluna que serão buscados
  tipos.name IN('text', 'ntext', 'varchar', 'nvarchar')
 
 
-- cursor para varrer as tabelas
DECLARE cTabelas cursor LOCAL fast_forward FOR
SELECT DISTINCT Tabela FROM #result
 
DECLARE @nomeTabela VARCHAR(255)
 
OPEN cTabelas
 
fetch NEXT FROM cTabelas INTO @nomeTabela
 
while @@fetch_status = 0
BEGIN
 
  -- cursor para varrer as colunas da tabela corrente
  DECLARE cColunas cursor LOCAL fast_forward FOR
  SELECT Coluna, Tipo, Tamanho FROM #result WHERE Tabela = @nomeTabela
 
  DECLARE @nomeColuna VARCHAR(255)
  DECLARE @tipoColuna VARCHAR(255)
  DECLARE @tamanhoColuna VARCHAR(255)
 
  OPEN cColunas
 
  -- monta as colunas da cláusula select 
  fetch NEXT FROM cColunas INTO @nomeColuna, @tipoColuna, @tamanhoColuna
 
  while @@fetch_status = 0
  BEGIN
    -- cria a declaração da variável
    SET @SQL = 'declare @hasresults bit' + CHAR(13) + CHAR(10) + CHAR(13) + CHAR(10)
    -- cria o select
    SET @SQL = @SQL + 'select' + CHAR(13) + CHAR(10)
    SET @SQL = @SQL + CHAR(9) + '''' + @nomeTabela + ''' AS NomeTabela'
    SET @SQL = @SQL + CHAR(9) + ',' + @nomeColuna + CHAR(13) + CHAR(10)
    -- adiciona uma coluna com o tipo e o tamanho do campo
    SET @SQL = @SQL  + CHAR(9) + ',' + '''' + @tipoColuna + ''' AS ''' + @nomeColuna + '_Tipo''' + CHAR(13) + CHAR(10)
    SET @SQL = @SQL  + CHAR(9) + ',' + 'DATALENGTH(' + @nomeColuna + ') AS ''' + @nomeColuna + '_Tamanho_Ocupado''' + CHAR(13) + CHAR(10)    
    SET @SQL = @SQL  + CHAR(9) + ',' + '''' + @tamanhoColuna + ''' AS ''' + @nomeColuna + '_Tamanho_Maximo''' + CHAR(13) + CHAR(10)
 
    -- define a tabela temporária (#result)
    SET @SQL = @SQL + 'into' + CHAR(13) + CHAR(10) + CHAR(9) + '#result_' + @nomeTabela + CHAR(13) + CHAR(10)
    -- adiciona a cláusula from
    SET @SQL = @SQL +  'from' + CHAR(13) + CHAR(10) + CHAR(9) + @nomeTabela + CHAR(13) + CHAR(10)
    -- inicia a montagem do where
    SET @SQL = @SQL + 'where' + CHAR(13) + CHAR(10)
    SET @SQL = @SQL + CHAR(9) + @nomeColuna + ' like ''' + @filtro + '''' + CHAR(13) + CHAR(10)
 
    SET @SQL = @SQL + CHAR(13) + CHAR(10) + 'select @hasresults = count(*) from #result_' + @nomeTabela + CHAR(13) + CHAR(10)
    SET @SQL = @SQL + CHAR(13) + CHAR(10) + 'if @hasresults > 0'
    SET @SQL = @SQL + CHAR(13) + CHAR(10) + 'begin'
    SET @SQL = @SQL + CHAR(13) + CHAR(10) + CHAR(9) + 'select * from #result_' + @nomeTabela
    SET @SQL = @SQL + CHAR(13) + CHAR(10) + 'end' + CHAR(13) + CHAR(10)
    SET @SQL = @SQL + CHAR(13) + CHAR(10) + 'drop table #result_' + @nomeTabela
    SET @SQL = @SQL + CHAR(13) + CHAR(10)
 
    fetch NEXT FROM cColunas INTO @nomeColuna, @tipoColuna, @tamanhoColuna
	-- descomente a linha abaixo para ver o SQL produzido no janela de Messages
    -- print @sql
    EXEC(@SQL)
    SET @SQL = ''
  END
 
  close cColunas
  deallocate cColunas
 
  fetch NEXT FROM cTabelas INTO @nomeTabela
END
 
close cTabelas
deallocate cTabelas
 
DROP TABLE #result

O que ela faz exatamente?

  1. Busca no sysobjects todos as tabelas existentes no banco de dados.
  2. Faz o mesmo na tabela syscolumns para obter o nome da coluna, o tamanho e o tipo delas, conforme configuração
  3. Por fim, verifica se o texto existe na tabela e campo informado
  4. Se houver, apresente um resultset completo com o nome da tabela, o dado, o tipo do campo e tamanho
  5. A query foi testada no SQL Server 2000 e 2005, funcionando perfeitamente e ambos o casos.

É importante notar que não foram colocadas aqui considerações de desempenho ou o uso do recurso fulltext, sendo o objetivo principal resolver o problema de encontrar o texto desejado.

Bom proveito!