Preview only show first 10 pages with watermark. For full document please download

Delphi Aplicado Módulo 1b

Apostila de delphi, curso completo

   EMBED


Share

Transcript

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: [email protected] ) 102 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: [email protected] ) 103 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: [email protected] ) 104 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: [email protected] ) 105 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. Posicione na linha que deseja fazer o BreakPoint e pressione F5, após prossiga pressionando F7, F7 etc para continuar com a depuração 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. 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. Œ Digite o código abaixo no evento OnClick do botão BitBtn. Delphi Aplicado - by Jurandir A. Pellin ( e-mail: [email protected] ) 106 • 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: [email protected] ) 107 R Como alinhar botões ? No primeiro exemplo alinharemos os botões na vertical. 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. Alinhamento horizontal Delphi Aplicado - by Jurandir A. Pellin ( e-mail: [email protected] ) 108 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 Veja os diferentes tamanhos dos botões 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. Agora todos os botões estão com o tamanho de 80 caracteres de largura. 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. Delphi Aplicado - by Jurandir A. Pellin ( e-mail: [email protected] ) 109 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 Quando teclar na tecla F1 será mostrada esta caixa de mensagem. 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 Delphi Aplicado - by Jurandir A. Pellin ( e-mail: [email protected] ) 110 R Como programar letras, números, teclas de função ? Vamos programar algumas letras. 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. 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: Delphi Aplicado - by Jurandir A. Pellin ( e-mail: [email protected] ) 111 R Códigos do teclado em hexadecimal vk_LButton vk_RButton vk_Cancel vk_MButton vk_Back vk_Tab vk_Clear vk_Return vk_Shift vk_Control vk_Menu vk_Pause vk_Capital vk_Escape vk_Space vk_Prior vk_Next = $01; = $02; = $03; = $04; = $08; = $09; = $0C; = $0D; = $10; = $11; = $12; = $13; = $14; = $1B; = $20; = $21; = $22; vk_End vk_Home vk_Left vk_Up vk_Right vk_Down vk_Select vk_Print vk_Execute vk_SnapShot vk_Insert vk_Delete vk_Help vk_A até vk_Z vk_0 até vk_9 = $23; = $24; = $25; = $26; = $27; = $28; = $29; = $2A; = $2B; = $2C; = $2D; = $2E; = $2F; = tem os mesmos valores ASCII: 'A' até 'Z' = tem os mesmos valores ASCII: '0' até '9' vk_NumPad0 vk_NumPad1 vk_NumPad2 vk_NumPad3 vk_NumPad4 vk_NumPad5 vk_NumPad6 vk_NumPad7 vk_NumPad8 vk_NumPad9 = $60; // Blocos de números (lado direito do teclado) = $61; = $62; = $63; = $64; = $65; = $66; = $67; = $68; = $69; vk_Multiply vk_Add vk_Subtract = $6A; // multiplicação = $6B; // adição = $6D; // subtração vk_NumLock vk_Scroll = $90; = $91; Delphi Aplicado - by Jurandir A. Pellin vk_F1 vk_F2 vk_F3 vk_F4 vk_F5 vk_F6 vk_F7 vk_F8 vk_F9 vk_F10 vk_F11 vk_F12 vk_F13 vk_F14 vk_F15 vk_F16 vk_F17 vk_F18 vk_F19 vk_F20 vk_F21 vk_F22 vk_F23 vk_F24 = $70; ( tecla F1 ) = $71; ( tecla F2 ) = $72; ( tecla F3 ) = $73; ( tecla F4 ) = $74; = $75; = $76; = $77; = $78; = $79; = $7A; = $7B; = $7C; = $7D; = $7E; = $7F; = $80; = $81; = $82; = $83; = $84; = $85; = $86; = $87; vk_Separator = $6C; // separador vk_Decimal = $6E; // decimal ( e-mail: [email protected] ) 112 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. 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; ) Exemplo: No evento OnClick digite: Clientes_TB.Post ( grava registro corrente na tabela de Clientes ) Delphi Aplicado - by Jurandir A. Pellin ( e-mail: [email protected] ) 113 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. Botões padrão do navegador de dados. O Delphi como padrão mostra símbolos no navegador. Como acho estes símbolos horríveis mostrarei como substituí-los por ícones J A tela abaixo mostra resultado de como fica após ter definido ícones para o DBNavigator Definindo ícones para o navegador. 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) Delphi Aplicado - by Jurandir A. Pellin ( e-mail: [email protected] ) 114 Os arquivos com a terminação .bmp ( arquivos de imagens ) devem estar na pasta onde se encontra o projeto. Outra forma , usando evento OnShow Delphi Aplicado - by Jurandir A. Pellin ( e-mail: [email protected] ) 115 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: [email protected] ) 116 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 é o botão do próximo registro do Navigator. Quando clicado, mostrará uma mensagem. Button First Prior Next Last Insert Delete Edit Post Cancel Refresh Valor nbFirst nbPrior nbNext nbLast nbInsert nbDelete nbEdit nbPost nbCancel nbRefresh Este é o valor (value) do botão próximo registro ( Next = nbNext ). Veja a tabela os botões e seus valores. Ação Vai para o primeiro registro. Vai para o registro anterior. Vai para o próximo registro. Vai para o último registro. Insere um registro em branco. Apaga o registro atual. Permite editar o registro atual. Grava o registro atual. Cancela a edição corrente. Atualiza (refresca) os dados no Dataset. 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: [email protected] ) 117 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: [email protected] ) 118 “ Organize os campos de acordo com a tela abaixo: Agora precisamos inserir o componete DBNavigator para navegar nos registros, adiante faremos um navegador com botões + ícones J ” 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. Delphi Aplicado - by Jurandir A. Pellin ( e-mail: [email protected] ) 119 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: [email protected] ) 120 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 := StrToInt Edit1.Text Variável inteira. Atribui o conteúdo do Edit1.Text para armazenar na variável do tipo inteira Total1. Converte texto para valor inteiro É um objeto texto. Delphi Aplicado - by Jurandir A. Pellin ( e-mail: [email protected] ) 121 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: [email protected] ) 122 R Como remover ponto decimal ? Digite esta função. R Como arredondar valor ? ( 1 ) R Como arredondar valor ? ( 2 ) Delphi Aplicado - by Jurandir A. Pellin ( e-mail: [email protected] ) 123 R Como formatar “zeros” no lado esquerdo do número ? %.5d significa que no total haverá cinco números, ou seja, 00020 R Como formatar valor ? R Função “copy” Insira 3 componentes Edit e um Bitbtin. 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á”. Delphi Aplicado - by Jurandir A. Pellin ( e-mail: [email protected] ) 124 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: [email protected] ) 125 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 ) abaixo: Delphi Aplicado - by Jurandir A. Pellin • Insira um Bitbtn e no evento OnClick digite o código ( e-mail: [email protected] ) 126 R Case … of … else … end ( 2 ) Trabalhando com blocos de comandos. Para fazer o exemplo abaixo, insira um form, dois Edits e um Bitbtn. Digete 11 e será mostrado o mês por extenso. R Case ... of ... else … end ( 3 ) Delphi Aplicado - by Jurandir A. Pellin ( e-mail: [email protected] ) 127 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: [email protected] ) 128 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: [email protected] ) 129 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. R Como usar o operador “or” ? ( 1 ) Delphi Aplicado - by Jurandir A. Pellin ( e-mail: [email protected] ) 130 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: [email protected] ) 131 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: [email protected] ) 132 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: [email protected] ) 133 R Como formatar “data” e “hora” ? Exemplos de Formatos DIA ShortDateFormat ShortDateFormat ShortDateFormat ShortDateFormat := 'd' := 'ddd'; := 'dddd'; := 'dddddd'; 1d 3 ds 4 ds 6 ds Dia 23 Dia da semana abreviado "Dom" Dia da semana "Domingo" Data: domingo, 23 de janeiro de 2000 MES ShortDateFormat ShortDateFormat ShortDateFormat ShortDateFormat := 'm'; := 'mm'; := 'mmm'; := 'mmmm'; 1m 2 ms 3 ms 4 ms Dia do mês "1" Dia do mês com o zero diante do "01" Mês abreviado "Jan" Mês por extenso "Janeiro" ANO ShortDateFormat ShortDateFormat := 'yy'; := 'yyy'; Formato "23/01/2000" Ano "2000 HORA ShortDateFormat ShortDateFormat ShortDateFormat ShortDateFormat ShortDateFormat := 'n'; := 'ss'; := 't'; := 'tt'; := 'am/pm'; Minutos "11" ou 'nn' = 05 ou 's' = 5 Segundo "05" Formato "17:15" Formato "17:15:06" 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: [email protected] ) 134 R Pesquisando registros com “InputBox e SetRange” Pesquisando registro em uma tabela de dados. 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 Digite o código abaixo no evento OnClick do Bitbtn. Serão mostradas duas caixas de diálogo pedindo pelo código inicial e final. R Pesquisando registros com “InputQuery” x “InputBox” Pesquisando registros em uma tabela de dados. No exemplo abaixo veremos como usar o InputQuery e InputBox. Delphi Aplicado - by Jurandir A. Pellin ( e-mail: [email protected] ) 135 InputQuery Obs: Com o InputQuery podemos programa “o clique no botão cancel”, e já no InputBox não é possível. InputBox Delphi Aplicado - by Jurandir A. Pellin ( e-mail: [email protected] ) 136 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: [email protected] ) 137 R Como criar cores personalizadas ( sistema RGB ) ? Gerando cor para fundo do formulário. Delphi Aplicado - by Jurandir A. Pellin ( e-mail: [email protected] ) 138 R Como filtrar registro em um “ListBox” ? 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 variável PausaX. Digite a função Procura Delphi Aplicado - by Jurandir A. Pellin ( e-mail: [email protected] ) 139 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: [email protected] ) 140 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: [email protected] ) 141 Tabela criada 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 ) Delphi Aplicado - by Jurandir A. Pellin Insira um componente Bitbtn, clique duplo neste botão e digite as linhas de código ao lado no evento OnClick. ( e-mail: [email protected] ) 142 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ês J ... 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, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType Parameters hWnd // handle of owner window // Texto da mensagem // define um título para caixa com o erro // tipo de caixa com ícone exclamação e botão OK 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 MB_ABORTRETRYIGNORE Ignore. MB_OK MB_OKCANCEL MB_RETRYCANCEL MB_YESNO MB_YESNOCANCEL Meaning The message box contains three push buttons: Abort, Retry, and The message box contains one push button: OK. This is the default. The message box contains two push buttons: OK and Cancel. The message box contains two push buttons: Retry and Cancel. The message box contains two push buttons: Yes and No. The message box contains three push buttons: Yes, No, and Cancel. Delphi Aplicado - by Jurandir A. Pellin ( e-mail: [email protected] ) 143 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: [email protected] ) 144 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 the new 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: [email protected] ) 145 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. MessageBox é uma Função Mb_IconWarning + Mb_Ok Constante - Caption. Caption = Erro Constante – Texto, ou seja, Erro Cliente não existe è 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: 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: [email protected] ) 146 þ 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: [email protected] ) 147 è 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: [email protected] ) 148 è 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. Se o nome digitado na caixa de diálogo não existir na tabela, o Delphi mostrará a mensagem acima. 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. Delphi Aplicado - by Jurandir A. Pellin ( e-mail: [email protected] ) 149 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: [email protected] ) 150 R SQL w Procurando registro com SQL Insira um botão do tipo Bitbtn e no evento OnClick digite o código abaixo. 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. R SQL w Procurando registro com parâmetro Neste exemplo estamos procurando / filtrando um registro usando parâmetro, neste caso Xnome. Insira um Edit e um Bitbtn, no evento OnClick digite as linhas de código abaixo: Xnome é uma variável. Passaremos o parâmetro para localizar o que for digitado no Edit. Delphi Aplicado - by Jurandir A. Pellin ( e-mail: [email protected] ) 151 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 Upper força maiúsculas. UpperCase força entrar dados em maiúsculas no InputBox. 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). Dia em do teste deste exemplo: 08/11/2002 Delphi Aplicado - by Jurandir A. Pellin ( e-mail: [email protected] ) 152 R SQL w Pesquisando “mês” – “dia-mês-ano” Localizando registros do “mês” solicitado. Pode ser extraído: dia, mês e ano J Day Month Year = dia = mês = ano Não podemos voltar atrás e fazer um novo começo, mas podemos recomeçar e fazer um novo fim. Ayrton Senna Delphi Aplicado - by Jurandir A. Pellin ( e-mail: [email protected] ) 153 R SQL w SQL Interativo ( visual ) com SQL Builder Œ 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 para Alias. ” Clique no DBGrid e defina a propriedade DataSource para DataSource1. Œ‹ 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. ŒŒ Selecione o Alias que esta sendo usado no seu projeto. ŒŽ Selecione os campos desejados que serão listados clicando nos quadradinhos. Delphi Aplicado - by Jurandir A. Pellin Œ• Escolha a tabela Clientes.DB. ( e-mail: [email protected] ) 154 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: [email protected] ) 155 SQL organizada para melhor ler o código J SELECT Clie_Codigo, Clie_Nome, Clie_Cidade FROM "Clientes.DB" Clientes ORDER BY Clie_Nome Œ‘ O que está escrito em vermelho você deverá incluir ( digitar ) para passar parâmetro ao Xnome. SELECT Clie_Codigo, Upper : força Clie_Nome, digitação letras Clie_Cidade maiúsculas. FROM "Clientes.DB" Clientes WHERE Upper(Clie_Nome) LIKE Upper(:Xnome) ORDER BY Clie_Nome Œ’ Clique em Query1, clique na propriedade Params, clique em Xnome, será aberta a tela abaixo: 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. Œ“ 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. Foram digitadas as letras iniciais ra, serão listados todos os registros com estas iniciais. Delphi Aplicado - by Jurandir A. Pellin ( e-mail: [email protected] ) 156 R SQL w Filtrar registros “letras iniciais” ou “período” Componentes utilizados neste exemplo è DbGrid, Query, Edit e DateTimePicker 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. 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. 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. Œ 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 Delphi Aplicado - by Jurandir A. Pellin ( e-mail: [email protected] ) 157 • Clique no DBGrid e defina a propriedade DataSource para DataSource1. ‘ Clique no botão OK e no evento OnClick digite o código abaixo: 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)); R SQL w Filtra registros por “valor” e “nome”. 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: [email protected] ) 158 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. 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. Digite os campos da tabela e o nome da tabela. SELECT AVG(salario) FROM Funcionarios; SELECT AVG(salário) FROM Funcionários; SELECT AVG(salario ) FROM Funcionarios; Delphi Aplicado - by Jurandir A. Pellin ( e-mail: [email protected] ) 159 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: [email protected] ) 160 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 GROUP BY, 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: [email protected] ) 161 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: [email protected] ) 162 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: [email protected] ) 163 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: [email protected] ) 164 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: [email protected] ) 165 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: [email protected] ) 166 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 NOT BETWEEN NOT IN NOT LIKE IS NOT NULL Significado não entre dois valores especificados não entre uma lista de valores não entre um padrão especificado não igual ao valor null Delphi Aplicado - by Jurandir A. Pellin ( e-mail: [email protected] ) 167 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 predicado Descrição 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. O nome da tabela que contém os campos dos quais os registros são selecionados. * tabela 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: [email protected] ) 168 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 na instruçã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 HAVING CategoriaID, Sum(UnidadesNoEstoque) FROM Produtos GROUP BY CategoriaID 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: [email protected] ) 169 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 OWNERACCESS OPTION; FROM Funcionários ORDER BY Sobrenome WITH 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: [email protected] ) 170 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, Departamento; Count([Departamento]) AS Tbc FROM Funcionários GROUP BY 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: [email protected] ) 171 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 destino bancodedadosexterno origem campo1, campo2 expressãodetabela valor1, valor2 Descrição O nome da tabela ou consulta em que os registros devem ser anexados. O caminho para um banco de dados externo. Para uma descrição do caminho, consulte a cláusula IN. O nome da tabela ou consulta de onde os dados devem ser copiados. 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. 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. Os valores para inserir em campos específicos do 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: [email protected] ) 172 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: [email protected] ) 173 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 tabela.* tabela critério Descrição O nome opcional da tabela da qual os registros são excluídos. O nome da tabela da qual os registros são excluídos. 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: [email protected] ) 174 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 Funcionários.FuncionárioID = FolhadePagamento.FuncionárioID 'Estagiário'; JOIN FolhaDePagamento ON WHERE Funcionários.Título = R SQL w Classificando registros no DBGrid com “radiogroup” Neste exemplo geraremos vários resultados no mesmo DBGrid usando. O objetivo é mostrar combinação com “case”, “radiogroup”, “DbGrid”. Será necessário ter 3 tabelas: Funcionários, Cidades e UFs. Œ Abra um novo formulário ( new form ). • Insira um componente RadioGroup ( aba Standard ), na propriedade Columns digite o número “3”, na propriedade Items digite as “4” linhas abaixo: Funcionários - A - Z Funcionários - Z - A Cidades - A - Z Cidade = 1 Estado - escolher... Crie as tabelas: Funcionários, Cidades e Estados Ž Insira 3 componentes SQL e 3 DataSource, clique em cada componente SQL, defina o Alias na propriedade DatabaseName que apontará para as tabelas ( ou digite o caminho onde estão as tabelas ), e defina a propriedade Name de cada componente, veja na tela gráfica abaixo ( Funcinarios_QRY, Cidades_QRY e UF_QRY ), defina as propriedades DataSet de cada _QRY de cada DataSource. • Insira um DBGrid ( aba DataControls ). Delphi Aplicado - by Jurandir A. Pellin ( e-mail: [email protected] ) 175 • Clique duplo no RadioGroup e no evento OnClick digite o código abaixo: Delphi Aplicado - by Jurandir A. Pellin ( e-mail: [email protected] ) 176 R SQL w Usuário digita linha SQL. Insira um Formulário, Query defina o Alias, DataSource – defina o DataSet, RadioGroup, na propriedade Items (...) digite as 3 linhas que estão no gráfico abaixo da palavra “Opções”, insira 3 Edits, na propriedade Text de cada Edit digite as linhas dos SQLs de acordo com o exemplo. Clique no DBGrid, defina a propriedade DataSource para DaraSourcel. Se você já esta familiarizado com SQL, basta digitar a SQL para gerar o resultado no DBGrid ( Grid ). Busca linha SQL do Edit1 Busca linha SQL do Edit2 Busca linha SQL do Edit3 Delphi Aplicado - by Jurandir A. Pellin ( e-mail: [email protected] ) 177 R SQL w Filtrando registros com ComboBox. Uma maneira muito prática para selecionarmos registros é utilizando o componente ComboBox. Œ Abra um novo formulário ( new form ). • Insira 2 componentes SQL e 2 DataSource, clique no componente SQL, defina o Alias na propriedade DatabaseName que apontará para as tabelas ( ou digite o caminho onde estão as tabelas ), defina a propriedade Name de cada componente - Name do query / datasource = Sigla_Sql Sigla_DS - Name do query / datasource: Descr_UF_Sql - Descr_UF_DS, clique no componente DataSource e defina o nome Descr_UF_DS. Ž Insira um ComboBox ( aba Standard ). - • Insira um DBGrid ( aba DataControls ). Digite o código abaixo nos eventos indicados: ( no evento OnShow do formulário e no evento OnClick do Combobox ) Clique em Sigla_Sql, na propriedade SQL ( Tstrings ...) digite: SELECT UF FROM "Estados.db" Estados Clique em Descr_UF_Sql, na propriedade SQL ( Tstrings ...) digite: SELECT Descr_UF FROM Delphi Aplicado - by Jurandir A. Pellin "Estados.db" Estados ( e-mail: [email protected] ) 178 R SQL w Pesquisando salários com SQL e “InputBox” Neste exemplo localizaremos o salário informado, para isto usaremos SQL e InputBox. Œ Crie a tabela abaixo. • Insira um formulário, um componente DbGrid, Query e um DataSource. Clique no Query1, clique na propriedade DatabaseName e defina o Alias, clique no DataSource, clique na popriedade DataSet = Query1. Clique no DBGrid, clique na propriedade DataSource = DataSource1. Clique no Query1, clique em SQL (Strings ...) e digite a linha: Select Nome, Salario From "Clientes.db" Where Salario = :SalarioX Os dois pontos ( : ) devem estar rente ao nome da variável SalarioX e não deve ter espaço entre Ž Digite o código abaixo: Delphi Aplicado - by Jurandir A. Pellin ( e-mail: [email protected] ) 179 Após clicar no botão Pesquisa será aberta caixa para digitar um salário. R SQL w Navegando nos registros. Navegando nos registros usando funções SQL e Locate. Componentes utilizados: Um Edit, DBGrid, Query, DataSource e 4 botões Bitbtn. Defina a propriedade DatabaseName do Query e DataSource, clique no DBGrid e na propriedade DataSource defina DataSource1. Clique no Query1 e na propriedade Active defina True Delphi Aplicado - by Jurandir A. Pellin ( e-mail: [email protected] ) 180 Foi digitado a letra “h”, após o cursor posicionará o ponteiro no primeiro registro que possuir a letra “h”. Delphi Aplicado - by Jurandir A. Pellin ( e-mail: [email protected] ) 181 R SQL w Filtrando registros “letras iniciais”. Clique no ComboBox, clique na aba Events, dê um clique duplo em OnChange e digite o código abaixo: Insira um formulário, um ComboBox, um DBGrid, um DataSource e um Query1. Clique no Query1, clique em DatabaseName, defina o Alias, clique no DataSource e defina o DataSet = Query1, clique no DBGrid e defina a propriedade DataSource para DataSource1, clique em Query1 e defina a propriedade Active para True. Clique no componente Query1, clique no botão direito, clique em SQL Builder, selecione o Database que é o Alias, selecione a tabela, marque os campos Nome, Cidade e Data Nasc, feche a tela do Sql Builder, clique em Yes. Adicione os campos no Query, Clique no botão direito Fields Editor, botão direito Add fields e adicione os campos ( veja ao lado ) Outra maneira de usar SQL com variáveis. ComboBox Delphi Aplicado - by Jurandir A. Pellin ( e-mail: [email protected] ) 182 Após digitado a letra “m” será listado no Grid o nome Mike Allan Pellin, se pressionar “backspace”, permanecerá somente a letra “m”, ou seja, listará todos os nomes que iniciarem com a letra “m”. R SQL w Procurando registros com “locate” Insira: um form, Edit, DbGrid, Query, Datasource e um Bitbtn. Defina as propriedades dos componentes: Query, DataSource e DBGrid Como definir estas propriedades já vimos em vários exemplos anteriores J Veja o código fonte abaixo: Delphi Aplicado - by Jurandir A. Pellin ( e-mail: [email protected] ) 183 R SQL w Filtrando registros por perído ( intervalo de datas ) ŒInsira dois componentes Edit ( aba Standard ), um DBGrid e dois Bitbtn • Insira um componente Query ( aba DataAccess ). Na propriedade SQL , clique em (Tstrings) ... digite as linhas abaixo nesta ordem: SELECT Codigo, Data, Qtde FROM "Produtos.db" Produtos WHERE (Produtos.Data >= :Data_Inicial) and (Produtos.Data <= :Data_Final) Ž Insira um componete DBGrid ( aba DataControls ), na propriedade DataSource defina DataSource1. Clique no componente DataSource1 e na propriedade DataSet defina Query1. Na propriedade DatabaseName = Alias ou o caminho onde está armazenada a tabela de produtos. • Clique na propriedade Name = Data_Inicial, será exibida uma telinha, estes dois parâmetros já foram definidos na propriedade SQL , clique em (Tstrings) ... dê um clique duplo em Params, será aberta a tela acima, defina a propriedade DataType deve ser do tipo ftDate porque o parâmetro é do tipo data. Delphi Aplicado - by Jurandir A. Pellin ( e-mail: [email protected] ) 184 ü Interpretação do Código Fonte SELECT Codigo, Data, Qtde FROM "Produtos.db" Produtos WHERE (Produtos.Data >= :Data_Inicial) AND (Produtos.Data <= :Data_Final) SELECT Ü Seleciona os campos da tabela “código”, “data” e “qtde” FROM Ü Buscará informações da tabela de “produtos.db” WHERE Ü Onde o “campo da tabela data” deverá ser “ >= maior ou igual ” ao “parâmetro Dta_Inicial e “ AND “ “ <= menor ou igual “, segundo parâmetro é Data_Final” Resultado da filtragem dos dados com SQL Delphi Aplicado - by Jurandir A. Pellin ( e-mail: [email protected] ) 185 R SQL w Filtrando por período e cidade Pesquisando registros por registro e dependendo da letra da cidade digitada e se esta existir será mostrada no Grid. Perido de: 01/01/2000 – 23/10/2000 – nenhuma cidade foi informada Perido de: 01/01/2000 – 23/10/2000 – Digite as letras “ im “ Delphi Aplicado - by Jurandir A. Pellin ( e-mail: [email protected] ) 186 Clique no componente Query1, clique na propriedade SQL ( Tstrings ... ) e digite a SQL que esta sendo mostrada em String List Editor. Delphi Aplicado - by Jurandir A. Pellin ( e-mail: [email protected] ) 187 R SQL w Classificando registros “menu PopUP”. Neste exemplo aprenderemos usar o componente PopUp Menu juntamente com Sql, onde classificaremos registros do Grid. Œ Insira um componente DBGrid (aba DataControls). Na propriedade Datasource deste DBGrid defina Datasource1 e na propriedade PopupMenu defina PopupMenu1 Ž Insira um componente Query (aba Data Access). Clique na propriedade SQL ( TStrings ), será aberta uma tela, digite as duas linhas abaixo e clique Ok. SELECT Func_Codigo, Func_Nome, Func_Salario, Func_Data_Nasc FROM "Funcionarios.DB" Funcionarios • Insira um componente Datasource (aba Data Access) e na propriedade DataSet defina Query1. • Insira um componente PopupMenu (aba Standard). Clique duplo sobre o ícone PopupMenu e na propriedade Caption digite o texto Lista em ordem de NOME , clique duplo sobre esta opção para digitar o código fonte (veja o program fonte abaixo) Delphi Aplicado - by Jurandir A. Pellin ( e-mail: [email protected] ) 188 Veja o gráfico abaixo, nomes estão em ordem ascendente ( A ... Z ) Delphi Aplicado - by Jurandir A. Pellin ( e-mail: [email protected] ) 189 R SQL w Filtrando “datas correntes” maiores ou iguais. No exemplo a seguir mostraremos como listar registros que possuem a data maior ou igual ao do sistema ( data corrente ). Listará datas maiores ou iguais a data atual ( data do sistema ) Pega data do sistema, ou seja, data atual. Delphi Aplicado - by Jurandir A. Pellin ( e-mail: [email protected] ) 190 R SQL w Filtrando registros com “datas pagas”. Œ Crie uma tabela com os campos abaixo: Nome – Data_Vencto – Data_Pagto e Valor ( $ ). • Insira um formulário, um DBGRid, Query, DataSource 3 botões BitBtn. Insira um componente Query e um Datasource. Clique no DBGrid e defina a propriedade DataSet para DataSource1. Clique em Query e defina a propriedade DatabaseName com Alias ou caminho onde está a tabela. Clique em Datasource1, clique em Dataset e defina Query1. Pode ser usado: is null ou is not null Delphi Aplicado - by Jurandir A. Pellin ( e-mail: [email protected] ) 191 Registros ainda não pagos: Todos os registros: Soma valores dos registros pagos: Outra forma, mostra total em um Edit ou em um Label Soma_Total é uma variável, poderia ser qualquer nome para armazenar o total. Delphi Aplicado - by Jurandir A. Pellin ( e-mail: [email protected] ) 192 R SQL – Procurando registro com SQL – LIKE e RadioGroup u Insira um Edit, um BitBtn, um RadioGroup, clique na propriedade Items e digite um abaixo do outro as seguintes linhas: Localiza através das " letras iniciais " Localiza através da " letras finais " Localiza " de qualquer letra digitada " v Insira um DBGrid, insira um Query e um DataSource, clique em Query, clique na propriedade DatabaseName e defina o Alias onde se encontra a tabela, clique em DataSource e defina Query1 Clique em Query1, clique na propriedade SQL ( TStrings ), será aberta a tela abaixo, digite a SQL. Campos da tabela Digitge as 3 últimas linhas Digite a(s) letra(s) deseja(s) e clique no botão Ok. Um nome inicia com a letra “ m “. Delphi Aplicado - by Jurandir A. Pellin ( e-mail: [email protected] ) 193 R Totalizando valores Clique no Query1, clique em DatabaseName e defina o Alias ou o caminho onde esta a tabela, clique em DataSource1, clique em DataSet e defina Query1 R Somando salários da cidade solicitada Apenas insira dois Edits e um botão, o grid abaixa serve apenas para mostrar as cidades. Delphi Aplicado - by Jurandir A. Pellin ( e-mail: [email protected] ) 194 R Pesquisando com Query + Like Basta digitar qualquer letra no campo de pesquisa “ Letras Iniciaisde “que deseja localizar. Insira um Edit, Query, DataSource1 R Formulário MDI Uma interface MDI (Multiple Document Interface) possibilita a visualização de mais de um documento ou objeto simultaneamente. Aplicações MDI são constituidas geralmente de dois ou mais formulários: o formulário principal (MDIform) que geralmente constitui a janela principal do programa e seus filhos (MDIchild) localizados dentro de sua área de trabalho. Em aplicações MDI, você geralmente precisa mostrar múltiplas instâncias de um classe de formulário. Um formulário filho de MDI deve ser criado para ser exibido e deve ser destruído para não mais exibí-lo. Com uma nova aplicação vamos iniciar uma aplicação MDI que possa abrir vários arquivos de figuras selecionados pelo usuário. fsMDIChild fsMDIChild fsMDIChild Delphi Aplicado - by Jurandir A. Pellin ( e-mail: [email protected] ) 195 Delphi Aplicado - by Jurandir A. Pellin ( e-mail: [email protected] ) 196 Veja abaixo as 3 tabelas usadas neste projeto: File – New Application e insira um componente MainMenu ( aba Standard ) Delphi Aplicado - by Jurandir A. Pellin ( e-mail: [email protected] ) 197 No primeiro formulário, ou seja, no formulário do Menu defina a propriedade FormStyle para fsMDIForm Delphi Aplicado - by Jurandir A. Pellin ( e-mail: [email protected] ) 198 Cadastro de Clientes No formulário Clientes mude a propriedade do formulário FormStyle para fsMDIChild Delphi Aplicado - by Jurandir A. Pellin ( e-mail: [email protected] ) 199 Cadastro de Fornecedores No formulário Fornecedores mude a propriedade do formulário FormStyle para fsMDIChild Cadastro de Transportadoras No formulário Transportadoras mude a propriedade do formulário FormStyle para fsMDIChild Delphi Aplicado - by Jurandir A. Pellin ( e-mail: [email protected] ) 200 Clique em Project – Options e passe os formulários Clientes_Frm, Transp_Frm e Fornec_Frm para o lado direito da tela abaixo: R Apaga TODOS os registros da tabela Digite a procedure Apaga_Todos_Regs Delphi Aplicado - by Jurandir A. Pellin ( e-mail: [email protected] ) 201 R Pesquisa registros em um drop-down Com este código podemos procurar registros selecionando o campo desejado para a procura. Digite a função Seleciona Delphi Aplicado - by Jurandir A. Pellin ( e-mail: [email protected] ) 202 Selecione o campo que deseja procurar Delphi Aplicado - by Jurandir A. Pellin ( e-mail: [email protected] ) 203 R Criando Grid zebrado Delphi Aplicado - by Jurandir A. Pellin ( e-mail: [email protected] ) 204 R Criando descrição com balão No exemplo a seguir criaremos um balão para descrição. Insira um componente Memo Digite Constantes e as Varáveis. Delphi Aplicado - by Jurandir A. Pellin ( e-mail: [email protected] ) 205 Delphi Aplicado - by Jurandir A. Pellin ( e-mail: [email protected] ) 206 R Encriptografando e decriptografando senhas R Movendo colunas no DBGrid Com este código será possível mover colunas de um lado para outro. Digite estas duas linhas Delphi Aplicado - by Jurandir A. Pellin ( e-mail: [email protected] ) 207 Digite estas 4 linhas R Formatando data FormatDateTime Delphi Aplicado - by Jurandir A. Pellin ( e-mail: [email protected] ) 208 Identificadores.......................................................................................................................................... 102 With ... do................................................................................................................................................. 102 Array [ ... ] of ........................................................................................................................................... 102 Begin ... end; ............................................................................................................................................ 103 If ... then ... else ... .................................................................................................................................... 103 Goto ... ; ................................................................................................................................................... 103 Case ... of ... else ... end; ........................................................................................................................... 104 Repeat ... until; ......................................................................................................................................... 104 For ... to (downto) ... do ... ; ...................................................................................................................... 104 While ... do ... ;......................................................................................................................................... 105 Break; ou continue...;................................................................................................................................ 105 R Animando formulário........................................................................................................................... 105 R Como depurar ( encontrar ) possíveis erros no programa ?.................................................................... 106 R Depurando erros com Watch List ......................................................................................................... 106 R Como alinhar botões ?.......................................................................................................................... 108 R Como definir tamanho / altura para todos os botões ? .......................................................................... 109 R Abrindo link......................................................................................................................................... 109 R Como programar teclas de função Ÿ F1, F2, F3 ... ? .............................................................................. 110 R Atalho ao pressionar Ctrl A .................................................................................................................. 110 R Toca arquivo de som ............................................................................................................................ 110 R Como programar letras, números, teclas de função ? ............................................................................ 111 R Como por zeros no lado esquerdo de um número ?............................................................................... 111 R Como forçar abertura do formulário maximizado ?............................................................................... 111 R Códigos do teclado em hexadecimal..................................................................................................... 112 R Quais são as propriedades do navegador de dados ?.............................................................................. 113 R Como definir ícones para o DBNavegator ?......................................................................................... 114 R Definindo “caption”, “descrição” para o navegador de dados ............................................................... 116 R Programando os botões do navegador de registros................................................................................ 117 R Como criar botões para navegar nos registros da tabela ? ..................................................................... 118 R Como calcular percentual em um “edit” ?............................................................................................. 120 R Como converter textos para números ? ................................................................................................. 121 R Como somar valor flutuante ?............................................................................................................... 122 R Como formatar um número em um “edit” ? .......................................................................................... 122 R Como “somar” e “dividir” ? ................................................................................................................. 122 R Como remover ponto decimal ?............................................................................................................ 123 R Como arredondar valor ? ( 1 )............................................................................................................... 123 R Como arredondar valor ? ( 2 ).............................................................................................................. 123 R Como formatar “zeros” no lado esquerdo do número ? ......................................................................... 124 R Como formatar valor ? ......................................................................................................................... 124 R Função “copy” ..................................................................................................................................... 124 R Função “pos” ....................................................................................................................................... 125 R Como aceitar somente “letras” em um “edit” ? ..................................................................................... 125 R Como fazer decisão composta ( variáveis ) ? ........................................................................................ 125 R Como usar “Case … of … else … end” ? ( 1 )..................................................................................... 126 R Case … of … else … end ( 1 )........................................................................................................... 126 Delphi Aplicado - by Jurandir A. Pellin ( e-mail: [email protected] ) 209 R Case … of … else … end ( 2 )........................................................................................................... 127 R Case ... of ... else … end ( 3 )............................................................................................................... 127 R Atalhos importantíssimos do editor de códigos ( shortcuts ).................................................................. 128 R Como usar componente “CheckBox” ?................................................................................................ 128 R Diferença de dias - DaysBetween ......................................................................................................... 129 R Como usar “If ... else ... end” ? ............................................................................................................. 129 R Como usar o operador “or” ? ( 1 )........................................................................................................ 130 R Como usar o operador “or” ? ( 2 )........................................................................................................ 131 R Diferença de anos - YearsBetween ....................................................................................................... 131 R Como usar o operador “and” ?.............................................................................................................. 131 R Com usar os componentes “ComboBox e CheckBox” ? ....................................................................... 132 R Como formatar “data” e “hora” ?.......................................................................................................... 134 R Pesquisando registros com “InputBox e SetRange” .............................................................................. 135 R Pesquisando registros com “InputQuery” x “InputBox”........................................................................ 135 R Gravando registro mediante confirmação – Sim ou Não. ...................................................................... 137 R Como usar o componente “RadioGroup” ? ........................................................................................... 137 R Como criar cores personalizadas ( sistema RGB ) ?.............................................................................. 138 R Como filtrar registro em um “ListBox” ?.............................................................................................. 139 R Abre Outlook ....................................................................................................................................... 140 R Mostra IP atual..................................................................................................................................... 141 R Como criar uma tabela via programação ? ............................................................................................ 141 R Maneiras de procurar registros nas tabelas............................................................................................ 142 è PROCURA 1 - Procura registros através de um “índice primário”....................................................... 142 è PROCURA 2 - Procura registros através de um “índice primário”...................................................... 146 è PROCURA 3 - Procura registros através de um “índice secundário” ................................................... 147 è PROCURA 4 - Procura registros através de um “índice secundário” ................................................... 148 è PROCURA 5 - Procura registros através de “qualquer campo”............................................................ 148 è PROCURA 6 - Procura registros através de “qualquer campo”............................................................ 149 R O que é SQL ? SQL w Structured Query Language........................................................................... 149 R SQL w Como classificar registros com SQL ? ...................................................................................... 150 R SQL w Procurando registro com SQL................................................................................................... 151 R SQL w Procurando registro com parâmetro.......................................................................................... 151 R SQL w Procurando registro com SQL e InputBox:.............................................................................. 152 R SQL w Procura datas maiores ou iguais ao do sistema .......................................................................... 152 R SQL w Pesquisando “mês” – “dia-mês-ano” ......................................................................................... 153 R SQL w SQL Interativo ( visual ) com SQL Builder ............................................................................. 154 R SQL w Filtrar registros “letras iniciais” ou “período”............................................................................ 157 R SQL w Filtra registros por “valor” e “nome”......................................................................................... 158 R Principais instruções SQL .................................................................................................................... 168 Instrução SELECT.................................................................................................................................... 168 Cláusula GROUP BY ............................................................................................................................... 169 Cláusula HAVING ................................................................................................................................... 169 Cláusula ORDER BY ............................................................................................................................... 170 Cláusula WITH OWNERACCESS OPTION............................................................................................ 170 Mais exemplos de instruções SELECT, cláusula FROM ........................................................................... 170 Exemplo de cláusula GROUP BY............................................................................................................. 171 Exemplo de cláusula HAVING................................................................................................................. 171 Exemplo de cláusula ORDER BY............................................................................................................. 172 Instrução INSERT INTO .......................................................................................................................... 172 Exemplo de instrução INSERT INTO....................................................................................................... 173 Declaração UPDATE................................................................................................................................ 173 Exemplo de instrução UPDATE ............................................................................................................... 174 Instrução DELETE ................................................................................................................................... 174 Exemplo de instrução DELETE................................................................................................................ 175 Delphi Aplicado - by Jurandir A. Pellin ( e-mail: [email protected] ) 210 R SQL w Classificando registros no DBGrid com “radiogroup” ............................................................... 175 R SQL w Usuário digita linha SQL. ......................................................................................................... 177 R SQL w Filtrando registros com ComboBox........................................................................................... 178 R SQL w Pesquisando salários com SQL e “InputBox”............................................................................ 179 R SQL w Navegando nos registros. .......................................................................................................... 180 R SQL w Filtrando registros “letras iniciais”. ........................................................................................... 182 R SQL w Procurando registros com “locate” ............................................................................................ 183 R SQL w Filtrando registros por perído ( intervalo de datas ) .................................................................. 184 R SQL w Filtrando por período e cidade................................................................................................... 186 R SQL w Classificando registros “menu PopUP”. ................................................................................... 188 R SQL w Filtrando “datas correntes” maiores ou iguais............................................................................ 190 R SQL w Filtrando registros com “datas pagas”. .................................................................................... 191 R SQL – Procurando registro com SQL – LIKE e RadioGroup................................................................ 193 R Totalizando valores .............................................................................................................................. 194 R Somando salários da cidade solicitada .................................................................................................. 194 R Pesquisando com Query + Like ............................................................................................................ 195 R Formulário MDI................................................................................................................................... 195 R Apaga TODOS os registros da tabela ................................................................................................... 201 R Pesquisa registros em um drop-down ................................................................................................... 202 R Criando Grid zebrado ........................................................................................................................... 204 R Criando descrição com balão................................................................................................................ 205 R Encriptografando e decriptografando senhas......................................................................................... 207 R Movendo colunas no DBGrid ............................................................................................................... 207 R Formatando data FormatDateTime ....................................................................................................... 208 Delphi Aplicado - by Jurandir A. Pellin ( e-mail: [email protected] ) 211