Dec | Hex | Char | Dec | Hex | Char | Dec | Hex | Char | Dec | Hex | Char | |||
0 | 0 | NUL | 32 | 20 | . | 64 | 40 | @ | 96 | 60 | ` | |||
1 | 1 | SOH | 33 | 21 | ! | 65 | 41 | A | 97 | 61 | a | |||
2 | 2 | STX | 34 | 22 | " | 66 | 42 | B | 98 | 62 | b | |||
3 | 3 | ETX | 35 | 23 | # | 67 | 43 | C | 99 | 63 | c | |||
4 | 4 | EOT | 36 | 24 | $ | 68 | 44 | D | 100 | 64 | d | |||
5 | 5 | ENQ | 37 | 25 | % | 69 | 45 | E | 101 | 65 | e | |||
6 | 6 | ACK | 38 | 26 | & | 70 | 46 | F | 102 | 66 | f | |||
7 | 7 | BEL | 39 | 27 | ' | 71 | 47 | G | 103 | 67 | g | |||
8 | 8 | BS | 40 | 28 | ( | 72 | 48 | H | 104 | 68 | h | |||
9 | 9 | TAB | 41 | 29 | ) | 73 | 49 | I | 105 | 69 | i | |||
10 | A | LF | 42 | 2A | * | 74 | 4A | J | 106 | 6A | j | |||
11 | B | VT | 43 | 2B | + | 75 | 4B | K | 107 | 6B | k | |||
12 | C | FF | 44 | 2C | , | 76 | 4C | L | 108 | 6C | l | |||
13 | D | CR | 45 | 2D | - | 77 | 4D | M | 109 | 6D | m | |||
14 | E | SO | 46 | 2E | . | 78 | 4E | N | 110 | 6E | n | |||
15 | F | SI | 47 | 2F | / | 79 | 4F | O | 111 | 6F | o | |||
16 | 10 | DLE | 48 | 30 | 0 | 80 | 50 | P | 112 | 70 | p | |||
17 | 11 | DC1 | 49 | 31 | 1 | 81 | 51 | Q | 113 | 71 | q | |||
18 | 12 | DC2 | 50 | 32 | 2 | 82 | 52 | R | 114 | 72 | r | |||
19 | 13 | DC3 | 51 | 33 | 3 | 83 | 53 | S | 115 | 73 | s | |||
20 | 14 | DC4 | 52 | 34 | 4 | 84 | 54 | T | 116 | 74 | t | |||
21 | 15 | NAK | 53 | 35 | 5 | 85 | 55 | U | 117 | 75 | u | |||
22 | 16 | SYN | 54 | 36 | 6 | 86 | 56 | V | 118 | 76 | v | |||
23 | 17 | ETB | 55 | 37 | 7 | 87 | 57 | W | 119 | 77 | w | |||
24 | 18 | CAN | 56 | 38 | 8 | 88 | 58 | X | 120 | 78 | x | |||
25 | 19 | EM | 57 | 39 | 9 | 89 | 59 | Y | 121 | 79 | y | |||
26 | 1A | SUB | 58 | 3A | : | 90 | 5A | Z | 122 | 7A | z | |||
27 | 1B | ESC | 59 | 3B | ; | 91 | 5B | [ | 123 | 7B | { | |||
28 | 1C | FS | 60 | 3C | < | 92 | 5C | \ | 124 | 7C | | | |||
29 | 1D | GS | 61 | 3D | = | 93 | 5D | ] | 125 | 7D | { | |||
30 | 1E | RS | 62 | 3E | > | 94 | 5E | ^ | 126 | 7E | ~ | |||
31 | 1F | US | 63 | 3F | ? | 95 | 5F | _ | 127 | 7F | DEL |
quinta-feira, 30 de dezembro de 2010
Tabela Ascii
quarta-feira, 29 de dezembro de 2010
Cuidados ao usar o OnExit
Rave - Imprimindo Gráficos (Chart)
Uma coisa muito comum nos sistemas, são os relatórios com gráficos estatísticos, os famosos Charts.
Antigamente eu usava o QuickReport e o ReportBuilder, porém relatórios com gráficos só precisei fazer no QuickReport e não tive muitas dificuldade, pois ele já tem um componente que facilita a vida.
Mas, como agora larguei o QuickReport e estou usando somente o Rave, houve então a necessidade de saber como fazer relatórios nele com gráficos.
Comecei então a fuçar no Rave e percebi que não existia nenhum componente que facilitasse a vida. Então fiz algumas pesquisas na internet para saber se não existiam componentes de terceiros, mas infelizmente não achei nenhum, porém nessas pesquisas, achei duas soluções para o caso :
1 – Salvar o conteúdo de um TCustomChart em um BMP e imprimir esse BMP no Rave
2 – Usar o método WriteChartData disponível na unit RPTChart
Esta última solução é a indicada pela Nevrona.
Fiz o teste com as duas soluções e as duas foram satisfatórias, porém gostei mais da última solução, pois como disse, é indicada pela própria Nevrona e não aparenta ser uma "gambiarra" :-) como a primeira solução.
Depois desta pesquisa, resolvi escrever este artigo para demonstrar como não é um bicho de sete cabeças fazer isso funcionar.
Então vamos lá...
Antes de iniciarmos, gostaria de explicar como a "coisa funciona", para depois partirmos para prática.
O método WriteChartData, "escreve" o conteúdo de um TCustomChart dentro de um campo do tipo Graphic. Então, a princípio, nosso gráfico será montado no TChart ou TDBChart do Delphi, e depois disso, iremos utilizar o WriteChartData para fazer com que o conteúdo do gráfico seja impresso, desenhado dentro do nosso relatório.
Agora vamos colocar em prática esta teoria...
Irei utilizar um RVCustomConnection, pois não preciso estar conectado a um DataSet para gerar o gráfico no Rave, só preciso de alguém que me disponibilize um campo para poder usá-lo na impressão, então o RVCustomConnection é o ideal para isso. Para quem não sabe para que serve o RVCustomConnection, vale a pena começar a mexer nele, pois é muito interessante.
Agora é serio, chega de teoria e vamos para prática...:-)
1 - Insira os seguintes componentes no Form:
TRVProject
TRVCustomConnection
TRVSystem
TChart
2 – Na clausula uses, insira a unit RPTChart. É esta unit que nos disponibilizará o método WriteChartData
3 - Ajuste a propriedade Engine do RaveProject, apontando para o RVSystem.
4 - Ajuste o Chart, de forma que represente algum gráfico, só para podermos visualizar o resultado final.
5 – Agora iremos ajustar dois eventos do componente RVCustomConnection:
OnGetCols:
Este evento é chamado quando o Rave necessita extrair os meta-data dos campos. É aqui que criaremos nosso campo do tipo graphic. Para isso, coloque o seguinte código neste evento:
with Connection do
begin
WriteField('CampoChart', dtGraphic, 0, '', '');
end;
OnGetRow:
Este evento é chamado quando o Rave necessita extrair os valores dos campos do registro atual. É aqui que iremos alimentar o valor do campo que criamos acima. Para isso, coloque o seguinte código neste evento:
WriteChartData(Connection, Chart1);
Chart1 é o nome do TChart que inserimos no Form.
A parte de codificação já está pronta, agora vamos para parte visual.
6 – Entre no RaveDesigner
7 – Crie uma Region e dentro desta Region crie uma banda simples.
8 – Dentro da Band1(que acabou de ser criada), insira o componente MetaFile, que está na palheta Standard do Rave.
9 – Crie uma DataView, da mesma forma que se fosse criar uma outra qualquer, a diferença é que os dados agora virão de um RVCustomConnection.
10 - Após ter criado, perceba que na TreeView o DataView1 está disponível, porém se clicar no sinal de mais do DataView1 para exibir os campos, perceberá que o campo que criamos via código(CampoChart) não está disponível, só tem um campo, que é o que vem de brinde, mas não use-o. Para que o nosso campo possa ser criado, o evento OnGetCols terá que ser chamado, e como fazer isso em tempo de projeto ?
O segredo é : O RaveDesigner tem que estar aberto juntamente com a aplicação e depois chamar o Refresh do DataView.
Então vamos lá...
11 - Execute a aplicação e volte para o RaveDesigner, mas não feche a aplicação ainda.
12 – Selecione o DataView1 lá na TreeView e clique com o botão direito do mouse sobre o DataView1. Aparecerá um item chamado Refresh, basta clicar nele e...bingo :-). Pronto, o campo que criamos via código irá aparecer na lista. Quando clicar pela primeira vez no Refresh, vai aparecer uma mensagem, é uma alerta de que um campo será excluído, isso ocorre pois quando criamos a DataView, já veio aquele campo de brinde, mas como não criamos ele no OnGetCols, então a mensagem alertará de que o mesmo será excluído.
13 – Agora selecione o componente MetaFile que foi inserindo em Band1 e altere duas propriedades dele:
DataField : CampoChart (nome do campo que criamos)
DataView : DataView1 (nome da dataview criada)
Pronto...Pode executar a aplicação e fazer o teste.
Caso queira fazer o teste no próprio preview do RaveDesigner, basta deixar a aplicação aberta, caso contrário, se a aplicação não estiver aberta e você chamar o preview do RaveDesigner, receberá de presente um errinho básico, o famoso "Acess violation..." :-)
Lembre-se, o exemplo que fizemos foi com um TChart, o mesmo poderá ser feito com um TDBChart.
Outro detalhe, utilizamos um RVCustomConnection, mas poderíamos utilizar um RVDataSetConnection sem problemas, porém neste caso, só fique atento com o seguinte:
No evento OnGetCols, antes de criar o campo, chame o método DoGetCols do Connection que vem como parâmetro neste evento. Isso deve ser feito para que primeiro sejam criadas as colunas do DataSet que está associado e depois sim poder criar as suas colunas.
E no evento OnGetRow, antes de chamar o WriteChartData, chame o método DoGetRow do Connection que vem como parâmetro neste evento. Isso deve ser feito para que primeiro seja alimentando os campos do DataSet que está associado e depois sim poder alimentar seus campos criados manualmente.
Espero que um dia possa surgir um componente para utilizarmos no Rave, pois assim ficará muito mais fácil, mas enquanto isso não acontece, temos esta solução
terça-feira, 28 de dezembro de 2010
Usuário e senha do DBA do MySql
Para Windows = ODBC (Maíusculo e sem senha) – usuário root e sem senha
Para Linux = root (Minúsculo e sem senha)
Detalhe importante: O DBA pode ser acessado somente via localhost (máquina local). Depois do primeiro acesso SQL, mude os Rights se quiser acessar de outro micro na rede (mas aconselho a não fazer isso, olha a segurança!!!!!).
Alguns comandos básicos para Firebird
Como traduzir as mensagens do Delphi
segunda-feira, 20 de dezembro de 2010
Cálculo do Dígito Verificador da Chave de Acesso do CT-e
Antes de demonstrar como gerar o digito verificador, vamos entender do que é composta a chave de acesso.
A Chave de Acesso do Conhecimento de Transporte Eletrônico é representada por uma seqüência de 44 caracteres numéricos, representados da seguinte forma:
Código da UF - Código da UF do emitente do Documento Fiscal (Tamanho 2 caracteres)
Ano e Mês da Emissão (AAMM) - Ano e Mês de emissão do CT-e (Tamanho 4 caracteres)
CNPJ - CNPJ do emitente (Tamanho 14 caracteres)
Modelo - Modelo do Documento Fiscal (Tamanho 2 caracteres)
Série - Série do Documento Fiscal (Tamanho 3 caracteres)
Numero do CTe - Número do Documento Fiscal (Tamanho 9 caracteres)
Código Numérico - Código Numérico que compõe a Chave de Acesso (Tamanho 9 caracteres)
Digito - Dígito Verificador da Chave de Acesso (Tamanho 1 caractere)
O Cálculo
O dígito verificador da chave de acesso do CT-e é baseado em um cálculo do módulo 11. O módulo 11 de um número é calculado multiplicando-se cada algarismo pela seqüência de multiplicadores 2,3,4,5,6,7,8,9,2,3, ... posicionados da direita para a esquerda.
A somatória dos resultados das ponderações dos algarismos é dividida por 11 e o DV (dígito verificador) será a diferença entre o divisor (11) e o resto da divisão:
DV = 11 - (resto da divisão)
Quando o resto da divisão for 0 (zero) ou 1 (um), o DV deverá ser igual a 0 (zero).
Vamos exemplificar toda essa teoria no Delphi.
Primeiro devemos desenhar o formulário. Nesse exemplo estou utilizando dois edit’s para exemplificar melhor o funcionamento, porém em seu projeto poderá realizar tudo no mesmo Edit. Coloquei também um botão para acionar o evento do cálculo quando clicar. Veja como ficou a interface na figura 1:
O primeiro Edit vamos chamá-lo de edtChave. O segundo Edit, de edtDV.
No edtChave, vamos informar uma chave de exemplo, retirada da página 74 do Manual de Integração – Contribuinte Padrões Técnicos de Comunicação.
Chave Exemplo: 5206043300991100250655012000000780026730161. O dígito verificador dessa chave deverá ser igual à “5”
Agora vamos ao código do botão. O algoritmo foi montada de forma bem primária para facilitar o entendimento, mas lembre-se que você pode usar arrays para facilitar:
procedure TForm1.btnGerarDigitoClick(Sender: TObject); Var // Essas serão as variáveis responsáveis por armazenar cada numero da chave V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13, V14, V15, V16, V17, V18, V19, V20, V21, V22, V23, V24, V25, V26, V27, V28, V29, V30, V31, V32, V33, V34, V35, V36, V37, V38, V39, V40, V41, V42, V43: Real; // as variáveis abaixo serão responsáveis por armazenar os resultados //das multiplicações R1, R2, R3, R4, R5, R6, R7, R8, R9, R10, R11, R12, R13, R14, R15, R16, R17, R18, R19, R20, R21, R22, R23, R24, R25, R26, R27, R28, R29, R30, R31, R32, R33, R34, R35, R36, R37, R38, R39, R40, R41, R42, R43: Real; // Utilizaremos as variáveis abaixo para formulação do resultado Soma, Divisao, Resultado: Real; SomaI: integer; begin // Através do código abaixo, vamos separar os valores com a “função Copy” //da chave de acesso V1 := StrToFloat(Copy(edtChaveAcesso.Text, 1, 1)); V2 := StrToFloat(Copy(edtChaveAcesso.Text, 2, 1)); V3 := StrToFloat(Copy(edtChaveAcesso.Text, 3, 1)); V4 := StrToFloat(Copy(edtChaveAcesso.Text, 4, 1)); V5 := StrToFloat(Copy(edtChaveAcesso.Text, 5, 1)); V6 := StrToFloat(Copy(edtChaveAcesso.Text, 6, 1)); V7 := StrToFloat(Copy(edtChaveAcesso.Text, 7, 1)); V8 := StrToFloat(Copy(edtChaveAcesso.Text, 8, 1)); V9 := StrToFloat(Copy(edtChaveAcesso.Text, 9, 1)); V10 := StrToFloat(Copy(edtChaveAcesso.Text, 10, 1)); V11 := StrToFloat(Copy(edtChaveAcesso.Text, 11, 1)); V12 := StrToFloat(Copy(edtChaveAcesso.Text, 12, 1)); V13 := StrToFloat(Copy(edtChaveAcesso.Text, 13, 1)); V14 := StrToFloat(Copy(edtChaveAcesso.Text, 14, 1)); V15 := StrToFloat(Copy(edtChaveAcesso.Text, 15, 1)); V16 := StrToFloat(Copy(edtChaveAcesso.Text, 16, 1)); V17 := StrToFloat(Copy(edtChaveAcesso.Text, 17, 1)); V18 := StrToFloat(Copy(edtChaveAcesso.Text, 18, 1)); V19 := StrToFloat(Copy(edtChaveAcesso.Text, 19, 1)); V20 := StrToFloat(Copy(edtChaveAcesso.Text, 20, 1)); V21 := StrToFloat(Copy(edtChaveAcesso.Text, 21, 1)); V22 := StrToFloat(Copy(edtChaveAcesso.Text, 22, 1)); V23 := StrToFloat(Copy(edtChaveAcesso.Text, 23, 1)); V24 := StrToFloat(Copy(edtChaveAcesso.Text, 24, 1)); V25 := StrToFloat(Copy(edtChaveAcesso.Text, 25, 1)); V26 := StrToFloat(Copy(edtChaveAcesso.Text, 26, 1)); V27 := StrToFloat(Copy(edtChaveAcesso.Text, 27, 1)); V28 := StrToFloat(Copy(edtChaveAcesso.Text, 28, 1)); V29 := StrToFloat(Copy(edtChaveAcesso.Text, 29, 1)); V30 := StrToFloat(Copy(edtChaveAcesso.Text, 30, 1)); V31 := StrToFloat(Copy(edtChaveAcesso.Text, 31, 1)); V32 := StrToFloat(Copy(edtChaveAcesso.Text, 32, 1)); V33 := StrToFloat(Copy(edtChaveAcesso.Text, 33, 1)); V34 := StrToFloat(Copy(edtChaveAcesso.Text, 34, 1)); V35 := StrToFloat(Copy(edtChaveAcesso.Text, 35, 1)); V36 := StrToFloat(Copy(edtChaveAcesso.Text, 36, 1)); V37 := StrToFloat(Copy(edtChaveAcesso.Text, 37, 1)); V38 := StrToFloat(Copy(edtChaveAcesso.Text, 38, 1)); V39 := StrToFloat(Copy(edtChaveAcesso.Text, 39, 1)); V40 := StrToFloat(Copy(edtChaveAcesso.Text, 40, 1)); V41 := StrToFloat(Copy(edtChaveAcesso.Text, 41, 1)); V42 := StrToFloat(Copy(edtChaveAcesso.Text, 42, 1)); V43 := StrToFloat(Copy(edtChaveAcesso.Text, 43, 1)); // Conforme explicado anteriormente neste artigo, faremos a multiplicação // por 2,3,4,....9 R43 := V43 * 2; R42 := V42 * 3; R41 := V41 * 4; R40 := V40 * 5; R39 := V39 * 6; R38 := V38 * 7; R37 := V37 * 8; R36 := V36 * 9; R35 := V35 * 2; R34 := V34 * 3; R33 := V33 * 4; R32 := V32 * 5; R31 := V31 * 6; R30 := V30 * 7; R29 := V29 * 8; R28 := V28 * 9; R27 := V27 * 2; R26 := V26 * 3; R25 := V25 * 4; R24 := V24 * 5; R23 := V23 * 6; R22 := V22 * 7; R21 := V21 * 8; R20 := V20 * 9; R19 := V19 * 2; R18 := V18 * 3; R17 := V17 * 4; R16 := V16 * 5; R15 := V15 * 6; R14 := V14 * 7; R13 := V13 * 8; R12 := V12 * 9; R11 := V11 * 2; R10 := V10 * 3; R9 := V9 * 4; R8 := V8 * 5; R7 := V7 * 6; R6 := V6 * 7; R5 := V5 * 8; R4 := V4 * 9; R3 := V3 * 2; R2 := V2 * 3; R1 := V1 * 4; // Somaremos os valores obtidos dos resultados das multiplicações Soma := R1 + R2 + R3 + R4 + R5 + R6 + R7 + R8 + R9 + R10 + R11 + R12 + R13 + R14 + R15 + R16 + R17 + R18 + R19 + R20 + R21 + R22 + R23 + R24 + R25 + R26 + R27 + R28 + R29 + R30 + R31 + R32 + R33 + R34 + R35 + R36 + R37 + R38 + R39 + R40 + R41 + R42 + R43; SomaI := Trunc(Soma); Divisao := (SomaI mod 11); Resultado := 11 - Divisao; // Compara se o resultado é igual a 1 (Se for deverá ser = 0) if Resultado = 1 then edtDV.Text := '0' else edtDV.Text := FloatToStr(Resultado); end;Pronto!! Agora é só adaptar o algoritmo ao seu projeto. Para customizar e reduzir o tamanho do código, você poderá utilizar arrays para alimentação das variáveis e multiplicação dos resultados.
quarta-feira, 3 de novembro de 2010
Trabalhando com horas
Se você esta querendo fazer um acumulador de horas, você pode criar dois acumuladores, um para horas, e, outro para minutos.
Exemplo:
Type
TypeHora:Array[1..2] of interger;
Procedure Acumula:TypeHora;
Var
Hora,minuto:Integer;
Begin
Hora:=Hora+StrToInt(Copy(DateTimeToStr(Time()),1,2));
Minuto:=Minuto+StrToInt(Copy(DataTimeToStr(Time()),4,5));
If Minuto >= 60 Then Begin
Hora:=Hora+1;
Minuto:=0;
end;
Acumula[1]:=Hora;
Acumula[2]:=Minuto;
End;
Desta forma voce pode armazemar por exemplo o numero de horas que uma pessoa trabalhou durante o mes...
Validar datas
try
StrToDate(Edit1.Text); //--Entre parenteses informar a data a ser validada.
except
on EConvertError do
ShowMessage ('Data Inválida!');
end;
Obtendo o extenso do mês passado por parâmetro
Function MesExtenso (xMes : Variant) : string;
Var
Dia, Mes, Ano : Word;
begin
Mes := 0;
Case VarType (xMes) of
VarDate : DecodeDate (xMes, Ano, Mes, Dia);
VarString :
Try
Mes := StrToInt (xMes);
Except
End;
else
Try
Mes := Round (xMes);
Except
End;
end;
case Mes of
1: Result := 'Janeiro';
2: Result := 'Fevereiro';
3: Result := 'Março';
4: Result := 'Abril';
5: Result := 'Maio';
6: Result := 'Junho';
7: Result := 'Julho';
8: Result := 'Agosto';
9: Result := 'Setembro';
10: Result := 'Outubro';
11: Result := 'Novembro';
12: Result := 'Dezembro';
else
Result := '';
end;
end;
Obtendo o próximo dia útil caso a data informada caia em um fim de semana
Function ProximoDiaUtil (dData : TDateTime) : TDateTime;
begin
if DayOfWeek(dData) = 7 then
dData := dData + 2
else
if DayOfWeek(dData) = 1 then
dData := dData + 1;
ProximoDiaUtil := dData;
end;
Quantos fins de semana já se passaram no corrente ano
A função abaixo retorna quantos finais de semana já se passaram no ano corrente:
function WeekNum(const TDT:TDateTime) : Word;
var
Y,M,D:Word;
dtTmp:TDateTime;
begin
DecodeDate(TDT,Y,M,D);
dtTmp := EnCodeDate(Y,1,1);
Result := (Trunc(TDT-dtTmp)+(DayOfWeek(dtTmp)-1)) DIV 7;
if Result = 0 then begin
Result := 51
end
else
begin
Result := Result-1;
end;
End;
segunda-feira, 18 de outubro de 2010
Conceito de Banco de Dados
• | Clique em File/New/Table |
• | Escolha o tipo da nova tabela, Paradox 7 |
• | Aparece uma janela para que você defina a estrutura de campos, índices e demais opções necessárias na criação da tabela |
• | Em Field Name, você escolhe o nome do campo, com até 25 caracteres |
• | Em Type, o Tipo do campo, com a barra de espaço ou o botão direito do mouse você pode escolher o tipo a partir de uma lista |
• | Size é o tamanho do campo, usado somente em alguns tipos de campos |
• | Key especifica os campos que farão parte da chave primária, que não pode se repetir e deve ser composta pelos primeiros campos da tabela |
Opção | Descrição |
Validity Checks | Validações para os campos, como obrigatoriedade, valor mínimo e máximo |
Table Lookup | Indica que o valor atribuído a um determinado campo tem que estar gravado em outra tabela |
Secondary Indexes | Cria índices secundários |
Referential Integrity | Cria integridade referencial, geralmente utilizada em relacionamentos de 1 para N. |
Password Security | Permite a criação de senhas, protegendo a tabela de acesso não autorizado |
Table Language | Especificar o driver de língua utilizado pela tabela, geralmente é o Pdox ANSI Intl850 |
Dependent Tables | Mostra todas as tabela dependentes através da integridade referencial |
Tipo | Descrição | Faixa | Tamanho |
A | Alfanumérico | 1-255 | |
N | Numérico | ± 10 308 | |
$ | Monetário | ||
S | Short Integer | ± 32767 | |
I | Long Integer | ± 2147483648 | |
D | Data | ||
T | Hora | ||
@ | Data e Hora de modificação | ||
M | Memo | 1-240* | |
G | Gráfico | 1-240* | |
L | Lógico | True/False | |
+ | Autoincremental | 1-2147483648 |
Propriedades | Descrição |
AliasName | Nome do Alias do banco de dados, usado quando você criar um Alias da BDE |
Connected | Define se a conexão com o banco de dados está ativa |
DatabaseName | Nome do Alias local a ser usado pelos outros componentes do Delphi |
DataSetCount | Número de DataSets (Tabelas) abertos no banco de dados |
DataSets | Lista com os DataSets abertos |
DriverName | Driver usado para criar um Alias local, automaticamente cancela a propriedade AliasName |
InTransaction | Define se o Database está em transação |
KeepConnection | Define se a conexão com o banco de dados será mantida, mesmo sem DataSets abertos |
LoginPrompt | Define se será mostrado o quadro de login padrão da BDE |
Params | Parâmetros do banco de dados, com itens semelhantes à seção Definition do Database Explorer |
TransIsolation | Nível de isolamento da transação, define como uma transação irá enxergar outra |
Métodos | Descrição |
Close | Encerra a conexão com o banco de dados, todos os DataSets serão fechados |
CloseDataSets | Fecha todos os DataSets abertos, mas a conexão não é encerrada |
Commit | Grava alterações feitas durante a transação |
Open | Abre a conexão com o banco de dados |
Rollback | Anula todas as alterações feitas durante a transação |
StartTransaction | Inicia uma transação |
Eventos | Descrição |
OnLogin | Evento usado quando você quiser escrever seu próprio método de conexão com o banco de dados |
• | Inclua um novo DataModule |
• | Adicione ao DataModule um Table e um DataSource |
• | No Table Coloque em DatabaseName o nome do Alias criado pela propriedade DatabaseName do Database e em TableName, o nome da tabela |
• | No evento OnCreate do DataModule, chame o método Open do componente Table |
• | No DataSource coloque em DataSet o nome do componente TTable |
• | No Form, para definir a interface com o usuário, use os componentes de controle de dados que estão na página DataControls, basicamente DBEdit e DBNavigator |
• | Para poder acessar os dados, coloque a Unit onde está o DataModule no uses da Unit do Form |
• | Em todos os componentes DataControls, escolha na propriedade DataSource, o componente DataSource criado no DataModule |
• | Em alguns controles, como no DBEdit, deve ser especificado também o campo da tabela, na propriedade DataField |
Propriedades | Descrição |
Active | Define se a tabela esta aberta ou fechada |
BOF | Informa se está no início da tabela |
CanModify | Define se a aplicação pode inserir, deletar ou alterar registros |
DatabaseName | Nome do banco de dados onde está a tabela, deve ser escolhido um Alias, que pode ser local |
EOF | Informa se está no fim da tabela |
Exclusive | Define se a tabela pode ser compartilhada por outro usuário |
FieldCount | Número de campos da tabela |
FieldDefs | Lista com a Definição dos campos da tabela |
Fields | Lista de objetos do tipo TField, que representam os campos da tabela |
Filter | String com uma condição de filtragem |
Filtered | Define se a tabela é filtrada |
IndexFieldNames | Nome dos campo de índice, usados para ordenar os registros da tabela |
IndexName | Nome do índice atual, vazia quando o índice for a chave primária |
IndexDefs | Lista com a definição dos índices |
MasterFields | Campos usados no relacionamento com a tabela mestre |
MasterSource | DataSource da tabela mestre em uma relação Mestre/Detalhe |
Modified | Define se o registro atual foi modificado |
ReadOnly | Define se a tabela é somente para leitura |
RecNo | Número do registro atual |
RecordCount | Número de registros |
State | Estado da tabela |
TableName | Nome da tabela |
TableType | Tipo da tabela |
Método | Descrição |
AddIndex | Cria um novo índice, a tabela deve ser exclusiva |
Append | Entra em modo de inserção e, ao gravar, o registro será colocado no fim do arquivo |
AppendRecord | Insere um registro no final do arquivo através de código |
Cancel | Cancela as alterações feitas no registro atual |
Close | Fecha a tabela |
CreateTable | Cria uma tabela, depende de FieldDefs e IndexDefs |
Delete | Exclui o registro corrente |
DeleteIndex | Exclui um índice |
DeleteTable | Exclui a tabela |
DisableControls | Desabilita a atualização dos controles visuais |
Edit | Permite a alteração dos campos do registro atual |
EmptyTable | Apaga todos os registro da tabela, para isso a tabela não pode esta sendo compartilhada |
EnableControls | Habilita os controles visuais |
FieldByName | Acessa um campo, do tipo TField, pelo nome |
FindKey | Procura o registro com os valores exatos aos dos parâmetros nos campos do índice atual |
FindNearest | Procura o registro com os valores mais aproximados aos dos parâmetros nos índices |
First | Move para o primeiro registro |
Insert | Entra em modo de inserção de um novo registro na posição atual |
InsertRecord | Adiciona um novo registro, já com os dados, na posição atual |
IsEmpty | Define se a tabela está vazia |
Last | Move para o último registro |
Locate | Procura um registro, usando ou não índices, de acordo com a disponibilidade |
LockTable | Trava a tabela |
Lookup | Procura um registro e retorna valores dos campos deste |
MoveBy | Move um número específico de registros |
Next | Move para o próximo registro |
Open | Abre a tabela |
Post | Grava as alterações no registro atual |
Prior | Move para o primeiro registro |
Refresh | Atualiza a tabela com os dados já gravados |
RenameTable | Renomeia a tabela |
UnlockTable | Destrava a tabela |
Evento | Descrição |
AfterCancel | Após do método Cancel |
AfterClose | Após o fechamento da tabela |
AfterDelete | Após do método Delete |
AfterEdit | Após do método Edit |
AfterInsert | Após do método Insert |
AfterOpen | Após do método Open |
AfterPost | Após do método Post |
AfterScroll | Após mudar de registro |
BeforeCancel | Antes do método Cancel |
BeforeClose | Antes do fechamento da tabela |
BeforeDelete | Antes do método Delete |
BeforeEdit | Antes do método Edit |
BeforeInsert | Antes do método Insert |
BeforeOpen | Antes do método Open |
BeforePost | Antes do método Post |
BeforeScroll | Antes de mudar o registro |
OnCalcFields | Evento usado para calcular os valores dos campos calculados |
OnDeleteError | Quando ocorre um erro ao chamar o método Delete |
OnEditError | Quando ocorre um erro ao chamar o método Edit |
OnFilterRecord | Evento usado com filtragem variável |
OnNewRecord | Quando a tabela entra em modo de inserção, não deixa Modified igual a True |
OnPostError | Quando ocorre um erro ao chamar o método Post |
• | No uses da Unit detalhe, Pedidos, inclua a Unit da tabela mestre, Clientes |
• | Na Table detalhe, Pedidos, Coloque em MasterSource o DataSource da tabela mestre, Clientes |
• | Em MasterFields, chame o Fields Links Designer e escolha os campos de ligação das tabelas, no caso, CodCli para as duas tabelas |
Propriedades | Descrição |
Alignment | Alinhamento do texto do campo nos controles visuais |
AsBoolean | Valor do campo convertido para Boolean |
AsCurrency | Valor do campo convertido para Currency |
AsDateTime | Valor do campo convertido para DataTime |
AsFloat | Valor do campo convertido para Double |
AsInteger | Valor do campo convertido para Integer |
AsString | Valor do campo convertido para string |
AsVariant | Valor do campo convertido para Variant |
Calculated | Indica se o campo é calculado em tempo de execução |
CanModify | Indica se um campo pode ser modificado |
ConstraintErrorMessage | Mensagem de erro se a condição de CustomConstraint não for satisfeita |
CustomConstraint | Condição de validação do campo |
DataSet | DataSet onde está o campo |
DataSize | Tamanho do campo, em Bytes |
DataType | Propriedade do tipo TFieldType, que indica o tipo do campo |
DefaultExpression | Expressão com valor Default do campo para novos registros |
DisplayLabel | Título a ser exibido para o campo |
DisplayText | Texto exibido nos controles visuais associados ao campo |
DisplayWidth | Número de caracteres que deve ser usado para mostrar o campo no controles visuais |
EditMask | Máscara de edição do campo |
FieldKind | Propriedade do tipo TFieldKind que indica o tipo do campo, como Calculado ou Lookup |
FieldName | Nome do campo na tabela |
FieldNo | Posição física do campo na tabela |
Index | Posição do campo nos controles visuais |
IsIndexField | Indica se um campo é válido para ser usado como índice |
IsNull | Indica se o campo está vazio |
KeyFields | Campo chave da tabela no relacionamento com LookupDataSet, usado em campos Lookup |
Lookup | Indica se um campo é Lookup |
LookupCache | Define se será usado cache para campos Lookup |
LookupDataSet | DataSet onde está definido o valor do campo Lookup |
LookupKeyFields | Campo chave do relacionamento em LookupDataSet |
LookupResultField | Valor do campo, que será mostrado nos controles visuais |
ReadOnly | Define se um campo é somente para leitura |
Required | Define se o campo é obrigatório |
Size | Tamanho físico do campo |
Text | Texto de edição do campo |
Value | Acesso direto ao valor do campo |
Visible | Define se um campo é visível |
Eventos | Descrição |
OnChange | Chamado quando o valor do campo é mudado |
OnSetText | Chamado pelos controles visuais para atribuir o texto digitado pelo usuário ao campo |
OnGetText | Chamado para formatar o texto de exibição do campo |
OnValidate | Validação do valor atribuído ao campo, caso o valor não seja válido, gere uma exceção |
Método | Descrição |
Assign | Atribui um valor de um campo a outro, inclusive nulo |
FocusControl | Seta o foco para o controle visual ligado ao campo nos Forms |
Clear | Limpa o conteúdo do campo |
TStringField | TBlobField | TTimeField |
TSmallintField | TIntegerField | TBytesField |
TFloatField | TWordField | TVarBytesField |
TCurrencyField | TAutoIncField | TGraphicField |
TBooleanField | TBCDField | TMemoField |
TDateField | TDateTimeField |
Propriedades | Descrição |
MaxValue | Valor máximo para o campo |
MinValue | Valor mínimo para campo |
DisplayFormat | Formato de apresentação do campo, como ,0.00” %” ou ,0.##” Km” |
EditFormat | Formato de edição do campo |
Currency | Define se um campo é monetário |
DisplayValues | Usado com campos Boolean, define o texto para True e False, como Sim;Não |
Métodos | Descrição |
LoadFromFile | Carrega o conteúdo do campo de um arquivo |
SaveToFile | Salva o conteúdo do campo para um arquivo |
• | Usando o objeto TField ligado ao campo. |
• | Usando a notação de colchetes. Se você não especificar nenhuma propriedade, é assumida a propriedade Value por padrão. |
• | Através do método FieldByName |
• | Usando a lista Fields do TTable |
• | Abra o Fields Editor do Table desejado, Empréstimos |
• | Clique com o direito e escolha New Field |
• | No quadro New Field, escolha as propriedades do campo como descrito em campos calculados, mas em Field type, escolha Lookup |
• | Em Key Fields escolha o campo da tabela que faz parte do relacionamento, CodLivro |
• | DataSet é a tabela onde está a descrição, Livros |
• | Em Lookup Keys, escolha o campo de DataSet que faz parte do relacionamento, CodLivro |
• | Finalmente, escolha em Result field o campo de DataSet que vai ser mostrado para o usuário, Título |
Propriedade | Descrição |
AutoEdit | Define se a tabela entrará em modo de edição assim que o usuário digitar novos valores nos controles |
DataSet | DataSet ao qual o TDataSource faz referência |
Evento | Descrição |
OnDataChange | Ocorre quando o DataSet é alterado, ao mudar de registro ou mudar os valores dos campos |
OnStateChange | Ocorre quando o estado do DataSet é alterado |
OnUpdateData | Ocorre antes de uma atualização |
Propriedades | Descrição |
VisibleButtons | Define os botões que serão visíveis |
Hints | Hints exibidos pelos botões |
ConfirmDelete | Define se será solicitado uma confirmação antes da exclusão |
Eventos | Descrição |
BeforeAction | Quando um botão do Navigator é pressionado, antes da ação ser executada |
OnClick | Quando um botão do Navigator é pressionado, depois da ação ser executada |
Propriedades | Descrição |
Columns | Lista do tipo TDBGridColumns, com as colunas da Grid, cada item da lista é do tipo TColumn |
Fields | Lista de objetos TField mostrados nas colunas |
Options | Set com as opções da Grid, como ConfirmDelete, MultiSelect, ColumnResize |
SelectedField | Campo da coluna selecionada |
SelectedIndex | Índice da coluna selecionada |
SelectedRows | Lista do tipo TBookmarkList, com os registros selecionados em uma Grid com MultiSelect |
TitleFont | Fonte do título das colunas |
FixedColor | Cor Fixa, usada nas colunas e indicadores |
Eventos | Descrição |
OnCellClick | Ao clicar em uma célula da Grid |
OnColEnter | Quando uma célula de alguma coluna da Grid recebe o foco |
OnColExit | Quando uma célula de alguma coluna da Grid perde o foco |
OnColumnMoved | Quando o usuário mover uma coluna |
OnDrawDataCell | Evento usado para personalizar a forma de desenhar os dados que são apresentados na Grid |
OnEditButtonClick | Ao clicar no botão de edição de uma célula, mostrado pela propriedade ButtonStyle da coluna |
OnTitleClick | Ao clicar no título das colunas |
Propriedades | Descrição |
ButtonStyle | Botão mostrado ao editar as células da coluna |
Field | Objeto TField ligado à coluna |
FieldName | Nome do campo ligado à coluna |
PickList | TStrings com os itens da lista DropDown usada nas células da coluna |
Title | Propriedade do tipo TColumnTitle com as opções do título da coluna |
Propriedades | Descrição |
DataField | Campo ao qual o controle está ligado |
Propriedades | Descrição |
ValueChecked | Valor a ser armazenado quando está selecionado |
ValueUnchecked | Valor a ser armazenado quando não está selecionado |
Propriedades | Descrição |
Values | Valor a ser armazenado para cada botão de rádio |
Propriedades | Descrição |
ListSource | DataSource que contém os valores a serem exibidos na lista |
ListField | Campo de ListSource que será exibido |
KeyField | Campo de ListSource usado no relacionamento |
1. | Crie uma aplicação que cadastre os Clientes de uma empresa e as Compras feitas por estes Clientes, permita inclusão, alteração, exclusão e consulta aos dados cadastrados. Na janela principal fica o cadastro de Clientes, com a grade de visualização de suas Compras, crie também uma Janela para localizar Clientes por Nome. |
2. | Uma academia de ginástica deseja manter um controle maior sobre seus Alunos, para isso ela organizou os clientes em turmas. Os dados de uma Turma são Número de alunos, Horário da aula, Duração da aula, Data inicial, Data final e Instrutor. Deve ser feita também uma tabela de instrutores para evitar a digitação repetitiva do Nome. Os dados dos Alunos são Matrícula, Data de Matrícula, Nome, Endereço, Bairro, Cidade, Estado, Telefone, Data de nascimento, Altura e Peso. Crie um banco de dados, normalizado, para guardar essas informações. |