Autoincrement em campo alfanumérico
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
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
Curtidas 0
Respostas
Gustavo Bretas
06/08/2012
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.
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!
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!
GOSTEI 0
Carlos Magno
06/08/2012
Não deu certo, Gustavo. Montei a query, não deu erro, mas não gravou o código.
GOSTEI 0
Deivison Melo
06/08/2012
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!
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!
GOSTEI 0
Gustavo Bretas
06/08/2012
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!
Estamos aguardando seu retorno!
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!
GOSTEI 0
Carlos Magno
06/08/2012
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.
GOSTEI 0
Carlos Magno
06/08/2012
Aconteceu algo....ao recompilar deu um erro que diz Record locked by another user.
GOSTEI 0
Gustavo Bretas
06/08/2012
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:
Aguardando retorno!
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!
GOSTEI 0
Carlos Magno
06/08/2012
Vou tentar amanhã, pq agora to de saida do trabalho.....amanhã dou um retorno
GOSTEI 0
Carlos Magno
06/08/2012
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?
GOSTEI 0
Carlos Magno
06/08/2012
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.
GOSTEI 0
Carlos Magno
06/08/2012
Ninguem???
GOSTEI 0
Deivison Melo
06/08/2012
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!!!!
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!!!!
GOSTEI 0
Carlos Magno
06/08/2012
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.
GOSTEI 0
William
06/08/2012
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().
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().
GOSTEI 0
Deivison Melo
06/08/2012
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!!
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!!
GOSTEI 0
William
06/08/2012
Colega Deivison no primeiro post ele menciona que essa tabela é do Paradox!!
O campo é Alfanumérico a grosso modo é do tipo VARCHAR, então não tem como usar a função agredada MAX()!
O campo é Alfanumérico a grosso modo é do tipo VARCHAR, então não tem como usar a função agredada MAX()!
GOSTEI 0
William
06/08/2012
O campo é Alfanumérico a grosso modo é do tipo VARCHAR, então não tem como usar a função agredada MAX()!
Corrigindo meu último post, pode sim usar MAX() no instrução SQL com campos VARCHAR!
SELECT MAX(Campo_VARCHAR) + 1 FROM TABELA;
Essa instrução retorna o valor do campo VARCHAR acrescido de + 1.
GOSTEI 0
Carlos Magno
06/08/2012
William.... eu tentei fazer na query como você me passou:
ela estava assim:
select MAX(COD_CLI) as COD_CLI from cliente;
fiz assim:
select MAX(COD_CLI) + 1 as COD_CLI from cliente;
Só que deu o seguinte erro: Type mismatch in expression;
Seria falta de alguma aspa?
ela estava assim:
select MAX(COD_CLI) as COD_CLI from cliente;
fiz assim:
select MAX(COD_CLI) + 1 as COD_CLI from cliente;
Só que deu o seguinte erro: Type mismatch in expression;
Seria falta de alguma aspa?
GOSTEI 0
William
06/08/2012
Carlos vc tem Skype?
GOSTEI 0
Bruno Leandro
06/08/2012
Ola carlos voce ja tentou desta forma
select max(cast(COD_CLI as Int)) + 1 from cliente;
select max(cast(COD_CLI as Int)) + 1 from cliente;
GOSTEI 0
Carlos Magno
06/08/2012
Bruno....sem colocar o AS INT dá erro de "token ))"... e colocando o AS INT dá erro de Type mismatch. Campo é alfanumérioc, isto é, campo string e da forma como você colocou pede um integer.
GOSTEI 0
Claudia Nogueira
06/08/2012
Eu vi que já tentou de várias formas, então vou dar minha contribuição.
Você pode fazer isso pegando o último, armazenando em uma variável, incrementando 1 e gravar.
Exemplo:
Você pode fazer isso pegando o último, armazenando em uma variável, incrementando 1 e gravar.
Exemplo:
Var
iCod_cli : Integer;
begin
with Tabela do
Close;
Open;
Last;
try
iCod_cli := StrToInt(FieldByName('cod_cli').AsString) + 1;
except
iCod_cli := 1;
end;
//Agora você pega esse iCod_cli e grava na tabela
end;
end;
GOSTEI 0
Alisson Santos
06/08/2012
Amigo gostaria de saber se o que todas essas coisas que você fez deu certo, pois as explicações estão corretas até o ponto que sei.
Você fez o processo corretamente, pois nos que verifiquei acima, você está tentando utilizar um código que existe.
O que primeiro você tem que ver é se o código é incrementado pelo cliente ou interno, se for interno tudo tranquilo, vai conseguir resolver o seu problema com o que informarão agora se não for não tem como fazer.
Caso haja algum erro, debugar o programa para verificar o qual o valor que está sendo passado para esse campo antes.
Você fez o processo corretamente, pois nos que verifiquei acima, você está tentando utilizar um código que existe.
O que primeiro você tem que ver é se o código é incrementado pelo cliente ou interno, se for interno tudo tranquilo, vai conseguir resolver o seu problema com o que informarão agora se não for não tem como fazer.
Caso haja algum erro, debugar o programa para verificar o qual o valor que está sendo passado para esse campo antes.
GOSTEI 0
Gilvanio Gonçalves
06/08/2012
Carlos Magno, vc diz que o campo do sistema é alphanumerico, o programador
fez desta forma para acrescentar + 1 no codigo:
exemplo: se o codigo já gravado é 12 na codificação ao gravar tem
o comando para acrecentar + 1 sendo então 13 o proximo registro.
isto é facil se tratando de paradox. exemplo util e facil, e funcional
pra vc.
vc pode fazer o seguinte no seu codigo.
como vc deseja que o codigo fique em foco no dbedit ou (edit 0do seu form
e depois gravar faça o seguinte no evento oncrete do seu form de cadastro
insira este codigo:
procedure TFrmCadClientes.FormCreate(Sender: TObject);
Var
Cod:String[5];
begin
TbCadClie.open;
if TbCadclie.IsEmpty
then cod:='00001'
else
begin
TbCadClie.Last;
Cod:=IntToStr(TbCadClieCodigo.AsInteger + 1);
while Length(Cod)<5 do
cod:='0'+ Cod;
End;
TbCadClie.Append;
TbCadClieCodigo.Value:=Cod;
end;
assim quando abrir o form o dbedit que esta setado no campo codigo
da tabela exibira o codigo disponivel para gravação.
vc pode usar o codigo também no botão novo.
para gravar, vc seu codigo normal com o post; ok.
faça ai que tenho certeza que é isto que falta pra vc.
acho que não precisa explicar o codigo esta de facil entendimento.
no codigo dei exemplo com tabela, mas vc pode usar query ser for o seu caso.
Abs.
fez desta forma para acrescentar + 1 no codigo:
exemplo: se o codigo já gravado é 12 na codificação ao gravar tem
o comando para acrecentar + 1 sendo então 13 o proximo registro.
isto é facil se tratando de paradox. exemplo util e facil, e funcional
pra vc.
vc pode fazer o seguinte no seu codigo.
como vc deseja que o codigo fique em foco no dbedit ou (edit 0do seu form
e depois gravar faça o seguinte no evento oncrete do seu form de cadastro
insira este codigo:
procedure TFrmCadClientes.FormCreate(Sender: TObject);
Var
Cod:String[5];
begin
TbCadClie.open;
if TbCadclie.IsEmpty
then cod:='00001'
else
begin
TbCadClie.Last;
Cod:=IntToStr(TbCadClieCodigo.AsInteger + 1);
while Length(Cod)<5 do
cod:='0'+ Cod;
End;
TbCadClie.Append;
TbCadClieCodigo.Value:=Cod;
end;
assim quando abrir o form o dbedit que esta setado no campo codigo
da tabela exibira o codigo disponivel para gravação.
vc pode usar o codigo também no botão novo.
para gravar, vc seu codigo normal com o post; ok.
faça ai que tenho certeza que é isto que falta pra vc.
acho que não precisa explicar o codigo esta de facil entendimento.
no codigo dei exemplo com tabela, mas vc pode usar query ser for o seu caso.
Abs.
GOSTEI 0
Gilvanio Gonçalves
06/08/2012
Carlos Magno, vc diz que o campo do sistema é alphanumerico, o programador
fez desta forma para acrescentar + 1 no codigo:
exemplo: se o codigo já gravado é 12 na codificação ao gravar tem
o comando para acrecentar + 1 sendo então 13 o proximo registro.
isto é facil se tratando de paradox. exemplo util e facil, e funcional
pra vc.
vc pode fazer o seguinte no seu codigo.
como vc deseja que o codigo fique em foco no dbedit ou (edit 0do seu form
e depois gravar faça o seguinte no evento oncrete do seu form de cadastro
insira este codigo:
assim quando abrir o form o dbedit que esta setado no campo codigo
da tabela exibira o codigo disponivel para gravação.
vc pode usar o codigo também no botão novo.
para gravar, vc seu codigo normal com o post; ok.
faça ai que tenho certeza que é isto que falta pra vc.
acho que não precisa explicar o codigo esta de facil entendimento.
no codigo dei exemplo com tabela, mas vc pode usar query ser for o seu caso.
Abs.
fez desta forma para acrescentar + 1 no codigo:
exemplo: se o codigo já gravado é 12 na codificação ao gravar tem
o comando para acrecentar + 1 sendo então 13 o proximo registro.
isto é facil se tratando de paradox. exemplo util e facil, e funcional
pra vc.
vc pode fazer o seguinte no seu codigo.
como vc deseja que o codigo fique em foco no dbedit ou (edit 0do seu form
e depois gravar faça o seguinte no evento oncrete do seu form de cadastro
insira este codigo:
procedure TFrmCadClientes.FormCreate(Sender: TObject); Var Cod:String[5]; begin TbCadClie.open; if TbCadclie.IsEmpty then cod:='00001' else begin TbCadClie.Last; Cod:=IntToStr(TbCadClieCodigo.AsInteger + 1); while Length(Cod)<5 do cod:='0'+ Cod; End; TbCadClie.Append; TbCadClieCodigo.Value:=Cod; end;
assim quando abrir o form o dbedit que esta setado no campo codigo
da tabela exibira o codigo disponivel para gravação.
vc pode usar o codigo também no botão novo.
para gravar, vc seu codigo normal com o post; ok.
faça ai que tenho certeza que é isto que falta pra vc.
acho que não precisa explicar o codigo esta de facil entendimento.
no codigo dei exemplo com tabela, mas vc pode usar query ser for o seu caso.
Abs.
GOSTEI 0
Gilvanio Gonçalves
06/08/2012
Carlos Magno, vc diz que o campo do sistema é alphanumerico, o programador
fez desta forma para acrescentar + 1 no codigo:
exemplo: se o codigo já gravado é 12 na codificação ao gravar tem
o comando para acrecentar + 1 sendo então 13 o proximo registro.
isto é facil se tratando de paradox. exemplo util e facil, e funcional
pra vc.
vc pode fazer o seguinte no seu codigo.
como vc deseja que o codigo fique em foco no dbedit ou (edit do seu form)
e depois gravar.
faça o seguinte no evento oncrete do seu form de cadastro
insira este codigo:
o codigo acima vai verificar qual é ultimo codigo já cadastrado e adicionando mais 1, para novo registro, exebindo
no dbedit do seu form para novo cadastro, isto na tabela do sistema que vc mencionou.
onde Tbcadclie é a tabela que devera estar setada ao sistema que vc deseja gravar os dados junto com o codigo.
assim quando abrir o form o dbedit que esta setado no campo codigo
da tabela exibira o codigo disponivel para gravação.
vc pode usar o codigo também no botão novo.
para gravar, vc usa o seu codigo normal com o post; ok.
faça ai que tenho certeza que é isto que falta pra vc.
acho que não precisa explicar o codigo esta de facil entendimento.
no codigo deixei como exemplo tabela, mas vc pode usar query ser for o seu caso.
Abs.
fez desta forma para acrescentar + 1 no codigo:
exemplo: se o codigo já gravado é 12 na codificação ao gravar tem
o comando para acrecentar + 1 sendo então 13 o proximo registro.
isto é facil se tratando de paradox. exemplo util e facil, e funcional
pra vc.
vc pode fazer o seguinte no seu codigo.
como vc deseja que o codigo fique em foco no dbedit ou (edit do seu form)
e depois gravar.
faça o seguinte no evento oncrete do seu form de cadastro
insira este codigo:
procedure TFrmCadClientes.FormCreate(Sender: TObject); Var Cod:String[5]; begin TbCadClie.open; if TbCadclie.IsEmpty then cod:='00001' else begin TbCadClie.Last; Cod:=IntToStr(TbCadClieCodigo.AsInteger + 1); while Length(Cod)<5 do cod:='0'+ Cod; End; TbCadClie.Append; TbCadClieCodigo.Value:=Cod; end;
o codigo acima vai verificar qual é ultimo codigo já cadastrado e adicionando mais 1, para novo registro, exebindo
no dbedit do seu form para novo cadastro, isto na tabela do sistema que vc mencionou.
onde Tbcadclie é a tabela que devera estar setada ao sistema que vc deseja gravar os dados junto com o codigo.
assim quando abrir o form o dbedit que esta setado no campo codigo
da tabela exibira o codigo disponivel para gravação.
vc pode usar o codigo também no botão novo.
para gravar, vc usa o seu codigo normal com o post; ok.
faça ai que tenho certeza que é isto que falta pra vc.
acho que não precisa explicar o codigo esta de facil entendimento.
no codigo deixei como exemplo tabela, mas vc pode usar query ser for o seu caso.
Abs.
GOSTEI 0
Carlos Magno
06/08/2012
Bom dia a todos..... Gilvanio, sua última postagem deu certo e era justamente o que eu estava procurando. Muito obrigado pela sua ajuda, não desmerecendo a ajuda dos outros, pois todos foram aproveitados. Então meu muito obrigado a todos. E, por favor, o moderador colocar esse tópico como resolvido.
GOSTEI 0