Record not found or changed by another user
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.
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
Curtidas 0
Respostas
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+
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
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.
Aparentemente o que vc passou, a forma que configurou esta correta.
GOSTEI 0
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
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+
|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
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
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+
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
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
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+
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
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.
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
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?
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