BCDField em ADO
04/11/2005
0
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
Curtir tópico
+ 0
Responder
Posts
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:
.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
Responder
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).
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
Clique aqui para fazer login e interagir na Comunidade :)