DevMedia - asp.net, Java, Delphi, SQL e web Design, tudo em um só lugar!
Bem vindo a DevMedia!
LOGIN:     SENHA:
 
 
DevWare  
Novidade: DevMedia lança o DevWare - Saiba mais!

Fórum DevMedia


Autor
Mensagem
Carlos Magno
 


País: Brasil
Estado: PI
Cidade: Picos
Mensagens: 136
 Postado em: 6/8/2012 04:49:28 PM
 
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

Bretas
 

 


País: Brasil
Estado: MT
Cidade: Cuiabá
Mensagens: 226
 Postado em: 6/8/2012 06:45:06 PM
 
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
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!

Carlos Magno
 


País: Brasil
Estado: PI
Cidade: Picos
Mensagens: 136
 Postado em: 7/8/2012 09:18:12 AM
 
Não deu certo, Gustavo. Montei a query, não deu erro, mas não gravou o código.
Deivison
 
 

 


País: Brasil
Estado: PE
Cidade: x
Mensagens: 485
 Postado em: 7/8/2012 09:31:55 AM
 
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!


Bretas
 

 


País: Brasil
Estado: MT
Cidade: Cuiabá
Mensagens: 226
 Postado em: 7/8/2012 10:54:17 AM
 
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
SELECT MAX(CAS(CAMPO AS INTEGER)) AS ID FROM TABELA


Estamos aguardando seu retorno!

Carlos Magno
 


País: Brasil
Estado: PI
Cidade: Picos
Mensagens: 136
 Postado em: 7/8/2012 12:55:00 PM
 
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 Magno
 


País: Brasil
Estado: PI
Cidade: Picos
Mensagens: 136
 Postado em: 7/8/2012 01:06:20 PM
 
Aconteceu algo....ao recompilar deu um erro que diz Record locked by another user.
Bretas
 

 


País: Brasil
Estado: MT
Cidade: Cuiabá
Mensagens: 226
 Postado em: 7/8/2012 03:09:10 PM
 
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
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!

Carlos Magno
 


País: Brasil
Estado: PI
Cidade: Picos
Mensagens: 136
 Postado em: 7/8/2012 04:37:55 PM
 
Vou tentar amanhã, pq agora to de saida do trabalho.....amanhã dou um retorno
Carlos Magno
 


País: Brasil
Estado: PI
Cidade: Picos
Mensagens: 136
 Postado em: 8/8/2012 10:33:22 AM
 
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?
Carlos Magno
 


País: Brasil
Estado: PI
Cidade: Picos
Mensagens: 136
 Postado em: 9/8/2012 10:07:03 AM
 
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.
Carlos Magno
 


País: Brasil
Estado: PI
Cidade: Picos
Mensagens: 136
 Postado em: 13/8/2012 04:02:25 PM
 
Ninguem???
Deivison
 
 

 


País: Brasil
Estado: PE
Cidade: x
Mensagens: 485
 Postado em: 13/8/2012 05:14:24 PM
 
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!!!!


Carlos Magno
 


País: Brasil
Estado: PI
Cidade: Picos
Mensagens: 136
 Postado em: 23/8/2012 09:27:28 AM
 
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.
wllfl
 
 

 


País: Brasil
Estado: SP
Cidade: São Roque
Mensagens: 623
 Postado em: 24/8/2012 12:51:06 PM
 
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().

Deivison
 
 

 


País: Brasil
Estado: PE
Cidade: x
Mensagens: 485
 Postado em: 24/8/2012 12:57:39 PM
 
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!!

wllfl
 
 

 


País: Brasil
Estado: SP
Cidade: São Roque
Mensagens: 623
 Postado em: 24/8/2012 02:52:33 PM
 
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()!

wllfl
 
 

 


País: Brasil
Estado: SP
Cidade: São Roque
Mensagens: 623
 Postado em: 24/8/2012 03:17:55 PM
 

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.

Carlos Magno
 


País: Brasil
Estado: PI
Cidade: Picos
Mensagens: 136
 Postado em: 25/8/2012 11:37:28 AM
 
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?

wllfl
 
 

 


País: Brasil
Estado: SP
Cidade: São Roque
Mensagens: 623
 Postado em: 25/8/2012 11:45:02 AM
 
Carlos vc tem Skype?
BRUNO LEANDRO
 

 


País: Brasil
Estado: SP
Cidade: Tupã
Mensagens: 554
 Postado em: 25/8/2012 01:42:39 PM
 
Ola carlos voce ja tentou desta forma

select max(cast(COD_CLI as Int)) + 1 from cliente;

Carlos Magno
 


País: Brasil
Estado: PI
Cidade: Picos
Mensagens: 136
 Postado em: 27/8/2012 11:12:43 AM
 
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.
Claudiadnh
 
 

 


País: Brasil
Estado: RO
Cidade: ROLIM DE MOURA
Mensagens: 565
 Postado em: 8/11/2012 11:32:47 AM
 
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
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;

Alisson
 
 

 


País: Brasil
Estado: SP
Cidade: Lençóis Paulista
Mensagens: 661
 Postado em: 8/11/2012 02:00:21 PM
 
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.

Gilvanio C. Gonçalves
 

 


País: Brasil
Estado: MG
Cidade: betim
Mensagens: 188
 Postado em: 8/11/2012 03:18:00 PM
 
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.

Gilvanio C. Gonçalves
 

 


País: Brasil
Estado: MG
Cidade: betim
Mensagens: 188
 Postado em: 8/11/2012 05:36:43 PM
 

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.

Gilvanio C. Gonçalves
 

 


País: Brasil
Estado: MG
Cidade: betim
Mensagens: 188
 Postado em: 8/11/2012 05:46:51 PM
 
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
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.

Carlos Magno
 


País: Brasil
Estado: PI
Cidade: Picos
Mensagens: 136
 Postado em: 12/11/2012 11:33:39 AM
 
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.
web-03
DevMedia  |  Anuncie  |  Fale conosco
Hospedagem web por Porta 80 Web Hosting
2013 - Todos os Direitos Reservados a web-03