Retornar valor automático do banco para o Clientdataset
Olá pessoal,
Essa dúvida tá me matando de tanto pesquisar!
Como retornar um valor de um campo gerado automaticamente no banco de dados (autoincremental por exemplo) para o clientdataset logo após o applyupdates???
Estou usando Delphi2007:
SQLConnection+SQLDataSet+DataSetProvider+CLientdataset
O Banco de dados é SQLServer, mas o objetivo é funcionar em qualquer banco (pois essa é a ideologia do DBexpress certo?)
Obrigado pela ajuda!!
Essa dúvida tá me matando de tanto pesquisar!
Como retornar um valor de um campo gerado automaticamente no banco de dados (autoincremental por exemplo) para o clientdataset logo após o applyupdates???
Estou usando Delphi2007:
SQLConnection+SQLDataSet+DataSetProvider+CLientdataset
O Banco de dados é SQLServer, mas o objetivo é funcionar em qualquer banco (pois essa é a ideologia do DBexpress certo?)
Obrigado pela ajuda!!
Cd.degrande
Curtidas 0
Respostas
Comodelphi
19/11/2007
BeforeUpdateRecord no Provider.
DeltaDS.FieldByName(<Nome do Campo>).Value := <Valor>;
Não use edit, nem post no Delta;
DeltaDS.FieldByName(<Nome do Campo>).Value := <Valor>;
Não use edit, nem post no Delta;
GOSTEI 0
Comodelphi
19/11/2007
Esqueci de dizer que em options do provider tem estar assim:
poPropogateChanges := True;
é isso.
poPropogateChanges := True;
é isso.
GOSTEI 0
Cd.degrande
19/11/2007
Colega,
Primeiramente, Obrigado pela ajuda
Fiz um teste aki e infelizmente não funcionou. Mas acho que não fui muito claro no meu problema: Tenho uma tabela com 2 campos: 1 eu passo o valor pelo programa e o outro o valor é gerado lá no banco. Aí após dar um ApplyUpdates eu preciso que o valor gerado pelo banco retorne para o ClientDataSet.
A solução apontada está atribuindo um valor para o campo:
[i:b05ab31158]DeltaDS.FieldByName(´nomedocampo´).Value := <valor>;[/i:b05ab31158]
e o que eu preciso é do contrário:
[i:b05ab31158]????:= DeltaDS.FieldByName(´nomedocampo´).Value;[/i:b05ab31158]
Se puder dar mais uma atenção eu agradeço
(sou iniciante em Dbexpress)
Primeiramente, Obrigado pela ajuda
Fiz um teste aki e infelizmente não funcionou. Mas acho que não fui muito claro no meu problema: Tenho uma tabela com 2 campos: 1 eu passo o valor pelo programa e o outro o valor é gerado lá no banco. Aí após dar um ApplyUpdates eu preciso que o valor gerado pelo banco retorne para o ClientDataSet.
A solução apontada está atribuindo um valor para o campo:
[i:b05ab31158]DeltaDS.FieldByName(´nomedocampo´).Value := <valor>;[/i:b05ab31158]
e o que eu preciso é do contrário:
[i:b05ab31158]????:= DeltaDS.FieldByName(´nomedocampo´).Value;[/i:b05ab31158]
Se puder dar mais uma atenção eu agradeço
(sou iniciante em Dbexpress)
GOSTEI 0
Cd.degrande
19/11/2007
me esqueci, o erro que tá dando é:
[i:40d1055a40]´dataset not in edit or insert mode´[/i:40d1055a40]
ou seja, ele está tentando atribuir o valor para o campo.
t+
[i:40d1055a40]´dataset not in edit or insert mode´[/i:40d1055a40]
ou seja, ele está tentando atribuir o valor para o campo.
t+
GOSTEI 0
Comodelphi
19/11/2007
with TZReadOnlyQuery.Create(nil) do begin Connection := ecConnection.Connection; SQL.Clear; if UpdateKind = ukInsert then begin SQL.Text := ´SELECT currval(´´pedh_codpedh_seq´´) as cod´; Open; DeltaDS.FieldByName(´codpedh´).[b]NewValue[/b] := FieldByName(´cod´).AsInteger; end; Free; end;
Desculpe, na verdade a propriedade a ser editada é NewValue, esse trecho de código funcionou com Postgres + Zeos; Eu pego valor da sequencia gerada pelo banco e associo ao Delta do ClientDataSet. Você pode modificar o exemplo para o MSSQL: select @@identity as cod. Não tenho certeza se é assim no MSSQL mas é por ai.
abcs.
GOSTEI 0
Cd.degrande
19/11/2007
Valeu, vou testar aki, obrigado pela ajuda
GOSTEI 0
Cd.degrande
19/11/2007
Olá pessoal.
Pois é, ainda não consegui resolver o problema de retornar o valor de um campo gerado automaticamente no banco logo após a inserção do registro.
Não consegui utilizar a dica citada pelo colega acima.
Se alguem puder ajudar, agradeço, é só ´subir´ para ver os posts anteriores.
t+
Pois é, ainda não consegui resolver o problema de retornar o valor de um campo gerado automaticamente no banco logo após a inserção do registro.
Não consegui utilizar a dica citada pelo colega acima.
Se alguem puder ajudar, agradeço, é só ´subir´ para ver os posts anteriores.
t+
GOSTEI 0
Macario
19/11/2007
Olá.
Se voce quer obter o valor do campo identity gerado pelo MSSQL para usar em um relacionamento, execute logo após o ApplyUpdates.
Select @@Identity as CAMPO
desta forma você obterá o valor gerado.
Espero que ajude.
Se voce quer obter o valor do campo identity gerado pelo MSSQL para usar em um relacionamento, execute logo após o ApplyUpdates.
Select @@Identity as CAMPO
desta forma você obterá o valor gerado.
Espero que ajude.
GOSTEI 0
Cd.degrande
19/11/2007
Valeu moçada, deu certo, o ´tontão´ aqui que estava fazendo errado, funcionou beleza.
Mas mesmo deixo aqui a minha pequena indignação quanto ao Dbexpress+ClientDataset sobre o assunto de campos autoincrementais no lado servidor. Resolvi utilizar essa tecnologia após pesquisas realizadas e vários comentários a respeito da portabilidade para vários bancos de dados (isso encheu os olhos). Agora vou ter que implantar uma configuração para saber qual o banco de dados q estou usando, pois a solução apontada pelos atenciosos colegas (@@identity) só vai funcionar com o SQLServer.
Mais paciência, antes uma ´configuraçãozinha´ do que alterar o projeto todo no caso de troca de banco.
Obrigado a todos!
Mas mesmo deixo aqui a minha pequena indignação quanto ao Dbexpress+ClientDataset sobre o assunto de campos autoincrementais no lado servidor. Resolvi utilizar essa tecnologia após pesquisas realizadas e vários comentários a respeito da portabilidade para vários bancos de dados (isso encheu os olhos). Agora vou ter que implantar uma configuração para saber qual o banco de dados q estou usando, pois a solução apontada pelos atenciosos colegas (@@identity) só vai funcionar com o SQLServer.
Mais paciência, antes uma ´configuraçãozinha´ do que alterar o projeto todo no caso de troca de banco.
Obrigado a todos!
GOSTEI 0
Macario
19/11/2007
Neste caso, se vc trabalhar com multicamadas vc implementa Interface para casa banco, o que não é visto como um problema.
Mesmo se for client/server voce fazendo uso de functions fica ´elegante´.
Um abraço.
Mesmo se for client/server voce fazendo uso de functions fica ´elegante´.
Um abraço.
GOSTEI 0
Comodelphi
19/11/2007
o uso de interfaces sem dúvida é super elegante e mais que isso, fica muito profissional e padronizado. Um bom exemplo, pra quem quiser fazer algo parecido, é a biblioteca do ZeosDBO. abcs.
GOSTEI 0