|
ActiveDelphi .: O site do programador Delphi! :.
|
Exibir mensagem anterior :: Exibir próxima mensagem |
Autor |
Mensagem |
mobius1qwe Aprendiz
Registrado: Quarta-Feira, 8 de Dezembro de 2010 Mensagens: 146
|
Enviada: Ter Abr 14, 2015 5:15 pm Assunto: [RESOLVIDO]Cannot access field as type float |
|
|
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 |
|
|
johnny-walker Moderador
Registrado: Sábado, 4 de Outubro de 2003 Mensagens: 10653 Localização: Contagem/MG - BRAZIL
|
Enviada: Sex Abr 17, 2015 12:41 pm Assunto: |
|
|
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 |
|
|
mobius1qwe Aprendiz
Registrado: Quarta-Feira, 8 de Dezembro de 2010 Mensagens: 146
|
Enviada: Sex Abr 17, 2015 7:45 pm Assunto: |
|
|
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 |
|
|
mobius1qwe Aprendiz
Registrado: Quarta-Feira, 8 de Dezembro de 2010 Mensagens: 146
|
Enviada: Seg Abr 20, 2015 2:10 pm Assunto: |
|
|
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 |
|
|
mobius1qwe Aprendiz
Registrado: Quarta-Feira, 8 de Dezembro de 2010 Mensagens: 146
|
Enviada: Sex Abr 24, 2015 2:44 pm Assunto: |
|
|
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 |
|
|
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|