erro com dbexpress
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.
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
Curtidas 0
Respostas
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
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
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
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.
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
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!!!
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
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
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
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
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