Fórum SQLDataSet sem Fields - upWhereKeyOnly #364801
08/10/2008
0
Preciso fazer uns updates utilizando a estrutura SQLDataSet + DataSetProvider + ClientDataSet.
Ocorre que essa estrutura é montada em runtime e por isso não tenho os fields definidos no CDS ou no SDS. Porém preciso utilizar upWhereKeyOnly no provider.
De que forma posso acessar o provider flags do SQLDataSet em runtime?
Atualmente eu abro a consulta nele também para que ele tenha os fields definidos mas não gosto muito dessa maneiro e procuro melhores.
obrigado
Andremuller
Curtir tópico
+ 0Posts
08/10/2008
Emerson Nascimento
Gostei + 0
09/10/2008
Andremuller
Obrigado, mas infelizmente isso não funcionaria porque, como eu disse o
sds.FieldCount = 0.
(nesse evento também)
Para carregar os fields eu abro o sds antes de abrir o cds, mas isso só para ter os fields e poder fazer a seleção da chave.
cdsToSinc.Close; sdsToSinc.Close; sdsToSinc.CommandText := ´SELECT * FROM ´ + sTabela + ´ WHERE ´ + sPk + ´ = ´ + IntToStr(sPkValor); sdsToSinc.Open; if Assigned(sdsToSinc.FindField(sPk)) then begin sdsToSinc.FieldByName(sPk).ProviderFlags := [pfInKey, pfInUpdate, pfInWhere]; dspToSinc.UpdateMode := upWhereKeyOnly; end else dspToSinc.UpdateMode := upWhereAll; cdsToSinc.Open; cdsToSinc.FieldByName(sPk).ProviderFlags := [pfInKey, pfInUpdate, pfInWhere];
A questão é que esse código não me agrada nem um pouco. Procuro uma forma de ter os fields no sds sem precisar abrir a consulta nele. Pensei em criar os objetos manualmente no FieldsDefs... mas talvez alguém aqui sabe uma maneira mais automaticamente.
Gostei + 0
09/10/2008
Emerson Nascimento
DeltaDS.FieldCount - retorna o número de campos
DeltaDS.FieldByName(X).NewValue - atribui um valor ao campo
DeltaDS.FieldByName(X).AsXXXX - retorna o conteúdo do campo
DeltaDS.FieldByName(X).ProviderFlags - manipula as flags do campo
e deixa de ter de abrir o dataset, precisando abrir apenas o clientdataset.
e funciona, porque eu trabalho dessa forma.
Gostei + 0
09/10/2008
Andremuller
Lembrando que o CommandText é montado em runtime para diversas tabelas e por isso não posso carregar os fields em design time.
Como não consigo setar o pfInKey dá erro ´Unable do find record. No key specified´ no ApplyUpdates.
Gostei + 0
09/10/2008
Emerson Nascimento
acho que opero milagres, porque comigo funciona.
Gostei + 0
20/11/2008
Andremuller
Passei pelo mesmo problema novamente e agora lendo seu post denovo acho que entendi de que forma você faz isso.
Você altera o CommandText do ClientDataSet ao invés do SQLDataSet.
Liga vários ClientDataSet a 1 provider e a 1 SQLDataSet.
Então não precisaria informar no SQLDataSet o provider flags dos fields.
Porque atualmente, quando mudo o CommandText do SQLDataSet, utilizo upWhereKeyOnly no provider eu sou OBRIGADO a informar quais campos são chave no SQLDataSet.
No seu exemplo você só informa os campos chaves no DeltaDS, quer dizer, não é a mesma arquitetura que estou utilizando.
O seu SQLDataSet não tem CommandText informado, certo?
Gostei + 0
20/11/2008
Emerson Nascimento
você tem um e-mail pra eu te passar um exemplo?
Gostei + 0
21/11/2008
Andremuller
O problema parece resolvido com a sua dica mesmo.
Quando você falou em DeltaDS eu não tinha me dado por conta que esse era um parâmetro do evento BeforeUpdateRecords.
Realmente flegando no que seria o client nesse momento é suficiente.
É que eu continuei flegando só o client em outro momento, e nesse outro ele exige que no SQLDataSet também esteja sinalizada a chave.
Muito obrigado
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)