GARANTIR DESCONTO

Fórum Auto numeração via Código. #40796

11/12/2003

0

Tenho um campo código na tabela e quero inseri-lo via edit, mas sempre acrescentando+1. Sei que existe o generator(nunca usei), mas existe alguma maneira de implementa-lo(acrescentando+1) via código?
Se faço via beforPost acrescenta+2, no botão Npost do navigator então acusa a mensagem que o campo está vazio, enfim, é isso.
Quero jogar esse número do código depois do preenchimento do cadastro, estou pensando no uso em uma rede.


Amilton/pr

Amilton/pr

Responder

Posts

11/12/2003

Afarias

crie um generator no banco::

CREATE GENERATOR nome_generator;


crie a seginte ´função´ no delphi::


function TFormx.GetNewID(const AGenerator: string): Integer;
const
  SQLText = ´select gen_id(¬s, 1) from rdb$database´;
begin
  with IBSQL1 do
  begin
    SQL.Text := Format(SQLText, [AGenerator]);
    Transaction.StartTransaction;
    try
      ExecQuery;
      Result := Fields[0].AsInteger;
    finally
      Transaction.Commit;
    end;
  end;
end;




vc pode substituir o IBSQL por outro componente q esteja usando (que execute SQLs no IB)

vc pode usar o seginte código para pegar um novo código (no BeforePost ou OnNewRecord do seu DataSet)::

  SeuDataSet.FieldByName(´CODIGO´).AsInteger := GetNewID(´nome_generator´);


se tiver problemas com ´campo está vazio´ ... defina a propriedade REQUIRED do TField que representa o campo Código para FALSE.


T+


Responder

Gostei + 0

12/12/2003

Amilton/pr

Blz., mas posso usar esse código no Botão nPost do Navigator ou tenho que colocar um botão pra gravar?


Responder

Gostei + 0

12/12/2003

Afarias

Vc pode colocar onde quizer! Mas, é bom colocar as coisas no seu devido lugar ... sendo assim, aconselho q coloque o código nos eventos BeforePost ou OnNewRecord do DataSet.

Mas, como disse, vc pode colocar onde quizer.


T+


PS:: No caso de colocar no BeforePost, vc teria q antes ´perguntar´

if DataSet.State = dsInsert then
{...}


Responder

Gostei + 0

16/12/2003

Amilton/pr

Nessa Gerator . . .

1-function TFormx.GetNewID(const AGenerator: string): Integer;
2-const
3- SQLText = ´select gen_id(¬s, 1) from rdb$database´;
4-begin
5- with IBSQL1 do
6- begin
7- SQL.Text := Format(SQLText, [AGenerator]);
8- Transaction.StartTransaction;
9- try
10- ExecQuery;
11- Result := Fields[0].AsInteger;
12- finally
13- Transaction.Commit;
14- end;
15- end;
16-end;

Fiz uma numeração de linhas pra mostrar que dá erro na linha 7(acho que o ponto, mas tirei esse ponto e mesmo assim dá erro) e depois na linha 10.


Responder

Gostei + 0

16/12/2003

Afarias

Bom, não sei se já te falei: procure manter cada dicussão no seu lugar ok? Especificamente esta, vamos manter e continuar apenas aqui certo??


Bom, não há erros neste procedimento, então::

Qual a mensagem de erro q vc está recebendo??



T+


Responder

Gostei + 0

16/12/2003

Amilton/pr

Muito bem, meu amigo!!!!
Olha, criei um Generator com o nome de P_Gener, com o valor 0.
Na função na linha:
SQLText := Format(SQLText, [AGenerator]);

Obs. na instrução está sql.text, aqui é sqltext, sem o ponto. Com o ponto dá a mensagem : undeclared Identifier SQL.

mensagem de erro nessa instrução: left side cannot be assigned to

Aguaro retorno . . .


Responder

Gostei + 0

16/12/2003

Amilton/pr

Ainda sobre o Generator na linha ExecQuery;

Essa mensagem: Undeclared Identifier ´ExecQuery´

Para complementar sobre o Generator em questão . . .


Responder

Gostei + 0

17/12/2003

Afarias

|criei um Generator com o nome de P_Gener, com o valor 0.
|Na função na linha: SQLText := Format(SQLText, [AGenerator]);

NÃO É SQLText := {...} é ::: SQL.Text := {...}

TEM o PONTO ok?! SQL é uma propriedade do IBSQL que é do tipo TStrings. E Text é uma propriedade do TStrings.

Depois no Format, tem SQLText (sem ponto) que, se vc reparar é o nome da constante criada!! (Vc pode renomear a constante para outro nome q mais lhe agradar)

Vc usaria a função da forma (EX.)::

MinhaVariavel := GetNewID(´P_GENER´);


|Obs. na instrução está sql.text, aqui é sqltext, sem o ponto. Com o ponto
|dá a mensagem : undeclared Identifier SQL.

É pq vc provavelmente não está usando um IBSQL. Se vc está usando outro componente, tem q mudar algumas coisas no código para este componente específico.


|Ainda sobre o Generator na linha ExecQuery;
|Essa mensagem: Undeclared Identifier ´ExecQuery´

Mesma coisa!


T+


Responder

Gostei + 0

17/12/2003

Amilton/pr

Legal!
Realmente . . . estou usando o componente IbDataset e ele não tem a propriedade SQL, mas substitui pelo comando SelectSql.text e não deu o erro mais. Agora na linha ExecQuery continua com a mesma situação.
Tem algum comando para executar um IbDataset como um IbQuery pra resolvermos isso?


Responder

Gostei + 0

17/12/2003

Afarias

Já q vc está usando IBX, não é mais fácil vc simplesmente usar um IBSQL no lugar do IBDataSet?? Cada coisa no seu lugar -- o IBDataSet não é feito pra isso, o IBSQL sim.


T+


Responder

Gostei + 0

17/12/2003

Amilton/pr

Posso perfeitamente fazer isso, na verdade eu não sei exatamente como funciona e nem as diferenças entre ambos, mas no caso da IbQuery como fica alterar, incluir, deletar, enfim . . . a manutenção em geral se não tem as propriedades InsertSql, DeleteSql, etc?

Poderia me dizer as diferenças e funções desses componentes?


Responder

Gostei + 0

17/12/2003

Afarias

Veja Amilton,

Para selecionar os registros e editá-los, vc deve usar um IBDataSet Ok??

Se vc quer gerar o código automático direto no IBDataSet, vc pode usar a propriedade GeneratorField para isso Ok??

Bom, como vc quer gerar o valor via código... vc deve usar uma função como aquela -- é algo a parte -- não tem nada a ver com a seleção e edição de registros!!!! É só pra gerar um novo código em qualquer parte q vc desejar certo???

E eu não disse IBQuery eu disse IBSQL, os componentes IBX são divididos mais ou menos assim::


IBTable - não serve pra nada
IBStoredProc - procedimentos ´executáveis´ (os ´selecionáveis´ não)
IBQuery - seleção de registros (e alteração caso usado em conjunto com um IBUpdateSQL)
IBDataSet - é igual a 1 IBQuery + 1 IBUpdateSQL
IBSQL - executar comandos SQL (inclusive consultas -- unidirecional e sem suporte a controles visuais)


T+


Responder

Gostei + 0

17/12/2003

Amilton/pr

Desculpe, disse IbQuery mas colei o componente IbSql.
Olha, usei a propriedade GeneratorField para incrmentar o código em 1, no Dataset, assim: Nome da Generetor: P_Gener - Obs. Mudei o valor da Generator para 0;
Field: Codigo
Increment: 1
Apply event: opcao New Record -

Quando rodo o programa dá violação de chave.


Responder

Gostei + 0

17/12/2003

Afarias

vc não pode voltar o valor de um generator q está sendo usado se já existem registros na tabela a qual ele se presta. o q vc vai ter é violações de chave primária.


T+


Responder

Gostei + 0

17/12/2003

Amilton/pr

Blz. Limpei a tabela e comecei a inserir os dados.
Coloquei o valor da Generator em 0 ou 1, isso incluencia em algo?
Na propriedade GeneratorField na opção ApplyField marquei OnPost e LEGAL!!! agora está funcionando Blz.
Depois de tudo, aparente simples, né?
Pelo que entendi esse código gerado é autoincremento, só conseguirei a editar registros do inicio se limpar a tabela e começar tudo novamente?

Em que situação, então eu usaria o Generator com IbSql?


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar