Autoincremento da tabela filho?
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.
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
Curtidas 0
Respostas
Adriano_servitec
19/06/2007
Mexendo daqui, mexendo dali, cheguei ao seguinte codigo, pegando o maior valor da ID
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.
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
Adriano_servitec
19/06/2007
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
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.
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
Adriano_servitec
19/06/2007
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
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.
[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.
GOSTEI 0
Martins
19/06/2007
Seguinte, vamos analisar se código.
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.
Atente para isso e bons códigos.
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
Adriano_servitec
19/06/2007
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
Bom agora eu nao sei o pq, mais funcionou.
Obrigado amigo
GOSTEI 0