| Exibir mensagem anterior :: Exibir próxima mensagem |
| Autor |
Mensagem |
maxsf9 Novato

Registrado: Sexta-Feira, 23 de Abril de 2010 Mensagens: 9
|
Enviada: Dom Mai 02, 2010 1:44 pm Assunto: Como auto incrementar um valor na tabela pelo delphi ?? |
|
|
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 |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Dom Mai 02, 2010 2:32 pm Assunto: |
|
|
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 |
|
 |
Lehapan Experiente

Registrado: Quarta-Feira, 16 de Junho de 2004 Mensagens: 401 Localização: Caxias do Sul - RS
|
Enviada: Seg Mai 03, 2010 10:55 am Assunto: |
|
|
Se estiver utilizando o Firebird, pode ser utilizado o GENERATOR.
Espero ter colaborado. _________________ Wilson Lehapan Junior, vulgo Paulista...!!! |
|
| Voltar ao Topo |
|
 |
BrunoLichot Aprendiz


Registrado: Terça-Feira, 6 de Fevereiro de 2007 Mensagens: 161 Localização: São Paulo
|
Enviada: Seg Mai 03, 2010 2:49 pm Assunto: |
|
|
| 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 |
|
 |
rafmattos Colaborador

Registrado: Quinta-Feira, 11 de Fevereiro de 2010 Mensagens: 3416 Localização: Campo Grande/MS
|
Enviada: Seg Mai 03, 2010 3:01 pm Assunto: |
|
|
| 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 |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Seg Mai 03, 2010 3:49 pm Assunto: |
|
|
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 |
|
 |
BrunoLichot Aprendiz


Registrado: Terça-Feira, 6 de Fevereiro de 2007 Mensagens: 161 Localização: São Paulo
|
Enviada: Seg Mai 03, 2010 4:13 pm Assunto: |
|
|
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 |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Seg Mai 03, 2010 4:35 pm Assunto: |
|
|
| 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 |
|
 |
BrunoLichot Aprendiz


Registrado: Terça-Feira, 6 de Fevereiro de 2007 Mensagens: 161 Localização: São Paulo
|
Enviada: Seg Mai 03, 2010 4:38 pm Assunto: |
|
|
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 |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Seg Mai 03, 2010 4:57 pm Assunto: |
|
|
| 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 |
|
 |
rafmattos Colaborador

Registrado: Quinta-Feira, 11 de Fevereiro de 2010 Mensagens: 3416 Localização: Campo Grande/MS
|
Enviada: Seg Mai 03, 2010 5:03 pm Assunto: |
|
|
| 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 |
|
 |
BrunoLichot Aprendiz


Registrado: Terça-Feira, 6 de Fevereiro de 2007 Mensagens: 161 Localização: São Paulo
|
Enviada: Seg Mai 03, 2010 5:07 pm Assunto: |
|
|
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 |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Seg Mai 03, 2010 5:14 pm Assunto: |
|
|
| 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 |
|
 |
rafmattos Colaborador

Registrado: Quinta-Feira, 11 de Fevereiro de 2010 Mensagens: 3416 Localização: Campo Grande/MS
|
Enviada: Seg Mai 03, 2010 5:25 pm Assunto: |
|
|
| mas sempre vai ser o 880.000? |
|
| Voltar ao Topo |
|
 |
rafmattos Colaborador

Registrado: Quinta-Feira, 11 de Fevereiro de 2010 Mensagens: 3416 Localização: Campo Grande/MS
|
Enviada: Seg Mai 03, 2010 5:31 pm Assunto: |
|
|
fiquei meio confuso tb,
mas se vc verificar todos aqueles q são < que 880.000 |
|
| Voltar ao Topo |
|
 |
|