Fórum Retornar valor automático do banco para o Clientdataset #349191

19/11/2007

0

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!!


Cd.degrande

Cd.degrande

Responder

Posts

19/11/2007

Comodelphi

BeforeUpdateRecord no Provider.

DeltaDS.FieldByName(<Nome do Campo>).Value := <Valor>;

Não use edit, nem post no Delta;


Responder

Gostei + 0

19/11/2007

Comodelphi

Esqueci de dizer que em options do provider tem estar assim:

poPropogateChanges := True;

é isso.


Responder

Gostei + 0

19/11/2007

Cd.degrande

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)


Responder

Gostei + 0

19/11/2007

Cd.degrande

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+


Responder

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.


Responder

Gostei + 0

20/11/2007

Cd.degrande

Valeu, vou testar aki, obrigado pela ajuda


Responder

Gostei + 0

21/11/2007

Cd.degrande

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+


Responder

Gostei + 0

22/11/2007

Macario

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.


Responder

Gostei + 0

22/11/2007

Cd.degrande

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!


Responder

Gostei + 0

23/11/2007

Macario

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.


Responder

Gostei + 0

23/11/2007

Comodelphi

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.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar