ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Como auto incrementar um valor na tabela pelo delphi ??
Ir à página 1, 2  Próximo
 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
maxsf9
Novato
Novato


Registrado: Sexta-Feira, 23 de Abril de 2010
Mensagens: 9

MensagemEnviada: Dom Mai 02, 2010 1:44 pm    Assunto: Como auto incrementar um valor na tabela pelo delphi ?? Responder com Citação

Estou desenvolvendo um programa em que um form apresenta várias tabelas.
Coloquei pra auto incrementar o valo do código de uma tabela de um banco de dados, até aí tudo bem, funcionou direito.
O problema é que quando eu utilizei o mesmo método pra auto incrementar o valor da segunda tabela, o código deixou de funcionar(o programa roda normal, porém o código não é executado quando deveria).
Se alguém souber como fazer certo ou o que eu devo mudar no meu códio, por favor me ajude...
Primeira Tabela:
Código:
procedure TFrmCavalos.BtInserirClick(Sender: TObject);

var
  prox:integer;

begin
     Dm.ClientDataSetCavalos.Last;
     prox:=Dm.ClientDataSetCavalos.fieldbyname('cdcavalo').AsInteger +1;
     Dm.ClientDataSetCavalos.Append;
     Dm.ClientDataSetCavalos.FieldByName('cdcavalo').AsInteger:=prox;
     DBEdit1.SetFocus;


Segunda Tabela:
Código:
procedure TFrmCavalos.BtInserir2Click(Sender: TObject);

var
  prox:integer;


begin
     Dm.ClientDataSetFerrageamento.Last;
     prox:=Dm.ClientDataSetFerrageamento.fieldbyname('cdferrag').AsInteger +1;
     Dm.ClientDataSetFerrageamento.Append;
     Dm.ClientDataSetFerrageamento.FieldByName('cdferrag').AsInteger:=prox;
     Dm.ClientDataSetFerrageamento.FieldByName('cdcavalo').AsInteger:=Dm.ClientDataSetCavalos.fieldbyname('cdcavalo').AsInteger;


E mesmo quando deleto o código da segunda tabela, o da primeira tabela continua não funcionando.


Estou usando o firebird+ibocondole!!!


Editado pela última vez por maxsf9 em Dom Mai 02, 2010 3:55 pm, num total de 1 vez
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Dom Mai 02, 2010 2:32 pm    Assunto: Responder com Citação

Que banco vc esta usando?

A maioria dos bancos possuem autoInc automatico, não precisando fazer estes códigos de incrementação

Mais se mesmo assim vc precisar de incremetar o ultimo + 1, veja um exemplo
Código:

function FuncmaxOrdemServ: string;
var
  _MaxNumber : Integer;
begin

  with qryAutoInc do
  begin
    close;
    sql.clear;
    sql.add (' select max(numero_documento)as xn_doc from contas_receber ');
    open;
    _MaxNumber :=  StrToInt(fieldbyname('xn_Doc').AsString);
    Result := IntToStr( _MaxNumber + 1 );
  end;

end;

_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Lehapan
Experiente
Experiente


Registrado: Quarta-Feira, 16 de Junho de 2004
Mensagens: 401
Localização: Caxias do Sul - RS

MensagemEnviada: Seg Mai 03, 2010 10:55 am    Assunto: Responder com Citação

Se estiver utilizando o Firebird, pode ser utilizado o GENERATOR.

Espero ter colaborado.
_________________
Wilson Lehapan Junior, vulgo Paulista...!!!
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
BrunoLichot
Aprendiz
Aprendiz


Registrado: Terça-Feira, 6 de Fevereiro de 2007
Mensagens: 161
Localização: São Paulo

MensagemEnviada: Seg Mai 03, 2010 2:49 pm    Assunto: Responder com Citação

na proxima edicao da Active Delphi, estarei dando continuidade a serie de artigos sobre DataSnap, e uma das coisas que vou mostrar e como fazer auto-incremento de forma totalmente segura, rápida, sem a fragilidade de duplicar registros, sem dependencia do banco de dados e pode aplicar esta técnica a qualquer banco de dados.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail Visitar a homepage do Usuário MSN Messenger
rafmattos
Colaborador
Colaborador


Registrado: Quinta-Feira, 11 de Fevereiro de 2010
Mensagens: 3416
Localização: Campo Grande/MS

MensagemEnviada: Seg Mai 03, 2010 3:01 pm    Assunto: Responder com Citação

Código:

Procedure IncrementaID(LocalConnect: TSqlConnection; NomeTabela : String; Chave_Primaria : TField; IDAuto : Boolean);
var
  Qry : TSQLQuery;
begin
  if IDAuto = FALSE then begin
     Exit;
  end;
  if Chave_Primaria.DataSet.State <> dsInsert then
       exit;    //termina a execução caso não esteja em modo de inserção
  Qry:=TSQLQuery.Create(nil); //cria uma instância do objeto
  try
    Qry.SQLConnection:=LocalConnect;  //componente de conexão
    Qry.SQL.Add('SELECT MAX('+Chave_Primaria.FieldName+') FROM '+NomeTabela);
    Qry.Open;
    if Qry.Fields[0].IsNull then    //se a tabela está vazia retornará nulo
       Chave_Primaria.AsInteger:=1    //então este será o primeiro registro
    else Chave_Primaria.AsInteger:=Qry.Fields[0].AsInteger+1;
  finally
    FreeAndNil(Qry);  //tira o objeto da memória
  end;
end;



chamada no before post

Código:

procedure TfrmCadFornecedor.cdsFornecedorBeforePost(DataSet: TDataSet);
begin
  inherited;
IncrementaID(DMPrincipal.SQLConnection1,'FORNECEDOR',cdsFornecedorIDFORNECEDOR,TRUE // SE FOR FALSE ELE NAO GERA O ID);
end;
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail Visitar a homepage do Usuário MSN Messenger
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Seg Mai 03, 2010 3:49 pm    Assunto: Responder com Citação

Falando em autoinc e aproveitando o topico do colega...

Preciso de algo assim

Se no banco NÃO tiver como inicial o codigo 880.000 então o proximo é 880.000 ao dar um insert

se ja existe 0 880.000 então incrementa +1

O banco pode estar assim

1
2
3
4
5


Neste caso se o proximo insert deve incluir 880.000 em um edit

se o banco ja tiver com os numeros 880.000 ai normal basta incluir +1

A minha grande duvida é saber como verificar que não tem numero grande (no caso 880.000) no banco para inserir a partir deste numero.

(Obs: Depois o usuario poderá mudar este numero para um numero que tem numa papeleta que ele recebe, mais enquanto não retorna esta papeleta deve verificar se existe numeros grandes e inserir + 1 ou começar pelo numero 880.000)
_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
BrunoLichot
Aprendiz
Aprendiz


Registrado: Terça-Feira, 6 de Fevereiro de 2007
Mensagens: 161
Localização: São Paulo

MensagemEnviada: Seg Mai 03, 2010 4:13 pm    Assunto: Responder com Citação

Chave primaria nao é para ser ordenada e crescente, ela precisa ser unica e intransferivel... igual a CPF (nao use CPF como chave primaria e so um exemplo) cada um tenho o seu e qdo alguem morre akele CPF continua sendo dele, nao e passado a outra pessoa.

Se precisa de um campo identado corretamente sem buracos, este campo e algum outro campo menos de chave primaria.

segue aki o codigo da funcao para criar chave primaria.

crie uma tabela chamada controle com dois campos: Campo(Varchar 30 - PK) e valor(Double PRecision)
.......

“function RetornaID(Campo : String) : Double;”.
Em sua implementação precisaremos de um SQLDataSet (SQLControle), um DataSetProvider(DspControle) e um ClientDataSet(CdsControle) devidamente configurados e com seus campos adicionados utilizando o comando no SQLDataSet como segue: “SELECT CAMPO, VALOR FROM CONTROLE WHERE CAMPO LIKE :CAMPO”. Percebam que este comando deve ser colocado na propriedade CommandText do SQLDataSet e este por sua vez deve ter a propriedade SQLConnection apontando para a conexão que acabamos de configurar. Não se esqueçam de verificar se o parâmetro “CAMPO” está devidamente tipificado como ftString, configure a propriedade DataSet do DataSetProvider para apontar para o SqlControle, a propriedade Provider do ClientDataSet para apontar para o DspControle e não esqueçam de através do botão direito usar o método GetParams do ClientDataSet para que o parâmetro “CAMPO” seja definido automaticamente no CdsControle. Adicione também os campos do CdsControle como objetos aplicando um duplo clique no ClientDataSet para abrir o editor de campos e com o botão direito do mouse ou através da combinação Ctrl+F e desta forma adicionar todos os campos envolvidos no Select.
Façamos a implementação do código da função (Dica: Após declarar a função, se usar as teclas Ctrl+Shift+C, automaticamente o corpo da função será declarado) conforme a Listagem 4.

function TGlobalMethods.RetornaID(Campo: String): Double;
begin
repeat
CdsControle.Close;
CdsControle.Params[0].AsString := UpperCase(Campo);
CdsControle.Open;
if CdsControle.RecordCount = 1 then
begin
CdsControle.Edit;
CdsControleVALOR.AsInteger := CdsControleVALOR.AsInteger + 1;
end
else if CdsControle.RecordCount <= 0 then
begin
CdsControle.Insert;
CdsControleCAMPO.AsString := UpperCase(Campo);
CdsControleVALOR.AsInteger := 1;
end;
CdsControle.Post;
until CdsControle.ApplyUpdates(0) = 0;
Result := CdsControleVALOR.AsInteger;
CdsControle.Close;
end;
Listagem 4 – Função RetornaID

A lógica é muito simples: a função recebe o nome da chave a ser gerada, se existir registro pra ela soma-se em 1 o seu valor, se não existir inserimos com o valor 1. Por estarmos trabalhando com ClientDataSet que opera com os dados em memória e usa o método ApplyUpdates para enviar essas alterações ao banco de dados dentro de uma transação monitorada, ao usarmos o parâmetro “0” estamos definido que não pode haver erros, inclusive de concorrência. Tudo feito dentro do repeat-until nos garantirá que cada requisição receberá um valor único e mesmo que esta não o utilize este valor será perdido para sempre, garantindo completamente a segurança desses dados. Eu uso este método comercialmente com total sucesso em vários bancos de dados diferentes a mais de 6 anos. No meu link de downloads gratuitos (HTTP://cc.embarcadero.com/author/795118) tem um vídeos sobre a palestra que apresentei no FDD de 2008 onde demonstro alguns recursos interessantes do ClientDataSet e do DBExpress que pode ser muito útil para o desenvolvimento DataSnap.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail Visitar a homepage do Usuário MSN Messenger
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Seg Mai 03, 2010 4:35 pm    Assunto: Responder com Citação

adriano_servitec escreveu:
Falando em autoinc e aproveitando o topico do colega...

Preciso de algo assim

Se no banco NÃO tiver como inicial o codigo 880.000 então o proximo é 880.000 ao dar um insert

se ja existe 0 880.000 então incrementa +1

O banco pode estar assim

1
2
3
4
5


Neste caso se o proximo insert deve incluir 880.000 em um edit

se o banco ja tiver com os numeros 880.000 ai normal basta incluir +1

A minha grande duvida é saber como verificar que não tem numero grande (no caso 880.000) no banco para inserir a partir deste numero.

(Obs: Depois o usuario poderá mudar este numero para um numero que tem numa papeleta que ele recebe, mais enquanto não retorna esta papeleta deve verificar se existe numeros grandes e inserir + 1 ou começar pelo numero 880.000)
Legal o codigo do colega ai BrunoLichot (mais eu aqui não uso clientdataset e datasetprovider nos meus projetos, mais valeu a dica para quando for usar em multbancos...

Mais aproveitando ainda, no meu caso isso não é uma chave primaria, é apenas um controle que precisa ser feito...

Ou seja se não existe o numero 880.000 no banco deve começar por ele, se existir apenas incrementa + 1 880.001, lembrando que depois vem o usuario e altera estes numeros para numeros menores, ai novamente deve começar o proximo insert em 880.000 e assim por diante...
_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
BrunoLichot
Aprendiz
Aprendiz


Registrado: Terça-Feira, 6 de Fevereiro de 2007
Mensagens: 161
Localização: São Paulo

MensagemEnviada: Seg Mai 03, 2010 4:38 pm    Assunto: Responder com Citação

se o ClientDataSet não existisse eu o teria criado!!!!

Não vivo mais sem ele..alguns dos motivos, independente do projeto se multibanco ou não estão no video que indiquei..creio que vale a pena dar uma olhada.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail Visitar a homepage do Usuário MSN Messenger
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Seg Mai 03, 2010 4:57 pm    Assunto: Responder com Citação

BrunoLichot escreveu:
se o ClientDataSet não existisse eu o teria criado!!!!

Não vivo mais sem ele..alguns dos motivos, independente do projeto se multibanco ou não estão no video que indiquei..creio que vale a pena dar uma olhada.
Desculpe amigo, que video são estes?

Só lembrando que no meu caso isso não é uma chave primaria, é apenas um controle que precisa ser feito...

Ou seja se não existe o numero 880.000 no banco deve começar por ele, se existir apenas incrementa + 1 880.001, lembrando que depois vem o usuario e altera estes numeros para numeros menores, ai novamente deve começar o proximo insert em 880.000 e assim por diante...


Preciso de ajuda neste controle, pois não sei que foi que inventou que estes numeros de controle deveriam começar com 880.000 e agora preciso fazer igual.
_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
rafmattos
Colaborador
Colaborador


Registrado: Quinta-Feira, 11 de Fevereiro de 2010
Mensagens: 3416
Localização: Campo Grande/MS

MensagemEnviada: Seg Mai 03, 2010 5:03 pm    Assunto: Responder com Citação

adriano_servitec escreveu:
BrunoLichot escreveu:
se o ClientDataSet não existisse eu o teria criado!!!!

Não vivo mais sem ele..alguns dos motivos, independente do projeto se multibanco ou não estão no video que indiquei..creio que vale a pena dar uma olhada.
Desculpe amigo, que video são estes?

Só lembrando que no meu caso isso não é uma chave primaria, é apenas um controle que precisa ser feito...

Ou seja se não existe o numero 880.000 no banco deve começar por ele, se existir apenas incrementa + 1 880.001, lembrando que depois vem o usuario e altera estes numeros para numeros menores, ai novamente deve começar o proximo insert em 880.000 e assim por diante...


Preciso de ajuda neste controle, pois não sei que foi que inventou que estes numeros de controle deveriam começar com 880.000 e agora preciso fazer igual.



adriano entendi mas qual é o ponto q vc não está conseguindo fazer?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail Visitar a homepage do Usuário MSN Messenger
BrunoLichot
Aprendiz
Aprendiz


Registrado: Terça-Feira, 6 de Fevereiro de 2007
Mensagens: 161
Localização: São Paulo

MensagemEnviada: Seg Mai 03, 2010 5:07 pm    Assunto: Responder com Citação

No meu link de downloads gratuitos (HTTP://cc.embarcadero.com/author/795118) tem um vídeos sobre a palestra que apresentei no FDD de 2008 onde demonstro alguns recursos interessantes do ClientDataSet e do DBExpress que pode ser muito útil para o desenvolvimento

eu ja tive que implementar sua solucao e partir de um numero ou garantir os valores crescentes.

usei implemetacao simples de controle sobre insercao, alteracao e exclusao de registro natabela e reorganizando os valores ou gerando eles a medida do necessario.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail Visitar a homepage do Usuário MSN Messenger
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Seg Mai 03, 2010 5:14 pm    Assunto: Responder com Citação

rafmattos escreveu:
adriano_servitec escreveu:
BrunoLichot escreveu:
se o ClientDataSet não existisse eu o teria criado!!!!

Não vivo mais sem ele..alguns dos motivos, independente do projeto se multibanco ou não estão no video que indiquei..creio que vale a pena dar uma olhada.
Desculpe amigo, que video são estes?

Só lembrando que no meu caso isso não é uma chave primaria, é apenas um controle que precisa ser feito...

Ou seja se não existe o numero 880.000 no banco deve começar por ele, se existir apenas incrementa + 1 880.001, lembrando que depois vem o usuario e altera estes numeros para numeros menores, ai novamente deve começar o proximo insert em 880.000 e assim por diante...


Preciso de ajuda neste controle, pois não sei que foi que inventou que estes numeros de controle deveriam começar com 880.000 e agora preciso fazer igual.



adriano entendi mas qual é o ponto q vc não está conseguindo fazer?
Ola Ralf Mattos, seguinte...

Inventaram um tal de controle de Ordem de Serviço que ao ser inserido deve começar com o numero 880.000 (nem sei pq deste numero) e assim por diante, isso logo quando abre o serviço, depois vem os entregadores com uma papeleta contendo um numero que deve ser substituido por estes numeros grandes

Acho que é controlado algo tipo se tiver numero grande é pq esta pendente se tiver numero pequeno é pq ja esta resolvido...Como disse não sei quem inventou isso, mais pediram para eu fazer assim

O meu problema é saber se no banco contém apenas numeros pequenos para no inserir incluir um numero grande.

Acho que ficou confuso minha explicação
_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
rafmattos
Colaborador
Colaborador


Registrado: Quinta-Feira, 11 de Fevereiro de 2010
Mensagens: 3416
Localização: Campo Grande/MS

MensagemEnviada: Seg Mai 03, 2010 5:25 pm    Assunto: Responder com Citação

mas sempre vai ser o 880.000?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail Visitar a homepage do Usuário MSN Messenger
rafmattos
Colaborador
Colaborador


Registrado: Quinta-Feira, 11 de Fevereiro de 2010
Mensagens: 3416
Localização: Campo Grande/MS

MensagemEnviada: Seg Mai 03, 2010 5:31 pm    Assunto: Responder com Citação

fiquei meio confuso tb,
mas se vc verificar todos aqueles q são < que 880.000
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail Visitar a homepage do Usuário MSN Messenger
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Ir à página 1, 2  Próximo
Página 1 de 2

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB