BCDField em ADO

04/11/2005

Tenho um Dbgrid onde edito meus dados. Todos os dados aceitam alterações (post) mas os campos tipo BCDField não aceitam (dá a mensagem que a linha não pode ser encontrada, houve alguma modificação antes da ultima leitura) mas não tem nada disso não.
Uso Banco Access e acesso via ADO.
Agradeço


Crpavao

Respostas

05/11/2005

Crpavao

Ninguém que possa me ajudar?


Responder Citar

05/11/2005

Bon Jovi

Procure sempre detalhar mais as dúvidas, principalmente colocando a estrutura da tabela e códigos envolvidos.

Nunca vi esse problema por causa do BCD. Por estar usando Post, verifique se os providers flags estão corretos do DataSet do ADO e do ClientDataSet. E não deixe de usar ClientDataSet, não garanto nada qto a dar Post e Delete em Server DataSets vivos (como AdoQuery, AdoDataSet, etc).

Segue exemplo que funciona:

Tabela: TABELA1
Campos: CAMPO_BCD1 DECIMAL(18) PRIMARY KEY, CAMPO_BCD2 DECIMAL(15,2)

.dfm:
object Form1: TForm1
  Left = 226
  Top = 121
  Width = 696
  Height = 480
  Caption = ´Form1´
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = ´MS Sans Serif´
  Font.Style = [&93;
  OldCreateOrder = False
  OnCreate = FormCreate
  OnDestroy = FormDestroy
  PixelsPerInch = 96
  TextHeight = 13
  object DBGrid1: TDBGrid
    Left = 4
    Top = 4
    Width = 320
    Height = 120
    DataSource = DataSource1
    TabOrder = 0
    TitleFont.Charset = DEFAULT_CHARSET
    TitleFont.Color = clWindowText
    TitleFont.Height = -11
    TitleFont.Name = ´MS Sans Serif´
    TitleFont.Style = [&93;
  end
  object ADOConnection1: TADOConnection
    ConnectionString = 
      ´Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\bd1.mdb;Persist ´ +
      ´Security Info=False´
    LoginPrompt = False
    Mode = cmShareDenyNone
    Provider = ´Microsoft.Jet.OLEDB.4.0´
    Left = 4
    Top = 128
  end
  object ADODataSet1: TADODataSet
    Connection = ADOConnection1
    CommandText = ´select CAMPO_BCD1, CAMPO_BCD2 from TABELA1´
    Parameters = <>
    Left = 32
    Top = 128
    object ADODataSet1CAMPO_BCD1: TBCDField
      FieldName = ´CAMPO_BCD1´
      ProviderFlags = [pfInUpdate, pfInWhere, pfInKey&93;
      Precision = 18
      Size = 0
    end
    object ADODataSet1CAMPO_BCD2: TBCDField
      FieldName = ´CAMPO_BCD2´
      ProviderFlags = &91;pfInUpdate&93;
      Precision = 15
      Size = 2
    end
  end
  object DataSource1: TDataSource
    DataSet = ClientDataSet1
    Left = 116
    Top = 128
  end
  object ClientDataSet1: TClientDataSet
    Aggregates = <>
    Params = <>
    ProviderName = ´DataSetProvider1´
    AfterPost = ClientDataSet1AfterPost
    AfterDelete = ClientDataSet1AfterDelete
    Left = 88
    Top = 128
    object ClientDataSet1CAMPO_BCD1: TBCDField
      FieldName = ´CAMPO_BCD1´
      ProviderFlags = &91;pfInUpdate, pfInWhere, pfInKey&93;
      Precision = 18
      Size = 0
    end
    object ClientDataSet1CAMPO_BCD2: TBCDField
      FieldName = ´CAMPO_BCD2´
      ProviderFlags = [pfInUpdate&93;
      Precision = 15
      Size = 2
    end
  end
  object DataSetProvider1: TDataSetProvider
    DataSet = ADODataSet1
    Constraints = True
    UpdateMode = upWhereKeyOnly
    Left = 60
    Top = 128
  end
end


.pas
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, ADODB, DB, Grids, DBGrids, Provider, DBClient;

type
  TForm1 = class(TForm)
    ADOConnection1: TADOConnection;
    ADODataSet1: TADODataSet;
    DBGrid1: TDBGrid;
    DataSource1: TDataSource;
    ADODataSet1CAMPO_BCD1: TBCDField;
    ADODataSet1CAMPO_BCD2: TBCDField;
    ClientDataSet1: TClientDataSet;
    DataSetProvider1: TDataSetProvider;

    ClientDataSet1CAMPO_BCD1: TBCDField;
    ClientDataSet1CAMPO_BCD2: TBCDField;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure ClientDataSet1AfterPost(DataSet: TDataSet);
    procedure ClientDataSet1AfterDelete(DataSet: TDataSet);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  ADOConnection1.Open;
  ClientDataSet1.Open;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  ClientDataSet1.Close;
  ADOConnection1.Close;
end;

procedure TForm1.ClientDataSet1AfterPost(DataSet: TDataSet);
begin
  ClientDataSet1.ApplyUpdates(-1);
end;

procedure TForm1.ClientDataSet1AfterDelete(DataSet: TDataSet);
begin
  ClientDataSet1.ApplyUpdates(-1);
end;

end.


Valores inseridos e tb alterados na grid com sucesso:
CAMPO_BCD1   CAMPO_BCD2
1            10
2            9,99
3            5,5



Responder Citar

05/11/2005

Crpavao

Amigo,
Nunca usei ClientDataset. Vou verificar na minha lógica.
Mas a verdade é que é uma simples ADOQuery e tenho um DBGRID para esta ADOQuery.
Qdo edito meus dados tipo inteiro ou string são gravados normalmente. mas qdo o campo é BCD não grava no Banco dando o erro que a linha não foi encontrada, talvez esta tenha sido modificada após a ultima leitura.
Já desenvolvi aplicativos usando o ADO puro (sem ClientDataset) e funcionou numa boa. Não´sei se é a conexão ou algum detalhe nestes campos (float mas no ADO são definidos como BCD).


Responder Citar