Fórum Retornar valor automático do banco para o Clientdataset #349191
19/11/2007
0
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
Curtir tópico
+ 0Posts
19/11/2007
Comodelphi
DeltaDS.FieldByName(<Nome do Campo>).Value := <Valor>;
Não use edit, nem post no Delta;
Gostei + 0
19/11/2007
Comodelphi
poPropogateChanges := True;
é isso.
Gostei + 0
19/11/2007
Cd.degrande
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
19/11/2007
Cd.degrande
[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
19/11/2007
Comodelphi
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
20/11/2007
Cd.degrande
Gostei + 0
21/11/2007
Cd.degrande
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
22/11/2007
Macario
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
22/11/2007
Cd.degrande
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
23/11/2007
Macario
Mesmo se for client/server voce fazendo uso de functions fica ´elegante´.
Um abraço.
Gostei + 0
23/11/2007
Comodelphi
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)