GARANTIR DESCONTO

Fórum Autoincremento da tabela filho? #58435

19/06/2007

0

Pessoal eu procurei mais nao achei, bom preciso fazer um autoincremento assim:

Tenho a tabela 1 com os nomes da empresa

Agora na tabela 2 preciso incluir assim
01-empresa 1
01-fulano de tal
02-ciclano de tal
03-...
04-...
02-empresa 2
01-fulano de tal
02-ciclano de tal
03-...
04-...
03-empresa 2
01-fulano de tal
02-ciclano de tal
03-...
04-...

Ou seja a cada empresa começar o autoincremento na tabela 2

Estou usando firebird 2.0

Pode ser via codigo, tirgger, sproc.

Grato a ajuda de todos
Adriano.


Adriano_servitec

Adriano_servitec

Responder

Posts

19/06/2007

Adriano_servitec

Mexendo daqui, mexendo dali, cheguei ao seguinte codigo, pegando o maior valor da ID

procedure TForm1.Button1Click(Sender: TObject);
var
idempr,prox : integer;
begin
with ibquery1 do
  begin
    close;
    sql.clear;
    sql.add(´select max(id_sal)as chavepri from salario_m where id_empresa = :pchaveempresa´);
    idempr:=ibtable1.fieldbyname(´id_empresa´).asInteger;
    Parambyname(´pchaveempresa´).asinteger := idempr; //variavel que recebe o codigo da empresa
    Open;
    Prox:=FieldByName(´chavePri´).asInteger+1;
    ibtable2.append;
    ibtable2.FieldByName(´id_sal´).AsInteger:=Prox;
    ibtable2.FieldByName(´nome´).AsString:=edit1.text;
    ibtable2.FieldByName(´salario´).AsFloat:=strtofloat(edit2.text);
    ibtable2.FieldByName(´id_empresa´).AsInteger:=ibtable1.FieldByName(´id_empresa´).AsInteger;
    ibtable2.Post;
end;
end;



Mais descobri que se eu quiser ter um codigo assim, tenho que abrir mao da PK(Chave Primaria).

Ai pessoal, pelo visto nao tem jeito mesmo de fazer algo assim sendo o campo um campo unique.


Responder

Gostei + 0

19/06/2007

Adriano_servitec

Eu nao posso excluir a chave primaria, e preciso criar um autoincremento assim.

Bom pensei eu montar um tipo o ID_Empresa + ID_SAL, para ficar assim

Empresa1
campo ID_Sal (Integer)
100001
100002
100003
....

Empresa2
campo ID_Sal (Integer)
200001
200002
200003
....

E assim por diante.
Mais nao consegui, o maximo que consegui foi assim
Empresa1
11
112
1113
11114
....

Empresa2
21
222
2223
22224

E pior se eu colocar 0000 no meio ai estoura as casas do integer

O que eu fiz foi pasar para variaveis string e depois converter vara inteiros para jogar na tabela.
O codigo ficou assim
procedure TFCadFunc.BitBtn2Click(Sender: TObject);
var
IDempr, Prox, GerID_Func : integer;
sProx, sID_Empresa, sM_SIdSpx : string;
begin
with dm.qAutoIncFunc do
  begin
    close;
    sql.clear;
    sql.add(´select max(id_sal)as chavepri from salario_m where id_empresa = :pchaveempresa´);
    idempr:=dm.QEmpresa.fieldbyname(´id_empresa´).asInteger;
    Parambyname(´pchaveempresa´).asinteger := idempr; //variavel que recebe o codigo da empresa
    Open;
    Prox:=0; //limpando a variavel inteiro pára receber a soma da chave do Funcionario
    sProx:=´´; //Limpando variavel String;
    Prox:=FieldByName(´chavePri´).asInteger+1; //somando o maior valor + 1
    sProx:=IntToStr(Prox); //transformando a variavel de Inteiro para String
    sID_Empresa:=´´; //Limpando variavel String;
    sID_Empresa:=IntToStr(dm.QEmpresa.FieldByName(´id_empresa´).AsInteger); //transformando o campo da tabela para string
    Sm_SIdSpx:=sId_Empresa + SProx; //juntando as duas variaves string
    GerID_Func:=StrToInt(Sm_SIdSpx); //jogando o resultado das duas variaveis
    dm.qFuncionarios.append;
    dm.qFuncionarios.FieldByName(´id_sal´).AsInteger:=GerID_Func; //recebendo a variavel (campo id_empresa + id_func)
    dm.qFuncionarios.FieldByName(´nome´).AsString:=edit1.text;
    dm.qFuncionarios.FieldByName(´salario´).AsFloat:=strtofloat(edit2.text);
    dm.qFuncionarios.FieldByName(´id_empresa´).AsInteger:=dm.QEmpresa.FieldByName(´id_empresa´).AsInteger;
    dm.qFuncionarios.Post;
    dm.qFuncionarios.ApplyUpdates;
end; 
end;
Mais como disse esta somando o maior numero, eu acho que eh por causa do MAX no select que pega o maior numero +1.
Achei que limpando as variaveis funcionaria, mais nao deu certo.

Tambem fiquei pensando, se no caso funcionar pegar somente para um filtro em SQL os ultimos numeros tipo 0001, 0002. Acho que um substring nao funciona com inteiros entao neste segundo caso devo converter novamente para string para fazer o filtro?

Essa tabela esta vinculada a tabela empresa, sempre vai mostrar o primeiro numero o numero do ID_Empresa.

Bom resumindo eu quero eh fazer do jeito que citei acima
1000001
1000002
2000001
3000001
.....

Entenderam?

Alguem pode me ajudar?

Obrigado
Adriano.


Responder

Gostei + 0

20/06/2007

Adriano_servitec

Bom eu mudei, pq achei que isso acima ia me complicar, entao resolvi criar mais um campo que nao eh chave primaria e nem eh vinculado nada no evento do dataset, mas, ai veio o erro abaixo.

[b:f309b3878a][size=16:f309b3878a]Cannot focus a disabled or invisible windows[/size:f309b3878a][/b:f309b3878a]
Ele soh apareçe na hora em que vou gravar no banco de dados
Nao tem nada invisivel, nem desabilitado, eh um form simples, mais na hora de gravar aconteçe o erro

Olhe a unit
unit uCadFun;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, DBCtrls, DB, Grids, DBGrids, StdCtrls;

type
  TFCadFun = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Button1: TButton;
    DBGrid1: TDBGrid;
    dsempresa: TDataSource;
    DBNavigator1: TDBNavigator;
    DBGrid2: TDBGrid;
    dsFuncionarios: TDataSource;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  FCadFun: TFCadFun;

implementation

uses uDM;

{$R *.dfm}

procedure TFCadFun.Button1Click(Sender: TObject);
var 
idempr,prox : integer; 
begin
with dm.qAutoIncFunc do
  begin 
    close;
    sql.clear; 
    sql.add(´select max(id_func)as chavepri from salario_m where id_empresa = :pchaveempresa´);
    idempr:=dm.qEmpresa.fieldbyname(´id_empresa´).asInteger;
    Parambyname(´pchaveempresa´).asinteger := idempr; //variavel que recebe o codigo da empresa
    Open;
    Prox:=FieldByName(´chavePri´).asInteger+1;
    dm.qFuncionarios.append;
    dm.qFuncionarios.FieldByName(´id_func´).AsInteger:=Prox;
    dm.qFuncionarios.FieldByName(´nome´).AsString:=edit1.text;
    dm.qFuncionarios.FieldByName(´salario´).AsFloat:=strtofloat(edit2.text);
    dm.qFuncionarios.FieldByName(´id_empresa´).AsInteger:=dm.QEmpresa.FieldByName(´id_empresa´).AsInteger;
    dm.qFuncionarios.Post;
    dm.qFuncionarios.ApplyUpdates;

  end;

end;

end.

Ja revirei ela toda e nao achei nada

Nao estou forçando foco em nada
Mais vi que se eu mudar assim o codigo
procedure TFCadFun.Button1Click(Sender: TObject); var idempr,prox : integer; begin with dm.qAutoIncFunc do begin close; sql.clear; sql.add(´select max([color=blue:f309b3878a]id_sal[/color:f309b3878a])as chavepri from salario_m where id_empresa = :pchaveempresa´); idempr:=dm.qEmpresa.fieldbyname(´id_empresa´).asInteger; Parambyname(´pchaveempresa´).asinteger := idempr; //variavel que recebe o codigo da empresa Open; Prox:=FieldByName(´chavePri´).asInteger+1; dm.qFuncionarios.append; dm.qFuncionarios.FieldByName([color=blue:f309b3878a]´id_sal´[/color:f309b3878a]).AsInteger:=Prox; dm.qFuncionarios.FieldByName(´nome´).AsString:=edit1.text; dm.qFuncionarios.FieldByName(´salario´).AsFloat:=strtofloat(edit2.text); dm.qFuncionarios.FieldByName(´id_empresa´).AsInteger:=dm.QEmpresa.FieldByName(´id_empresa´).AsInteger; dm.qFuncionarios.Post; dm.qFuncionarios.ApplyUpdates; end; end;
Funciona (Mudei e destaquei em azul)

Tenho os dois campos na tabela, soh que funciona somente com o campo id_sal, e preciso que funcione com o campo id_func.

Alguem tem alguma ideia?
To precisando de ajuda

Adriano.


Responder

Gostei + 0

22/06/2007

Martins

Seguinte, vamos analisar se código.

close; 
    sql.clear; 
    sql.add(´select max(id_func)as chavepri from salario_m where id_empresa = :pchaveempresa´); 
    idempr:=dm.qEmpresa.fieldbyname(´id_empresa´).asInteger; 
    Parambyname(´pchaveempresa´).asinteger := idempr; //variavel que recebe o codigo da empresa 


Aqui vc está selecionando apenas o campos ID-FUNC, então somente ele será retornado em sua Query, então ao tentar usar o campo ID_EMPRESA, vc não vai conseguir pq ele está invisível, não existe na sua query apos sua última instrução.


Veja aqui. Esse seu código q funciona, vc está usando o mesmo registro q traz no select.

sql.clear; 
sql.add(´select max(id_sal)as chavepri from salario_m where id_empresa = :pchaveempresa´); 
idempr:=dm.qEmpresa.fieldbyname(´id_empresa´).asInteger; 
Parambyname(´pchaveempresa´).asinteger := idempr; //variavel que recebe o codigo da empresa 
Open; 
Prox:=FieldByName(´chavePri´).asInteger+1; 
dm.qFuncionarios.append; 
dm.qFuncionarios.FieldByName(´id_sal´).AsInteger:=Prox; 


Atente para isso e bons códigos.


Responder

Gostei + 0

22/06/2007

Adriano_servitec

Olah amigo, bom en nao entendo o que vc quis me dizer, mais tudo bem, esse problema eu ja tinha resolvido, fazendo o mesmo codigo porem em vez de usar um zQuery usei os componentes do DBExpress, e do mesmo modo funcionou.

Bom agora eu nao sei o pq, mais funcionou.

Obrigado amigo


Responder

Gostei + 0

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

Aceitar