Fórum Auto numeração via Código. #40796
11/12/2003
0
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
Curtir tópico
+ 0Posts
11/12/2003
Afarias
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+
Gostei + 0
12/12/2003
Amilton/pr
Gostei + 0
12/12/2003
Afarias
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
{...}
Gostei + 0
16/12/2003
Amilton/pr
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.
Gostei + 0
16/12/2003
Afarias
Bom, não há erros neste procedimento, então::
Qual a mensagem de erro q vc está recebendo??
T+
Gostei + 0
16/12/2003
Amilton/pr
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 . . .
Gostei + 0
16/12/2003
Amilton/pr
Essa mensagem: Undeclared Identifier ´ExecQuery´
Para complementar sobre o Generator em questão . . .
Gostei + 0
17/12/2003
Afarias
|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+
Gostei + 0
17/12/2003
Amilton/pr
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?
Gostei + 0
17/12/2003
Afarias
T+
Gostei + 0
17/12/2003
Amilton/pr
Poderia me dizer as diferenças e funções desses componentes?
Gostei + 0
17/12/2003
Afarias
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+
Gostei + 0
17/12/2003
Amilton/pr
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.
Gostei + 0
17/12/2003
Afarias
T+
Gostei + 0
17/12/2003
Amilton/pr
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?
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)