ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

[RESOLVIDO]Cannot access field as type float

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
mobius1qwe
Aprendiz
Aprendiz


Registrado: Quarta-Feira, 8 de Dezembro de 2010
Mensagens: 146

MensagemEnviada: Ter Abr 14, 2015 5:15 pm    Assunto: [RESOLVIDO]Cannot access field as type float Responder com Citação

Boa tarde pessoal, sou eu de novo

Ao ler um campo do tipo NUMERIC(6,2) do banco em um StringGrid, ele traz o valor corretamente, mas no banco o valor aparece como 0.00.

Tenho a seguinte estrutura de tabela:
Código:
CREATE TABLE ControleAP(
ID INTEGER NOT NULL PRIMARY KEY,
Descricao Varchar(100),
Credito Numeric(6,2) DEFAULT 0,
Debito Numeric(6,2) DEFAULT 0
);


Quando faço a gravação sem os valores literais do maskedit, só grava os valores inteiros. Dessa forma que estou gravando, é exibido na tabela como se fosse gravado no banco, mas quando vou no SQLite expert e rodo a consulta 'SELECT * FROM ...' o campo Débito vem com valor 0.00 e isso faz o cálculo do saldo vir errado.

Código:
      CDS.FieldByName('Credito').AsString := trim(copy(MaskEdit1.Text, 3, 10));
      CDS.FieldByName('Debito').AsString := trim(copy(MaskEdit2.Text, 3, 10));


Já tentei fazer a gravação via AsFloat, AsCurrency, AsVariant, AsReal e não dá certo nenhum deles, me retorna o erro: "Cannot access field 'Debito' as type float"

O campo Debito não é campo calculado, agregado, internalcalc nem nada, é um campo de dados normal do tipo NUMERIC(6,2). É a mesma coisa que o Crédito e no campo crédito não dá problema.

Alguém poderia me ajudar?


Editado pela última vez por mobius1qwe em Sex Abr 24, 2015 2:45 pm, num total de 1 vez
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
johnny-walker
Moderador
Moderador


Registrado: Sábado, 4 de Outubro de 2003
Mensagens: 10653
Localização: Contagem/MG - BRAZIL

MensagemEnviada: Sex Abr 17, 2015 12:41 pm    Assunto: Responder com Citação

Está correto, o mesmo acontece com o delphi na questão do separador, cujo separador decimal é o . (ponto).

Veja seno maskeedit está pegando a informação correta.


bye
_________________
P.O.W.E.R B.Y D.E.L.P.H.I
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
mobius1qwe
Aprendiz
Aprendiz


Registrado: Quarta-Feira, 8 de Dezembro de 2010
Mensagens: 146

MensagemEnviada: Sex Abr 17, 2015 7:45 pm    Assunto: Responder com Citação

Sim, a informação vem corretamente.

A máscara que uso é "R$ 9999,99;1; " são 10 caracteres no total, sendo que pego só os números que é da posição 3 em diante, caso não tiver todos os números digitados, vai haver espaço em branco por isso o Trim.

Eu estava usando o quarteto mágico: SQLConnection, SQLDataSet, DataSetProvider, ClientDataSet pra manipular as informações de banco só que na hora de gravar o valor do maskedit, no banco não mostrava valor gravado, mas na hora da leitura ele vinha certinho.

Então, como uso o XE7, mudei o quarteto de conexão pra FireDAC: FDConnection e FDQuery. Com isso nos campos que eu tinha gravado anteriormente com o ClientDataSet, aparecia uma mensagem "BCD Overstack" e na hora de buscar informação do banco, trazia a mensagem de erro: "12>34 is not a valid float value" como se ao invés de usar o ponto "." ele tivesse gravando o sinal de Maior ">".

Porém agora tenho outro problema, após fazer essa conversão pro FireDAC, ao tentar gravar um valor lido do MaskEdit, não grava nada. A informação é trazida corretamente: "12,34" mesmo convertendo a vírgula pra ponto com o StringReplace() não grava nada, grava "0".

Alguma ideia de como resolver?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
mobius1qwe
Aprendiz
Aprendiz


Registrado: Quarta-Feira, 8 de Dezembro de 2010
Mensagens: 146

MensagemEnviada: Seg Abr 20, 2015 2:10 pm    Assunto: Responder com Citação

Boa tarde pessoas, resolvi o problema do MaskEdit, tirei o componente fora e botei um DBEdit, colocando o Field como currency já me traz o valor em formato de moeda não precisando usar MaskEdit.

Porém tenho agora outro problema: Inicialização

Quando inicio o aplicativo com o banco vazio, o campo calculado 'Saldo' acusa Type Mismatch no FDQuery:

Código:
---------------------------
Debugger Exception Notification
---------------------------
Project Project1.exe raised exception class EDatabaseError with message 'FDQGrid: Type mismatch for field 'Saldo', expecting: Currency actual: WideString'.
---------------------------
Break   Continue   Help   
---------------------------


o campo saldo é fruto de uma consulta:
Código:
SELECT
  c.ID,
  c.Descricao,
  c.Credito,
  c.Debito,
  ((SELECT COALESCE(SUM(Credito),0) FROM Controle c2 WHERE c2.ROWID <= c.ROWID) -
  (SELECT COALESCE(SUM(Debito),0) FROM Controle c3 WHERE c3.ROWID <= c.ROWID)) AS Saldo
FROM
  Controle c


No FDQuery Fields setei o campo Saldo como TCurrencyField. Se eu tiver valor no banco, não dá erro. Se o banco tiver vazio, dá esse erro aí. Alguém sabe como resolver?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
mobius1qwe
Aprendiz
Aprendiz


Registrado: Quarta-Feira, 8 de Dezembro de 2010
Mensagens: 146

MensagemEnviada: Sex Abr 24, 2015 2:44 pm    Assunto: Responder com Citação

Descobri a origem do problema.
Os DataSets do delphi quando criam um campo que não existe na estrutura da tabela inicialmente, criam com um tipo qualquer baseado nos tipos dos campos envolvidos no cálculo. Essa criação automática geralmente dá erro pelas fontes que andei pesquisando.

Quando o campo é criado a partir de um valor que o SQL produz, não dá problema porque o tipo é criado corretamente. A solução que usei foi explicitamente criar o campo calculado "Saldo" em caso do banco não possuir valor após a primeira inserção de dados.

Inicialmente, o banco vazio, ao invés de usar o SQL que traz o saldo, apenas faço um SELECT * FROM Tabela, após inserir o primeiro dado, refaço a consulta, dessa vez trazendo o campo Saldo e atualizando a grid com os valores.

Aqui a estrutura do DataModule:
Código:
  FDQConsulta.SQL.Add('SELECT COUNT(*) FROM ControleAP');
  FDQConsulta.Open();
  FDQGrid.Close;
  if FDQConsulta.Fields.Fields[0].AsInteger = 0 then
  begin
    FDQGrid.SQL.Clear;
    FDQGrid.SQL.Add('SELECT * FROM ControleAP');
    vazio := true;
  end
  else
  begin
    FDQGrid.SQL.Clear;
    FDQGrid.SQL := FDQBackup.SQL;
    FDQGrid.FieldDefs.Update;
    with TCurrencyField.Create(FDQGrid) do
    begin
      Name := 'Saldo';
      FieldKind := fkData;
      FieldName := 'Saldo';
      DataSet := FDQGrid;
      currency := true;
    end;
    vazio := false;
  end;


E aqui a procedure que atualiza a tabela.
Código:
procedure TfPrincipal.VerificaVazio;
begin
  if DM.vazio then
    with DM do
    begin
      FDQConsulta.Close;
      FDQConsulta.SQL.Clear;
      FDQConsulta.SQL.Add('SELECT COUNT(*) FROM ControleAP');
      FDQConsulta.Open();
      if FDQConsulta.Fields.Fields[0].AsInteger > 0 then
      begin
        FDQGrid.Close;
        FDQGrid.SQL.Clear;
        FDQGrid.SQL := FDQBackup.SQL;
        FDQGrid.FieldDefs.Update;
        with TCurrencyField.Create(FDQGrid) do
        begin
          Name := 'Saldo';
          FieldKind := fkData;
          FieldName := 'Saldo';
          DataSet := FDQGrid;
          currency := true;
        end;
        with DBGrid1.Columns.Add do
        begin
          Font.Style := [fsBold];
          Expanded := false;
          Title.Caption := 'Saldo';
          FieldName := 'Saldo';
          Visible := true;
        end;
        vazio := false;
        FDQGrid.Open();
        DS.DataSet.Refresh;
        FDQConsulta.Close;
      end;
    end;
end;


Talvez esse código ajude outros que futuramente possam passar pelo mesmo problema.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB