GARANTIR DESCONTO

Fórum Autoincrement em campo alfanumérico #421109

06/08/2012

0

Olá galera....tentando incrementar uma tabela com mais recursos me deparei com um probleminha. Vou tentar explicar.

A tabela é Paradox para cadastro de cliente e ela faz parte de um sistema criado por outra pessoa. Como ela não oferece todos os campos necessários às necessidades da empresa que trabalho resolvi adicionar campos para complementar. Notei que o campo de código do cliente é alfanumérico e não autoincrement. Mesmo assim fiz o novo form, que funcionou legal. Só não foi preenchido após salvar o campo de código.

Então vem a dúvida:
Como fazer para que, ao adicionar novo cliente, seja gerado o código tipo autoincrement e este seja mostrado no form no momento do preenchimento dos dados?

Acho que deu pra entender......rsrsrsr
Carlos Magno

Carlos Magno

Responder

Posts

06/08/2012

Gustavo Bretas

Carlos, faz muito tempo que não tabalho com Paradox, mas se vc usar os componentes da paleta BDE, tenta fazer um SELECT MAX na tabela em questão com uma TQuery.

SELECT MAX(CAMPO) AS ID FROM TABELA


A questão é que como o campo é alfanumérico, se tiver um registro que o ID não seja numéro vai dar problema!

Espero ter ajudado!

Abraço!
Responder

Gostei + 0

07/08/2012

Carlos Magno

Não deu certo, Gustavo. Montei a query, não deu erro, mas não gravou o código.
Responder

Gostei + 0

07/08/2012

Deivison Melo

Quando for pesquisar essas informações por serem alfanumericos os valores ficaram ordenados de forma um pouco difernte dos numericos.

Digamos que temos os valores: 1,2,3,10,20,30 e ao mandarmos ordenar os valores ficará da seguinte forma:

1
10
2
20
3
30

Ao invés de ficar:

1
2
3
10
20
30

Para resolver isso, na sua consulta deverá ser efetuado um cast nas informações a serem pesquisadas!

Espero te ajudado!

Responder

Gostei + 0

07/08/2012

Gustavo Bretas

Carlos, não deu certo, mas o que aconteceu? Não trouxe nada, touxe o código errado? Não gravar o código pode ser relaciona a algumas outras coisas!
Quanto mais informação vc conseguir nos passar, mais fácil fica para te ajudarmos!

O Deivison tem razão nesse lance da ordenação, mas eu não sei se é possível fazer o cast em query com DBE, não tenho certeza se é compatível, mas um teste não faz mal né!? rsrs

Tenta esse Carlos!

SELECT MAX(CAS(CAMPO AS INTEGER)) AS ID FROM TABELA


Estamos aguardando seu retorno!
Responder

Gostei + 0

07/08/2012

Carlos Magno

Bom... testei o CAST, mas não me retornou nada. Quando coloquei somente o MAX, sem compilar ele me retornou o código do último registro inserido. Mas ao dar o Append para iniciar o novo registro, não me retornou número nenhum, e após o Post, não gravou nada no campo de código, mas gravou nos outros.
Responder

Gostei + 0

07/08/2012

Carlos Magno

Aconteceu algo....ao recompilar deu um erro que diz Record locked by another user.
Responder

Gostei + 0

07/08/2012

Gustavo Bretas

Carlos, esta fazendo o select em outra query né?

Como o campo não é autoincremento vc vai ter que setar o código nele, e pra buscar o código tem que ser em outra query!

Eu recomendo vc setar o código no BeforePost do DataSet, assim evita erro de PK se alguém estiver cadastrando no mesmo momento que vc!

Então:

procedure TSeuFormulario.SeuDataSetBeforePost(DataSet : TDataSet);
begin
try
qryCodigo.Close;
qryCodigo.SQL.Clear;
qryCodigo.SQL.Add(SELECT MAX(CAMPO) AS ID FROM TABELA);
qryCodigo.Open;
//
SeuDataSetClienteCodigo.AsInteger := qryCodigo.Fields[0].AsInteger;
//
finally
qryCodigo.Close;
end;
end;


Aguardando retorno!
Responder

Gostei + 0

07/08/2012

Carlos Magno

Vou tentar amanhã, pq agora to de saida do trabalho.....amanhã dou um retorno
Responder

Gostei + 0

08/08/2012

Carlos Magno

Bretas.....ainda não tentei sua dica, mas ao ler direito segue uma informação. Todas as querys e datasets estão em um datamodule. Então, como eu faria essa setagem na query do datamodule?
Responder

Gostei + 0

09/08/2012

Carlos Magno

Alguma dica a mais ae, por favor....??????.....até agora não entendi do porque o programador que fez o sistema criou a tabela de clientes com o campo de código como alfanumérico e não como autoincrement como seria o procedimento padrão.
Responder

Gostei + 0

13/08/2012

Carlos Magno

Ninguem???
Responder

Gostei + 0

13/08/2012

Deivison Melo

Usa essa funcao:


function GeneratorID (aName: string; Connection: TSQLConnection;
Incrementa: Boolean): integer;
var
Qry: TSQLQuery;
begin
Qry := TSQLQuery.Create(nil);
try
Qry.SQLConnection := Connection;
if Incrementa then
Qry.SQL.Add(
SELECT GEN_ID(+aName+, 1) FROM RDB$DATABASE)
else
Qry.SQL.Add(
SELECT GEN_ID(+aName+, 0) FROM RDB$DATABASE);
Qry.Open;
Result := Qry.Fields[0].AsInteger;
finally
FreeAndNil(Qry);
end;
end;


Ou seja vc vai descarregar o valor dessa função em uma variável alfanumerica e depois utilizar!!!!

Responder

Gostei + 0

23/08/2012

Carlos Magno

Deivison....desculpe a demora responder, mas não entendi onde se coloca esta função que você postou. Não sei se você leu em outros post que fiz, mas sou leigo em DELPHI, estou aprendendo sozinho e na raça mesmo. Eu tentei fazer usando um MAX, pegar esse valor, transformar em INTEGER e adicionar 1, mas dá erros de incompatibilidades de formatos e diz que não é um valor integer válido. Caramba, só esta faltando isso para concluir meu programinha e deixar ele pelo menos funcional para outros usarem.
Responder

Gostei + 0

24/08/2012

William

Olá Carlos, a função q o colega Deivison postou para vc é baseada no SGBD Firebird o que acredito que não seja o seu caso.

Quanto à questão de não criar um campo ID auto incremento e criar um campo código alfanumérico, vai muito da análise de pré-requisitos e conhecimento sobre banco de dados do programador na época de desenvolvimento.

Acredito que essa tabela já esteja sendo usada e possua vários registros.

Eu tentaria criar um novo campo ID inteiro, sei que já existe informações então vc teria que montar um loop no delphi e preencher esse campo ID auto incrementando baseado no contador do loop, após essa fase aí é só seguir o exemplo do colega Bretas, usando instrução SQL MAX().
Responder

Gostei + 0

24/08/2012

Deivison Melo

function GeneratorID (aName: string; Connection: TSQLConnection;
Incrementa: Boolean): integer;
var
Qry: TSQLQuery;
begin
Qry := TSQLQuery.Create(nil);
try
Qry.SQLConnection := Connection;
if Incrementa then
Qry.SQL.Add(
SELECT max(+campo+, 1) FROM tabela)
else
Qry.SQL.Add(
SELECT max(+campo+, 0) - 1 FROM tabela);
Qry.Open;
Result := Qry.Fields[0].AsInteger;
finally
FreeAndNil(Qry);
end;
end;

Vê se assim atenderá... (estou sem delphi aqui)

Qual o banco q vc está utilizando?

Me fala que faço a funcao para vc!!
Responder

Gostei + 0

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

Aceitar