quarta-feira, janeiro 30, 2008

Habilitando e desabilitando Triggers no SQL Server via T-SQL

Essa é uma "diquinha" bem simples, de um recurso que nem todos que lidam com o SQL Server conhecem. Através do Transact SQL (T-SQL) é possível habilitar e desabilitar triggers, sem a necessidade de excluí-las ou comentá-las (como a maiores do pessoal faz). A sintaxe é bem simples:

alter table nome_tabela
[disable, enable] trigger nome_trigger


Exemplo

Suponha que se tenha a tabela tab_venda, e nela uma trigger chamada trg_atualiza_limite_cliente. Para desabilitar essa trigger, a linha SQL ficaria como a seguir:


alter tabl
e
tab_venda

disable trigger trg_atualiza_limite_cliente


Para habiltá-la novamente, substitua disable por enable. Simples não?

Até +

sábado, janeiro 26, 2008

Exportando tabelas do MS Access para Excel ou HTML usando ADO

Salve pessoal,

Um recurso bem interessante porém pouco conhecido sobre o ADO, é que ele permite através do JET (mecanismo usado para acessar bancos de dados Access) a possibilidade de exportação direta para planilhas do Excel (XLS) e arquivos HTML. Pensando nisso, revolvi postar um exemplo de como se fazer isso em Delphi, vamos lá!

Primeiramente, criamos um formulário com os elementos mostrados abaixo:

Temos aí:
  • 3 Tbitbtn: btnAbrir, btnExportaXLS e btnExportaHTM;
  • 1 TListbox: listTabelas, que seá usado para exibir as tabelas presentes no database;
  • 1 TADOConnection: conAccess, responsável por estabelecer a conexão com o database;
  • 1 TOpenDialog: openDialog, que será usado para selecionar o banco de dados a ser usado;

Codificação

Declare uma função na sessão private da unit, com o seguinte header:

function TabelasADO(ADOConnection: TADOConnection):TStringList;

Seu corpo deve ficar como abaixo:

function TfrmExemplo.TabelasADO(ADOConnection: TADOConnection): TStringList;
var ADODataSet: TADODataSet; Tabelas: TStringList;
begin
Tabelas := TStringList.Create;
ADODataSet := TADODataSet.Create(nil);
ADODataSet.Connection := ADOConnection;
ADOConnection.OpenSchema(siTables, EmptyParam, EmptyParam, ADODataSet);

//Filtra somente as tabelas
ADODataSet.Filter := adicionaFiltro(ADODataSet.Filter, '(TABLE_TYPE = ''TABLE'')');
ADODataSet.Filtered := True;

with ADODataSet do
begin
First;
while not EOF do
begin
Tabelas.Add(FieldByName('TABLE_NAME').AsString);
Next;
end;
end;

ADODataSet.Free;
Result := Tabelas;
end;

Precisaremos também de outra função:
function adicionaFiltro(string1, string2: string): string;
Com o código listado abaixo:
function TfrmExemplo.adicionaFiltro(string1, string2: string): string;
begin
if string1 <> '' then
Result := string1 + ' or ' + string2
else
Result := string2;
end;

O evento onClick do botão btnAbrir fica como a seguir:

procedure TfrmExemplo.btnAbrirClick(Sender: TObject);
var stringConexao: string;
begin
stringConexao := EmptyStr;

if openDialog.Execute then
begin
stringConexao := Format('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;Persist Security Info=False',[openDialog.FileName]);
conAccess.ConnectionString := stringConexao;
conAccess.Connected := True;
listTabelas.Items := TabelasADO(conAccess);
end;
end
;

Por fim, o evento onClick do botão btnExportaXLS, que também é compartilhado com o botão btnExportaHTM, reaproveitando código:

procedure TfrmExemplo.btnExportaXLSClick(Sender: TObject);
var nomeTabela, instrucaoSQL: string;
begin

nomeTabela := listTabelas.Items[listTabelas.ItemIndex];

if Sender = btnExportaXLS then
instrucaoSQL := 'select * into ' + nomeTabela + ' in "c:\doctemp\' + nomeTabela + 'FromAccess.xls" "Excel 8.0;" from ' + nomeTabela
else
instrucaoSQL := 'select * into [' + nomeTabela + '.htm] in "c:\doctemp" "HTML Export;" from ' + nomeTabela;

try
conAccess.Execute(instrucaoSQL);
MessageDlg('A tabela ' + nomeTabela + 'foi exportada com sucesso para o formato selecionado!', mtInformation, [mbOk], 0);
except
MessageDlg('Não foi possível exportar a tabela "' + nomeTabela + '"', mtError, [mbOK], 0);
end;

end;

Algumas consideração a fazer: meu formulário se chama frmExemplo; eu possuo uma pasta chamada "doctemp" em minha máquina, que é para onde eu exporto meus arquivos, uso isso no código e é provável que precisem modificar isso.

Bem, quem estiver precisando, pode fazer o teste e, em caso de dúvidas sobre algum trecho do código, é só comentar.

Abraços e até a próxima.

quarta-feira, janeiro 23, 2008

Comentários

Quando iniciei este blog nunca tive a pretenção de torná-lo um "hit" na blogosfera, e por isso mesmo estou surpreso com o número de acessos que ele tem tido nos últimos meses. Uma de minhas preocupações sempre foi a de publicar tópicos para os quais eu não encontrava nada relacionado na net, afinal, tem alguns assuntos que já são "arroz de festa", ou seja, e vê em tudo o que é site, e ficar falando sobre eles é no mínimo redundante. Parece que a receita deu certo, já que os tópicos aqui publicados estão sendo bastante acessados.

Para se ter uma idéia mais precisa sobre o público que visita o blog, gostaria de pedir um favor a todos que se utilizarem dos tópicos aqui relacionados: comentários! Isso mesmo, comentários!

Sempre que fizerem uma visita, deixem um comentário, com o nome, o que faz e o que achou do tópico, assim posso direcionar, aumentar e melhorar o nível das postagens.

Desde já um abraço a todos e obrigado pela visita, voltem sempre!