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

(Resolvido) Como Salvar um campo atribuindo um caption nele e o v


robinhocne

Pergunta

Bom,

Deixa eu tentar explicar!

Na tabela de lancamentos para eu fazer os lancamentos de "x" parcelas eu uso um grid para vizualizar as parcelas geradas, o grid (DbgLan) é ligado pelo datasource (DtsLan) e o datasource é ligado um RxMemoryData (TblPar):

Na tabela de Lancamentos eu tenho os seguintes campos:

Quantidade de Parcelas = 3 ** No caso aqui eu falo quantos parcelas eu quero gerar aqui no caso 3 igual no Dbgrid

Valor = 100,00 ** Valor das parcelas

1ªVencimento = 19/11/2007 ** no caso o primeiro vencimento da 1ªparcela e assim gera os restantes vencimentos.

Nesse grid eu tenho uma vizualização assim:

Par        Vencimento       Valor
  1         19/11/2007      100,00
  2         19/12/2007      100,00
  3         19/01/2008      100,00
No Botão (SpbGePar) é o botão que gera as parcelas e mostra no grid (dbglan), esses são os dados dele:
procedure Tfrmcadlan.SpbGeParClick(Sender: TObject);
var a, prazo : integer; data : TDate;
begin
   if ( not tblPar.Active ) then tblPar.Open else tblPar.EmptyTable;

   data  := StrToDate( txtVen.Text );

   prazo := 30;

   for a := 1 to StrToInt( txtPar.Text ) do
   begin
      with tblPar do
      begin
         Insert;
         Fields[00].AsInteger  := a;
         Fields[01].AsDateTime := data;
         Fields[02].AsCurrency := StrToFloat( txtVal.Text );
         Post;
      end;
      data := ( data + prazo );
   end;
end;
E para salvar isso tudo:
procedure Tfrmcadlan.spbsalClick(Sender: TObject);
var vCod, vNom : String;
begin
   with vcpo do
     begin
        clear;
        add ('Aluno');
        add ('Parcela');
        add ('Valor');
        add ('Vencimento');
        add ('Emissao');
     end;

   tblPar.First;
   while ( not tblPar.eof ) do
   begin
      with vvlr do
      begin
         clear;
         add (#39 + TxtCod.Text + #39);
         Add ( tblPar.Fields[00].AsString );
         Add ( TiraMascara( FormatFloat( '#########,##', tblPar.Fields[02].AsCurrency ) ) );
         add (#39 + FormatDateTime ('mm/dd/yyyy', tblPar.Fields[01].AsDateTime ) + #39);
         add (#39 + FormatDateTime ('mm/dd/yyyy', StrToDate ( TxtEmi.Text ) ) + #39);
      end;

      incluirregistro ('Lancamento', vcpo, vvlr);
      tblPar.Next;

   end;

   vCod := txtCod.Text;
   vNom := txtAlu.Text;

   inherited;

      tblPar.close;
end;
Então o que eu quero depois dessa explicação é o seguinte, gostaria em onde eu vizualizo as parcelas tipo parcela...1,2,3 etc aparecesse assim, 1ªparcela, 2ªparcela, 3ªparcela e etc, o campo parcela na tabela de dados era numeric (2,0), mas já mudei para varchar (30). Em vez de ser assim no grid e para salvar:
Par        Vencimento       Valor
  1         19/11/2007      100,00
  2         19/12/2007      100,00
  3         19/01/2008      100,00
Seria assim:
Parcelas          Vencimento       Valor
  1ª Parcela         19/11/2007      100,00
  2ª Parcela         19/12/2007      100,00
  3ª Parcela         19/01/2008      100,00

Como eu poderia fazer dessa maneira tipo eu já deixar algo dito na coluna da parcela que é parcela e atribuir a qual parcela será na frente?

Link para o comentário
Compartilhar em outros sites

Posts Recomendados

  • 0

robinhcne, eu acredito que possa ser mais útil manter gravado o número da parcela.

A questão visual, pode ser resolvida apenas com a formatação do campo na tabela.

Supondo que você tenha o campo adicionado ao seu dataset, em modo design-time, abra seu dataset (duplo click), selecione o field em questão e vá até a propriedade DisplayFormat na janela Object Inspector e defina ela para "#0 ª parcela" (sem as àspas duplas, é claro). Simples assim!

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0
robinhcne, eu acredito que possa ser mais útil manter gravado o número da parcela.

A questão visual, pode ser resolvida apenas com a formatação do campo na tabela.

Supondo que você tenha o campo adicionado ao seu dataset, em modo design-time, abra seu dataset (duplo click), selecione o field em questão e vá até a propriedade DisplayFormat na janela Object Inspector e defina ela para "#0 ª parcela" (sem as àspas duplas, é claro). Simples assim!

Abraços

Ok, simples mesmo Micheus, mas Tipo assim

Eu queria que salvasse dessa maneira que aparece, pois para eu vizualizar no grid como 1ªparcela e nos relátirios também.

Como eu poderia salvar assim....?

Link para o comentário
Compartilhar em outros sites

  • 0
Ok, simples mesmo Micheus, mas Tipo assim

Eu queria que salvasse dessa maneira que aparece, pois para eu vizualizar no grid como 1ªparcela e nos relátirios também.

o procedimento seria o mesmo para visualizar no relatório. Mas...

Como eu poderia salvar assim....?
... se você quer fazer deste jeito, então observe o seguinte:

1 - você está utilizando uma tabela em memória, RxMemoryData, que tem um campo para parcela. Vejo que você está referenciando este campo com TbPar.Fields[00].AsInteger; Mas você deve ter criado o campo em design-time (aquele lance de duplo click no componente, Add para adicionar um novo field, provavelmente do tipo inteiro), então você tem como utilizar a propriedade DisplayFormat dele (nesta tabela em memória);

2 - você está movendo o valor do campo da tabela em memória para sua lista vvlr utilizando: Add(tblPar.Fields[00].AsString).

Se você utilizar a propriedade DisplayFormat, como disse no item 1, quando você passar o valor da forma que faz (e que citei no item 2), automaticamente você estará gravando o texto "nª Parcela"!

Isto porque, sempre que você define uma formatação para na propriedade DisplayFormat de algum campo, ao obter seu valor no formato string, ou seja, utilizando ".AsString", a formatação é aplicada ao resultado.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0
Ok, simples mesmo Micheus, mas Tipo assim

Eu queria que salvasse dessa maneira que aparece, pois para eu vizualizar no grid como 1ªparcela e nos relátirios também.

o procedimento seria o mesmo para visualizar no relatório. Mas...

Como eu poderia salvar assim....?
... se você quer fazer deste jeito, então observe o seguinte:

1 - você está utilizando uma tabela em memória, RxMemoryData, que tem um campo para parcela. Vejo que você está referenciando este campo com TbPar.Fields[00].AsInteger; Mas você deve ter criado o campo em design-time (aquele lance de duplo click no componente, Add para adicionar um novo field, provavelmente do tipo inteiro), então você tem como utilizar a propriedade DisplayFormat dele (nesta tabela em memória);

2 - você está movendo o valor do campo da tabela em memória para sua lista vvlr utilizando: Add(tblPar.Fields[00].AsString).

Se você utilizar a propriedade DisplayFormat, como disse no item 1, quando você passar o valor da forma que faz (e que citei no item 2), automaticamente você estará gravando o texto "nª Parcela"!

Isto porque, sempre que você define uma formatação para na propriedade DisplayFormat de algum campo, ao obter seu valor no formato string, ou seja, utilizando ".AsString", a formatação é aplicada ao resultado.

Abraços

Não entendi muito bem Micheus;

No FieldDefs o campo das parcela, no DataType está FtSmallint!

E agora?

Link para o comentário
Compartilhar em outros sites

  • 0
Não entendi muito bem Micheus;

No FieldDefs o campo das parcela, no DataType está FtSmallint!

Bom, eu não dei o caminho pelo FieldDefs, mas sim pela lista de campos via duplo no componente RxMemoryData. Se você fizer isto, vai encontrar as propriedade de que falei (DisplayFormat, não DataType).

De qualquer modo, acabei falando besteira. Esta parte do texto que coloquei antes está errada (é... eu também erro :D):

(...) Isto porque, sempre que você define uma formatação para na propriedade DisplayFormat de algum campo, ao obter seu valor no formato string, ou seja, utilizando ".AsString", a formatação é aplicada ao resultado.

Na verdade, definindo uma formatação para na propriedade DisplayFormat de algum campo, é possível obter seu valor formatado através do método DisplayText.

Assim, tendo criado o campo no RxMemoryData via procedimento de duplo click no componente (não através da sua propriedade FieldDefs), e definindo a formatação em DisplayFormat, na hora de atribuir o valor do campo parcela da tabela em memória (TblPar) para a lista de valores você utiliza o método DisplayText. Como no exemplo:

...
      with vvlr do
      begin
         clear;
         add (#39 + TxtCod.Text + #39);
         Add ( tblPar.Fields[00].DisplayText );  // <========= AQUI
         Add ( TiraMascara( FormatFloat( '#########,##', tblPar.Fields[02].AsCurrency ) ) );
...

Segue um exemplo em anexo também.

Project1.zip

Link para o comentário
Compartilhar em outros sites

  • 0
Mudei no vvlr do jeito que você me passou aqui mas dá esse erro na hora de salvar:

Dynamic SQL error SQL error code = - 104

Unexpected end of command

isto é um erro no SQL.

Acho que, devido a este seu método exclusivo de gravação de dados, você terá que fazer o mesmo que você faz com os outros campos string: concatenar o caracter #39, tipo

...
         add (#39 + TxtCod.Text + #39);
         Add (#39 + tblPar.Fields[00].DisplayText + #39);  // <========= AQUI
...

É aquela história do "espírito da coisa", se no seu procedimento de gravação você vai precisar que o valor string contenha o #39, então já tem que cair a ficha. ;)

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0
Mudei no vvlr do jeito que você me passou aqui mas dá esse erro na hora de salvar:

Dynamic SQL error SQL error code = - 104

Unexpected end of command

isto é um erro no SQL.

Acho que, devido a este seu método exclusivo de gravação de dados, você terá que fazer o mesmo que você faz com os outros campos string: concatenar o caracter #39, tipo

...
         add (#39 + TxtCod.Text + #39);
         Add (#39 + tblPar.Fields[00].DisplayText + #39);  // <========= AQUI
...

É aquela história do "espírito da coisa", se no seu procedimento de gravação você vai precisar que o valor string contenha o #39, então já tem que cair a ficha. ;)

Abraços

Ok, resolvido Micheus entedi, mas na hora que eu cadastro as parcelas gero elas bonitinhas e salvo elas ai elas também já dão baixa quer dizer !?! elas já são quitadas aparece como pagas sendo que nessa tabela de lancamentos eu não tenho o campo de data do pagamento! :blink: !

E agora porque acontecesse isso?

Link para o comentário
Compartilhar em outros sites

  • 0
mas na hora que eu cadastro as parcelas gero elas bonitinhas e salvo elas ai elas também já dão baixa quer dizer !?! elas já são quitadas aparece como pagas sendo que nessa tabela de lancamentos eu não tenho o campo de data do pagamento! :blink: !

E agora porque acontecesse isso?

Bom, daí acho que já é uma questão de procedimento seu.

Se você não tem um campo de data de pagamento para saber quando foram baixadas, que informação você está utilizando para indicar isto? :unsure:

Link para o comentário
Compartilhar em outros sites

  • 0
mas na hora que eu cadastro as parcelas gero elas bonitinhas e salvo elas ai elas também já dão baixa quer dizer !?! elas já são quitadas aparece como pagas sendo que nessa tabela de lancamentos eu não tenho o campo de data do pagamento! :blink: !

E agora porque acontecesse isso?

Bom, daí acho que já é uma questão de procedimento seu.

Se você não tem um campo de data de pagamento para saber quando foram baixadas, que informação você está utilizando para indicar isto? :unsure:

Desculpa pela informação incompleta eu tenho sim o campo no banco de dados, mas nesse formulário eu não tenho!

Esses são os campos que eu tenho na tabela de lancamentos no banco de dados.

ALUNO

PARCELA

VALOR

VENCIMENTO

EMISSAO

HISTORICO

DTPGTO ============= Aqui é onde informo a data de pagamento.

TIPO

HISTORICO1

Mas aqui na tabela no formulário eu não coloco o campo do DtPgto, para gravar a data do pagamento!

No botão salvar ficou assim:

procedure Tfrmcadlan.spbsalClick(Sender: TObject);
var vCod, vNom : String;
begin
   with vcpo do
     begin
        clear;
        add ('Aluno');
        add ('Parcela');
        add ('Valor');
        add ('Vencimento');
        add ('Emissao');
     end;

   tblPar.First;
   while ( not tblPar.eof ) do
   begin
      with vvlr do
      begin
         clear;
         add (#39 + TxtCod.Text + #39);
         Add (#39 + tblPar.Fields[00].DisplayText + #39);
         Add ( TiraMascara( FormatFloat( '#########,##', tblPar.Fields[02].AsCurrency ) ) );
         add (#39 + FormatDateTime ('mm/dd/yyyy', tblPar.Fields[01].AsDateTime ) + #39);
         add (#39 + FormatDateTime ('mm/dd/yyyy', StrToDate ( TxtEmi.Text ) ) + #39);
      end;
      incluirregistro ('Lancamento', vcpo, vvlr);
      tblPar.Next;
   end;
   vCod := txtCod.Text;
   vNom := txtAlu.Text;
   inherited;
      tblPar.close;
end;

Link para o comentário
Compartilhar em outros sites

  • 0
Desculpa pela informação incompleta eu tenho sim o campo no banco de dados, mas nesse formulário eu não tenho!

Esses são os campos que eu tenho na tabela de lancamentos no banco de dados.

Ok. você tem o campo...

Mas aqui na tabela no formulário eu não coloco o campo do DtPgto, para gravar a data do pagamento!
Isso porque é o formulário que gera a parcela, certo?!

Então, ainda não entendi aquela pergunta:

mas na hora que eu cadastro as parcelas gero elas bonitinhas e salvo elas ai elas também já dão baixa quer dizer !?! elas já são quitadas aparece como pagas sendo que nessa tabela de lancamentos eu não tenho o campo de data do pagamento! :blink: !

E agora porque acontecesse isso?

Acontece o quê?

Por acaso as parcelas estão sendo quitadas "automaticamente" quando você está gravando as parcelas recém geradas?

Se for isto, então em algum lugar do seu programa isto deve estar sendo feito (definida uma data para o campo DTPGTO)...

Link para o comentário
Compartilhar em outros sites

  • 0

Isso elas estão sendo quitadas automaticamente, no banco de dados estava como current_date, mas eu tirei e continua a mesma coisa, fiz até um busca Crtl+f para ver se ter no formulário de lancamentos mas nada, estou-lhe passando os codigos para você dá uma olhada!

unit flancamentos;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, fpadrao, StdCtrls, psvBasiclbl, psvBorderLabel, Buttons,
  ExtCtrls, Mask, Grids, DBGrids, DB, RxMemDS, IBCustomDataSet, IBQuery;

type
  Tfrmcadlan = class(Tfrmpadrao)
    Panel3: TPanel;
    psvBorderLabel1: TpsvBorderLabel;
    psvBorderLabel3: TpsvBorderLabel;
    psvBorderLabel4: TpsvBorderLabel;
    psvBorderLabel5: TpsvBorderLabel;
    txtcod: TEdit;
    txtalu: TEdit;
    psvBorderLabel6: TpsvBorderLabel;
    TxtPar: TEdit;
    TxtVen: TMaskEdit;
    DbgLan: TDBGrid;
    SpbGePar: TSpeedButton;
    DtsLan: TDataSource;
    TxtVal: TMaskEdit;
    tblPar: TRxMemoryData;
    tblParid: TSmallintField;
    tblParvencto: TDateField;
    tblParvalor: TCurrencyField;
    txtEmi: TMaskEdit;
    procedure spbsalClick(Sender: TObject);
    procedure SpbGeParClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure txtcodExit(Sender: TObject);
    procedure spbpesClick(Sender: TObject);
    Procedure LeRegistro();
  private

  public
    { Public declarations }
  end;

var
  frmcadlan: Tfrmcadlan;

implementation

{$R *.dfm}

USES funcoes, fprincipal, FPesAluno, fdtmiza;

procedure Tfrmcadlan.spbsalClick(Sender: TObject);
var vCod, vNom : String;
begin
   with vcpo do
     begin
        clear;
        add ('Aluno');
        add ('Parcela');
        add ('Valor');
        add ('Vencimento');
        add ('Emissao');
     end;

   tblPar.First;
   while ( not tblPar.eof ) do
   begin
      with vvlr do
      begin
         clear;
         add (#39 + TxtCod.Text + #39);
         Add (#39 + tblPar.Fields[00].DisplayText + #39);
         Add ( TiraMascara( FormatFloat( '#########,##', tblPar.Fields[02].AsCurrency ) ) );
         add (#39 + FormatDateTime ('mm/dd/yyyy', tblPar.Fields[01].AsDateTime ) + #39);
         add (#39 + FormatDateTime ('mm/dd/yyyy', StrToDate ( TxtEmi.Text ) ) + #39);
      end;
      incluirregistro ('Lancamento', vcpo, vvlr);
      tblPar.Next;
   end;
   vCod := txtCod.Text;
   vNom := txtAlu.Text;
   inherited;
   tblPar.close;
end;

procedure Tfrmcadlan.SpbGeParClick(Sender: TObject);
var a, prazo : integer; data : TDate;
begin
   if ( not tblPar.Active ) then tblPar.Open else tblPar.EmptyTable;

   data  := StrToDate( txtVen.Text );

   prazo := 30;

   for a := 1 to StrToInt( txtPar.Text ) do
   begin
      with tblPar do
      begin
         Insert;
         Fields[00].AsInteger  := a;
         Fields[01].AsDateTime := data;
         Fields[02].AsCurrency := StrToFloat( txtVal.Text );
         Post;
      end;
      data := ( data + prazo );
   end;
end;

procedure Tfrmcadlan.FormCreate(Sender: TObject);
begin
//   txtEmi.Text := FormatDateTime( 'dd/mm/yyyy', Date() );
end;


procedure Tfrmcadlan.txtcodExit(Sender: TObject);
begin
   ConsultaRegistros ('Alunos', 'Nome', 'Codigo=' + Copy (TxtCod.Text, 1, 6));
   TxtAlu.Text := LeDados ('Nome');
end;

procedure Tfrmcadlan.spbpesClick(Sender: TObject);
begin
   with vcpo do
      begin
         clear;
         add ('Codigo');
         add ('Nome');
         add ('Cpf');
         add ('Processo');
         Add ('CnhEntregue');
         Add ('(SELECT L.Vencimento FROM Lancamento L WHERE L.Aluno=A.Codigo AND EXTRACT( MONTH FROM L.Vencimento ) = EXTRACT( MONTH FROM CURRENT_DATE ) ) AS Vencimento' );
      end;
   with vvlr do
      begin
         clear;
         add ('Codigo');
         add ('Nome');
         add ('Cpf');
         add ('Processo');
      end;
   with TFrmPesAluno.create (application) do
      begin
         try
            tabela := 'alunos A';
            camporetorno := 'codigo';
            showmodal;
         finally
            free;
      end;
   end;
   if (retorno<> '') then
      begin
      inherited;
    LeRegistro();
    TxtCod.Text    := StrZero( StrToFloat( TxtCod.Text ), 6 );
    SpbSal.Enabled := True;
   txtEmi.Text := FormatDateTime( 'dd/mm/yyyy', Date() );
   LiberaReadOnly;
  end;
end;
procedure Tfrmcadlan.LeRegistro;
begin
   Consultaregistros('Alunos', 'Codigo, Nome, Cpf, Processo','Codigo =' + Retorno);
   TxtCod.text := Ledados ('Codigo');
   TxtAlu.text := LeDados ('Nome');
end;

end.

Link para o comentário
Compartilhar em outros sites

  • 0
Isso elas estão sendo quitadas automaticamente, no banco de dados estava como current_date, mas eu tirei e continua a mesma coisa, fiz até um busca Crtl+f para ver se ter no formulário de lancamentos mas nada, estou-lhe passando os codigos para você dá uma olhada!
robinhcne, já não lembro mais... Qual o bando de dados que você está utilizando? MySQL?

Por acaso, você está trabalhando com triggers?

Definiu algum valor default?

Se não é no código, tem que estar no banco. Não há opção.

Link para o comentário
Compartilhar em outros sites

  • 0
Isso elas estão sendo quitadas automaticamente, no banco de dados estava como current_date, mas eu tirei e continua a mesma coisa, fiz até um busca Crtl+f para ver se ter no formulário de lancamentos mas nada, estou-lhe passando os codigos para você dá uma olhada!
robinhcne, já não lembro mais... Qual o bando de dados que você está utilizando? MySQL?

Por acaso, você está trabalhando com triggers?

Definiu algum valor default?

Se não é no código, tem que estar no banco. Não há opção.

Uso o Firebird 2.0.3

Uso triggers

Esse é o trigger:

CREATE TRIGGER TRGCODLAN FOR LANCAMENTO
ACTIVE BEFORE INSERT POSITION 0
AS
   DECLARE VARIABLE VCOD NUMERIC (15,0);
BEGIN
   SELECT MAX(CODIGO) FROM  LANCAMENTO INTO :VCOD;
   IF (:VCOD IS NULL) THEN
   BEGIN
      VCOD=0;
   END
   NEW.CODIGO = (:VCOD+1);
END
O Unico do Lancameto! E a tabela no banco de dados!
REATE TABLE LANCAMENTO (
    CODIGO      NUMERIC(15,0) NOT NULL,
    ALUNO       NUMERIC(6,0),
    PARCELA     VARCHAR(30),
    VALOR       NUMERIC(5,3),
    VENCIMENTO  DATE,
    EMISSAO     DATE DEFAULT CURRENT_DATE,
    HISTORICO   VARCHAR(100),
    DTPGTO      DATE,
    TIPO        NUMERIC(1,0),
    HISTORICO1  VARCHAR(100)
);




/******************************************************************************/
/****                             Primary Keys                             ****/
/******************************************************************************/

ALTER TABLE LANCAMENTO ADD PRIMARY KEY (CODIGO);


/******************************************************************************/
/****                             Foreign Keys                             ****/
/******************************************************************************/

ALTER TABLE LANCAMENTO ADD FOREIGN KEY (ALUNO) REFERENCES ALUNOS (CODIGO);

Mas sobre o campo DtPgto aqui não tem nada que relaciona a ele!

Link para o comentário
Compartilhar em outros sites

  • 0
Estranho...

você utiliza o IBExpert para acessar a estrutura da tabela, parece-me.

Se sim, você já olhou como estão os dados na tabela, que valor está preenchido no campo DTPGTO?

Sim Utilizo o IbExpert!

Olhei esta preenchendo a data do lancamento a data do dia!

********************************

Fiz uma varredura buscando esse campo no meu programa e realmente não tinha nada na tabela de lancamento, ai resolvi mexer no banco de dados e excluir o campo de dtpgto e fiz outro com o nome de pagamento (date), e ai agora deu tudo certo tá funcionando normal!

Mas está acontecendo algo de errado baseado nesses dados para salvar!

Tipo se eu gero as parcela no valor assim (70,50), ai ele arredonda o valor para (71,00), o que será!,

oque esta de errado

Há segunda coisa, como faço para no grid mostrar o valor com a virgula tipo assim ele , se eu gero a parcela de 100,00 ele só mostra 100 no grid como posso arrumar também!

Acho que assim finalizo esse tópico!

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

  • 0
(...), ai resolvi mexer no banco de dados e excluir o campo de dtpgto e fiz outro com o nome de pagamento (date), e ai agora deu tudo certo tá funcionando normal!
era o que eu estava suspeitando, já que você citou que havia inicialmente definido ele com valor default CURRENT_DATE e depois alterou isto. Aparentemente pode haver um "bug" no banco, já que uma vez modificado, não deveria mais continuar a ser inicializado.

Voce fez exatamente o que eu lhe iria sugerir. beleza.

Mas está acontecendo algo de errado baseado nesses dados para salvar!

Tipo se eu gero as parcela no valor assim (70,50), ai ele arredonda o valor para (71,00), o que será!,

o que esta de errado

bom, eu não tenho este tipo de problema utilizando o FB, mas faça uns testes:

- na linha onde você inicializa o valor deste campo, ao invés de chamar seus procedimentos, coloque um valor fixo e veja como se comporta no banco. Coloque algo assim:

...
         Add (#39 + tblPar.Fields[00].DisplayText + #39);
         Add ( '70.5' );  // <=================== AQUI
         add (#39 + FormatDateTime ('mm/dd/yyyy', tblPar.Fields[01].AsDateTime ) + #39);
...
- se a informação agora for gravada corretamente, então tem algum problema com o procedimento que você utiliza para transformar o valor em texto. Se o objetivo é converter o campo que é numérico, para uma string, lembre-se que não deverá estar no formato de milhar - deve apenas conter o separador decimal e que neste caso deverá ser o ponto. Assim, sendo, experimente chamar desta forma:
...
         Add (#39 + tblPar.Fields[00].DisplayText + #39);
         Add (Format('%.2f', [tblPar.Fields[02].AsFloat]));  // <=================== AQUI
         add (#39 + FormatDateTime ('mm/dd/yyyy', tblPar.Fields[01].AsDateTime ) + #39);
...

onde a string de formatação "%.2f" significa que você estará formatando um float com 2 casas decimais (observe o número 2 após o ".") e a string retornada não fará a substituição do separador decimal. Ou seja, o separador será o ponto ("."), mesmo que esteja configurado em seu Windows para ser a vírgula.

Qualquer dúvida quanto a forma de montar esta string de formatação, procure no help por "Format strings".

Há segunda coisa, como faço para no grid mostrar o valor com a virgula tipo assim ele , se eu gero a parcela de 100,00 ele só mostra 100 no grid como posso arrumar também!
lembra-se do que falei antes sobre a propriedade DisplayFormat? É ela que você deve configurar.

Alguns comentários a título de informação (para você e quem mais se interessar):

- Na definição da estrutura das tabelas em seu banco, em campos como este que você utiliza para identificação do item, seja ele Aluno, Codigo, ID, normalmente defini-se como um tipo inteiro (não numéric). O INTEGER (pode armazenar um número muito grande). Mas se a intenção é poupar espaço, você pode utilizar outras variantes inteiras como o SMALLINT/TINYINT, é questão de conhecer os tipos oferecidos pelo banco que você utiliza. Apesar que, internamente, aquele seu campo ALUNO NUMERIC(6, 0), será convertido para integer pelo banco. Então, mais um motivo para manter os tipos de acordo com o uso. Se você não vai precisar dos decimais, encontre um tipo inteiro que acomode a quantidade de casas que você precisa.

- Se você der uma espiada no help, sobre o TCurrencyField, você verá que ele é exatamente o mesmo que um TFloatField, porém com alguns recursos para tratar o formato Currency: "TCurrencyField differs from its immediate ancestor TFloatField only in having a DataType of ftCurrency, and in formatting the value using a currency format by default." (TCurrencyField difere de seu antecessor imediato TFloatField apenas por ter um a propriedade DataType do tipo ftCurrency, e no formato do valor utilizando o formato currency por padrão);

Também lá, é salientado de que não deve ser confundido o TFieldCurrency com o tipo de dados Currency: "Do not confuse TCurrencyField with the Currency data type. Currency fields use the Double data type to store and manipulate their values. This data type is the format used by the physical database tables for currency fields. The TBCDField class uses the Currency data type to store and manipulate its value." (Não confunda TCurrencyField com o tipo de dados Currency. O campo currency (TCurrencyField) usa o tipo de dados Double para armazenar e manipular seus valores. Este tipo de dados é o formato utilizado pelas tabelas do banco de dados para campos currency. A classe TBCDField usa o tipo de dados Currency e manipula seu valor).

Motivo pelo qual, considero que não há necessidade de utilizar o AsCurrency, visto que pode dar uma noção errada do tipo de dados que está sendo referenciado.

- em campos tipo histórico ou observações, pode ser interessante avaliar o uso de um tipo de dado BLOB no banco de dados, principalmente quando forem relativamente grandes ou de tamanho indefinido. Em alguns bancos (não é o caso do FB), declarar um VARCHAR(200), significa reservar este espaço, mesmo que nunca seja preenchido com algo, bem como trafegar com eles pela rede.

Tem um artigo em inglês que faz algumas considerações sobre quando poder ser interessante utilizar um ou outro: To BLOB or not to BLOB, that is the question

Quando vier a fazer uso de BLOB no FB, declare o sub-type conforme o uso: 0 - padrão (imagens e outros dados); 1 ou TEXT para campos memo (textos). Segment Size, define não o tamanho do blob, mas o tamanho de cada bloco que será acessado de cada vez. Assim, se for para armazenar imagem, algo como 64K (65536) pode ser mais conveniente (é questão de avaliar o tamanho médio das imagens utilizadas), já para texto 100 poderia ser suficiente , mas segundo li em outro lugar, 2K (2048) é recomendado como padrão - é sempre questão de avaliação do seu uso.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Obrigado pelo comentário Micheus, é que eu aprendi nesse jeito meio esclusivo, mas estou inovando, dessas maneiras!

Bom fiz o teste que você me passou para salvar e valor monetário, e ai deu certo, mas mudei para o que você me passou e ai deu o seguinte erro!

Dynamic SQL error

SQL error code=-804

Count of columns does not equal count of values

Bom por esse erro que deu, acho que fala que tem mais colunas das quais informada, mais ou menos assim!

Esses são os dados do botão salvar:

procedure Tfrmcadlan.spbsalClick(Sender: TObject);
var vCod, vNom : String;
begin
   with vcpo do
     begin
        clear;
        add ('Aluno');
        add ('Historico');
        add ('Valor');
        add ('Vencimento');
        add ('Emissao');
        Add ('Tipo');
     end;

   tblPar.First;
   while ( not tblPar.eof ) do
   begin
      with vvlr do
      begin
         clear;
         add (#39 + TxtCod.Text + #39);
         Add (#39 + tblPar.Fields[00].DisplayText + #39);
         Add (Format('%.2f', [tblPar.Fields[02].AsFloat]));
         add (#39 + FormatDateTime ('mm/dd/yyyy', tblPar.Fields[01].AsDateTime ) + #39);
         add (#39 + FormatDateTime ('mm/dd/yyyy', StrToDate ( TxtEmi.Text ) ) + #39);
         Add (#39 + Edit1.Text + #39)
      end;
      incluirregistro ('Lancamento', vcpo, vvlr);
      
      tblPar.Next;
   end;
   vCod := txtCod.Text;
   vNom := txtAlu.Text;
   inherited;
   tblPar.close;
end;

Link para o comentário
Compartilhar em outros sites

  • 0
Bom fiz o teste que você me passou para salvar e valor monetário, e ai deu certo (...)
aquele com valor fixo, não é?!

Se sim, sinal que realmente havia algum problema com todas aquelas funções. Mas utilizando o format, nem será preciso elas.

(...), mas mudei para o que você me passou e ai deu o seguinte erro!

Dynamic SQL error

SQL error code=-804

Count of columns does not equal count of values

Bom por esse erro que deu, acho que fala que tem mais colunas das quais informada, mais ou menos assim!

é isso mesmo, você já passou por este erro anteriormente (se bem me lembro).

É interessante, porque desta vez, não estão faltando parâmetros como da outra vez: você adiciona 6 colunas à vcpo e 6 valores à vvlr. :huh:

E neste caso, eu diria que: "agora é com voce"

Teria que depurar para "ver" o que está acontecendo lá na procedure IncluirRegistro. Verificar como as listas estão quando vão sendo processadas, como fica a string da instrução SQL.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0
Bom fiz o teste que você me passou para salvar e valor monetário, e ai deu certo (...)
aquele com valor fixo, não é?!

Se sim, sinal que realmente havia algum problema com todas aquelas funções. Mas utilizando o format, nem será preciso elas.

(...), mas mudei para o que você me passou e ai deu o seguinte erro!

Dynamic SQL error

SQL error code=-804

Count of columns does not equal count of values

Bom por esse erro que deu, acho que fala que tem mais colunas das quais informada, mais ou menos assim!

é isso mesmo, você já passou por este erro anteriormente (se bem me lembro).

É interessante, porque desta vez, não estão faltando parâmetros como da outra vez: você adiciona 6 colunas à vcpo e 6 valores à vvlr. :huh:

E neste caso, eu diria que: "agora é com voce"

Teria que depurar para "ver" o que está acontecendo lá na procedure IncluirRegistro. Verificar como as listas estão quando vão sendo processadas, como fica a string da instrução SQL.

Abraços

Micheus tentei de tudo aqui mas nada, até para dar a mensagem de erros antes do erro, mas nada, estou lhe passando os dados da função para você vizualizar:

procedure incluirregistro (ptabela:string;pcampos, pvalores:tstringlist);
var a:integer;instrucaosql:string;
begin
instrucaosql:='insert into ' + ptabela + ' (';
for a :=0 to (pcampos.Count-1) do

   begin
      instrucaoSQL := instrucaosql+pcampos [a] + ', ';
   end;
   instrucaosql:= copy (instrucaosql,1,length (instrucaosql)-2) + ') values (';

for a :=0 to (pvalores.Count-1) do

   begin
      instrucaoSQL := instrucaosql+pvalores [a] + ', ';
   end;
   instrucaosql:= copy (instrucaosql,1,length (instrucaosql)-2) + '); ';
   showmessage (instrucaosql);
   with dtmiza.qryiza do
      begin
         close;
         sql.Clear;
         sql.add (instrucaosql);
         execsql;
      end;
end;

Link para o comentário
Compartilhar em outros sites

  • 0

Robinhocne, a procedure eu já conheço.

Como eu disse, você precisa executá-la e verificar como estão o conteúdo dos parâmetros, a string SQL que você monta - Depurar.

Dê uma olhada nestes dois posts:

http://scriptbrasil.com.br/forum/index.php...st&p=393331

http://scriptbrasil.com.br/forum/index.php...st&p=406052

eles dão alguma informação de como colocar break-points no seu programa para que você possa avaliar (evaluate) o conteúdo das variáveis.

Se você se esforçar para aprender a utilizar estes recursos, você conseguirá resolver muitos problemas sozinho.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0
Robinhocne, a procedure eu já conheço.

Como eu disse, você precisa executá-la e verificar como estão o conteúdo dos parâmetros, a string SQL que você monta - Depurar.

Dê uma olhada nestes dois posts:

http://scriptbrasil.com.br/forum/index.php...st&p=393331

http://scriptbrasil.com.br/forum/index.php...st&p=406052

eles dão alguma informação de como colocar break-points no seu programa para que você possa avaliar (evaluate) o conteúdo das variáveis.

Se você se esforçar para aprender a utilizar estes recursos, você conseguirá resolver muitos problemas sozinho.

Abraços

Fiz varias vezes esse Break- Points e modifiquei umas coisas para ver se era mas nada até agora, será que não tem outra maneira de modificar isso?

Quer dizer esse metodo!

Link para o comentário
Compartilhar em outros sites

  • 0

Bom andei pesquisando muito sobre isso e conversei com um amigo meu, e ai ele comentou que no banco ele salva em vez de virgula ponto, e ai para eu fazer uma função que mude a virgula que é gerada da parcela para ser o ponto, achei uma parecida e coloquei algumas coisas, mas não sei como vou usar sobre essa linha:

Add (#39 + FormatFloat('#,##0.00', tblPar.Fields[02].AsFloat) + #39);
Essa é a função:
function StringToFloat(s : string) : Extended;
{ Filtra uma string qualquer, convertendo as suas partes
  numéricas para sua representação decimal, por exemplo:
  'R$ 1.200,00' para 1200,00 '1AB34TZ' para 134}
var
  i           :Integer;
  t           : string;
  SeenDecimal,SeenSgn  : Boolean;
begin
  t := '';
  SeenDecimal := False;
  SeenSgn       := False;
  {Percorre os caracteres da string:}
  for i := Length(s) downto 0 do
      {Filtra a string, aceitando somente números e separador decimal:}
      if (s[i] in ['0'..'9', '-','+',DecimalSeparator]) then
          begin
          if (s[i] = DecimalSeparator) and (not SeenDecimal)  then
              begin
              t := s[i] + t;
              SeenDecimal := True;
              end
          else if (s[i] in ['+','-']) and (not SeenSgn) and (i = 1) then
                  begin
                  t := s[i] + t;
                  SeenSgn := True;
                  end
          else if s[i] in ['0'..'9'] then
                  begin
                  t := s[i] + t;
                  end;
          end;
          Result := StrToFloat(t);
      end;

Como adapto ela sobre essa linha?

estou mandando um exemplo do projeto, para alguém poder me ajudar?

http://www.4shared.com/file/32007545/c7f05...Lancamentos.htm

Link para o comentário
Compartilhar em outros sites

  • 0

Robinhocne, desculpe a demora em responder, estive viajando em férias :rolleyes:

Bom andei pesquisando muito sobre isso e conversei com um amigo meu, e ai ele comentou que no banco ele salva em vez de virgula ponto, e ai para eu fazer uma função que mude a virgula que é gerada da parcela para ser o ponto, achei uma parecida e coloquei algumas coisas, mas não sei como vou usar sobre essa linha:

Add (#39 + FormatFloat('#,##0.00', tblPar.Fields[02].AsFloat) + #39);
por toda esta parte que você postou aqui, vejo que você não levou em conta o que eu havia mencionado no post#18 <_< Vou por uma a parte relevante aque, denovo:
- se a informação agora for gravada corretamente, então tem algum problema com o procedimento que você utiliza para transformar o valor em texto. Se o objetivo é converter o campo que é numérico, para uma string, lembre-se que não deverá estar no formato de milhar - deve apenas conter o separador decimal e que neste caso deverá ser o ponto. Assim, sendo, experimente chamar desta forma:
...
         Add (#39 + tblPar.Fields[00].DisplayText + #39);
         Add (Format('%.2f', [tblPar.Fields[02].AsFloat]));  // <=================== AQUI
         add (#39 + FormatDateTime ('mm/dd/yyyy', tblPar.Fields[01].AsDateTime ) + #39);
...

onde a string de formatação "%.2f" significa que você estará formatando um float com 2 casas decimais (observe o número 2 após o ".") e a string retornada não fará a substituição do separador decimal. Ou seja, o separador será o ponto ("."), mesmo que esteja configurado em seu Windows para ser a vírgula.

Ou seja, você não está utilizando a função que sugeri (Format), a qual gera como resultado um texto numérico onde há apenas o ponto de decimal no número (nada de vírgula, que possa atrapalhar o entendimento banco sobre o número passado).

Experimente a alteração que sugeri. Antes disto, não tenho sugestões.

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,3k
    • Posts
      652,4k
×
×
  • Criar Novo...