Qual a forma correta para abertura de Tabela
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.
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
Curtidas 0
Respostas
Afarias
16/11/2003
|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+
|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+
GOSTEI 0
Paganato
16/11/2003
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?
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?
GOSTEI 0
Afarias
16/11/2003
|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+
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+
GOSTEI 0