Como gravar em duas tabelas?
Estou trabalhando num projeto da faculdade que precisa gravar em duas tabelas criadas conforme abaixo:
CREATE TABLE tbPessoa (
CPF VARCHAR(11) NOT NULL,
RG VARCHAR(8) NOT NULL,
NOME VARCHAR(50) NOT NULL,
ENDERECO VARCHAR(100),
BAIRRO VARCHAR(50),
CIDADE VARCHAR(50),
ESTADO VARCHAR(2),
CEP VARCHAR(9),
SEXO VARCHAR(1),
PROFISSAO VARCHAR(50),
DT_NASC TIMESTAMP,
DT_CADASTRO TIMESTAMP,
usuCADASTRO VARCHAR(20),
DT_ALTERADO TIMESTAMP,
usuALTERADO VARCHAR(20),
CONSTRAINT pk_Pessoa PRIMARY KEY (CPF));
CREATE TABLE tbTelefone (
CPF VARCHAR(11) NOT NULL,
NUMERO VARCHAR(15) NOT NULL,
TIPO VARCHAR(20),
CONSTRAINT pk_Telefone PRIMARY KEY (CPF,NUMERO),
CONSTRAINT fk_Telefone_Pessoa FOREIGN KEY (CPF)
REFERENCES tbPessoa (CPF));
Eu consigo fazer o SELECT das tabelas numa boa através de um DataSet, mas quando tento gravar um novo cadastro no form ele dá um erro dizendo que os campos da tabela telefone não estão disponíveis pra gravação. Alguém poderia me dar uma ajuda?
CREATE TABLE tbPessoa (
CPF VARCHAR(11) NOT NULL,
RG VARCHAR(8) NOT NULL,
NOME VARCHAR(50) NOT NULL,
ENDERECO VARCHAR(100),
BAIRRO VARCHAR(50),
CIDADE VARCHAR(50),
ESTADO VARCHAR(2),
CEP VARCHAR(9),
SEXO VARCHAR(1),
PROFISSAO VARCHAR(50),
DT_NASC TIMESTAMP,
DT_CADASTRO TIMESTAMP,
usuCADASTRO VARCHAR(20),
DT_ALTERADO TIMESTAMP,
usuALTERADO VARCHAR(20),
CONSTRAINT pk_Pessoa PRIMARY KEY (CPF));
CREATE TABLE tbTelefone (
CPF VARCHAR(11) NOT NULL,
NUMERO VARCHAR(15) NOT NULL,
TIPO VARCHAR(20),
CONSTRAINT pk_Telefone PRIMARY KEY (CPF,NUMERO),
CONSTRAINT fk_Telefone_Pessoa FOREIGN KEY (CPF)
REFERENCES tbPessoa (CPF));
Eu consigo fazer o SELECT das tabelas numa boa através de um DataSet, mas quando tento gravar um novo cadastro no form ele dá um erro dizendo que os campos da tabela telefone não estão disponíveis pra gravação. Alguém poderia me dar uma ajuda?
Soueusei26
Curtidas 0
Respostas
Mayron Cachina
03/10/2007
como é que está seu código de gravação no banco?
eh direto com um dbcontrol?
ou usando insert?
eh direto com um dbcontrol?
ou usando insert?
GOSTEI 0
Soueusei26
03/10/2007
Então, primeiro eu fiz com dbedit, mas me disseram que no momento em que ocorre o cdsMeu.dataset.post e ApplyUpdates(0) o servidor de banco de dados gera um erro e não aceita.
Agora estou tentando usar os controles padrões, mas estou apanhando pra caramba.
Agora estou tentando usar os controles padrões, mas estou apanhando pra caramba.
GOSTEI 0
Mayron Cachina
03/10/2007
cara eu nunca usei o cliente dataset pra gravar... como vc está fazendo???
GOSTEI 0
Soueusei26
03/10/2007
///// Estou usando este código no botão novo:
procedure TfrmPadrao.btnNovoClick(Sender: TObject);
begin
if not dstGenerico.DataSet.Active then
dstGenerico.DataSet.Open;
with dstGenerico.DataSet do
begin
Append;
FieldValues[´CPF´] := Trim(frmFuncionarios.txtCPF.Text);
FieldValues[´NOME´] := Trim(frmFuncionarios.txtNome.Text);
FieldValues[´ENDERECO´] := Trim(frmFuncionarios.txtEndereco.Text);
FieldValues[´BAIRRO´] := Trim(frmFuncionarios.txtBairro.Text);
FieldValues[´CIDADE´] := Trim(frmFuncionarios.txtCidade.Text);
FieldValues[´ESTADO´] := Trim(frmFuncionarios.txtUF.Text);
FieldValues[´CEP´] := Trim(frmFuncionarios.txtCEP.Text);
FieldValues[´RG´] := Trim(frmFuncionarios.txtRG.Text);
FieldValues[´DT_NASC´] := Trim(frmFuncionarios.mskDT_NASC.Text);
FieldValues[´SEXO´] := Trim(frmFuncionarios.cbxSexo.Text);
FieldValues[´PROFISSAO´] := Trim(frmFuncionarios.txtProfissao.Text);
end;
end;
///// Estou usando este código no botão salvar:
procedure TfrmPadrao.btnSalvarClick(Sender: TObject);
begin
dstGenerico.DataSet.Post;
end;
///// E este no afterpost:
procedure TdmdPrincipal.cdsPessoasAfterPost(DataSet: TDataSet);
begin
cdsPessoas.ApplyUpdates(0);
end;
//////// Funciona bem pra uma tabela, mas não sei como fazer para gravar em duas tabela...
///// E este é select que estou usando:
SELECT
p.CPF, p.RG, p.NOME, p.ENDERECO, p.BAIRRO, p.CIDADE, p.ESTADO,
p.CEP, p.SEXO, p.PROFISSAO, p.DT_NASC, p.DT_CADASTRO,
f.Numero, f.CPF as fCPF, f.TIPO
FROM
tbPessoa p,
tbTelefone f
procedure TfrmPadrao.btnNovoClick(Sender: TObject);
begin
if not dstGenerico.DataSet.Active then
dstGenerico.DataSet.Open;
with dstGenerico.DataSet do
begin
Append;
FieldValues[´CPF´] := Trim(frmFuncionarios.txtCPF.Text);
FieldValues[´NOME´] := Trim(frmFuncionarios.txtNome.Text);
FieldValues[´ENDERECO´] := Trim(frmFuncionarios.txtEndereco.Text);
FieldValues[´BAIRRO´] := Trim(frmFuncionarios.txtBairro.Text);
FieldValues[´CIDADE´] := Trim(frmFuncionarios.txtCidade.Text);
FieldValues[´ESTADO´] := Trim(frmFuncionarios.txtUF.Text);
FieldValues[´CEP´] := Trim(frmFuncionarios.txtCEP.Text);
FieldValues[´RG´] := Trim(frmFuncionarios.txtRG.Text);
FieldValues[´DT_NASC´] := Trim(frmFuncionarios.mskDT_NASC.Text);
FieldValues[´SEXO´] := Trim(frmFuncionarios.cbxSexo.Text);
FieldValues[´PROFISSAO´] := Trim(frmFuncionarios.txtProfissao.Text);
end;
end;
///// Estou usando este código no botão salvar:
procedure TfrmPadrao.btnSalvarClick(Sender: TObject);
begin
dstGenerico.DataSet.Post;
end;
///// E este no afterpost:
procedure TdmdPrincipal.cdsPessoasAfterPost(DataSet: TDataSet);
begin
cdsPessoas.ApplyUpdates(0);
end;
//////// Funciona bem pra uma tabela, mas não sei como fazer para gravar em duas tabela...
///// E este é select que estou usando:
SELECT
p.CPF, p.RG, p.NOME, p.ENDERECO, p.BAIRRO, p.CIDADE, p.ESTADO,
p.CEP, p.SEXO, p.PROFISSAO, p.DT_NASC, p.DT_CADASTRO,
f.Numero, f.CPF as fCPF, f.TIPO
FROM
tbPessoa p,
tbTelefone f
GOSTEI 0
Mayron Cachina
03/10/2007
Vc vai ter que fazer 2 inserts...
eu acho q n tem pra onde correr...
eu acho q n tem pra onde correr...
GOSTEI 0
Soueusei26
03/10/2007
Legal Mayron, acho que encontrei um tópico que fala sobre isso.
http://forum.clubedelphi.net/viewtopic.php?t=75421&highlight=dbexpress+iniciante
Acho que é isso que estou precisando.
http://forum.clubedelphi.net/viewtopic.php?t=75421&highlight=dbexpress+iniciante
Acho que é isso que estou precisando.
GOSTEI 0