Fórum Autoincremento da tabela filho? #58435
19/06/2007
0
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
Curtir tópico
+ 0Posts
19/06/2007
Adriano_servitec
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.
Gostei + 0
19/06/2007
Adriano_servitec
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;
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.
Gostei + 0
20/06/2007
Adriano_servitec
[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
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.
Gostei + 0
22/06/2007
Martins
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.
Gostei + 0
22/06/2007
Adriano_servitec
Bom agora eu nao sei o pq, mais funcionou.
Obrigado amigo
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)