Jump to content
Fórum Script Brasil
  • 0

[resolvido] Incrementar Campo


VDLR
 Share

Question

Alguém pode me ajudar:

Vou dar um exemplo do que presciso

Exemplo Tabela CadRIM

ID-- Data---------Contr_RIM

1--- 01/08/2007--- 5

2--- 06/08/2007--- 6

3--- 01/09/2007--- 7

4--- 01/11/2007--- 8

5--- 15/12/2007--- 9

6--- 10/01/2008--- 1

Próximo Lançamento em 15/01/08 seria no Max do ID que é 6, e acrescentar mais 1 no Contr_RIM que é 1.

Ficaria assim

7 15/01/2008 2

ID Campo Auto Incrementado

Tem como sempre no max do campo ID eu acrescentar mais 1 no campo Contr_RIM.

Já quebrei a cabeça com isto e não achei como.

Abraço

Valdecir :unsure:

Link to comment
Share on other sites

9 answers to this question

Recommended Posts

  • 0
Guest --Jonas --

Vai ai uma dica que pode vir a ser muito util:

Neste exemplo qryUso é um SimpleDataSet.

Desta forma o programador poderá mostrar facilmente o seu valor

Auto-incremental, por exemplo, sempre que ele der um insert na tabela ele faz o

seguinte:

Edit1.text := intTOstr(Inc_gen(‘Generator_desejada’))

Se caso cancelar a inserção chame a procedure Dec_Gen(‘Generator_desejada’);

//onde Generator_desejada e aquela que será incrementada ou decrementada.

Function Inc_Gen(Generator: String): 
integer;
begin
  qryUso.Close;
  qryUso.DataSet.CommandText := 'select gen_id('+Generator+',1) from 
rdb$DATABASE';
  qryUso.Open;
  result := qryUso.Fields.Fields[0].AsInteger;
  qryUso.Close; 
end;

procedure Dec_Gen(Generator: String);
begin
  qryUso.Close;
  qryUso.DataSet.CommandText := 'select gen_id('+Generator+',-1) from 
rdb$DATABASE';
  qryUso.Open;
  qryUso.Close;
end;

Link to comment
Share on other sites

  • 0

Jonas obrigado pela atenção.

Cara eu não entendi muito bem o que você postol ( não entendo sql)

1º onde entra o campo que eu desejo incrementar ? (o que eu presciso e incrementar sempre o ultimo lançamento da tabela)

2º Edit1.text := intTOstr(Inc_gen(‘Generator_desejada’)) que generator é este ?

Abraço

Valdecir ;)

Link to comment
Share on other sites

  • 0
Guest --Jonas --
Jonas obrigado pela atenção.

Cara eu não entendi muito bem o que você postol ( não entendo sql)

1º onde entra o campo que eu desejo incrementar ? (o que eu presciso e incrementar sempre o ultimo lançamento da tabela)

2º Edit1.text := intTOstr(Inc_gen(‘Generator_desejada’)) que generator é este ?

Abraço

Valdecir ;)

Generator é seu campo autoincremento, voce tem que adaptar ao seu codigo

ex: Edit1.text := intTOstr(Inc_gen('ID')) ;

Contr_RIM := Contr_RIM + 1;

deu pra entender ?

Link to comment
Share on other sites

  • 0
Vou dar um exemplo do que presciso

Exemplo Tabela CadRIM

ID-- Data---------Contr_RIM

1--- 01/08/2007--- 5

2--- 06/08/2007--- 6

3--- 01/09/2007--- 7

4--- 01/11/2007--- 8

5--- 15/12/2007--- 9

6--- 10/01/2008--- 1

Próximo Lançamento em 15/01/08 seria no Max do ID que é 6, e acrescentar mais 1 no Contr_RIM que é 1.

Ficaria assim

7 15/01/2008 2

ID Campo Auto Incrementado

Tem como sempre no max do campo ID eu acrescentar mais 1 no campo Contr_RIM.

VDLR, parece-me que você quer que ID seja incrementado sequencialmente (sempre pelo MAX+1) para todos os registros da sua tabela. Já para Contr_RIM, parece-me que você deseja incrementá-lo sequencialmente (sempre pelo MAX+1), mas apenas para os registros dentro de um determinado ano, ou seja, a cada ano a contagem reinicia. Certo?!

Cara eu não entendi muito bem o que você postol ( não entendo sql)

1º onde entra o campo que eu desejo incrementar ? (o que eu presciso e incrementar sempre o ultimo lançamento da tabela)

2º Edit1.text := intTOstr(Inc_gen(‘Generator_desejada’)) que generator é este ?

VDLR, pelos seus questionamentos dá para perceber que você não está utilizando Interbase ou Firebird.

Como sempre insisto em mencionar, em dúvidas com BD, é conveniente mencionar: Banco de dados e componente utilizados!!!

Pelo exemplo, o Jonas tentou exemplificar o tal gerador, utilizando um banco Interbase ou Firebird (já que usa rdb$DATABASE) e componentes da paleta DataAcces (DatasetProvider +ClientDataset, pelo que sugere qryUso.DataSet.CommandText)

Abraços

Link to comment
Share on other sites

  • 0
VDLR, parece-me que você quer que ID seja incrementado sequencialmente (sempre pelo MAX+1) para todos os registros da sua tabela. Já para Contr_RIM, parece-me que você deseja incrementá-lo sequencialmente (sempre pelo MAX+1), mas apenas para os registros dentro de um determinado ano, ou seja, a cada ano a contagem reinicia. Certo?!

É isso ai Micheus o ID sequencialmente e o Contr_RIM a cada ano a contagem reinicia e vai adicionando mais 1.

Tem como ??

Estou usando o BD MySql com DBexpress e ClientDataset

Abraço

Valdecir

Link to comment
Share on other sites

  • 0
VDLR, parece-me que você quer que ID seja incrementado sequencialmente (sempre pelo MAX+1) para todos os registros da sua tabela. Já para Contr_RIM, parece-me que você deseja incrementá-lo sequencialmente (sempre pelo MAX+1), mas apenas para os registros dentro de um determinado ano, ou seja, a cada ano a contagem reinicia. Certo?!

É isso ai Micheus o ID sequencialmente e o Contr_RIM a cada ano a contagem reinicia e vai adicionando mais 1.

Tem como ??

Estou usando o BD MySql com DBexpress e ClientDataset

estou meio apressado, indo embora, então deixo só as consultas SQL. É só colocar nos devidos componentes para executar:

select MAX(ID) ID

from CadRIM

Esta é direta, é só dá um open e pegar o resultado +1

select MAX(Contr_RIM) Contr_RIM

from CadRIM

where extract(year from data) = :ANO

Nesta é necessário passar como parâmetro o Ano

Acho que você consegue montar o resto.

Abraços

Link to comment
Share on other sites

  • 0

Poxa Micheus desculpe, mas não consegui.

Tenho esta função que faz parte do que você me passou. (pelo menos penso que sim....)

function TFRCadRim.GetNewFieldCod(TableName, FieldName :string) :LongInt;
begin
  DMdados.SQLDataSetMax.CommandType := ctQuery;
  DMdados.SQLDataSetMax.CommandText := 'SELECT (MAX('+FieldName+')) AS '+FieldName+' FROM '+TableName;
  DMdados.SQLDataSetMax.Open;
  Result := DMdados.SQLDataSetMax.FieldByName(FieldName).AsInteger +1;
  DMdados.SQLDataSetMax.Close;
end;

Mas não consegui colocar esta condição

where extract(year from data) = :ANO

Tem como você me ajudar

Abraço

Valdecir

Link to comment
Share on other sites

  • 0
Poxa Micheus desculpe, mas não consegui.

Tenho esta função que faz parte do que você me passou. (pelo menos penso que sim....)

function TFRCadRim.GetNewFieldCod(TableName, FieldName :string) :LongInt;
begin
  DMdados.SQLDataSetMax.CommandType := ctQuery;
  DMdados.SQLDataSetMax.CommandText := 'SELECT (MAX('+FieldName+')) AS '+FieldName+' FROM '+TableName;
  DMdados.SQLDataSetMax.Open;
  Result := DMdados.SQLDataSetMax.FieldByName(FieldName).AsInteger +1;
  DMdados.SQLDataSetMax.Close;
end;
é, faz um tempinho, e já tem um upgrade:
function TFRCadRim.GetNewFieldCod(TableName, FieldName :string; WhereOption :string = '') :LongInt;
begin
  DMdados.SQLDataSetMax.CommandType := ctQuery;
  DMdados.SQLDataSetMax.CommandText := 'SELECT (MAX('+FieldName+')) AS '+FieldName+' FROM '+TableName;
  if WhereOption <> '' then
      DMdados.SQLDataSetMax.CommandText :=   DMdados.SQLDataSetMax.CommandText +' WHERE ' +WhereOption;
  DMdados.SQLDataSetMax.Open;
  Result := DMdados.SQLDataSetMax.FieldByName(FieldName).AsInteger +1;
  DMdados.SQLDataSetMax.Close;
end;
e já adaptei aqui para o seu código. Daí para obter o MAX de ID, chame ela assim:
GetNewFieldCod('CadRIM', 'ID');
para o MAX de Contr_RIM, chame ela assim:
GetNewFieldCod('CadRIM', 'ID', Format('extract(year from data) = %d', [YearOf(Date)]));

- a função YearOf está declarada na unit DateUtils; (Delphi 7)

- a função Format está declarada na unit SysUtils;

Veja se agora vai...

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share



  • Forum Statistics

    • Total Topics
      150.1k
    • Total Posts
      647.1k
×
×
  • Create New...