Fórum SQLDataSet sem Fields - upWhereKeyOnly #364801

08/10/2008

0

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


Andremuller

Andremuller

Responder

Posts

08/10/2008

Emerson Nascimento

você pode acionar isso no evento BeforeUpdateRecords do DatasetProvider


Responder

Gostei + 0

09/10/2008

Andremuller

Olá Emerson.

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.


Responder

Gostei + 0

09/10/2008

Emerson Nascimento

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.


Responder

Gostei + 0

09/10/2008

Andremuller

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.


Responder

Gostei + 0

09/10/2008

Emerson Nascimento

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.


Responder

Gostei + 0

20/11/2008

Andremuller

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?


Responder

Gostei + 0

20/11/2008

Emerson Nascimento

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?


Responder

Gostei + 0

21/11/2008

Andremuller

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


Responder

Gostei + 0

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

Aceitar