Buscar

Fieldbyname e fields vs fieldvalues

nome

Héracles Alencar

Colunista ainda sem descrição. Caro colunista, por favor envie-nos sua descrição.

FieldByName e Fields vs FieldValues

Por: Héracles Alencar
        heracles_alencar@hotmail.com

É ótimo e prazeroso saber que estou escrevendo meu primeiro artigo para este site que, apesar de ser novo nele, tanto prezo e muito tem me ajudado.

Antes de iniciar, saudações a todos os leitores deste!

Estive dando uma passada pela Net e percebi que existem muitas perguntas referentes a erros do BDE. Não só em nosso Fórum mas em outras comunidades Delphi é comum o uso de algumas técnicas de TDataSet para atribuir ou mapear valores de uma tabela. Gostaria de fazer uma explanação sobre um assunto referente. Lembro aos leitores que o artigo é uma comparação de métodos que podem ser usados em registros de TDataSet, defendendo o uso de FieldValues[ ], não a solução de todos os erros do BDE que possam existir, embora a adoção do método aqui descrito poderá diminuir essa margem de erro. Confira!

A Função FieldByName( )

FieldByName( ) aceita um parâmetro de string que retorna o valor de algum campo no registro atual do DataSet. Estou fazendo referência a Classe TDataSet em um contexto geral, ou seja, TDBEDataSet é descendente de TDataSet, portanto qualquer componente descendente do mesmo, como o TTable, para fins de explicação deste, trato como simplesmente DataSet.

Um exemplo para a sintaxe básica para a chamada do método FieldByName seria:

Table1.FieldByName('NomeCampo').AsX

Considerando que, Table1 é um componente descendente de TDataSet. ...('NomeCampo') é o nome do campo ao qual você quer se referir e AsX é uma propriedade para acessar campos de um componente TField, retornando um valor de determinado tipo. As propriedades AsX e seus respectivos valores de retorno seguem abaixo:

 Propriedade Tipo de Retorno
 AsBoolean  Boolean 
 AsString  String
 AsInteger  LongInt
 AsFloat  Double
 AsDateTime  TDateTime
 AsValue  Variant
 
Exemplo 1 - Uso de FieldByName( )

procedure TForm1.Button1Click(Sender: TObject);
Var
 S: String;
 I: Integer;
begin
 S := Table1.FieldByName('Nome').AsString;
 I := Table1.FieldByName('Codigo').AsInteger;
 ShowMessage(S);
 ShowMessage(IntToStr(I));
End;

Para o uso de FieldByName é necessário que se saiba o tipo de campo que se está acessando, para tal, procure a propriedade DataType de TField que indica o tipo de dados com relação à Tabela do Banco de Dados. A propriedade DataType é de TFieldType que é definido da seguinte forma:

type
TFieldType = (ftUnknown, ftString, ftSmallint, ftInteger, ftWord,ftBoolean, ftFloat, ftCurrency, ftBCD, ftDate, ftTime, ftDateTime, ftBytes, ftVarBytes, ftAutoInc, ftBlob, ftMemo, ftGraphic, ftFmtMemo, ftParadoxOle, ftDBaseOle, ftTypedBinary, ftCursor, ftFixedChar, ftWideString,ftLargeint, ftADT, ftArray, ftReference, ftDataSet, ftOraBlob, ftOraClob, ftVariant, ftInterface, ftIDispatch, ftGuid, ftTimeStamp, ftFMTBcd)
;

A Propriedade Fields[ ]

A Propriedade de Array Fields[ ] é baseado em zero com Objetos TField, sendo que Fields[1] retorna um TField representando o segundo campo lógico do DataSet. Pra quem tem curiosidade de saber como TField é implementado procure-o na unidade DB.

Dica: Declare uma variável qualquer do tipo TField, segure Ctrl e clique na palavra TField que o Delphi buscará a unidade correspondente, depois é só usar o Exploring e mergulhar no que a nossa tão querida e amada Borland nos produziu.

A mesma regra de TFieldType para FieldByName( ) deve ser aplicado para Fields[ ]. Um exemplo de Fields[ ] no lugar de FieldByName é mostrado a seguir:

Exemplo 2 - Uso de Fields[ ]

procedure TForm1.Button1Click(Sender: TObject);
Var
 S: String;
 I: Integer;
begin
 S := Table1.Fields[1].AsString; //Campo Nome
 I := Table1.Fields[0].AsInteger; //Campo Codigo
 ShowMessage(S);
 ShowMessage(IntToStr(I));
End;

Para acessar o nome de um campo de um DataSet use a propriedade FieldName de TField.

Exemplo 3 - Uso de FieldName

procedure TForm1.Button1Click(Sender: TObject);
Var
 S: String;
begin
 S := Table1.Fields[0].FieldName;
end;

Se tiver apenas o nome do campo e quiser saber o valor lógico do campo, use a propriedade FieldNo. Proceda:

Exemplo 4 - Uso de FieldNo

procedure TForm1.Button1Click(Sender: TObject);
Var
 I: Integer;
begin
 I := Table1.FieldByName('Nome').FieldNo;
end;

A Propriedade FieldValues[ ]

A Propriedade de Array Padrão FieldValues[ ] de TDataSet retorna o valor de um campo como um Tipo de Dado Variant. Sendo FieldValues um propriedade padrão, não é necessário que seja referenciada o nome da propriedade.

Os leitores perceberão que o uso de FieldValues substitui significativamente a digitação de mais código e é menos passível de erros devido o poder do tipo de dado Variant. Em um outro artigo pretendo demonstrar a forma de se utilizar um tipo de dados Variant e descrever um pouco sobre OleVariant.

Indo diretamente ao que interessa:

Exemplo 5 - Uso de FieldValues

procedure TForm1.Button1Click(Sender: TObject);
Var
S: String;
I: Integer;
begin
S := Table1.FieldValues['Nome'];
I := Table1.FieldValues['Codigo'];
ShowMessage(S)
ShowMessage(IntToStr(I));
end;

O código acima pode ser simplificado para:

Exemplo 6 - Simplificação FieldValues

procedure TForm1.Button1Click(Sender: TObject);
Var
 S: String;
 I: Integer;
begin
 S := Table1['Nome'];
 I := Table1['Codigo'];
 ShowMessage(S);
 ShowMessage(IntToStr(I));
end;

Torna-se possível esta simplificação devido FieldValues ser a propriedade padrão.

Notem que as propriedades de TField (AsString e AsInteger) são excluídas. Isso acontece porque o tipo Variant é compatível com tipos nativos do Delphi e outros derivados.

Concluindo

Tanto a Função FieldByName quanto a Propriedade Fields continuam no Delphi apenas para manter compatibilidade entre as versões. São técnicas do Delphi 1 de 16 bits, de modo que, o uso de FieldValues torna o código menos passível de erros e mais cômodo e rápido. Economiza muita digitação desnecessária. Uma capacidade poderosa de FieldValues é a de armazenar os valores de vários campos em um Array do Tipo de Dados Variant (ArrayVariant := Table1['Codigo; Nome; Endereço; Fone; CPF'];). As únicas desvantagens são que o índice do Array Variant precisa ser baseado em zero e o conteúdo precisa ser varVariant.

Espero, sinceramente que tenham apreciado este artigo e que ele valha de alguma coisa em seus Projetos Delphi. Usei o Livro Delphi 5 - Guia do Desenvolvedor, dos Autores Steve Teixeira e Xavier Pacheco, como fonte de consulta para resgatar alguns métodos esquecidos. Qualquer dúvida ou comentário podem entrar em contato ou usar a seção de comentários.

Gostaria de agradecer a usuária deste site Patrícia que me ajudou no processo de desenvolvimento deste artigo, conversando e trocando idéias. Ela não sabe mas, isso muito me ajudou. Obrigado!

 

 

 

Publicidade

Vote no artigo




Quantidade de votos: 2 votos
Aceitação: 20%


Detalhes do artigo

Categoria: Banco de dados
Adicionado dia: 26/02/05
Por: Héracles Alencar
Visualizado: 51708 vezes

Planeta Delphi - Tudo sobre programação Delphi Planeta Delphi - www.planetadelphi.com.br - Todos os direitos reservados | Copyright 2001-2009