Ir para conteúdo
Fórum Script Brasil
  • 0

Obter A Quantidade De Decimais De Um Campo, Em Delphi6,


paulobergo

Pergunta

Oi pessoal...

Andei procurando mas não encontrei nada sobre isso...

Simples... dado um campo de uma tabela, do tipo ftFloat, ftCurrency, ftBCD...

Como recuperar a quantidade de casas decimais do campo?

Pelo DBExplorer, por exemplo, sei que um campo, p.e., precocusto é do tipo Numerico, tamanho = 14 (size), quatro casas decimais (scale=4)...

Como recuperar essa informacao pelo Delphi?

No caso,

iFieldG   := 14;
  iSize     := table1.Fields[iFieldG].Size;
  iDataSize := table1.Fields[iFieldG].DataSize;
  ShowMessage(table1.Fields[iFieldG].DisplayName+'='+
              'iDataSize='+IntToStr(iDataSize)+
              'iSize='+IntToStr(iSize));

Se o campo é string (char) de 13 caracteres (codigoean), DataSize = 14 e Size = 13

Se logico (boolean), retorna DataSize=2 e Size =0

Se Data (datetime), retorna DataSize=4 e Size =0

Se Inteiro (integer), retorna DataSize=2 e Size =0

e assim por diante...

O caso é... onde fica a quantidade de casas decimais?

Grato por qualquer ajuda!!!

Abraços

Editado por paulobergo
Link para o comentário
Compartilhar em outros sites

3 respostass a esta questão

Posts Recomendados

  • 0

Olá!

Micheus! valeu pela colaboração... mas não é bem isso... Precision parece que retorna a capacidade de um buffer para receber um valor armazenado, por exemplo, em um tFloat ou tBDC...

Então, o jeito foi resgatar, do fundo do baú, o comonente HTable da minha velha Halcn500 (componentes para acessar dBaseIII, Clipper, etc...)... e resolvi quase que por completo a parada... adaptei uma das minhas aplicações no fim de semana para poder abrir tabelas "BDE" ou tabelas MySQL...

Essa lib (Halcyon) tem a função FieldLen para obter o tamanho e a função FieldDecimals para retornar quantas casas decimais...

Infelizmente, ela não consegue abrir alguns tipos mais complexos de tabelas, como as do VisualDBase7, com campos tipo autoincremento, ou que tenham mais do que 128 campos...

Mas deu para ajudar bastante...

O que eu não entendo é que, visualizando qualquer tabela pelo dBExplorer, conseguimos obter perfeitamente o número de decimais... mas resgatar isso no Delphi é ainda um mistério...

De qualquer forma, agradeço!!!

Abraços!

Link para o comentário
Compartilhar em outros sites

  • 0
O que eu não entendo é que, visualizando qualquer tabela pelo dBExplorer, conseguimos obter perfeitamente o número de decimais... mas resgatar isso no Delphi é ainda um mistério...
Não é mistério não. Se for baixar um pouco o nível, você vai dar de cara com a BDE API. Eu já a utilizei no passado para criar uma rotina de reindexação de tabelas paradox (estavam sempre corrompendo, então...).

Dei uma pesquisada e achei um código que talvez você possa testar/adaptar. Vou colocá-lo aqui para facilitar, porque é necessário ser registrado no site para acessá-lo.

Ref. Experts Enchange (link)

//geobul:

//Here is how to use DbiOpenFieldList function:
---
type
  TForm1 = class(TForm)
    Button1: TButton;
    Table1: TTable;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}


uses BDE;

procedure fDbiOpenFieldList(Table: TTable; Physical: Boolean; List: TStrings);

function BDEFieldIntToStr(FieldType: Word): string;

begin
  case FieldType of
    fldUNKNOWN: result := 'unknown';
    fldZSTRING: result := 'string';               { Null terminated string }
    fldDATE: result := 'date';                    { Date     (32 bit) }
    fldBLOB: result := 'BLOb';                    { Blob }
    fldBOOL: result := 'boolean';                 { Boolean  (16 bit) }
    fldINT16: result := 'integer';                { 16 bit signed number }
    fldINT32: result := 'long integer';           { 32 bit signed number }

    fldFLOAT: result := 'float';                  { 64 bit floating point }
    fldBCD: result := 'BCD';                      { BCD }
    fldBYTES: result := 'bytes';                  { Fixed number of bytes }
    fldTIME: result := 'time';                    { Time        (32 bit) }
    fldTIMESTAMP: result := 'timestamp';          { Time-stamp  (64 bit) }
    fldUINT16: result := 'unsigned int';          { Unsigned 16 bit integer }
    fldUINT32: result := 'unsigned long int';     { Unsigned 32 bit integer }

    fldFLOATIEEE: result := 'float IEEE';         { 80-bit IEEE float }
    fldVARBYTES: result := 'varbytes';            { Length prefixed var bytes }
    fldLOCKINFO: result := 'lockinfo';            { Look for LOCKINFO typedef }
    fldCURSOR: result := 'Oracle cursor';         { For Oracle Cursor type }

    { Paradox types (Physical) }
    fldPDXCHAR: result := 'alpha';                { Alpha    (string) }
    fldPDXNUM: result := 'numeric';               { Numeric }

    fldPDXMONEY: result := 'money';               { Money }
    fldPDXDATE: result := 'date';                 { Date }
    fldPDXSHORT: result := 'smallint';            { Short }
    fldPDXMEMO: result := 'Memo BLOb';            { Text Memo       (blob) }
    fldPDXBINARYBLOB: result := 'Binary BLOb';    { Binary data     (blob) }
    fldPDXFMTMEMO: result := 'formatted BLOb';    { Formatted text  (blob) }
    fldPDXOLEBLOB: result := 'OLE BLOb';          { OLE object      (blob) }

    fldPDXGRAPHIC: result := 'Graphic BLOb';      { Graphics object (blob) }
    fldPDXLONG: result := 'long integer';         { Long }
    fldPDXTIME: result := 'time';                 { Time }
    fldPDXDATETIME: result := 'date time';        { Time Stamp }
    fldPDXBOOL: result := 'boolean';              { Logical }
    fldPDXAUTOINC: result := 'auto increment';    { Auto increment (long) }
    fldPDXBYTES: result := 'bytes';               { Fixed number of bytes }

    fldPDXBCD: result := 'BCD';                   { BCD (32 digits) }

    { xBASE types (Physical) }
    fldDBCHAR: result := 'character';             { Char string }
    fldDBNUM: result := 'number';                 { Number }
    fldDBMEMO: result := 'Memo BLOb';             { Memo          (blob) }
    fldDBBOOL: result := 'logical';               { Logical }
    fldDBDATE: result := 'date';                  { Date }
    fldDBFLOAT: result := 'float';                { Float }

    fldDBLOCK: result := 'LOCKINFO';              { Logical type is LOCKINFO }
    fldDBOLEBLOB: result := 'OLE BLOb';           { OLE object    (blob) }
    fldDBBINARY: result := 'Binary BLOb';         { Binary data   (blob) }
    fldDBBYTES: result := 'bytes';                { Only for TEMPORARY tables }
    fldDBLONG: result := 'long integer';          { Long (Integer) }
    fldDBDATETIME: result := 'date time';         { Time Stamp }
    fldDBDOUBLE: result := 'double';              { Double }

    fldDBAUTOINC: result := 'aut increment';      { Auto increment (long) }
  else
    Result := 'not found';
  end;
end;

var
  hFieldCur: hDBICur;
  rslt: DBIResult;
  Field: FLDDesc;
begin
  List.Clear;
  Check(DbiOpenFieldList(Table.DBHandle, PChar(Table.TableName), nil,
    Physical, hFieldCur));
  repeat
    rslt := DbiGetNextRecord(hFieldCur, dbiNOLOCK, @Field, nil);
    if (rslt = DBIERR_NONE) then begin

      List.Add(Format('%s %s %d %d', [Field.szName, BDEFieldIntToStr(Field.iFldType), Field.iLen, Field.iUnits2]));
    end;
  until (rslt <> DBIERR_NONE);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Table1.Open;
  fDbiOpenFieldList(Table1, True, Memo1.Lines);
  Table1.Close;
end;

end.
//---
//Regards, Geo

- Lista completa, classificada, das funções disponíveis - BDE Developer Suport - link

- BDE32.hlp (help da BDE API) - link para download de quem não o tem instalado. Se não me engano, quando instalado, deveria estar em "C:\Arquivos de programas\Arquivos comuns\Borland Shared\BDE"

Abraços

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      651,9k
×
×
  • Criar Novo...