Fórum Qual a forma correta para abertura de Tabela #40149

16/11/2003

0

Sou iniciante em C/S. Tenho a seguinte duvida. Fiz uma base, onde minha chave primaria é codigo e utilizo generator para controle do campo.
Na minha aplicação estou utilizando DBExpress. Montei mei DM com : SQLConection => SQLDataSet => DataSetProvider => ClientDataSet.
No CommandText do SQLDataSet coloquei : ´Select * from Clientes where Codigo = :pCodigo´ , onde pCodigo é meu paramentro para filtro.
Quando abro meu ClientDataSet, ele vem vazio. Não tenho nenhum problema ao tentar inserir um registro. Porem apos aplicar ´ApplyUpdates()´, esse registro continua em cache, porem sem o valor ´Codigo´, e no Banco ele tem o Codigo. Ai vem o problema ao inserir outro registro ele acusa ´Key Violation´ pois em cache ja existe um registro com codigo = Null.
Tentei dar refresh no ClientDataSet para atualizar os dados e o Valor do codigo, no entanto pelo meu comando Sql utiliazado no SQLDataSet ele me retorna vazio pois nâo tenho o valor do codigo para passar como parametro.

Se alguem puder ajudar, fico muito grato.


Paganato

Paganato

Responder

Posts

17/11/2003

Afarias

|Porem apos aplicar ´ApplyUpdates()´, esse registro continua em cache,
|porem sem o valor ´Codigo´, e no Banco ele tem o Codigo.

Normal. Vc deve estar gerando o código com trigger. assim, só o servidor vai saber do novo código (até q vc faça a query novamente).


Vc deve gerar o código na estação, no ClientDataSet (usando o evento OnNewRecord ou BeforePost) -- ou no DataSetProvider (usando o evento BeforeUpdateRecord) neste caso, vc tem q abilitar a opção poPropagateChanges.


T+


Responder

Gostei + 0

18/11/2003

Paganato

AFarias, descupe-me, mas como faço para gerar o código na estação?
Outra coisa é melhor gerar o codigo na estação ou com trigger?
E quanto a forma de acessar os dados na base, a que estou utilizando é boa ou existem formas diferentes ou até mesmo melhor?


Responder

Gostei + 0

19/11/2003

Afarias

|mas como faço para gerar o código na estação?

Se vc usa IBX vc pode usar a propriedade GeneratorField do IBQuery ou IBDataSet e configurar a opção onNewRecord ou beforePost.

Usando ou não IBX, vc pode gerar na estação com uma sismples query::

select gen_id(nome_do_generator,1) from rdb$database

eu sugiro q vc tenha um procedimento em seu sistema que pode ser usado para todos os generators::

procedure GetNewID(const AGeneratorName: string): Integer;
const
SQLText = ´select gen_id(¬s, 1) from rdb$database´;
begin
Result := 0;
with IBSQL1 do
try
SQL.Text := Format(SQLText, [AGeneratorName]);
Transaction.StartTransaction;
ExecQuery;
Result := Fields[0].AsInteger;
finally
Transaction.Commit;
end;
end;

(claro q vc pode substituir o IBSQL1 por um componente de sua preferência)

então, vc pode usar este código em um evento OnNewRecord ou BeforePost (ou outro caso) de seus DataSets, ex::

DataSet.FieldByName(´CODIGO´).AsInteger := GetNewID(´meuGenerator´);



|Outra coisa é melhor gerar o codigo na estação ou com trigger?

Não existe um melhor q o outro. O caso aqui é de *necessidade* -- vc tem de pensar:: ´Preciso saber do código gerado no cliente no momento da gravação??´, ou:: ´Devo contactar o banco de dados para receber um novo código neste momento??´

Depende do q sua aplicação precisa. Por experiência (não exatamente própria, mas dos sistemas que vejo por ai) -- a maioria absoluta dos sistemas de pequeno e médio porte vão devem usar a chave gerada no ´cliente´ (sem triggers).


|E quanto a forma de acessar os dados na base, a que estou utilizando é
|boa ou existem formas diferentes ou até mesmo melhor?

Na minha impressão está tudo certo. Não tem muito como avaliar a tecnologia q vc está usando para conexão (DBX no caso) -- todas são boas e tem suas vantágens e desvantágens.

No geral, me parece q vc está no caminho... tem uma boa abordágem.



T+


Responder

Gostei + 0

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

Aceitar