Fórum Record not found or changed by another user #375371
28/09/2009
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
Curtir tópico
+ 0Posts
28/09/2009
Afarias
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
28/09/2009
Osocram
Aparentemente o que vc passou, a forma que configurou esta correta.
Gostei + 0
28/09/2009
Ant.neto
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
28/09/2009
Afarias
|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
28/09/2009
Ant.neto
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
28/09/2009
Afarias
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
28/09/2009
Ant.neto
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
28/09/2009
Afarias
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
29/09/2009
Ant.neto
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.
Gostei + 0
13/08/2015
Jb Ltda
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
Clique aqui para fazer login e interagir na Comunidade :)