Buscar

modulo1b_delphi_aplicado

Prévia do material em texto

Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 102
Identificadores
Identificadores podem ser constantes, tipos, variáveis, procedures, funções, unidades, programas e campos
de registros.
Não existe limite de caracteres para o nome de um identificador mas apenas os 63 primeiros caracteres são
significantes (não podendo ser idêntico ao nome das palavras reservadas). O nome de um identificador deve
ser iniciado por Letras ou o carácter underscore ( _ ). O resto é formado por Letras, Dígitos, carácter
underscore (ASCII $5F). Não é permitido a utilização de espaços para a formação do nome.
+ Exemplo de identificadores válidos: Form1, SysUtils.StrLen, Label1.Caption
 With ... do...
Delimita um determinado bloco de declarações para um identificador específico evitando a declaração deste
identificador. A sintaxe do comando é: WITH {nome do identificador} DO {comandos};. Ex:
 Array [ ... ] of ...
Define um conjunto de variáveis ou constantes de um mesmo tipo. A sintaxe do comando é: array
[{quantidade de ocorrencias}] of {Tipo};. Os arrays são controlados por três funções:
Função Valor de Retorno
Low Primeiro elemento
High Aponta para o último elemento
SizeOf Tamanho do array
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 103
 Begin ... end;
Prende um conjunto de declarações em um bloco de comandos determinado. A sintaxe do comando é:
BEGIN {comandos} END;.
 If ... then ... else ...
Esta expressão escolhe entre o resultado de uma condição booleana o caminho verdadeiro (then) ou falso
(else). A sintaxe do comando é: IF {condição} THEN {bloco de comandos} ELSE {bloco de comandos};.
 Goto ... ;
Transfere a execução de um programa para o ponto determinado pelo Label. A sintaxe do comando é:
GOTO {Label};. Ex:
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 104
 Case ... of ... else ... end;
Consiste de uma lista de declarações que satisfaz a condição de um seletor de expressões, se nenhuma parte
da lista satisfazer ao seletor executa os comandos do sub-comando else. Para o seletor serão válidos os tipos
definidos, tipo Inteiros ou LongInt. A sintaxe do comando é:
Ex:
 Repeat ... until;
Repete um determinado bloco de declarações até a condição booleana do subcomando until ser satisfeita. A
sintaxe do comando é: REPEAT {comandos}; until {condição};. Ex:
 For ... to (downto) ... do ... ;
Incrementa em 1 uma determinada variável inteira, repetindo um bloco de comandos, até que esta atinja o
valor final do intervalo, o subcomando downto realiza o incremento reverso. A sintaxe do comando é: FOR
{variavel} := {valor inicial} to (downto) {valor final} do {bloco de comandos};. Ex:
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 105
 While ... do ... ;
Repete um bloco de comandos enquanto que determinada condição booleana seja satisfeita. A sintaxe do comando é:
WHILE {condição} DO {bloco de comandos};. Ex:
 Break; ou continue...;
O comando break interrompe um bloco de repetição for, while ou repeat saindo do bloco. A sintaxe do
comando é: BREAK; enquanto que o comando continue retorna a primeira instrução do bloco de repetição
for, while ou repeat. A sintaxe do comando é: CONTINUE;. Ex:
R Animando formulário
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 106
R Como depurar ( encontrar ) possíveis erros no programa ?
O que é depurar ? É como “passar um pente fino” no programa, e verificar erros que podem ser de lógica e
que podem afetar o perfeito funcionamento de um sistema. Tecnicamente conhecido como “Debug”, as
opções existentes no Delphi e são de extrema importância para a verificação de erros em um sistema.
A mais comum é a marcação de Breakpoints, que são locais dentro do programa que, quando executados
paralisam o funcionamento do programa, e permite a visualização de uma variável, por exemplo.
Para marcar uma linha, clique no lado esquerdo ( no editor de código do Delphi ), pressione a tecla de
função F5, após pressione F9 para rodar o programa, no exemplo abaixo foi digitado no campo1 ( edit1 ) o
número 10 e no campo2 ( edit2 ) o número 20, quando chegar neste ponto ( break point = quebra de ponto
), o ponteiro posicionará na linha em vermelho, posicione o mouse sobre a variável vl1 e será mostrado o
conteúdo, aqui o valor 10.
R Depurando erros com Watch List
É uma maneira para visualizar o conteúdo de variáveis quando estiver desenvolvendo seu projeto, tornando
trabalho mais dinâmico.
Posicione o ponteiro do mouse sobre
a variável vl1 para visualizar o
conteúdo da variável.
Posicione o ponteiro do mouse
sobre a variável vl2 para ver o
conteúdo da variável.
Posicione na linha que
deseja fazer o BreakPoint e
pressione F5, após prossiga
pressionando F7, F7 etc
para continuar com a
depuração
Œ Digite o código abaixo
no evento OnClick do
botão BitBtn.
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 107
 Na barra de titulos clique em View – Debug Windows – Watches ( Ctrl – Alt – W ), será aberta uma
pequena tela onde serão postas as variáveis para visualizar seus conteudos.
Ž Marque a variável Valor1, clique no botão direito, clique na opção Debug, clique em Add Watch at
cursor ( ou pressione Ctrl F5 para adicionar a variável na caixa Watch List ). Adicione as 3 variaveis na
lista.
 Para iniciar a depuração pressione F7, continue pressionando F7, observe que o cursor esta passando
linha por linha ate chegar o botão ( Bitbtn ) onde contem as variáveis que definimos no início do programa,
clique nele, prossiga pressionando F7, observe abaixo a lista ( Watch List ). Veja na tela abaixo, no lado
esquerdo da imagem abaixo, as variaveis Valor1, 2 e 3 com o conteudo de suas variáveis.
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 108
R Como alinhar botões ?
No primeiro exemplo alinharemos os botões na vertical.
Alinhamento horizontal
Selecione todos os botões. Para
selecionar mantenha pressionada a
tecla CTRL , arraste o mouse
formando um retângulo sobre todos
os botões. Quando os botões estão
selecionados são mostrados
pontinhos em seus cantos
indicando a seleção dos mesmos.
Após clicar na opção Align será
aberta outra tela. Estamos
querendo alinhar todos os botões
para esquerda e que tenham o
mesmo espaço na vertical.
Observe na caixa as opções
marcadas.
Veja resultado, todos os botões
foram alinhados para esquerda e
com um espaçamento vertical igual.
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 109
Resultado do alinhamento do botões
R Como definir tamanho / altura para todos os botões ?
Selecione todos os botões fazendo um retângulo em volta destes, clique no botão direito, será mostrado um
menu de atalho com opções para fazer esta operação – veja abaixo – Position – Size
No gráfico da página anterior, selecionei a opção Size para definir um tamanho para todos os botões
selecionados. Pode-se definir a largura do botão, comprimento, diminuir de acordo com o tamanho do menor
botão possível etc.
R Abrindo link
Insira um component Label ( aba Standard ), dê um clique duplo sobre Label1 e digite o código abaixo:
No início do programa na linha Uses digite ShellApi.
Veja os diferentes
tamanhos dos botões
Agora todos os
botões estão com
o tamanho de
80 caracteres de
largura.
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 110
R Como programar teclas de função Ÿ F1, F2, F3 ... ?
Programando as teclas de funções (F1...F12 e Escape, Home etc). Cliquei na proprieade KeyPreview e
defina o valor para True
R Atalho ao pressionar Ctrl A
Clique no formulário, selecione a propriedade KeyPreview e defina o valor para True
R Toca arquivo de som
Quando teclar na tecla F1 será mostrada esta caixa de
mensagem.
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 111
R Como programar letras, números, teclas de função ?Vamos programar algumas letras.
procedure TFrm_Alunos.EditCepKeyPress(Sender: TObject; var Key: Char);
begin
end;
// Serão aceitos os números de ( 1 ate 8 ) e se for pressionado no numero NOVE
// será inserido o número 1 UM ( #49 )
R Como por zeros no lado esquerdo de um número ?
R Como forçar abertura do formulário maximizado ?
No evento OnShow digite o código abaixo:
Código
foi
digitado
no evento
OnKey
Press do
campo
Nome.
Quando o cursor
no campo nome e
for digitado a
letra “e” ou “E”
será mostrada a
caixa de
mensagem.
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 112
R Códigos do teclado em hexadecimal
 vk_LButton = $01;
 vk_RButton = $02;
 vk_Cancel = $03;
 vk_MButton = $04;
 vk_Back = $08;
 vk_Tab = $09;
 vk_Clear = $0C;
 vk_Return = $0D;
 vk_Shift = $10;
 vk_Control = $11;
 vk_Menu = $12;
 vk_Pause = $13;
 vk_Capital = $14;
 vk_Escape = $1B;
 vk_Space = $20;
 vk_Prior = $21;
 vk_Next = $22;
 vk_End = $23;
 vk_Home = $24;
 vk_Left = $25;
 vk_Up = $26;
 vk_Right = $27;
 vk_Down = $28;
 vk_Select = $29;
 vk_Print = $2A;
 vk_Execute = $2B;
 vk_SnapShot = $2C;
 vk_Insert = $2D;
 vk_Delete = $2E;
 vk_Help = $2F;
 vk_A até vk_Z = tem os mesmos valores ASCII: 'A' até 'Z'
 vk_0 até vk_9 = tem os mesmos valores ASCII: '0' até '9'
 vk_NumPad0 = $60; // Blocos de números (lado direito do teclado)
 vk_NumPad1 = $61;
 vk_NumPad2 = $62;
 vk_NumPad3 = $63;
 vk_NumPad4 = $64;
 vk_NumPad5 = $65;
 vk_NumPad6 = $66;
 vk_NumPad7 = $67;
 vk_NumPad8 = $68;
 vk_NumPad9 = $69;
 vk_Multiply = $6A; // multiplicação
 vk_Add = $6B; // adição vk_Separator = $6C; // separador
 vk_Subtract = $6D; // subtração vk_Decimal = $6E; // decimal
 vk_NumLock = $90;
 vk_Scroll = $91;
vk_F1 = $70; ( tecla F1 )
 vk_F2 = $71; ( tecla F2 )
 vk_F3 = $72; ( tecla F3 )
 vk_F4 = $73; ( tecla F4 )
 vk_F5 = $74;
 vk_F6 = $75;
 vk_F7 = $76;
 vk_F8 = $77;
 vk_F9 = $78;
 vk_F10 = $79;
 vk_F11 = $7A;
 vk_F12 = $7B;
 vk_F13 = $7C;
 vk_F14 = $7D;
 vk_F15 = $7E;
 vk_F16 = $7F;
 vk_F17 = $80;
 vk_F18 = $81;
 vk_F19 = $82;
 vk_F20 = $83;
 vk_F21 = $84;
 vk_F22 = $85;
 vk_F23 = $86;
 vk_F24 = $87;
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 113
R Quais são as propriedades do navegador de dados ?
Este componente permite ao usuário navegar pelos registros da tabela, incluir registros, consultar, apagar etc.
Exemplo: No evento OnClick digite: Clientes_TB.Post ( grava registro corrente na tabela de Clientes )
Propriedades do
TBNavigator.
Posiciona no primeiro registro. ( linha de código = Nome_Tabela.First; )
Posiciona no registro anterior. ( linha de código = Nome_Tabela.Prior; )
Posiciona no próximo registro. ( linha de comando = Nome_Tabela.Next; )
Posiciona no último registro. ( linha de comando = Nome_Tabela.Last; )
Insere um novo registro. ( linha de comando = Nome_Tabela.Insert; )
Apaga o registro. ( linha de comando = Nome_Tabela.Delete; )
Altera o registro. ( linha de comando = Nome_Tabela.Edit; )
Grava o registro corrente. ( linha de comando = Nome_Tabela.Post; )
Atualiza registro corrente. ( linha de comando = Nome_Tabela.Refresh; )
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 114
R Como definir ícones para o DBNavegator ?
Como padrão o Delphi mostra os ícones “simples” como é mostrada na primeira tela abaixo, podemos
definir outros ícones.
A tela abaixo mostra resultado de como fica após ter definido ícones para o DBNavigator
Digite o código abaixo como mostra para definir os ícones:
Digite o novo Type antes do
Type gerado pelo Delphi.
Note que há dois Type(s)
Botões padrão do
navegador de dados.
Definindo ícones
para o navegador.
O Delphi como padrão mostra
símbolos no navegador. Como
acho estes símbolos horríveis
mostrarei como substituí-los
por ícones J
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 115
Outra forma , usando evento OnShow
Os arquivos com a terminação .bmp
( arquivos de imagens ) devem estar na
pasta onde se encontra o projeto.
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 116
R Definindo “caption”, “descrição” para o navegador de dados
Parte inicial do programa:
Veja as
“descrições”
sobre os botões
do navegador.
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 117
R Programando os botões do navegador de registros
Conhecendo os valores e as propriedades dos botões do componente DBNavigator. Podemos programar cada
um destes botões. Dê um clique duplo no objeto DBNavigator e digite o código abaixo:
Button Valor Ação
First nbFirst Vai para o primeiro registro.
Prior nbPrior Vai para o registro anterior.
Next nbNext Vai para o próximo registro.
Last nbLast Vai para o último registro.
Insert nbInsert Insere um registro em branco.
Delete nbDelete Apaga o registro atual.
Edit nbEdit Permite editar o registro atual.
Post nbPost Grava o registro atual.
Cancel nbCancel Cancela a edição corrente.
Refresh nbRefresh Atualiza (refresca) os dados no Dataset.
Button é o botão do próximo
registro do Navigator. Quando
clicado, mostrará uma mensagem.
Este é o valor (value) do botão próximo
registro ( Next = nbNext ).
Veja a tabela os botões e seus valores.
Clique duplo no componente DBNavigator ,
no evento OnClick digite o código ao lado.
è Após clicado no botão “inserir” será focado
no campo “código” da tabela.
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 118
R Como criar botões para navegar nos registros da tabela ?
Œ Crie um novo formulário: New Form.
 Altere as propriedades: Caption: Consulta - Name: Consulta_Frm.
Ž Insira dois componentes: um Table e um DataSource.
 Clique no componente Table, defina propriedade DataBaseName para Madruga ( meu Alias ), role para
baixo e altere a propriedade Name de Table1 para Clientes_TB, clique em TableName e defina o nome
da tabela Clientes.db e defina a propriedade Active para True.
 Clique no componente DataSorce1 e defina propriedade DataSet para Clientes_TB e na propriedade
Name defina o nome Clientes_DS.
‘ Clique no componente Table1, agora nomeado para Clientes_TB, clique duplo em Clientes_TB, será
aberta uma pequena tela em branco, clique no botão direito, posicione o ponteiro do mouse sobre esta tela
em branco, clique em Add Fields, abrirá uma tela pequena mostrando todos os campos em azul, clique
OK, após os campos serão inseridos no componente Table ou Clientes_TB.
’ Arraste todos os campos do componente Clientes_TB para dentro do formulário, isto montará todos os
campos do formulário juntamente com o relacionamento dos campos na respectiva tabela.
Arraste todos os campos para
dentro do formulário, o
Delphi automaticamente
associará cada campo com a
tabela em uso.
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 119
“ Organize os campos de acordo com a tela abaixo:
” Insira um componente DBNavigator ( aba DataControls ), altere a propriedade DataSource para
Clientes_DS.
• Salve o arquivo com o nome de Consulta.pas
ŒŒ Vamos criar botões para navegar nos registros da tabela. Insira 7 ( sete ) componentes Bitbtn, defina a
propriedade Name do primeiro botão para Bit_Anterior , Name = Bit_Posterior, Name = Bit_Primeiro,
Name = Bit_Ultim... Clique no primeiro botão, na propriedade Glyph defina um ícone para o botão
selecionado, proceda desta maneira para os demais botões.Agora precisamos inserir o
componete DBNavigator para
navegar nos registros, adiante
faremos um navegador com
botões + íconesJ
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 120
Digite os respectivos códigos no evento OnClick de cada botão:
R Como calcular percentual em um “edit” ?
Fazendo cálculos com percentual. Usaremos as funções FormatFloat (formata valor em casas decimais),
StrToFloat (converte uma string/texto em ponto flutuante), FloatToString (converte ponto flutuante em
string/texto): Insira 4 Edit ( aba Standard ) Edit1, Edit2, Edit3 e Edit4 e um Bitbtn.
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 121
R Como converter textos para números ?
Uma Edit1 recebe texto então temos que usar conversores (IntToStr = Inteiro para texto ou StrToInt =
texto para inteiro etc ) para converter para número ou texto. Veja o exemplo a seguir:
Dê um clique duplo no botão Soma e no evento OnClick digite as linhas de código abaixo entre o Begin ...
End:
Explicando linhas do código:
Total1 := StrToInt(Edit1.Text);
Total1 Variável inteira.
:= Atribui o conteúdo do Edit1.Text para armazenar na variável do tipo inteira Total1.
StrToInt Converte texto para valor inteiro
Edit1.Text É um objeto texto.
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 122
R Como somar valor flutuante ?
R Como formatar um número em um “edit” ?
R Como “somar” e “dividir” ?
Após clicado nos
botões veja os
resultados.
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 123
R Como remover ponto decimal ?
R Como arredondar valor ? ( 1 )
R Como arredondar valor ? ( 2 )
Digite esta função.
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 124
R Como formatar “zeros” no lado esquerdo do número ?
R Como formatar valor ?
R Função “copy”
O número “1” indica posição inicial e
o quatro posição final. Note que a
palavra “você” tem quatro letras.
A palavra “você” tem quatro letras,
tem um espaço em branco que é o
quinto (caracter), a posição inicial é
sexta, que é a letra “e” da palavra
“está”.
Insira 3
componentes Edit
e um Bitbtin.
%.5d significa que no
total haverá cinco
números,
ou seja, 00020
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 125
R Função “pos”
Procura uma string na frase.
R Como aceitar somente “letras” em um “edit” ?
R Como fazer decisão composta ( variáveis ) ?
Digite o código abaixo no evento OnClick do botão Processar:
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 126
R Como usar “Case … of … else … end” ? ( 1 )
Consiste de uma lista de declarações que satizfaz a condição de um seletor de expressões, se nenhuma parte
da lista satisfizer ao seletor executa os comandos do sub-comando else. Para o seletor serão válidos os tipos
definidos, tipo Inteiros ou LongInt. A sintaxe do comando é:
Exemplo:
R Case … of … else … end ( 1 )
Œ Insira um MaskEdit ( aba Additional )  Insira um Bitbtn e no evento OnClick digite o código
abaixo:
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 127
R Case … of … else … end ( 2 )
Trabalhando com blocos de comandos. Para fazer o exemplo abaixo, insira um form, dois Edits e um Bitbtn.
R Case ... of ... else … end ( 3 )
Digete 11 e será mostrado o
mês por extenso.
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 128
R Atalhos importantíssimos do editor de códigos ( shortcuts )
Ctrl Shift I .................Desloca bloco de texto/código para direita.
Ctrl Shift U ................Desloca bloco de texto/código para esquerda.
Crtl K T .......................Marca uma palavra.
Ctrl K O .......................Converte bloco marcado para minúsculas.
Ctrl Y ..........................Apaga linha corrente.
Ctrl N .......................... Insere linha na posição do cursor.
Ctrl F9.........................Compila programa.
F9 ...............................Executa programa ( Run ).
Ctrl F2......................... Interrompe/resseta programa que esta rodando.
Ctrl Barra Espaço .......Chama tela de métodos.
Ctrl F12.......................... Abre lista de unidades.
Shift F12........................ Abre lista de formulários.
Ctrl Shift C..................Adicionana linhas para implementação.
Ctrl S...........................Salva projeto.
R Como usar componente “CheckBox” ?
Verifica se CheckBox ( caixinhas ) estão marcadas ou não.
Insira dois componentes que
estão na paleta Standard.
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 129
R Diferença de dias - DaysBetween
Na linha Uses inclua DateUtils
R Como usar “If ... else ... end” ?
Trabalhando com blocos de comandos.
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 130
R Como usar o operador “or” ? ( 1 )
Verifica o número digitado, aceitará o intervalo
de 1 até 12 , dependendo do mês escolhido será
mostrado o mês escrito no edit a seguir.
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 131
R Como usar o operador “or” ? ( 2 )
Verifica se foi digitado o texto Masculino ou Feminino.
R Diferença de anos - YearsBetween
R Como usar o operador “and” ?
Verifica se o número digitado é “maior ou igual a 20” “e” menor ou igual a 90.
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 132
R Com usar os componentes “ComboBox e CheckBox” ?
Exemplo mostrando o uso combinado dos componentes ComboBox e CheckBox.. No exemplo a seguir há 4
situações.
Insira um Formulário, um Combobox
( aba Standard ) e 3 componentes
CheckBox.
Clique no ComoboBox,
clique na propriedade Items,
clique Strings, será aberta
uma tela, digite as 3 cidades.
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 133
Digite os códigos a seguir em seus respectivos eventos:
Com Items.Add pode-se adicionar
itens via programação.
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 134
R Como formatar “data” e “hora” ?
Exemplos de Formatos
DIA
ShortDateFormat := 'd' 1 d Dia 23
ShortDateFormat := 'ddd'; 3 ds Dia da semana abreviado "Dom"
ShortDateFormat := 'dddd'; 4 ds Dia da semana "Domingo"
ShortDateFormat := 'dddddd'; 6 ds Data: domingo, 23 de janeiro de 2000
MES
ShortDateFormat := 'm'; 1 m Dia do mês "1"
ShortDateFormat := 'mm'; 2 ms Dia do mês com o zero diante do "01"
ShortDateFormat := 'mmm'; 3 ms Mês abreviado "Jan"
ShortDateFormat := 'mmmm'; 4 ms Mês por extenso "Janeiro"
ANO
ShortDateFormat := 'yy'; Formato "23/01/2000"
ShortDateFormat := 'yyy'; Ano "2000
HORA
ShortDateFormat := 'n'; Minutos "11" ou 'nn' = 05 ou 's' = 5
ShortDateFormat := 'ss'; Segundo "05"
ShortDateFormat := 't'; Formato "17:15"
ShortDateFormat := 'tt'; Formato "17:15:06" -
ShortDateFormat := 'am/pm'; Só retorna se é AM ou PM
Insira um botão do tipo BitBtn e um Label, dê um clique duplo sobre o botão Bitbtn e no evento OnClick
digite as duas linhas abaixo:
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 135
R Pesquisando registros com “InputBox e SetRange”
Pesquisando registro em uma tabela de dados.
R Pesquisando registros com “InputQuery” x “InputBox”
Pesquisando registros em uma tabela de dados.
No exemplo abaixo veremos como usar o InputQuery e InputBox.
Insira um Form, DbGrid, Table, DataSource e um
Bitbtn. Altere o Name do Table e Datasource como
esta no Grid. Clique em Clientes_TB, altere a
propriedade DatabaseName para Alias ( aqui
Madruga ), a propridade TableName para
Clientes.DB, clique no Clientes_DS e defina a
prorpriedade Dataset para Clientes_TB, clique duplo
sobre Clientes_TB, clique no botão direito, clique em
Fields Editor, Add Fields e Ok para adicionar todos
os campos. Clique na propriedade Active e defina o
valor para True.Clique no DBGrid, clique na
propriedade DataSource e informe Clientes_DS.
Clique em Clientes_DS, clique em DataSet e defina
Clientes_TB
Serão mostradas duas
caixas de diálogo
pedindo pelo código
inicial e final.
Digite o código
abaixo no evento
OnClick do Bitbtn.
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 136
InputBox
InputQuery
Obs: Com o InputQuery podemos programa “o clique no botão
cancel”, e já no InputBox não é possível.
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 137
R Gravando registro mediante confirmação – Sim ou Não.
Gravará o registro na tabela somente mediante confirmação, clicando no botão “Sim” ou “Não”
R Como usar o componente “RadioGroup” ?
Usando Radiogroup e Case para fazer uma escolha.
Insira um formulário, um
radiogroup, na propriedade
Columns digite o valor 2 para
fazer duas colunas dentro do
RadioGroup, um Edit e um
Label.
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 138
R Como criar cores personalizadas ( sistema RGB ) ?
Gerando cor para fundo do formulário.
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 139
R Como filtrar registro em um “ListBox” ?
Digite a variável PausaX.
Insira um novo formulário, um edit e e um componente
ListBox. Faça vários testes... Pressione a tecla Esc, pressione
Enter e Backspace, veja como o código se comporta.
Digite os nomes no ListBox: Clique no ListBox, na
propriedade Items clique em (TString ... ) e digite os nomes.
Digite a função Procura
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 140
R Abre Outlook
Adicione um botão do tipo Bitbtn no formulário, dê um clique neste botão e digite o código abaixo:
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 141
R Mostra IP atual
R Como criar uma tabela via programação ?
Para criar uma tabela usamos o Database Desktop, no exemplo a seguir mostrarei como criar tabela através
de código.
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 142
R Maneiras de procurar registros nas tabelas
Insira um botão do tipo BitBtn, dê clique duplo sobre este botão e digite o código abaixo:
è PROCURA 1 ­ Procura registros através de um “índice primário”
FindKey ( função )
Procura registro pela “chave primária” ( procura por código ) Insira um componente
Bitbtn, clique duplo
neste botão e digite as
linhas de código ao
lado no evento
OnClick.
Tabela criada
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 143
Se você tiver alguma dúvida sobre alguma função, basta posicionar o cursor sobre a função desejada (neste
exemplo: Message ) e pressione F1. O Delphi explicará detalhadamente sobre cada função, porém, a ajuda
está em inglêsJ ... no problem J
The MessageBox function creates, displays, and operates a message box. The message box contains an
application-defined message and title, plus any combination of predefined icons and push buttons.
int MessageBox(
 HWND hWnd, // handle of owner window
 LPCTSTR lpText, // Texto da mensagem
 LPCTSTR lpCaption, // define um título para caixa com o erro
 UINT uType // tipo de caixa com ícone exclamação e botão OK
Parameters
hWnd
Identifies the owner window of the message box to be created. If this parameter is NULL, the message box
has no owner window.
lpText
Points to a null-terminated string containing the message to be displayed.
lpCaption
Points to a null-terminated string used for the dialog box title. If this parameter is NULL, the default title
Error is used.
uType
Specifies a set of bit flags that determine the contents and behavior of the dialog box. This parameter can be
a combination of flags from the following groups of flags.
Specify one of the following flags to indicate the buttons contained in the message box:
Flag Meaning
MB_ABORTRETRYIGNORE The message box contains three push buttons: Abort, Retry, and
Ignore.
MB_OK The message box contains one push button: OK. This is the default.
MB_OKCANCEL The message box contains two push buttons: OK and Cancel.
MB_RETRYCANCEL The message box contains two push buttons: Retry and Cancel.
MB_YESNO The message box contains two push buttons: Yes and No.
MB_YESNOCANCEL The message box contains three push buttons: Yes, No, and Cancel.
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 144
Flag Meaning
MB_ICONEXCLAMATION, MB_ICONWARNING An exclamation-point icon appears in the message box.
MB_ICONINFORMATION, MB_ICONASTERISK
An icon consisting of a lowercase letter i in a circle appears in the message box.
MB_ICONQUESTION A question-mark icon appears in the message box.
MB_ICONSTOP,
MB_ICONERROR,
MB_ICONHAND
A stop-sign icon appears in the message box.
 Specify one of the following flags to indicate the default button:
Flag Meaning
MB_DEFBUTTON1 The first button is the default button. MB_DEFBUTTON1 is the default unless
MB_DEFBUTTON2, MB_DEFBUTTON3, or MB_DEFBUTTON4 is specified.
MB_DEFBUTTON2 The second button is the default button.
MB_DEFBUTTON3 The third button is the default button.
MB_DEFBUTTON4 The fourth button is the default button.
Specify one of the following flags to indicate the modality of the dialog box:
Flag Meaning
MB_APPLMODAL The user must respond to the message box before continuing work in the
window identified by the hWnd parameter. However, the user can move to the
windows of other applications and work in those windows. Depending on the
hierarchy of windows in the application, the user may be able to move to other
windows within the application. All child windows of the parent of the message
box are automatically disabled, but popup windows are
not.MB_APPLMODAL is the default if neither MB_SYSTEMMODAL nor
MB_TASKMODAL is specified.
MB_SYSTEMMODAL Same as MB_APPLMODAL except that the message box has the
WS_EX_TOPMOST style. Use system-modal message boxes to notify the user
of serious, potentially damaging errors that require immediate attention (for
example, running out of memory). This flag has no effect on the user's ability to
interact with windows other than those associated with hWnd.
MB_TASKMODAL Same as MB_APPLMODAL except that all the top-level windows belonging
to the current task are disabled if the hWnd parameter is NULL. Use this flag
when the calling application or library does not have a window handle available
but still needs to prevent input to other windows in the current application
without suspending other applications.
In addition, you can specify the following flags:
MB_DEFAULT_DESKTOP_ONLY
The desktop currently receiving input must be a default desktop; otherwise, the function fails. A default
desktop is one an application runs on after the user has logged on.
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 145
MB_HELP
Adds a Help button to the message box. Choosing the Help button or pressing F1 generates a Help event.
MB_RIGHT
The text is right-justified.
MB_RTLREADING
Displays message and caption text using right-to-left reading order on Hebrew and Arabic systems.
MB_SETFOREGROUND
The message box becomes the foreground window. Internally, Windows calls the SetForegroundWindow
function for the message box.
MB_TOPMOST
The message box is created with the WS_EX_TOPMOST window style.
MB_SERVICE_NOTIFICATION
Windows NT only: The caller is a service notifying the user of an event. The function displays a message
box on the current active desktop, even if there is no user logged on to the computer. If this flag is set, the
hWnd parameter must be NULL. This is so the message box can appear on a desktop other than the desktop
corresponding to the hWnd.
For Windows NT version 4.0, the value of MB_SERVICE_NOTIFICATION has changed. See
WINUSER.H for the old and new values. Windows NT 4.0 provides backward compatibility for pre-existing
services by mapping the old value to thenew value in the implementation of MessageBox and
MessageBoxEx. This mapping is only done for executables that have a version number, as set by the linker,
less than 4.0.
To build a service that uses MB_SERVICE_NOTIFICATION, and can run on both Windows NT 3.x and
Windows NT 4.0, you have two choices.
1. At link-time, specify a version number less than 4.0; or
2. At link-time, specify version 4.0. At run-time, use the GetVersionEx function to check the system
version. Then when running on Windows NT 3.x, use MB_SERVICE_NOTIFICATION_NT3X; and on
Windows NT 4.0, use MB_SERVICE_NOTIFICATION.
MB_SERVICE_NOTIFICATION_NT3X
Windows NT only: This value corresponds to the value defined for MB_SERVICE_NOTIFICATION for
Windows NT version 3.51.
Return Values
The return value is zero if there is not enough memory to create the message box.
If the function succeeds, the return value is one of the following menu-item values returned by the dialog
box:
Value Meaning
IDABORT Abort button was selected.
IDCANCEL Cancel button was selected.
IDIGNORE Ignore button was selected.
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 146
IDNO No button was selected.
IDOK OK button was selected.
IDRETRY Retry button was selected.
IDYES Yes button was selected.
 If a message box has a Cancel button, the function returns the IDCANCEL value if either the ESC key is
pressed or the Cancel button is selected. If the message box has no Cancel button, pressing ESC has no
effect.
è PROCURA 2 ­ Procura registros através de um “índice primário”
GotoKey ( função )
Filtra registros através de uma chave primária com GotoKey. Insira um botão do tipo BitBtn, dê um clique
duplo sobre este botão e ditite o código abaixo:
MessageBox é
uma Função
Constante – Texto,
ou seja,
Cliente não existe
Constante - Caption.
Caption = Erro
Erro
Mb_IconWarning + Mb_Ok
Ao invés de usar o
componente Edit
usaremos a
variável Clientes.
AsString: Converte variável para String
( texto ).
FieldByName: Pega o nome do Campo
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 147
þ No exemplo da página acima usamos a variável “Cliente”, no exemplo abaixo usaremos um “edit”:
Podemos otimizar código fonte com “With ... do”, compare com código da página anterior:
Compare o código númeroŒ com . No Œ repito várias vezes Clintes_TB, no código  usei With ... do
para evitar esta repetição. É uma maneira de deixar seu código mais “enxuto”
è PROCURA 3 ­ Procura registros através de um “índice secundário”
FindNearest ( procedure )
Localiza registros através de um índice secundário. A procedure FindNearest , localiza registros através das
primeiras letras digitadas no campo “edit4”. Digite o código abaixo no evento OnChange do Edit.
Œ

Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 148
è PROCURA 4 ­ Procura registros através de um “índice secundário”
GotoNearest ( procedure )
Procurando registros através de um índice secundário. A procedure GotoNearest localiza registros através
das primeiras letras digitadas no campo “edit3”. Digite o código abaixo no evento OnChange do Edit.
è PROCURA 5 ­ Procura registros através de “qualquer campo”
Procura registro na tabela através de qualquer campo.
Filter
Código é nome do campo
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 149
è PROCURA 6 ­ Procura registros através de “qualquer campo”
Locate ( função )
Com esta função podemos procurar registros em uma tabela através de “qualquer campo”, este campo não
precisa ser índice, digite o código abaixo no evento OnClick de um botão.
Interpretando: If Cliente <> ‘ ‘ then ( se o conteúdo da variável Cliente for diferente de branco ... ), ou
seja, se for digitado algo na caixa de diálogo.
Reconhece registros gravados com letras maiúsculas na caixa InputBox - ( uppercase ):
þ No exemplo acima usamos a variável “Cliente” e no exemplo abaixo usaremos um “edit”:
R O que é SQL ? SQL w Structured Query Language
A SQL ou Linguagem Estruturada de Pesquisa, é uma linguagem universal para a manipulação de
informações em banco de dados.
Os métodos de acesso aos registros utilizados pelo componente TTable são bons para pesquisas simples em
registros, exceto para pesquisas complicadas de tomada de decisões. Para usarmos informações em banco de
dados de uma forma mais eficiente, deveremos chamar os dados de maneiras diferentes, combinar dados de
várias tabelas, aplicando restrições e resumir grandes volumes de dados em poucos números significativos.
O modo mais fácil de fazer isto é utilizando a SQL.
A SQL é uma linguagem não procedural, ou seja, não possui procedimentos ou funções para realizar tarefas.
Neste tipo de linguagem nós informamos o que queremos, e não como faze-lo.
Se o nome
digitado na caixa
de diálogo não
existir na tabela, o
Delphi mostrará a
mensagem acima.
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 150
R SQL w Como classificar registros com SQL ?
Insira um Form, DBGrid, Query, DataSource e Bibbtn.
Como foi explicado nas páginas anteriores sobre “filtragem” de dados, farei alguns exemplos básicos de
filtragem de dados usando SQL, mais adiante veremos mais detalhadamente sobre SQL.
Procedimentos abaixo feitos no Delphi 6.0, no Delphi 5.0 use mesmos componentes:
Œ Clique no botão New Form.
 Defina as propriedades Caption para Grade de dados e Name para Grade_Frm.
Ž Insira um DBGrid ( aba Data Controls ).
 Salve o arquivo ( formulário ) com o nome de Clientes_Grid1.pas.
 Insira um DataSource ( aba Data Access ).
‘ Insira um Query1.
’ Clique no DataSource e defina a propriedade DataSet para Query1.
“ Clique no Query1 defina a propriedade DataBaseName = Alias.
” Clique no DBGrid e defina a propriedade DataSource para DataSource1.
• Insira 3 componentes BitBtn, defina as propriedades caption e name.
ASC classifica os
registros em ordem
ASCendente.
DESC classificar
registros em ordem
DESCendente.
SELECIONA Todos DA tabela CLIENTES na ORDEM por código DESCENDENTE
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 151
R SQL w Procurando registro com SQL
Insira um botão do tipo Bitbtn e no evento OnClick digite o código abaixo.
R SQL w Procurando registro com parâmetro
Neste exemplo estamos procurando / filtrando um registro usando parâmetro, neste caso Xnome.
Insira um componente Edit e um
Bitbtn, digite as linhas de código
abaixo no evento OnClick.
Use esta função para
converter aspas em string.
Xnome é uma variável.
Passaremos o parâmetro
para localizar o que for
digitado no Edit.
Insira um Edit e um Bitbtn, no evento OnClick digite as linhas
de código abaixo:
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 152
R SQL w Procurando registro com SQL e InputBox:
Clique no componente Query1, clique na propriedade SQL TStrings (...), dentro da caixa digite o código
SQL abaixo.
SELECT
 Clie_Codigo,
 Clie_Nome,
 Clie_Cidade
FROM
 "Clientes.DB" Clientes
WHERE
 Upper(Clie_Nome) LIKE Upper(:Xnome)
ORDER BY Clie_Nome
R SQL w Procura datas maiores ou iguais ao do sistema
Retorna no DBGrid somente as “datas dos aniversariantes” maiores ou iguais a data do sistema (data
corrente).
Upper força
maiúsculas.
UpperCase
força entrar
dados em
maiúsculas no
InputBox.
Dia em do teste deste
exemplo: 08/11/2002
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 153
R SQL w Pesquisando “mês” – “dia-mês-ano”
Localizando registros do “mês” solicitado.
Não podemos voltar atrás e fazer um novo começo, mas podemos recomeçar e fazer um novo fim.
Ayrton Senna
Pode ser extraído: dia, mês e ano J
Day = dia
Month = mês
Year = ano
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 154
R SQL w SQL Interativo ( visual ) com SQL Builder
Œ Clique no botão New Form.
 Defina as propriedadesCaption para Grade de dados e Name para Grade_Frm.
Ž Insira um DBGrid ( aba Data Controls ).
 Salve o arquivo ( formulário ) com o nome de Clientes_Grid1.pas.
 Insira um DataSource ( aba Data Access )
‘ Insira um Query1.
’ Clique no DataSource e defina a propriedade DataSet para Query1
“ Clique no Query1 defina a propriedade DataBaseName para Alias.
” Clique no DBGrid e defina a propriedade DataSource para DataSource1.
ŒŒ Selecione o
Alias que esta sendo
usado no seu projeto.
Œ Escolha a
tabela
Clientes.DB.
ŒŽ Selecione os
campos desejados
que serão listados
clicando nos
quadradinhos.
Œ‹ Clique em Query1,
clique no botão direito,
clique em
SQL Builder, será aberta
a tela abaixo:
Insira um Edit e
um Bitbtn. Para ver o resultado da
SQL basta clicar no raio.
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 155
Clique no raio para visualizar o resultado da sql.
Œ Usaremos o Sorting para ordenar os registros ( ordem alfabética ). Na aba Sorting clique no campo
Clientes.Clie_Nome, clique no botão Add, o campo será posicionado no lado direito da tela, indicando que
foi selecionado, feche o SQL Builder clicando no “x” e para finalizar clique “yes”.
Œ Clique no componente Query1, pressione F11 para ir para as propriedades, clique nos três pontinhos da
propriedade SQL ( ... ), será aberta uma caixa mostrando a SQL que foi gerada pelo SQL Builder, o que já
fizemos anteriormente com a tela gráfica no item ‘ , organize a disposição da SQL para melhor visualizar e
para finalizar clique OK.
SQL gerada pelo SQL Builder:
SELECT Clie_Codigo, Clie_Nome, Clie_Cidade
FROM "Clientes.DB" Clientes
ORDER BY Clie_Nome
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 156
SQL organizada para melhor ler o códigoJ
SELECT
 Clie_Codigo,
 Clie_Nome,
 Clie_Cidade
FROM
 "Clientes.DB" Clientes
ORDER BY
 Clie_Nome
Œ’ Clique em Query1, clique na propriedade Params, clique em Xnome, será aberta a tela abaixo:
Œ“ No evento OnClick do botão Procura 1 que é um componente Bitbtn, digite o código abaixo:
A linha de código acima filtrará qualquer letra que for digitada no Edit.
SELECT
 Clie_Codigo,
 Clie_Nome,
 Clie_Cidade
FROM
 "Clientes.DB" Clientes
WHERE
Upper(Clie_Nome) LIKE Upper(:Xnome)
ORDER BY
 Clie_Nome
Œ‘ O que está escrito em
vermelho você deverá incluir
( digitar ) para passar
parâmetro ao Xnome.
Defina a propriedade
DataType para ftString, visto
que o nome a ser armazenado
neste parâmetro será uma
string. Defina o tipo de
parâmetro ParmType para
ptInput.
Foram digitadas as letras iniciais
ra, serão listados todos os
registros com estas iniciais.
Upper : força
digitação letras
maiúsculas.
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 157
R SQL w Filtrar registros “letras iniciais” ou “período”
Componentes utilizados neste exemploè DbGrid, Query, Edit e DateTimePicker
ΠInsira um Form.
 Insira um DBGrid.
Ž Insira um DataSource.
 Insira um Query, na propriedade DatabaseName defina o Alias ( ou, caminho onde as tabelas estão
armazenadas ), propriedade SQL ( ... ) clique nos três pontinhos e digite o código sql abaixo:
SELECT
 Clie_Codigo,
 Clie_Nome,
 Clie_Data_Nas
FROM
 "Clientes.DB" Clientes
WHERE
 Clie_Nome LIKE :NomeX AND
 ( Clie_Data_Nas >= :Dta_Inicial ) AND
 ( Clie_Data_Nas <= :Dta_Final )
ORDER BY
 Clie_Nome
Insira dois componentes
DateTimePicker ( aba Win32 ) para
dar entrada das datas, três Labels
para as descrições e um Edit para
digitar letras as serem procuradas.
Defina as propriedades do Query e
do DataSource.
Critério de pesquisa: Foi
digitado as letras “ra” ( sem as
aspas ), data inicial 01/01/1978
e data final 30/12/1988
Serão filtrados todos os
registros neste intervalo.
Clique no componente Query1,
clique no botão direito, clique em
Fields Editor, clique no botão
direito Add Fields, adcione os
campos que forem listados e feche a
tela.
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 158
 Clique no DBGrid e defina a propriedade DataSource para DataSource1.
‘ Clique no botão OK e no evento OnClick digite o código abaixo:
R SQL w Filtra registros por “valor” e “nome”.
Implementando código
If Query1.RecordCount =
0 then
Application.MessageBox('
NADA foi encontrado!',
'ATTENÇÃO',
+ Mb_ok +
Mb_IconWarning)
 else
ShowMessage('Total
registros encontrados : '
 +
IntToStr(Query1.RecordC
ount));
Atenção: Primeiramente você
deve clicar na coluna para dizer
qual campo deseja pesquisar,
após digite um código ou o nome
no campo Edit e clique OK
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 159
FUNÇÕES DE GRUPO – SQL ( veja exemplos básicos na página = 53 )
AVG
Retorna a média dos valores da coluna, ignorando valores nulos.
Exemplo: Obtenha a média de salários de todos os funcionarios.
SELECT AVG(salario) FROM Funcionarios;
SELECT AVG(salário) FROM Funcionários;
SELECT AVG(salario ) FROM Funcionarios;
Como usar este código:
Clique na coluna desejada, após
selecione ao lado Igual e clique no
botão Ok.
Exemplo abaixo:
Cliquei na coluna Salário, após digitei o
salário de 5000, selecionei a opção Igual
e cliquei Ok.
Digite os campos da
tabela e o nome da
tabela.
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 160
COUNT
Retorna o número de ocorrências da expressão, ou coluna. Usando *, retorna todas as ocorrências das linhas
incluindo, duplicadas e nulas.
Exemplo: Obtenha o número de empregados da empresa
SELCT COUNT(*) FROM emp;
Exemplo: Obtenha o número de empregados do departamento 10
SELECT COUNT(*) WHERE deptno = 10;
 SUM
Retorna a soma dos valores da coluna, ignorando valores nulos.
Exemplo: Obtenha a soma de todos os salários dos empregados.
SELECT SUM(sal) FROM emp;
Exemplo: Obtenha a soma de todos os salários do departamento 10.
SELECT SUM(sal) FROM emp WHERE deptno = 10;
 MAX
Retorna o valor máximo de uma coluna.
Exemplo: Obtenha o maior salário dos empregados.
SELECT MAX(sal) FROM emp;
Exemplo: Obtenha o maior salário do departamento 20.
SELECT MAX(sal) FROM emp WHERE deptno = 20;
 MIN
Retorna o valor mínimo de uma coluna.
Exemplo: Obtenha o menor salário dos empregados.
SELECT MIN(sal) FROM emp;
Exemplo: Obtenha o menor salário do departamento 10.
SELECT MIN(sal) FROM emp WHERE deptno = 10;
 CLÁUSULA GROUP BY
A cláusula GROUP BY referencia uma coluna especificada da tabela relacionada na cláusula FROM e
agrupa as linhas com base nos valores iguais dessa coluna.
O resultado da cláusula GROUP BY particiona a tabela em um conjunto de grupos, não efetuando qualquer
tipo de ordenação.
Exemplo: Obtenha o maior salário de cada profissão.
SELECT job, MAX(sal ) FROM emp GROUP BY job;
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 161
Exemplo: Obtenha o menor salário de cada profissão.
SELECT job, MIN(sal) FROM emp GROUP BY job;
Exemplo: Obtenha o maior salário da profissão CLERK.
SELECT MAX(sal) From Clientes WHERE job = 'CLERK' GROUP BY job;
Exemplo: Obtenha o menor salário da profissão CLERK.
SELECT MIN(sal) From Clientes WHERE job = 'CLERK' GROUP BY job;
Exemplo: Obtenha a média salarial por departamento.
SELECT deptno, AVG(sal) FROM emp GROUP BY deptno;
Observação: a cláusula WHERE só pode ser usada em funções de grupos em casos especiais
 CLÁUSULA HAVING
A cláusula HAVING especifica uma restrição sobre a tabela agrupada que resultou de uma cláusula
GROUP BY anterior e elimina os grupos que não satisfazem a condição estabelecida.
A cláusula HAVING é usada para especificar a qualidade que um grupo deve ter para ser incluído no
resultado. Ela efetua para os grupos a mesma função que a cláusula WHERE efetua para as linhas.
A cláusula HAVING é sempre utilizada junto com a cláusula GROUPBY, sendo que o HAVING é
especificado sempre após o GROUP BY.
Exemplo: Obtenha a média de salário dos departamentos que possuem mais de 3 empregados.
SELECT deptno, AVG(sal) FROM emp GROUP BY Clientes HAVING COUNT(*) > 3;
Exemplo:
Obtenha as profissões que o maior salário é igual ou maior que 3000.
SELECT job, MAX(sal) FROM emp GROUP BY job HAVING MAX(sal) >= 3000;
 SUBQUERIES (SUBCONSULTAS)
Uma subquery é uma cláusula SELECT aninhada com outra cláusula SELECT e que retorna um resultado
intermediário.
Exemplo:
SELECT coluna1, coluna2, .......... FROM tabela WHERE coluna = (SELECT coluna1, coluna2,........
FROM tabela WHERE condição);
A) SUBQUERY DE UMA LINHA
Exemplo: Obtenha o nome, profissão e salário do empregado que possui o menor salário.
SELECT MIN(sal) FROM emp; {recupera o menor salário de todos os empregados}
SELECT ename, job, sal FROM emp WHERE sal = (SELECT MIN(sal) FROM emp)
{o resultado acima é usado como parâmetro nesta query}
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 162
Como as subqueries aninhadas são processadas
Uma subquery é composta por duas cláusulas SELECT, o SELECT principal e select interno. O comando
SELECT interno é executado primeiro, produzindo um resultado. No exemplo acima o resultado é 800. O
SELECT principal é processado usando o valor retornado pelo SELECT interno. Observação: sempre que o
SELECT interno retorna uma linha da tabela podem ser utilizadas os operadores =, !=, <, <=, >, >=.
Exemplo: Obtenha o nome, profissão, de todos os empregados que possuem a mesma profissão do
empregado BLAKE.
SELECT job FROM emp WHERE ename = 'BLAKE';
SELECT ename, job FROM emp WHERE job = (SELECT job FROM emp WHERE ename =
'BLAKE');
Observação: O SELECT interno retorna a profissão de BLAKE que é MANAGER, e o SELECT externo
retorna o nome dos empregados com profissão de MANAGER.
B) SUBQUERIES QUE RETORNAM MAIS DE UMA LINHA DA TABELA
OPERADOR IN
Relembrando, o operador IN testa (verifica) os valores que estão em uma lista de valores.
Exemplo: Obtenha o nome, salário e número do departamento dos empregados que recebem o menor salário
de cada departamento.
SELECT MIN(sal) FROM emp GROUP BY deptno;
SELECT ename, sal, deptno FROM emp WHERE sal in (SELECT MIN(sal) FROM emp GROUP BY
deptno)
Observação:
Sempre que aparecer uma SUBQUERY, onde, no resultado retornam mais de uma linha da tabela, utiliza-se
o operador IN.
OPERADORES ANY E ALL
Os operadores ANY e ALL são utilizados para subqueries que retornam mais de uma linha da tabela, e
requerem o uso dos operadores igual ( = ), menor ( > ), maior ( < ), menor ou igual (>= ), maior ou igual ( <=
) ou diferente ( !=), aplicado ao resultado de uma subconsulta.
ANY
Compara um valor com cada valor da lista de valores que foi retornado pela subquery.
Exemplo: Obtenha o nome, salário, profissão e número do departamento de todos empregados que recebem
um salário maior que o menor salário dos empregados do departamento 30.
SELECT DISTINCT sal FROM emp WHERE deptno = 30;
SELECT ename, sal, job, deptno FROM emp WHERE sal > ANY (SELECT DISTINCT sal FROM
emp WHERE deptno = 30);
Observação: Quando a ANY é utilizado, frequentemente a cláusula DISTINCT é utilizada para prevenir que
a mesma linha seja selecionada várias vezes.
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 163
ALL
Compara um valor com todos os valores da lista de valores retornados pela subquery.
Exemplo: Obtenha o nome, salário, profissão e número do departamento de todos os empregados que
recebem um salário maior, que todos os salários dos empregados do departamento 30.
SELECT DISTINCT sal FROM emp WHERE deptno = 30;
SELECT ename, sal, job, deptno FROM emp WHERE sal > ALL (SELECT DISTINCT sal FROM
emp WHERE deptno = 30);
OPERADOR NOT
O operador NOT também pode utilizado com os operadores IN, ALL e ANY.
Utilização do ORDER BY
Não é possível utilizar o ORDER BY em um SELECT interno, a regra é utilizar somente um ORDER BY
em uma subquery e este deve ser o último comando do SELECT, ou seja no SELECT mais externo.
Aninhamento de subqueries
Também é possível aninhar (encadear) várias queries uma dentro da outra, não existindo limites.
CLÁUSULA HAVING COM SUBQUERIES ANINHADAS
A cláusula WHERE refere-se a uma linha da tabela e o HAVING a um grupo de linhas especificadas na
cláusula GROUP BY.
Exemplo: Obtenha o número dos departamentos, onde os empregados recebem um salário médio maior que
a média salarial do departamento 30.
SELECT AVG(sal) FROM emp WHERE deptno = 30;
SELECT deptno, AVG(sal) FROM emp HAVING AVG(sal) > (SELECT AVG(sal) FROM emp
WHERE deptno = 30) GROUP BY deptno;
Exemplo: Obtenha a profissão dos empregados que recebem a mais alta média salarial.
SELECT MAX(AVG(sal)) FROM emp GROUP BY job;
SELECT job, AVG(sal) FROM emp GROUP BY job HAVING AVG(sal) = (SELECT
MAX(AVG(sal)) FROM emp GROUP BY job);
Observação: O SELECT interno encontra a média salarial par aos grupos de profissões, e a função MAX
encontra a maior média salarial dos grupos, que é o valor (5000), este é utilizado pela cláusula HAVING. A
cláusula GROUP BY é necessária no SELECT principal para agrupar as profissões.
Recuperação simples
SELECT * FROM emp;
ou
SELECT empno, ename, job, mgr, hiredate, sal, comm, depto FROM emp;
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 164
A linguagem SQL suporta as seguintes expressões simples:
ADIÇÃO ( + )
SUBTRAÇÃO ( - )
MULTIPLICAÇÃO ( * )
DIVISÃO ( / )
Observação:
Caso a expressão aritmética contenha mais de um operador, a prioridade é *, / e depois +, -, sempre da
esquerda para a direita quando existir vários operadores com a mesma prioridade. Também podem ser
utilizados parênteses para especificar a ordem de execução dos operadores.
Recuperação usando expressões aritméticas
Recuperar os números dos empregados, salários e salário anual.
SELECT empno, sal, sal*12 FROM emp;
SELECT ename, sal +250 * 12 FROM emp;
SELECT ename, (sal + 250) * 12 FROM emp
Apelidos de colunas
Para criar um apelido para uma coluna, entre com o apelido depois do nome da coluna no comando
SELECT.
SELECT ename, sal * 12 SAL_ANUAL, comm FROM emp;
Operador de concatenação
O operador de concatenação permite ligar uma coluna a outra.
SELECT empno||ename EMPREGADO FROM emp;
Manuseio de valores nulos
Sempre que existir um valor nulo na tabela, este deve ser tratado, pois toda expressão feita com valor nulo o
resultado é nulo.
Um valor nulo é diferente de zero.
A função NVL converte um valor nulo para outro valor numérico.
SELECT ename, sal, sal * 12 + comm SAL_ANAUAL FROM emp;
SELECT ename, sal, sal * 12 + NVL(comm,0) SAL_ANUAL FROM emp;
A função NVL (comm, 0) substitui por 0 os valores nulos, para que não afetem a soma. Na multiplicação
utiliza-se 1 no lugar de um valor nulo para não afete a multiplicação.
CLÁUSULA DISTINTICT
A cláusula distinct é utilizada para eliminar os valores duplicados na saída (no resultado).
Recuperação não utilizando a cláusula DISTINCT:
Obtenha todos os números dos departamentos da tabela EMP.
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 165
SELECT deptno FROM emp;
Recuperação utilizando a cláusula DISTINCT:
Obtenha todos os números dos departamentos da tabela EMP.
SELECT DISTINCT deptno FROM emp;
DISTINCT pode ser utilizado para múltiplas colunas.
SELECT DISTINCT deptno, job FROM emp;
CLÁUSULA ORDER BY
A cláusula ORDER BY é utilizada para ordenar (classificar) as linhas da tabela .
A ordem do resultado pode aparecer em ordem decrescente (DESC) ou ascendente (ASC) que é default.
A cláusula order by sempre deve aparecer por último no comando select.
Obtenha o nome, a profissão, o solário de todos os empregados em ordem ascendente de nome do
empregado.
SELECT ename, job, sal FROM emp ORDER BY ename;
Obtenha o nome, a profissão e o salário de todos os empregados em ordem decrescente de nome do
empregado.
SELECT ename, job, sal FROM emp ORDER BY ename DESC;Obtenha o nome, a profissão e o salário de todos os empregados em ordem decrescente de profissão e
crescente de salário.
SELECT ename, job, sal FROM emp ORDER BY job DESC, SAL
Obtenha o nome, a profissão e o salário de todos os empregados em ordem decrescente de profissão e
salário.
SELECT ename, job, sal FROM emp ORDER BY job DESC, sal DESC;
CLÁUSULA WHERE
A cláusula WHERE é utilizada para especificar a condição ou condições que as linhas selecionadas devem
satisfazer. As condições da cláusula WHERE podem ser valores de colunas, valores literais (seqüência de
caracteres), expressões aritméticas ou funções. Seqüência de caracteres e datas devem ser englobadas entre
aspas simples. WHERE especifica a condição desejada, que pode assumir os operadores =, !=, >, >=, <, <=;
operadores booleanos AND, OR e NOT; e parênteses para indicar uma ordem desejada.
OPERADORES LÓGICOS
A cláusula WHERE pode assumir os seguintes operadores lógicos:
Igual ( = )
Maior ( > )
Maior ou Igual ( >= )
Menor ( < )
Menor ou Igual ( <= )
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 166
SELECT ename, sal, FROM emp WHERE deptno = 10;
SELECT ename, sal, FROM emp WHERE sal > 2000;
Operadores booleanos
A cláusula WHERE pode assumir os seguintes operadores booleanos:
· AND;
· OR;
· NOT.
AND - As duas condições devem ser satisfeitas para que a consulta retorne uma ou mais linhas da tabela.
Sintaxe:
SELECT colunas FROM nome-da-tabela WHERE condição1 AND condição2;
Recuperação Qualificada:
Obtenha os números dos empregados do departamento 20 com salário maior 1500.
SELECT ename, sal, depto FROM emp WHERE deptno = 20 AND sal > 1500;
OR - Quando uma ou ambas as condições forem satisfeitas.
Sintaxe:
SELECT colunas FROM nome-da-tabela WHERE condição1 OR condição2;
Obtenha os números dos empregados do departamento 20 ou que possuem salário maior 1500.
SELECT ename, sal, depto FROM emp WHERE deptno = 20 OR sal > 1500;
Usando and e or na mesma consulta
Ao usar AND e OR na mesma consulta, você geralmente deve usar parêntese para tornar a consulta mais
clara. A colocação dos parênteses pode alterar completamente o resultado.
SELECT ename, job, hiredate, sal, deptno FROM emp WHERE sal > 500 AND job ='CLERK' AND
(hiredate='03-DEC-81' OR hiredate='17-DEC-80);
SELECT ename, job, hiredate, sal, deptno FROM emp WHERE sal > 500 AND job = 'CLERK'
OR (hiredate = '03-DEC-81' AND hiredate = '17-DEC-80');
OPERADORES SQL
Operador BETWEEN ...AND ...
O operador BETWEEN..AND... testa os valores da coluna, e recupera os valores que estão entre um valor
mínimo e um valor máximo inclusive especificados no BETWEEN.
Obtenha os nomes e salários dos empregados que possuírem salários entre os valores 1000 e 2000.
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 167
SELECT ename, sal FROM emp WHERE sal BETWEEN 1000 AND 2000;
Operador IN
O operador IN testa os valores da coluna, e recupera somente os valores que estão na lista de valores
especificados pelo operador IN.
Obtenha os números, os salários e os gerentes dos empregados que possuírem os gerentes com os números
7902, 7566, 7788.
SELECT empno, sal, mgr FROM emp WHERE mgr IN (7902, 7566, 7788);
Observação
Caso forem usados caracteres ou data na lista, especificá-los entre aspas simples.
Operador LIKE
O operador LIKE permite recuperar linha da tabela sem saber exatamente o valor que está sendo procurado,
utilizando para isso os símbolos (%) e ( _ ). O símbolo de sublinhado ( _ ) é usado para representar um único
caractere. O símbolo de percentagem (%) é usado para representar uma cadeia de caracteres de qualquer
tamanho (inclusive zero).
Obtenha os nomes dos empregados que iniciam seu nome com S.
SELECT ename FROM emp WHERE ename LIKE 'S%';
Observação
O LIKE só pode ser usado com cadeia de caracteres ou com dados gráficos, e não com dados numéricos.
Operador IS NULL
O operador IS NULL testa os valores da coluna, e recupera somente as linhas da tabela que possuírem o
valor null.
Obtenha os números dos empregados que não possuírem gerente, ou seja o campo número do gerente (mgr)
é igual a nulo.
SELECT ename, mgr FROM emp WHERE mgr IS NULL;
Utilizando a negação (NOT)
Os operadores BETWEEN...AND..., IN, LIKE, e IS NULL podem ser combinados com o operador de
negação NOT.
Operador Significado
NOT BETWEEN não entre dois valores especificados
NOT IN não entre uma lista de valores
NOT LIKE não entre um padrão especificado
IS NOT NULL não igual ao valor null
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 168
R Principais instruções SQL
Instrução SELECT
Instrui o programa principal do banco de dados para retornar a informação como um conjunto de registros.
Sintaxe
SELECT [predicado { * | tabela.* | [tabela.]campo1 [AS alias1] [, [tabela.]campo2 [AS alias2] [, ...]]}
FROM expressãotabela [, ...] [IN bancodedadosexterno]
[WHERE... ] [GROUP BY... ] [HAVING... ] [ORDER BY... ] [WITH OWNERACCESS OPTION]
A instrução SELECT tem as partes abaixo:
Parte Descrição
predicado Um dos seguintes predicados: ALL, DISTINCT, DISTINCTROW ou TOP.
Você usa o predicado para restringir o número de registros que retornam. Se
nenhum for especificado, o padrão será ALL.
* Especifica que todos os campos da tabela ou tabelas especificadas são
 selecionados.
tabela O nome da tabela que contém os campos dos quais os registros são
 selecionados.
campo1, campo2 Os nomes dos campos dos quais os dados serão recuperados. Se você incluir
mais de um campo, eles serão recuperados na ordem listada.
alias1, alias2 Os nomes que serão usados como títulos de colunas em vez dos nomes
originais das colunas na tabela.
expressãotabela O nome da tabela ou tabelas contendo os dados que você quer recuperar.
Bancodedadosexterno O Nome do banco de dados que contém as tabelas em expressãotabela se não estiver
no banco de dados atual.
Comentários
Para executar esta operação, o programa principal de banco de dados procura a tabela ou tabelas
especificadas, extrai as colunas escolhidas, seleciona as linhas que satisfazem o critério e classifica ou
agrupa as linhas resultantes na ordem especificada. A instrução SELECT não muda os dados no banco de
dados.
SELECT é normalmente a primeira palavra em uma instrução SQL. A maior parte das instruções SQL são
instruções SELECT. A sintaxe mínima da instrução SELECT é:
SELECT campos FROM tabela
Você pode usar um asterisco (*) para selecionar todos os campos na tabela. O exemplo abaixo seleciona
todos os campos na tabela Funcionários: SELECT * FROM Funcionários;
Se o nome de um campo estiver incluído em mais de uma tabela na cláusula FROM, preceda-o com o nome
da tabela e o operador . (ponto). No exemplo abaixo, o campo Departamento está nas tabelas Funcionários e
Supervisores. A instrução SQL seleciona Departamento da tabela Funcionários e NomeSupv da tabela
Supervisores:
SELECT Funcionários.Departamento, Supervisores.NomeSupv
FROM Funcionários INNER JOIN Supervisores
WHERE Funcionários.Departamento = Supervisores.Departamento;
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 169
Ao criar um objeto Recordset, o programa principal de banco de dados do Jet usa o nome do campo da
tabela como o nome do objeto Field no objeto Recordset.
Se você quiser um nome de campo diferente ou um nome que não esteja implícito na expressão usada para
gerar o campo, use a palavra reservada AS. O exemplo abaixo usa o título Nasc para nomear o objeto Field
retornado no objeto Recordset resultante:
SELECT DataNasc AS Nasc FROM Funcionários;
Sempre que você usar funções aggregate ou consultas que retornem nomes de objetos Field ambíguos ou
duplicados, você precisará usar a cláusula AS para fornecer um nome alternativo para o objeto Field.
O exemplo abaixo usa o título Contagem para nomear o objeto Field retornado no objeto Recordset
resultante:
SELECT COUNT(FuncionárioID) AS Contagem FROM Funcionários;
Você pode usar outras cláusulas nainstrução SELECT para restringir e organizar posteriormente os seus
dados retornados.
Cláusula GROUP BY
GROUP BY é opcional. Valores de resumo são omitidos se não houver qualquer função aggregate SQL na
instrução SELECT. Os valores Null nos campos GROUP BY são agrupados e não omitidos. No entanto, os
valores Null não são avaliados em qualquer função aggregate SQL. Use a cláusula WHERE para excluir
linhas que você não quer agrupadas e use a cláusula HAVING para filtrar os registros após eles terem sido
agrupados.
A não ser que contenha dados Memo ou OLE Object, um campo na lista de campos GROUP BY pode fazer
referência a qualquer campo em qualquer tabela listada na cláusula FROM. Mesmo que o campo não esteja
incluído na instrução SELECT, fornecida a instrução SELECT, inclua pelo menos uma função SQL. O
programa principal de banco de dados do Jet não pode agrupar campos Memo ou OLE Objects.
Todos os campos na lista de campos SELECT devem ser incluídos na cláusula GROUP BY ou incluídos
como argumentos em uma função aggregate SQL.
Cláusula HAVING
HAVING é opcional. HAVING é semelhante a WHERE, que determina quais registros são selecionados.
Depois que os registros são agrupados com GROUP BY, HAVING determina quais registros são exibidos:
SELECT CategoriaID, Sum(UnidadesNoEstoque) FROM Produtos GROUP BY CategoriaID
HAVING SUM(UnidadesNoEstoque) > 100 AND LIKE "BOS*";
Uma cláusula HAVING pode conter até 40 expressões vinculadas por operadores lógicos, como And ou Or.
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 170
Cláusula ORDER BY
ORDER BY é opcional. Entretanto, se você quiser exibir seus dados na ordem classificada, você deve
utilizar ORDER BY. O padrão ordem de classificação é ascendente (A a Z, 0 a 9). Os dois exemplos abaixo
classificam os nomes dos funcionários pelo sobrenome.
SELECT Sobrenome, Nome FROM Funcionários ORDER BY Sobrenome;
SELECT Sobrenome, Nome FROM Funcionários ORDER BY Sobrenome ASC;
Para classificar em ordem descendente (Z a A, 9 a 0), adicione a palavra reservada DESC ao final de cada
campo que você quiser classificar em ordem descendente. O exemplo abaixo seleciona salários e os
classifica em ordem descendente
SELECT Sobrenome, Salário FROM Funcionários ORDER BY Salário DESC, Sobrenome;
Se você especificar um campo que contém dados Memo ou OLE Objects na cláusula ORDER BY, um erro
ocorrerá. O programa principal de banco de dados do Jet não classifica campos deste tipo. ORDER BY é
normalmente o último item em uma instrução SQL.
Você pode incluir campos adicionais na cláusula ORDER BY. Os registros são classificados primeiro pelo
primeiro campo listado depois de ORDER BY. Os registros que tiverem valores iguais naquele campo são
classificados pelo valor no segundo campo listado e assim por diante.
Cláusula WITH OWNERACCESS OPTION
A declaração WITH OWNERACCESS OPTION é opcional. O exemplo abaixo habilita o usuário a ver as
informações de salário (mesmo que não tenha outra permissão para ver a tabela Folha de Pagamentos) desde
que o proprietário da consulta tenha tal permissão:
SELECT Sobrenome, Nome, Salário FROM Funcionários ORDER BY Sobrenome WITH
OWNERACCESS OPTION;
Se, por outro lado, um usuário for impedido de criar ou anexar a uma tabela, você poderá usar WITH
OWNERACCESS OPTION para habilitá-lo a executar uma consulta construção de tabela ou consulta
anexação. Se você quiser reforçar as configurações de segurança do grupo de trabalho e as permissões dos
usuários, não inclua a declaração WITH OWNERACCESS OPTION. Esta opção exige que você tenha
acesso ao arquivo System.mda associado ao banco de dados. É realmente útil em implementações de
multiusuários seguras.
Mais exemplos de instruções SELECT, cláusula FROM
Esse exemplo seleciona os campos "Sobrenome" e "Nome" de todos os registros da tabela "Funcionários".
SELECT Sobrenome, Nome FROM Funcionários
Esse exemplo seleciona todos os campos da tabela "Funcionários".
SELECT Funcionários.* FROM Funcionários;
Esse exemplo conta o número de registros que têm uma entrada no campo "CódigoPostal" e nomeia o campo
retornado como "Tcp".
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 171
SELECT Count(CódigoPostal) AS Tcp FROM Clientes;
Esse exemplo mostra qual seria o salário se cada funcionário recebesse um aumento de 10 porcento. ão
altera o valor original dos salários.
SELECT Sobrenome, Salário AS Atual, Salário * 1.1 AS Proposto FROM Funcionários;
Esse exemplo coloca o título Nome no topo da coluna "Sobrenome". O título Salário é exibido no topo da
coluna "Salário".
SELECT Sobrenome AS Nome, Salário FROM Funcionários;
Esse exemplo mostra o número de funcionários e os salários médio e máximo.
SELECT Count(*) AS [Total de Funcionários], Avg(Salário) AS [Salário Médio], Max(Salário) AS
[Salário Máximo] FROM Funcionários;
Para cada registro, mostra Sobrenome e Salário no primeiro e último campos. A seqüência de caracteres
"tem um salário de" é retornada como o campo do meio de cada registro.
SELECT Sobrenome, 'tem um salário de', Salário FROM Funcionários;
Exemplo de cláusula GROUP BY
Esse exemplo cria uma lista de nomes de departamentos únicos e o número de funcionários em cada um
destes departamentos.
SELECT Departamento, Count([Departamento]) AS Tbc FROM Funcionários GROUP BY
Departamento;
Para cada título de função único, calcula o número de funcionários do departamento de Vendas que têm este
título.
SELECT Título, Count(Título) AS Tbc FROM Funcionários WHERE Departamento = 'Vendas'
GROUP BY Título;
Esse exemplo calcula o número de itens em estoque para cada combinação de número e cor do item.
SELECT Item, Sum(Unidades) AS Tbc FROM ItensEmEstoque GROUP BY Item, Cor;
Exemplo de cláusula HAVING
Esse exemplo seleciona os títulos de cargos do departamento de Produção atribuídos a mais de 50
funcionários.
SELECT Título, Count(Título) FROM Funcionários WHERE Departamento = 'Produção' GROUP BY
Título HAVING Count(Título) > 50;
Esse exemplo seleciona os departamentos que tenham mais de 100 funcionários.
SELECT Departamento, Count([Departamento]) FROM Funcionários
GROUP BY Departamento HAVING Count(Departamento) > 100;
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 172
Exemplo de cláusula ORDER BY
As instruções SQL mostradas abaixo usam a cláusula ORDER BY para classificar os registros em ordem
alfabética e depois por categoria.
Esse exemplo ordena os registros pelo sobrenome, em ordem descendente (Z-A).
SELECT Sobrenome, Nome FROM Funcionários ORDER BY Sobrenome DESC;
Esse exemplo ordena, primeiro, por categoria ID e depois por nome do produto.
SELECT CategoriaID, ProdutoNome, PreçoUnit FROM Produtos ORDER BY CategoriaID,
NomeProduto;
Instrução INSERT INTO
Adiciona um ou vários registros a uma tabela. Isto é referido como consulta anexação.
Sintaxe
Consulta anexação de vários registros:
INSERT INTO destino [IN bancodedadosexterno] [(campo1[, campo2[, ...]])]
SELECT [origem.]campo1[, campo2[, ...]
FROM expressãodetabela
Consulta anexação de um único registro:
INSERT INTO destino [(campo1[, campo2[, ...]])]
VALUES (valor1[, valor2[, ...])
A instrução INSERT INTO tem as partes abaixo:
Parte Descrição
destino O nome da tabela ou consulta em que os registros devem ser anexados.
bancodedadosexterno O caminho para um banco de dados externo. Para uma descrição do
 caminho, consulte a cláusula IN.
origem O nome da tabela ou consulta de onde os dados devem ser copiados.
campo1, campo2 Os nomes dos campos aos quais os dados devem ser anexados, se
estiverem após um argumento destino ou os nomes dos campos dos quais
 se deve obter os dados, se estiverem após um argumento origem.
expressãodetabela O nome da tabela ou tabelas das quais registros são inseridos. Este
 argumento pode ser um único nome de tabela ou uma combinação
 resultante de uma operação INNER JOIN, LEFT JOIN ou RIGHT JOIN ou de
uma consulta gravada.
valor1, valor2 Os valores para inserir em campos específicosdo novo registro. Cada valor é
inserido no campo que corresponde à posição do valor na lista: Valor1 é
inserido no campo1 do novo registro, valor2 no campo2 e assim por diante.
Você deve separar os valores com uma vírgula e colocar os campos de textos
entre aspas (" ").
Comentários
Você pode usar a instrução INSERT INTO para adicionar um único registro a uma tabela usando a sintaxe
de consulta anexação de um único registro como mostrado acima. Neste caso, seu código especifica o nome
e o valor de cada campo do registro. Você precisa especificar cada um dos campos do registro para os quais
um valor deve ser designado e um valor para este campo. Quando você não especifica cada campo, o valor
padrão ou Null é inserido nas colunas omitidas. Os registros são adicionados no final da tabela.
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 173
Você também pode usar INSERT INTO para anexar um conjunto de registros de outra tabela ou consulta
usando a cláusula SELECT ... FROM como é mostrado acima na sintaxe consulta anexação de vários
registros. Neste caso, a cláusula SELECT especifica os campos para acrescentar à tabela destino
especificada. A tabela de origem ou de destino pode especificar uma tabela ou uma consulta. Se uma
consulta for especificada, o programa principal de banco de dados do Microsoft anexa a qualquer e a todas
as tabelas especificadas pela consulta.
INSERT INTO é opcional, mas quando incluída, precede a instrução SELECT.
Se sua tabela de destino contém uma chave primária, você deve acrescentar valores únicos, não Null ao
campo ou campos da chave primária. Caso contrário, o programa principal de banco de dados do Jet não
anexará os registros. Se você anexar registros a uma tabela com um campo Counter e quiser numerar
novamente os registros anexados, não inclua o campo Counter em sua consulta. Inclua o campo Counter na
consulta se quiser manter os valores originais do campo. Use a cláusula IN para anexar registros a uma
tabela de outro banco de dados. Para achar quais registros serão anexados, antes de você executar a consulta
anexação, primeiro execute e veja os resultados de uma consulta seleção que use o mesmo critério de
seleção. Uma operação de consulta anexação copia os registros de uma ou mais tabelas em outra. As tabelas
que contêm os registros que você anexa não são afetadas pela operação de consulta anexação. Em lugar de
acrescentar registros existentes de outra tabela, você pode especificar o valor de cada campo em um único
registro novo usando a cláusula VALUES. Se você omitir a lista de campo, a cláusula VALUES deve
incluir um valor para cada campo na tabela; caso contrário, um erro ocorrerá em INSERT. Use uma
instrução adicional INSERT INTO com uma cláusula VALUES para cada registro adicional que você
quiser criar.
Exemplo de instrução INSERT INTO
Esse exemplo seleciona todos os registros de uma tabela hipotética "Novos Clientes" e os adiciona à tabela
"Clientes" (quando não são designadas colunas individuais, os nomes das colunas das tabelas SELECT
devem corresponder exatamente aos da tabela INSERT INTO).
INSERT INTO Clientes SELECT [Novos Clientes].* FROM [Novos Clientes];
Esse exemplo cria um novo registro na tabela "Funcionários"
INSERT INTO Funcionários (Nome,Sobrenome, Título) VALUES ("André", "Pereira", "Estagiário");
Esse exemplo seleciona todos os estagiários de uma tabela hipotética "Estagiários" que foram contratados há
mais de 30 dias e adiciona seus registros à tabela "Funcionários".
INSERT INTO Funcionários SELECT Estagiários.* FROM Estagiários WHERE DataContrato < Now()
- 30;
Declaração UPDATE
Cria uma consulta atualização que altera os valores dos campos em uma tabela especificada com base em
critérios específicos.
Sintaxe: UPDATE tabela SET valornovo WHERE critério;
A instrução UPDATE tem as partes abaixo:
Parte Descrição
tabela O nome da tabela cujos os dados você quer modificar.
valornovo Uma expressão que determina o valor a ser inserido em um campo específico nos
 registros atualizados.
critério Uma expressão que determina quais registros devem ser atualizados. Só os registros
 que satisfazem a expressão são atualizados.
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 174
Comentários
UPDATE é especialmente útil quando você quer alterar muitos registros ou quando os registros que você
quer alterar estão em várias tabelas. Você pode alterar vários campos ao mesmo tempo. O exemplo abaixo
aumenta o Valor do Pedido em 10 por cento e o valor do Frete em 3 por cento para embarques do Reino
Unido:
UPDATE Pedidos SET ValorPedido = ValorPedido * 1.1, Frete = Frete * 1.03 WHERE PaísEmbarque =
'RU';
UPDATE não gera um conjunto de resultados. Se você quiser saber quais resultados serão alterados,
examine primeiro os resultados da consulta seleção que use os mesmos critérios e então execute a consulta
atualização.
Exemplo de instrução UPDATE
Esse exemplo muda os valores no campo "RelatórioPara" para 5 para todos os registros de funcionários que
atualmente têm valores de RelatórioPara de 2.
UPDATE Funcionários SET RelatórioPara = 5 WHERE RelatórioPara = 2;
Esse exemplo aumenta o "PreçoUnit" de todos os produtos não suspensos do fornecedor 8 em 10 porcento.
UPDATE Produtos SET PreçoUnit = PreçoUnit * 1.1 WHERE FornecedorID = 8 AND Suspenso = No;
Esse exemplo reduz o PreçoUnit de todos os produtos não suspensos fornecidos pela Tokyo Traders em 5
porcento. As tabelas "Produtos" e "Fornecedores" têm uma relação um para vários.
UPDATE Fornecedores INNER JOIN Produtos ON Fornecedores.FornecedorID = Produtos.FornecedorID
SET PreçoUnit = PreçoUnit * .95 WHERE NomeEmpresa = 'Tokyo Traders' AND Suspenso = No;
Instrução DELETE
Cria uma consulta exclusão que remove registros de uma ou mais tabelas listadas na cláusula FROM que
satisfaz a cláusula WHERE.
Sintaxe: DELETE [tabela.*] FROM tabela WHERE critério
A instrução DELETE tem as partes abaixo:
Parte Descrição
tabela.* O nome opcional da tabela da qual os registros são excluídos.
tabela O nome da tabela da qual os registros são excluídos.
critério Uma expressão que determina qual registro deve ser excluído.
Comentários
DELETE é especialmente útil quando você quer excluir muitos registros. Para eliminar uma tabela inteira do
banco de dados, você pode usar o método Execute com uma instrução DROP.
Entretanto, se você eliminar a tabela, a estrutura é perdida. Por outro lado, quando você usa DELETE,
apenas os dados são excluídos. A estrutura da tabela e todas as propriedades da tabela, como atributos de
campo e índices, permanecem intactos.
Você pode usar DELETE para remover registros de tabelas que estão em uma relação um por vários com
outras tabelas. Operações de exclusão em cascata fazem com que os registros das tabelas que estão no lado
"vários" da relação sejam excluídos quando os registros correspondentes do lado "um" da relação são
excluídos na consulta.
Por exemplo, nas relações entre as tabelas Clientes e Pedidos, a tabela Clientes está do lado "um" e a tabela
Pedidos está no lado "vários" da relação. Excluir um registro em Clientes faz com que os registros
correspondentes em Pedidos sejam excluídos se a opção de exclusão em cascata for especificada.
Delphi Aplicado - by Jurandir A. Pellin ( e-mail: delphiewb@gmail.com ) 175
Exemplo de instrução DELETE
Esse exemplo exclui todos os registros de funcionários cujo título seja Estagiário. Quando a cláusula FROM
inclui apenas uma tabela, não é necessário indicar o nome da tabela na instrução DELETE.
DELETE * FROM Funcionários WHERE Título = 'Estagiário';
Esse exemplo exclui todos os registros de funcionários cujo título seja Estagiário e que também tenham um
registro na tabela "FolhadePagamento". As tabelas "Funcionários" e "FolhadePagamento" têm uma relação
um por um.
DELETE Funcionários * FROM Funcionários INNER JOIN FolhaDePagamento ON
Funcionários.FuncionárioID = FolhadePagamento.FuncionárioID WHERE Funcionários.Título =
'Estagiário';

Outros materiais

Materiais relacionados

Perguntas relacionadas

Materiais recentes

7 pág.
amábile

Irma Ana Zelia Da Fonsecaeeep

User badge image

Jonas Fernandes

Perguntas Recentes