Record not found or changed by another user

Delphi

28/09/2009

Amigos, o que pode ser.. já utilizei todas as dicas referente a este erro encontradas aqui no forum, dicas como essa abaixo .. mas não tem jeito... n consigo resolver. Utilizo o Delphi 2007 Fire 2.0 e dbexpress com clientdataset+sqldataset+provider, este erro acontece quando tento excluir ou editar. (utilizo ApplyUpdates(0)).
Por favor alguém pode me passar uma dica.
Citação:
e o seguinte

coloca todos os campo (Fields) tanto no no clientdataset quanto no sqldataset

no clientdataset :
depois no campo chave vc colocar assim
pfiNUpdate := false;
pfInWhere := true;
pfInKey := true;
e pra não campos chave
pfiNUpdate := true;
pfInWhere := true;
pfInKey := false;

no sqldataset
depois no campo chave vc colocar assim
pfiNUpdate := true;
pfInWhere := true;
pfInKey := true;
e pra não campos chave
pfiNUpdate := true;
pfInWhere := true;
pfInKey := false;

e no DataSetProvider fica assim
UpdateMode = upWhereKeyOnly


Estrutura da tabela.
CREATE GENERATOR ´GEN_Funcionario_ID´;
CREATE TABLE ´Funcionario´ (
IDFUNCIONARIO INTEGER,
NOME VARCHAR(70) NOT NULL,
SEXO CHAR(1),
IDENTIDADE VARCHAR(20),
CPF CHAR(11),
ENDERECO VARCHAR(75),
BAIRRO VARCHAR(20),
CIDADE VARCHAR(20),
ESTADO CHAR(2),
TELEFONE VARCHAR(10),
CELULAR VARCHAR(10),
EMAIL VARCHAR(75),
DNASCIMENTO DATE,
DADMISSAO DATE,
FUNCAO VARCHAR(21),
SALARIO NUMERIC(9,3),
GRATIFICACAO NUMERIC(9,3),
CARTPROFISSIONA VARCHAR(20),
HABILITACAO VARCHAR(20),
AUTORIZA CHAR(1),
CEP CHAR(8)
);
ALTER TABLE ´Funcionario´ ADD CONSTRAINT ´PK_Funcionario´ PRIMARY KEY (IDFUNCIONARIO);

|Agradeço a Ajuda.

Antonio Neto.


Ant.neto

Ant.neto

Curtidas 0

Respostas

Afarias

Afarias

28/09/2009

O mais importante ao definir o padrão de atualização do DataSnap é a propriedade UpdateMode do DataSetProvider.

Tendo definido:

DataSetProvider.UpdateMode = upWhereKeyOnly

Significa que ao resolver UPDATES e DELETES apenas o(s) campo(s) ´cheve´ serão utilizados para localizar (WHERE) o registro atualizado ou excluído.

Para definir quem é(são) o(s) campo(s) chave, é utilizada a propriedade ProviderFlags dos TFields do DataSet do DataSetProvider, incluindo [b:6c67db99fe]pfInKey[/b:6c67db99fe] no ProviderFlags apenas do(s) campo(s) chave!

ou, no ObjectInspector:

ProviderFlags.pfInKey := True // Apenas para os campos chave

NOTE QUE O ProviderFlags DEVE SER DEFINIDO NOS TFIELDS DO DATASET ASSOCIADO AO DataSetProvider (SQLDataSet no seu caso) E NÃO NO ClientDataSet.

Bom, caso esta configuração esteja incorreta, ou os campos utilizados para encontrar o registro tenham tido seus valores alterados por um usuário na rede então o DataSnap não conseguirá encontrar O REGISTRO ou encontrará mais q um registro, e assim vc terá o erro q está recebendo.


T+


GOSTEI 0
Osocram

Osocram

28/09/2009

Tente colocar no Evento OnGetTableName do dataSetProvider o nome da tabela em questão. Coloque o nome todo em maiusculo

Aparentemente o que vc passou, a forma que configurou esta correta.


GOSTEI 0
Ant.neto

Ant.neto

28/09/2009

O mais importante ao definir o padrão de atualização do DataSnap é a propriedade UpdateMode do DataSetProvider. Tendo definido: DataSetProvider.UpdateMode = upWhereKeyOnly Significa que ao resolver UPDATES e DELETES apenas o(s) campo(s) ´cheve´ serão utilizados para localizar (WHERE) o registro atualizado ou excluído. Para definir quem é(são) o(s) campo(s) chave, é utilizada a propriedade ProviderFlags dos TFields do DataSet do DataSetProvider, incluindo [b:5ea04e2400]pfInKey[/b:5ea04e2400] no ProviderFlags apenas do(s) campo(s) chave! ou, no ObjectInspector: ProviderFlags.pfInKey := True // Apenas para os campos chave NOTE QUE O ProviderFlags DEVE SER DEFINIDO NOS TFIELDS DO DATASET ASSOCIADO AO DataSetProvider (SQLDataSet no seu caso) E NÃO NO ClientDataSet. Bom, caso esta configuração esteja incorreta, ou os campos utilizados para encontrar o registro tenham tido seus valores alterados por um usuário na rede então o DataSnap não conseguirá encontrar O REGISTRO ou encontrará mais q um registro, e assim vc terá o erro q está recebendo. T+


Amigo, agradeço pela a atenção, mas n funcionou.. configurei da forma que vc. passou, os Tfields do clientdataset deixei os flags tudo false... configurei apenas no sqldataSet, mas o erro continuou. o duro que os campos strings, quando edito as vezes dar certo, mas quando trabalho com os campos numéricos com casas decimais da esse pau... estranho né.. obrigado novamente...


GOSTEI 0
Afarias

Afarias

28/09/2009

|as quando trabalho com os campos numéricos com casas decimais da esse
|pau... estranho né.. obrigado novamente...

Campos ´numéricos com casas decimais´ ?? Se vc está falando de campos tipo ponto flutuante (float, double, etc) então não tem nada de estranho.

Este tipo de dados não é exato e nunca deveria ser usado como ´chave´... estranho seria vc usar um campo deste tipo como ´chave´.


T+


GOSTEI 0
Ant.neto

Ant.neto

28/09/2009

|as quando trabalho com os campos numéricos com casas decimais da esse |pau... estranho né.. obrigado novamente... Campos ´numéricos com casas decimais´ ?? Se vc está falando de campos tipo ponto flutuante (float, double, etc) então não tem nada de estranho. Este tipo de dados não é exato e nunca deveria ser usado como ´chave´... estranho seria vc usar um campo deste tipo como ´chave´. T+


O QUE EU QUERO DIZER, QUE ESSE ERRO SÓ APARECE QUANDO ´ATERO´ OS CAMPOS DEFINIDOS COMO NUMÉRICO NO BANCO, ELES NÃO SÃO CHAVES. ESTES CAPOS:

(PARTE DA ESTRUTURA DA TABELA)
SALARIO NUMERIC(9,3),
GRATIFICACAO NUMERIC(9,3),

OBRIGADO NOVAMENTE


GOSTEI 0
Afarias

Afarias

28/09/2009

Hummm...

Use um monitor para ´capturar´ os comandos SQL executados no banco (quando do ApplyUpdates) para assim poder avaliar se os SQLs gerados estão corretos.


T+


GOSTEI 0
Ant.neto

Ant.neto

28/09/2009

Hummm... Use um monitor para ´capturar´ os comandos SQL executados no banco (quando do ApplyUpdates) para assim poder avaliar se os SQLs gerados estão corretos. T+


Não observei erro no SQL.

Fiz um teste de atribuir um valor diretamente ao campo. mas tbm da erro num tem jeito.. achp que vou voltar pro meu Delphi 7 e firebir 1.5 (nunca tive esteproblema.. rs) uilizo o Fire 2.0 e Delphi 2007.


Tteste
ClientDataSet1Valor.Asfloat:=10.00; // O Delphi atribui o tipo TBCD aos campos numériocos. daí utilizei AsFloat.
ClientDataSet1.ApplyUpdates(0) ;

Obrigado pela ajuda novamente.


GOSTEI 0
Afarias

Afarias

28/09/2009

|Não observei erro no SQL.

Pode mostrar o SQL gerado/executado (de um momento que dá erro) ??


|Fiz um teste de atribuir um valor diretamente ao campo. mas tbm da erro
|num tem jeito.. achp que vou voltar pro meu Delphi 7 e firebir 1.5 (nunca
|tive esteproblema.. rs) uilizo o Fire 2.0 e Delphi 2007.

Se for um bug, não é do Firebird 2. Se for do Delphi 2007, alguma atualização nos componentes ou drivers (de acesso ao banco) deve resolver.


|ClientDataSet1Valor.Asfloat:=10.00; // O Delphi atribui o tipo TBCD aos
|campos numériocos. daí utilizei AsFloat.

Não é natural que um campo tipo NUMERIC(x,3) seja TBCD. Até 4 casas decimais o mais correto seria q o campo fosse TCurrencyField.

Está usando DBX? Qual driver?? Sua base de dados foi criada em FB2? É Dialeto 3?


T+


GOSTEI 0
Ant.neto

Ant.neto

28/09/2009

Ola afarias,

Estou utilizando o drive Tbodbx4, Dbexpress, O Banco foi criado no dialeto 3, char set 8859_1, e criei através do Ibexpert utilizando o FB2.0. importante, eu tinha instalado o fire 1.5 e desinstalei.

Obrigado Novamente.

|Não observei erro no SQL. Pode mostrar o SQL gerado/executado (de um momento que dá erro) ?? |Fiz um teste de atribuir um valor diretamente ao campo. mas tbm da erro |num tem jeito.. achp que vou voltar pro meu Delphi 7 e firebir 1.5 (nunca |tive esteproblema.. rs) uilizo o Fire 2.0 e Delphi 2007. Se for um bug, não é do Firebird 2. Se for do Delphi 2007, alguma atualização nos componentes ou drivers (de acesso ao banco) deve resolver. |ClientDataSet1Valor.Asfloat:=10.00; // O Delphi atribui o tipo TBCD aos |campos numériocos. daí utilizei AsFloat. Não é natural que um campo tipo NUMERIC(x,3) seja TBCD. Até 4 casas decimais o mais correto seria q o campo fosse TCurrencyField. Está usando DBX? Qual driver?? Sua base de dados foi criada em FB2? É Dialeto 3? T+



GOSTEI 0
Jb Ltda

Jb Ltda

28/09/2009

Também tenho este problema, Esse erro também ocorre quando vou dar o ApplyUpdates no ClientDataSet e por algum motivo o registro no Qual o ClientDataset irá montar o Delete ou Update não existe mais no Banco. (Ex caso de deleção em cascata).

Ex: tenho 2 ClientDatasets, um que seria o pai e o outro o filho.

- Deleto o registro no ClientDataset Filho
- Deleto o Registro no ClientDataset Pai.

Ao dar o applyUpdates no ClientDataset Pai o registro filho é deletado via Trigger.
Ao Dar o applyUpdates no ClientDataset Filho ocorre o erro "Record not found or Changed by User" por causa que o registro não existe mais no banco.

Lembrando que Preciso dar o applyUpdates dentro da Mesma transação.

Como resolver esse caso?
GOSTEI 0
POSTAR