SQLDataSet sem Fields - upWhereKeyOnly
Olá pessoal.
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
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
Curtidas 0
Respostas
Emerson Nascimento
08/10/2008
você pode acionar isso no evento BeforeUpdateRecords do DatasetProvider
GOSTEI 0
Andremuller
08/10/2008
Olá Emerson.
Obrigado, mas infelizmente isso não funcionaria porque, como eu disse o
(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.
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.
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
Emerson Nascimento
08/10/2008
no BeforeUpdateRecords do DatasetProvider você deve trabalhar com SourceDS e DeltaDS, onde SourceDS é o Dataset (SQLDataset, IBDataset, etc) e o DeltaDS é o ClientDataset. daí você pode usar:
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.
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
Andremuller
08/10/2008
Acontece que no BeforeUpdateRecords o SQLDataset está sem os fields e como consequência disso não consigo setar o pflnKey.
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.
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
Emerson Nascimento
08/10/2008
também tenho um sqldataset ligado a um datasetprovider e altero a instrução no clientdataset em runtime (tenho vários clientdatasets ligados ao mesmo provider).
acho que opero milagres, porque comigo funciona.
acho que opero milagres, porque comigo funciona.
GOSTEI 0
Andremuller
08/10/2008
Olá Emerson.
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?
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
Emerson Nascimento
08/10/2008
minha configuração é dessa forma mesmo. tenho a opção upWhereKeyOnly no provider, mas não preciso da instrução no SQLDataset, pois posso ´flegar´ os campos chave no evento BeforeUpdateRecord do provider em tempo de execução.
você tem um e-mail pra eu te passar um exemplo?
você tem um e-mail pra eu te passar um exemplo?
GOSTEI 0
Andremuller
08/10/2008
Olá Emerson.
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
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