| Últimas 20 atualizações de RUBENS ANTUNES |
|
|
Vamos aprender como criar um campo auto incremento no firebird, ele não possui um campo auto incremento nativo, mas através de generator e trigger podemos montar. Eu criei uma tabela que nos servirá de exemplo essa tabela terá os seguintes campos Tabela Cliente
...
Exibição do post interrompida. Para ler conteúdo completo, clique aqui
|
|
|
|
Neste artigo estarei demonstrando
como se fazer pesquisa no Delphi usando o componente ClientDataSet, eu criei um
banco de dados e uma tabela chamada Pessoa que nos servirá de demonstração.
Tabela Pessoa
...
Exibição do post interrompida. Para ler conteúdo completo, clique aqui
|
|
|
|
Precisamos localizar quando um cliente foi cadastrado, para isso iremos aprender como pesquisar por campo Date. Na nossa aplicação exemplo temos um banco de dados com a tabela Pessoa contendo os seguintes campos: TABELA PESSOA
...
Exibição do post interrompida. Para ler conteúdo completo, clique aqui
|
|
|
|
Vamos desenvolver uma pesquisa o qual não sabemos o campo que o usuário irá escolher, ou seja, ele poderá escolher o campo nome, endereço ou outro. Temos a seguinte tabela dentro do banco de dados Pesquisa: Tabela Pessoa
...
Exibição do post interrompida. Para ler conteúdo completo, clique aqui
|
|
|
|
Vamos falar agora de índices persistentes, eles são criados em memória e podem ser reutilizados, e nos possibilita ordenar em ordem crescente e decrescente em tempo de execução do projeto.
Iremos juntar tudo o que aprendemos para criarmos um método para ordenar os registros em ordem crescente e decrescente;
A Idéia é o usuário clicar na coluna desejada e ele ordenar em ordem crescente e quando clicar novamente ele ordenar em ordem decrescente a mesma coluna. Vamos a prática.
No evento OnTitleClick do DbGrid coloque o seguinte código:
1
procedure TfrmPrincipal.dbgPessoaTitleClick(Column: TColumn);
2 var
3 vName:String;
4 Opcao:TIndexOptions;
5 begin
6 if cdsPessoa.IndexName = Column.FieldName +
'_ASC' then
8 begin
9 vName:=
Column.FieldName + '_DESC';
10 Opcao:=
[ixDescending];
11 end
12
...
Exibição do post interrompida. Para ler conteúdo completo, clique aqui
|
|
|
|
Mas
o que é Índice? Imagine um livro sem um índice, demoraríamos muito tempo para
encontrar o assunto que desejamos. O índice serve para mostrar, indicar ou
revelar algo, é uma lista de elementos dentro de uma determinada ordem. No
Delphi nós podemos criar Índices em ordem Crescente e Decrescente, nos
possibilitando encontrar mais facilmente os registros em nossos componentes de
visualização de dados como o DbGrid.
Existe dois tipos de índices, o temporário e o
persistente. O índice temporário é feito em memória assim como o persistente, a
diferença que o temporário eu não posso reutilizá-lo já o persistente eu posso
reutilizá-lo, ele nos permite ordenar em ordem crescente e decrescente.
Nesse
artigo iremos conhecer como trabalhar com índice utilizando as propriedades
IndexDefs e IndexFieldNames do ClientDataSet.
Crie um Banco de dados e uma
tabela com os seguintes campos e preencha:
...
Exibição do post interrompida. Para ler conteúdo completo, clique aqui
|
|
|
|
A partir de agora
iremos criar índice em tempo de projeto, iremos definir o índice em run-time,
ou seja, em tempo de execução do projeto.
Selecione o
Formulário e no evento OnCreate coloque
o seguinte código:
procedure TfrmPrincipal.FormCreate(Sender: TObject);
begin
cdsPessoa.Open;
cdsPessoa.IndexFieldNames:='nome';
end;
A propriedade
IndexFiledNames recebe uma string, aqui estamos passando o nome do campo que
queremos ordenar, podemos também ordenar por qualquer outro campo da sua
tabela, basta separá-los por ponto e vírgua (;).
Após o campo
Nome, coloque o campo salario e execute a aplicação e perceba como ficou a
ordenação dos campos.
procedure TfrmPrincipal.FormCreate(Sender:
TObject);
begin
cdsPessoa.Open;
cdsPessoa.IndexFieldNames:='Nome; Salario';
end;
A propriedade IndexFiledNames
toma como primeira referência para montar o índice o campo nome e depois o
campo salario.
Mas e se
quiséssemos clicar em determinada coluna do DbGrid e ele ordenar por ela. Para
isso iremos utilizar o evento OnTitleClick do DbGrid, coloque o seguinte código
nesse evento:
...
Exibição do post interrompida. Para ler conteúdo completo, clique aqui
|
|
|
|
A utilização de índice nos
permite pesquisarmos um registro em memória sem precisarmos ir ao banco de
dados dando um select, podemos utilizar alguns métodos do ClientDataSet como o
FindKey e FindNearest.
FindKey: Ele faz uma busca precisa em memória trazendo o registro
que contenha a expressão utilizada pelo usuário, ou seja, se você deseja buscar
por nome, você terá que digitar exatamente como está descrito no ClientDataSet,
ou seja, se você quer o João Carlos, terá que digitar João Carlos, não basta
digitar só João.
Coloque em nosso formulário um
Edit e mude a propriedade name para edtLocaliar e no evento OnKeyUP do mesmo
coloque o seguinte código:
procedure TfrmPrincipal.edtLocalizarKeyUp(Sender:
TObject; var Key: Word; Shift: TShiftState);
begin
cdsPessoa.IndexFieldNames:='id';
cdsPessoa.FindKey([edtLocalizar.Text]);
end;
Para utilizarmos o método FindKey
temos que ter um índice definido, aqui criamos um índice com o campo id e
pedimos para o método FindKey localizar nesse índice o registro o qual passamos
a instrução no Edit para localizá-lo.
FindNearest: Esse método posicionará o cursor no nome mais próximo
ao digitado pelo o usuário ou exatamente como o usuário digitou, um fato
importante é que ele assim como o FindKey,
posiciona o cursor no registro, eles não nos retorna uma lista
aproximada.
procedure TfrmPrincipal.edtLocalizarKeyUp(Sender:
TObject; var Key: Word; Shift: TShiftState);
begin
cdsPessoa.IndexFieldNames:='nome';
cdsPessoa.FindNearest([edtLocalizar.Text]);
end;
Assim como o método FindKey o método
FindNearest precisa também de índice para poder varrer esse índice a diferença
que ele procura o registro que está mais próximo do que foi digitado no Edit.
...
Exibição do post interrompida. Para ler conteúdo completo, clique aqui
|
|
|
|
Será que toda vez que precisarmos
ordenar um ClientDataSet, teremos que colocar esse código todo no evento
OnTitleClick, claro que não, para isso podemos utilizar uma Unit para guardar o
nosso código e ser utilizado em qualquer parte do nosso projeto. Vamos a
prática, Crie uma Unit clicando em File/New/Unit
Delphi, a unit é muito comum em Orientação a objeto. Ela nos permite criar
classes é métodos entre outras funcionalidades. Salve-a como Uordenar e Coloque
o seguinte código:
1 unit Uordenar;
2 interface
3 Uses DBClient, DBGrids, Graphics, DB;
4 type
5 TOrdenar = Class
6 public
7 class procedure orderna(var cds :
TClientDataSet;var dbg : TDBGrid;column : TColumn);
8 end;
9 implementation
Tecle Ctrl+Shift+C para implementarmos
a classe, podemos perceber que o Delphi
criou essa classe logo mais abaixo, coloque o seguinte código:
{ TOrdenar }
10 class procedure
TOrdenar.orderna(var cds: TClientDataSet; var dbg: TDBGrid;
11 column: TColumn);
12 var
13 vName:String;
14
Opcao:TIndexOptions;
15 begin
16 if cds.IndexName = Column.FieldName + '_ASC'
then
17 begin
18 vName:= Column.FieldName + '_DESC';
19 Opcao:= [ixDescending];
20 end
21 else
22 begin
23 vName:= Column.FieldName + '_ASC';
24 Opcao:= [];
25 end;
26 if cds.IndexDefs.IndexOf(vName) < 0 then
27 begin
28 cds.AddIndex(vName,Column.FieldName,
Opcao);
29 cds.IndexName:=vName;
30 cds.First;
31 end;
end;
...
Exibição do post interrompida. Para ler conteúdo completo, clique aqui
|
|
|
|
Introdução ao Sql
Subqueries
Neste
artigo irei demonstrar como utilizar uma busca dentro de outra busca. Esse é um
recurso avançado e extremamente útil do comando SELECT. Na prática, será
colocado um SELECT dentro de outro. Isso quer dizer que serão colocados vários
SELECTs internos. Subqueries faz parte do padrão SQL-86, logo todos os bancos
de dados relacionados que utilizam SQL devem permitir essa utilização.
Vamos criar algumas tabelas que
nos servirá de exemplo:
Tabela Gravadora
...
Exibição do post interrompida. Para ler conteúdo completo, clique aqui
|
|
|
|
Introdução ao Sql
Subquery de múltiplas linhas
Neste
artigo, demonstrarei como trabalhar com subquery de múltiplas linhas. Neste
caso, o SELECT interno retorna mais de uma linha. Não se pode utilizar
operadores simples como igualdade, diferença, maior ou menor. Deve-se utilizar
um operador de grupo para realizar a comparação. Esses operadores são ANY, ALL
e IN.
IN
Imagine que
gostaríamos de saber quais CDs têm o preço igual ao menor preço de cada
gravadora. Inicialmente devemos saber qual o menor preço de cada gravadora.
Isso pode ser feito com o comando:
Select min(preço_venda) from CD
Group by Codigo_gravadora
Para saber quais são os CDs com esses preço, poderíamos
escrever o seguinte comando:
Select código_cd, nome_cd, preço_venda from cd
Where preco_venda in (15,9,10.5)
Para fazer isso tudo em um único comando, escrevemos o
comando da seguinte forma:
select codigo_cd, nome_cd, preco_venda from cd
where preco_venda in (select min(preco_venda) from cd
group by codigo_gravadora)
|
Código_CD
|
Nome_CD
|
Preço_Venda
|
...
Exibição do post interrompida. Para ler conteúdo completo, clique aqui
|
|
|
|
Introdução ao Sql
Subquery de múltiplas colunas
Alguns
bancos de dados permitem realizar a busca em múltiplas colunas utilizando uma
subquery.
A primeira
técnica consiste em colocar as colunas unidas na cláusula WHERE do SELECT
externo e realizar a busca no SELECT interno dessas colunas unidas da mesma
forma. Essa técnica tende a ser muito lenta, mas pode ser feita em qualquer
banco de dados.
Temos
vários CDs indicados no cadastro e queremos conhecer os dados do CD dentre os
menores CDs indicados de cada gravadora. Para isso, temos que saber o menor CD
indicado de cada gravadora. Observe que tivemos que unir as duas colunas com ||
.
select codigo_gravadora || min(cd_indicado) from cd
group by codigo_gravadora
Agora devemos realizar a busca dos dados dos CDs que atendem
a essa característica:
select codigo_cd, nome_cd, codigo_gravadora, cd_indicado
from cd
where codigo_gravadora || cd_indicado in (15,21,31)
Note como a combinação das colunas CODIGO_GRAVADORA e
CD_INDICADO é a mesma do comando SELECT anterior. Agora veremos tudo num único
comando:
select codigo_cd, nome_cd, codigo_gravadora, cd_indicado
from cd
where codigo_gravadora || cd_indicado in
(select codigo_gravadora || min(cd_indicado) from cd
group by codigo_gravadora)
...
Exibição do post interrompida. Para ler conteúdo completo, clique aqui
|
|
|
|
Introdução SQL
Pesquisa avançada
Já
vimos muitas formas de pesquisa em tabelas. Agora vamos analisar algumas formas
que permitem trabalhar com vários comandos SELECT. Serão criados conjuntos que
poderão ser unidos e separados da mesma forma como trabalhamos com os conjuntos
na matemática.
UNION
A união entre
tabelas cria uma saída com todas as linhas de uma tabela unida com as linhas da
outra tabela. Diferentemente da união regular entre tabelas, aqui as linhas não
são combinadas às linhas da outra tabela. As linhas da segunda tabela são
colocadas em seqüência às linhas da primeira tabela.
É
necessário que haja uma compatibilidade entre as colunas. Na prática, isso quer
dizer que as colunas devem ser do mesmo tipo e estar na mesma seqüência para
que se possa unir as duas tabelas. Mesmo que o conteúdo das tabelas não seja
coerente, a união entre as tabelas autores e músicas é possível porque as
colunas têm o mesmo tipo de dado e tamanho.
É
importante que as colunas estejam na mesma seqüência, com o mesmo tipo de dados
nos dois SELECTs, do contrário o comando não funcionará. Veja que não é
necessário que as colunas tenham o mesmo nome, uma vez que apenas o tipo de
dado e o tamanho são comparados e, normalmente, quando é feita essa união,
trabalha-se com tabelas diferentes. Veja o exemplo:
select codigo_autor, nome_autor
from autor
where codigo_autor < 10
union
select codigo_musica, nome_musica
from musica
where codigo_musica < 15
...
Exibição do post interrompida. Para ler conteúdo completo, clique aqui
|
|
|
|
Introdução ao SQL
Case
Expressões CASE
O padrão SQL prevê a
possibilidade de utilizar a expressão CASE, presente em diversas linguagens de
programação. Utilizando essa cláusula é possível criar complexas estruturas de
controle tanto nas diversas linguagens de programação como nos comandos SQL. Ao
ser utilizada a cláusula CASE em comandos SQL é possível economizar diversas
linhas de código, pois não é necessário criar blocos de programação para testar
condições.
A expressão
CASE será testada em tempo de execução do comando SELECT ou UPDATE. Como o CASE
faz parte de outro comando, será possível colocá-lo em qualquer situação em que
um valor deva ser testado.
Veja que em
linguagens de programação usuais a expressão CASE, que é autônoma, não tem a
mesma forma de avaliação e executará um bloco de instruções. Dessa forma, um
único comando testará diversas linhas retornando, em cada linha, o comando
correspondente à linha analisada.
SELECT
É possível utilizar o comando
SELECT prevendo diversas condições para extração dos dados. A sintaxe é a
seguinte:
SELECT colunas,
CASE
WHEN
condição THEN ação
...
[ELSE
condição padrão]
END
FROM
tabela;
Como
exemplo, podemos imaginar uma situação em que desejamos dar um desconto sobre o
preço de venda CDs em função do preço. Quanto maior o preço de venda, maior o
desconto. Veja:
select nome_cd, preco_venda,
case
when preco_venda < 10 then
preco_venda * 0.9
when preco_venda >=10 and
preco_venda < 13 then
preco_venda *
.8
else
preco_venda *
.7
end venda
from cd
|
Nome_CD
|
Preço_Venda
|
Venda
|
...
Exibição do post interrompida. Para ler conteúdo completo, clique aqui
|
|
|
|
Uma característica muito importante do SQL é o poder de
agrupar linhas com base em valores de determinadas colunas. Dessa forma, não
estaremos trabalhando na pesquisa em todas as linhas da tabela, como fizemos
anteriormente, mas sim em grupos menores. Para isso, utilizamos as funções de
grupo já mostradas, com a cláusula GRUPO BY no comando SELECT. A cláusula GRUPO
BY deve vir antes da cláusula ORDER BY e depois do WHERE (se houver necessidade de utilizá-los).
Como
exemplo, podemos querer saber quantos pedidos foram vendidos, para isso iremos
fazer a busca na tabela pedido e agrupar por CODVENDA:
SELECT CODVENDA, COUNT(*) FROM PEDIDO
GRUPO BY CODVENDA;
Para
sabermos quanto um determinado cliente nos comprou, precisamos agrupar por
CODCLIENTE, veja como fica essa
instrução:
SELECT CODCLIENTE, SUM(TOTALPEDIDO) FROM PEDIDO
GROUP BY CODCLIENTE;
Podemos realizar mais de uma função de grupo dentro de um
mesmo SELECT. Aqui, além da média do preço de venda, temos a quantidade de
registros da tabela PEDIDO.
SELECT
CODVENDA, AVG(PRECOVENDA), COUNT(*) FROM PEDIDO
GROUP BY
CODVENDA;
Agrupamento com mais
de uma tabela
Podemos unir mais de uma tabela
seguindo as mesmas regras vistas anteriormente, veja o exemplo a seguir:
SELECT PEDIDO.CODVENDA, PEDIDO.CODCLIENTE, CLIENTE.NOME,
SUM(TOTALPEDIDO) FROM PEDIDO, CLIENTE
WHERE PEDIDO.CODCLIENTE = CLIENTE.CODCLIENTE
GROUP BY PEDIDO.CODVENDA, PEDIDO.CODCLIENTE, CLIENTE.NOME;
Obs.: Devemos
colocar todas as colunas que fazem parte do comando SELECT na cláusula GROUP
BY, exceto, naturalmente, a função de grupo. Adote isso como regra para evitar
problemas com o comando. Não é obrigatóri
...
Exibição do post interrompida. Para ler conteúdo completo, clique aqui
|
|
|
|
Funções de grupo operam conjuntos de linhas visando a
fornecer um resultado para o grupo. Até agora trabalhamos apenas com funções
que tratavam apenas uma linha de cada vez. A diferença básica é que serão
utilizados grupos de linhas. Esses grupos podem ser constituídos desde toda a
tabela até subgrupos da tabela.
Funções de grupo
Existem diversas funções de
grupo que são implementadas pelo padrão SQL. Essas funções auxiliam a computar
uma variedade de medidas baseadas em valores das colunas do banco de dados. As
principais funções de grupo são:
...
Exibição do post interrompida. Para ler conteúdo completo, clique aqui
|
|
|
|
Até agora vimos como realizar
pesquisas em uma única tabela. Contudo, na montagem do nosso modelo de dados
sempre temos diversas tabelas. Logo é necessário sabermos como vincular a
informação dessas tabelas de forma a mostrar a informação de maneira correta. A
isto é dado o nome de união de tabelas (join).
Como
visto anteriormente, a união entre as entidades do nosso modelo lógico se dá
por meio de chaves primárias e estrangeiras. Essas chaves são, na representação
física do modelo, as colunas que as tabelas têm em comum. No decorrer
apresentarei as diversas formas de unir colunas e como implementá-las em SQL.
União de tabelas
Para realizar a
união de tabelas, basta acrescentarmos após a cláusula FROM do comando SELECT
as tabelas que queremos unir. Devemos colocar na cláusula WHERE a condição de união das tabelas, ou seja, as
respectivas chaves primária e estrangeira. Sintaxe:
SELECT
Tabela1.coluna1,
Tabela1.coluna2,
Tabela2.coluna1,
Tabela2.coluna2
FROM Tabela1, Tabela2
WHERE Tabela1.chave_primaria =
Tabela2.chave_estrangeira
Note
que é opcional colocar a identificação da tabela antes do nome das colunas na
lista de campo do comando SELECT. Contudo, essa é uma prática recomendada para
facilitar o entendimento do comando.
Essa
regra só não é válida quando estivermos querendo mostrar uma coluna que tenha o
mesmo nome em amb
...
Exibição do post interrompida. Para ler conteúdo completo, clique aqui
|
|
|
|
Quando criamos colunas com tipo
de dado Data, podemos realizar uma série de cálculos e operações cronológicas.
Podemos calcular o número de dias entre duas datas, somar e subtrair dias,
meses e etc.
O padrão
SQL especifica quatro tipos de dados relacionados a data e hora:
...
Exibição do post interrompida. Para ler conteúdo completo, clique aqui
|
|
|
|
Podemos
fazer cálculos quando realizamos buscas no banco de dados, simplesmente
aplicando um dos operadores aritméticos a colunas. Dessa forma, mesmo não tendo
armazenado o valor total (preço unitário multiplicado pela quantidade) em um
item de pedido, é possível realizar este cálculo. Como exemplo, será verificado
o preço de um determinado produto e aumentará em 5%. Veja abaixo como fica essa
instrução SQL.
SELECT CODIGO, NONME, PRECO,
PRECO * 1.05 FROM TABELA;
|
CODIGO
|
NOME
|
PRECO
|
PRECO
* 1.05
|
...
Exibição do post interrompida. Para ler conteúdo completo, clique aqui
|
|
|
|
Introdução ao Sql Parte XIII
Operadores Especiais Parte 2
(LIKE e IN)
LIKE
Com este operador, podemos
comparar cadeias de caracteres utilizando padrões de comparação (wildcard) para umou mais caracteres.
Normalmente, o caracter percentual (%) substitui zero, um ou mais caracteres e
sublinha (_) substitui um caractere.
Utilizando
a combinação desses caracteres especiais com o que se quer localizar, pode-se
conseguir uma variedade muito grande de expressões. Veja na tabela a seguir
algumas possíveis combinações:
...
Exibição do post interrompida. Para ler conteúdo completo, clique aqui
|
|
|
| |
|