Array
(
)

BCDField em ADO

Crpavao
   - 04 nov 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
   - 05 nov 2005

Ninguém que possa me ajudar?


Bon Jovi
   - 05 nov 2005

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:#Código

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 = []
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 = []
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]
Precision = 18
Size = 0
end
object ADODataSet1CAMPO_BCD2: TBCDField
FieldName = ´CAMPO_BCD2´
ProviderFlags = [pfInUpdate]
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 = [pfInUpdate, pfInWhere, pfInKey]
Precision = 18
Size = 0
end
object ClientDataSet1CAMPO_BCD2: TBCDField
FieldName = ´CAMPO_BCD2´
ProviderFlags = [pfInUpdate]
Precision = 15
Size = 2
end
end
object DataSetProvider1: TDataSetProvider
DataSet = ADODataSet1
Constraints = True
UpdateMode = upWhereKeyOnly
Left = 60
Top = 128
end
end


.pas#Código
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:
#Código
CAMPO_BCD1   CAMPO_BCD2
1 10
2 9,99
3 5,5



Crpavao
   - 05 nov 2005

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).