Autor
Mensagem
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, 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.
#Código
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!
#Código
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!
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!
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!
#Código
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!
#Código
SELECT MAX(CAS(CAMPO AS INTEGER)) AS ID FROM TABELA
Estamos aguardando seu retorno!
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.
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:
#Código
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:
#Código
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!
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!!!!
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.
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().
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!!
Citação:
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!
Citação:
SELECT MAX(Campo_VARCHAR) + 1 FROM TABELA;
Essa instrução retorna o valor do campo VARCHAR acrescido de + 1.
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:
#Código
Você pode fazer isso pegando o último, armazenando em uma variável, incrementando 1 e gravar.
Exemplo:
#Código
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;
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.
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.
Citação:
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:
#Código
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.
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:
#Código
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:
#Código
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.
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.











