paulobergo Postado Março 9, 2007 Denunciar Share Postado Março 9, 2007 (editado) 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 = 13Se logico (boolean), retorna DataSize=2 e Size =0 Se Data (datetime), retorna DataSize=4 e Size =0Se Inteiro (integer), retorna DataSize=2 e Size =0e assim por diante...O caso é... onde fica a quantidade de casas decimais?Grato por qualquer ajuda!!!Abraços Editado Março 12, 2007 por paulobergo Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Março 10, 2007 Denunciar Share Postado Março 10, 2007 Se não estou enganado, existe num TFloatField (e similares) a propriedade Precision (acho que é isso), mas não estou certo se ele é atualizado com o valor vindo do banco ou se é uma propriedade que você define para o TField.Abraços Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 paulobergo Postado Março 12, 2007 Autor Denunciar Share Postado Março 12, 2007 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! Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Março 13, 2007 Denunciar Share Postado Março 13, 2007 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
paulobergo
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,
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 paulobergoLink para o comentário
Compartilhar em outros sites
3 respostass a esta questão
Posts Recomendados
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.