BCDField em ADO
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
Uso Banco Access e acesso via ADO.
Agradeço
Crpavao
Curtidas 0
Respostas
Crpavao
04/11/2005
Ninguém que possa me ajudar?
GOSTEI 0
Bon Jovi
04/11/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:
.pas
Valores inseridos e tb alterados na grid com sucesso:
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 = [] 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
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
GOSTEI 0
Crpavao
04/11/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).
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).
GOSTEI 0