erro com dbexpress

Delphi

28/01/2004

Srs,

Dando continuidade ao meu estudo, estou desenvolvendo uma simples aplicação de cadastro de clientes. Estou usando sqlserver como banco, e a paleta dbexpress, para inserir estou usando um botão com o código: ´datasource.dataset.append´ e assim por diante. A tabela clientes foi criada com a propriedade IDENTY do campo id_cliente setada para YES, isto faz o campo se comportar como autoincremento. Quando vou inserir algum registro na aplicação eu preencho apenas os campos ´razao social´ e ´nomefantasia´, pois o campo ´id_cliente´ eu deixei desativado. Ao salvar o delphi me retorna um erro ´id_cliente must have a value´, ou seja ele é um campu chave-primária e não pode conter valores nulos, mas porque o incremento não funcionou automaticamente ao salvar o registro? Eu já usei os componentes ADO e funcionaram corretamente, mas como pretendo ser programador eu preciso entender porque não funcionou com dbexpress.

Aguardo um retorno de vcs.


Programalista

Programalista

Curtidas 0

Respostas

Maicongabriel

Maicongabriel

28/01/2004

Entendendo, funciona assim:: O Delphi utiliza a chave primária para se referenciar ao registro no banco de dados! Logo, mesmo que o banco crie o codigo automático(com o FB este erro tbm ocorre), o delphi não consegue ´ver´ este código, logo é precizo que você crie uma ´gambiarra´ para tal detalhe! Os componentes ADO devem funcionar pq o proprio já faz a ´gambiarra´ e/ou funciona de uma forma diferente(pouco provável), mas com DBExpress é assim. :wink:


GOSTEI 0
Programalista

Programalista

28/01/2004

Ok MaiconGabriel,

Agora, como é que eu crio no sqlserver uma stored procedure que incremente o id_cliente da tabela clientes? Como seria o codigo desta stored procedure, por que ai então eu exibiria o codigo através de um DBtext.

Lourival Oliveira
Sete Lagoas - MG


GOSTEI 0
Rik3500

Rik3500

28/01/2004

Olá Lourival Oliveira.

Eu em seu lugar faria o seguinte.
Independente de usar o ADO ou DBExpress, eu criaria o autoincremento no codigo do programa e não o SqlServer, assim:
1- Crie uma Query, e instrua o seguinte código SQL: ´Select MAX(Codigo) from Tabela´, abra a query e adicione o campo gerado;
2- No dataSet em que voce irá tabalhar, ex: DataSetClientes. Crie o evento AfterInsert a instrução:
Query.Close ou Active := False;
Query.Open ou Acteive := True;
DataSetClientesCodigo.Value := (QueryMAX.Value + 1);

Assim voce verá que ira funcionar beleza.

Falou!

Abraço.


GOSTEI 0
Programalista

Programalista

28/01/2004

Caro Rick3500,

Vc é ferademais, funcionou a sugestão, veja abaixo o codigo que implementei. Muito Obrigado, valeu mesmo.

[color=blue:94bad22d7b]dados.SQLQuery1.Active:= False;
dados.SQLQuery1.Active:= True;
dados.ClientDataSet1id_cliente.Value:= dados.SQLQuery1column1.Value + 1;[/color:94bad22d7b]

Olhe que é uma idéia bastante original, parabéns!!!


GOSTEI 0
Oziasl

Oziasl

28/01/2004

Já tive esse problema e foi resolvido da seguinte forma.

Adicione o campos pela query, dando duplo clique e aponte para campo autoincremento e na propriedade required passe para false. Faça o mesmo para clientdataset. Os componentes dbexpress são bons, mas precisam ser bem configurados :P . Tudo de bom - Ozias


GOSTEI 0
Programalista

Programalista

28/01/2004

Nossa, as possibilidades às vezes são limitadas pelo nosso próprio conhecimento, pouco ou muito. Ozias, sou-lhe muito grato pela dica, pois também funcionou. Agora eu fiquei na dúvida sobre qual destas formas é a mais eficiente no que diz respeito à performance da aplicação e/ou do banco de dados. Vc saberia me responder?


GOSTEI 0
Rik3500

Rik3500

28/01/2004

Em termos de velocidade da aplicação, e para evitar o excesso de componetes no projeto, a solução do Ozias é a melhor sem duvida.


GOSTEI 0
POSTAR