Problemas com cadastro.
:) Estou com problemas ao cadastrar um novo registro em uma tabela o codigo é esse abaixo e a estrutura da tabela está logo abaixo dele.
procedure TfrmCadastroVisitante.btnCadastrarClick(Sender: TObject);
var
DataHora : string;
begin
DataHora := DateTimeToStr(now);
if (txtNome.text = ´´) or(txtHospede.text = ´´) then begin
begin
MessageDlg(´Você deve preencher todos os campos obrigatórios!´,mtError, [mbOK], 0);
Abort;
end;
//Começa a inserção dos dados no Banco
with dmCondominio do begin
if not (traAlteraQuarto.InTransaction) then
traAlteraQuarto.StartTransaction;
with sqlGeral do begin
Close;
with SQL do begin
Clear;
Add(´insert into Visitante (COD_VISI, NOM_VISI, IDE_VISI, CPF_VISI, COD_HOSP, DAT_HOR_ENT_VISI)´);
Add(´values (GEN_ID (GEN_COD_VISI,1),´´´+txtNome.Text+´´´,´´´+txtIdentidade.Text+´´´,´´´+txtCPF.Text+´´´,´´´+txtHospede.Text +´´´,´´´ + DataHora +´´´)´);//Atenção
end;
end;
end;
try
dmCondominio.sqlGeral.Prepare;
dmCondominio.sqlGeral.ExecQuery;
except
on EIBError do begin //Erro do InterBase
dmCondominio.traAlteraQuarto.Rollback;
MessageDlg(´Não foi possível cadastrar o quarto!´,mtError,[mbOK],0);
Abort;
Exit;
end;
end;
//Finalizando a transação com efetivação das modificações
dmCondominio.traAlteraQuarto.Commit;
MessageDlg(´Inserção do Item Quarto efetuada com sucesso!´,mtInformation,[mbOK],0);
//Executa um Refresh para atualizar o DBGrid
with dmCondominio.qryVisitante do begin
close;
sql.Clear;
sql.add(´select * from Visitante´);
Prepare;
dmCondominio.idbCondominio.Close;
dmCondominio.idbCondominio.open;
open;
end;
//Fim do cadastro
//Execução do cancelamento da transação somente se no botão estiver escrito Cancelar
end;
end;
ESTRUTURA DA TABELA:
CREATE TABLE ´VISITANTE´
(
´COD_VISI´INTEGER NOT NULL,
´DAT_HOR_ENT_VISI´TIMESTAMP NOT NULL,
´DAT_HOR_SAI_VISI´TIMESTAMP,
´NOM_VISI´CHAR(50) NOT NULL,
´IDE_VISI´CHAR(15),
´FOT_VISI´CHAR(254) NOT NULL,
´FOT_IDE_FRE_VISI´CHAR(254),
´FOT_IDE_VER_VISI´CHAR(254),
´COD_CONT´INTEGER,
´COD_HOSP´INTEGER NOT NULL,
PRIMARY KEY (´COD_VISI´)
);
ALTER TABLE ´VISITANTE´ ADD FOREIGN KEY (´COD_CONT´) REFERENCES CONTA (´COD_CONT´);
ALTER TABLE ´VISITANTE´ ADD FOREIGN KEY (´COD_HOSP´) REFERENCES HOSPEDE (´COD_HOSP´);
agradecido
:? :) :) Dougla Fiorini Carvalho
procedure TfrmCadastroVisitante.btnCadastrarClick(Sender: TObject);
var
DataHora : string;
begin
DataHora := DateTimeToStr(now);
if (txtNome.text = ´´) or(txtHospede.text = ´´) then begin
begin
MessageDlg(´Você deve preencher todos os campos obrigatórios!´,mtError, [mbOK], 0);
Abort;
end;
//Começa a inserção dos dados no Banco
with dmCondominio do begin
if not (traAlteraQuarto.InTransaction) then
traAlteraQuarto.StartTransaction;
with sqlGeral do begin
Close;
with SQL do begin
Clear;
Add(´insert into Visitante (COD_VISI, NOM_VISI, IDE_VISI, CPF_VISI, COD_HOSP, DAT_HOR_ENT_VISI)´);
Add(´values (GEN_ID (GEN_COD_VISI,1),´´´+txtNome.Text+´´´,´´´+txtIdentidade.Text+´´´,´´´+txtCPF.Text+´´´,´´´+txtHospede.Text +´´´,´´´ + DataHora +´´´)´);//Atenção
end;
end;
end;
try
dmCondominio.sqlGeral.Prepare;
dmCondominio.sqlGeral.ExecQuery;
except
on EIBError do begin //Erro do InterBase
dmCondominio.traAlteraQuarto.Rollback;
MessageDlg(´Não foi possível cadastrar o quarto!´,mtError,[mbOK],0);
Abort;
Exit;
end;
end;
//Finalizando a transação com efetivação das modificações
dmCondominio.traAlteraQuarto.Commit;
MessageDlg(´Inserção do Item Quarto efetuada com sucesso!´,mtInformation,[mbOK],0);
//Executa um Refresh para atualizar o DBGrid
with dmCondominio.qryVisitante do begin
close;
sql.Clear;
sql.add(´select * from Visitante´);
Prepare;
dmCondominio.idbCondominio.Close;
dmCondominio.idbCondominio.open;
open;
end;
//Fim do cadastro
//Execução do cancelamento da transação somente se no botão estiver escrito Cancelar
end;
end;
ESTRUTURA DA TABELA:
CREATE TABLE ´VISITANTE´
(
´COD_VISI´INTEGER NOT NULL,
´DAT_HOR_ENT_VISI´TIMESTAMP NOT NULL,
´DAT_HOR_SAI_VISI´TIMESTAMP,
´NOM_VISI´CHAR(50) NOT NULL,
´IDE_VISI´CHAR(15),
´FOT_VISI´CHAR(254) NOT NULL,
´FOT_IDE_FRE_VISI´CHAR(254),
´FOT_IDE_VER_VISI´CHAR(254),
´COD_CONT´INTEGER,
´COD_HOSP´INTEGER NOT NULL,
PRIMARY KEY (´COD_VISI´)
);
ALTER TABLE ´VISITANTE´ ADD FOREIGN KEY (´COD_CONT´) REFERENCES CONTA (´COD_CONT´);
ALTER TABLE ´VISITANTE´ ADD FOREIGN KEY (´COD_HOSP´) REFERENCES HOSPEDE (´COD_HOSP´);
agradecido
:? :) :) Dougla Fiorini Carvalho
Douglasf
Curtidas 0
Respostas
Afarias
27/12/2003
Vc esqueceu de dizer qual é o problema q está tendo.
mas, pra começar, substitua o código::
por::
pois o anterior é realmente um problema!
T+
mas, pra começar, substitua o código::
DataHora := DateTimeToStr(Now);
por::
DataHora := FormatDateTime(´mm/dd/yy HH:nn:ss´, Now);
pois o anterior é realmente um problema!
T+
GOSTEI 0
Douglasf
27/12/2003
Bem o problema q esta acontecendo é q não cadastra... simplesmente cai nesta parte do codigo:
except
on EIBError do begin //Erro do InterBase
dmCondominio.traAlteraQuarto.Rollback;
MessageDlg(´Não foi possível cadastrar o quarto!´,mtError,[mbOK],0);
Abort;
Exit;
end;
except
on EIBError do begin //Erro do InterBase
dmCondominio.traAlteraQuarto.Rollback;
MessageDlg(´Não foi possível cadastrar o quarto!´,mtError,[mbOK],0);
Abort;
Exit;
end;
GOSTEI 0
Afarias
27/12/2003
Se cai nesta parte do código é pq é gerada uma EXCEÇÃO...
qual a classe da exceção (Exception) gerada e sua mensagem original???
T+
qual a classe da exceção (Exception) gerada e sua mensagem original???
T+
GOSTEI 0
Douglasf
27/12/2003
eu não sei...
como faço para ver issu?
como faço para ver issu?
GOSTEI 0
Martins
27/12/2003
Qundo vc roda seu aplicativo atraves do [F9] do Delphi (em Run time), quando o seu codigo é direcionado para excessao, lhe é dada uma mensagem de erro antes da que vc personalizou, essa é a original, poste-a aqui, para que possamos ver o q tem de errado. Pq não podemos te orientar no escuro, falow.
T+
T+
GOSTEI 0
Douglasf
27/12/2003
Hahah... eis a questão!
Meu delphi não sei pq, mas toda vez q rodo o programa dessa forma trava o computador, já instalei-o umas 3 vezes e não deu certo, pensava que era memória e instalei no pc do meu pai que é um Pentium 700MHz 128RAM e cotinuou o problema....
já postei no forum e ninguem sabia oq era...
Meu delphi não sei pq, mas toda vez q rodo o programa dessa forma trava o computador, já instalei-o umas 3 vezes e não deu certo, pensava que era memória e instalei no pc do meu pai que é um Pentium 700MHz 128RAM e cotinuou o problema....
já postei no forum e ninguem sabia oq era...
GOSTEI 0
Afarias
27/12/2003
no seu except coloque o seginte código::
T+
on E: EIBError do begin dmCondominio.traAlteraQuarto.Rollback; MessageDlg(Format(´¬s [¬d; ¬d]´, [E.message, E.SQLCode, E.IBErrorCode]),mtError,[mbOK],0); Abort; Exit; end;
T+
GOSTEI 0
Douglasf
27/12/2003
Afarias,
troquei o codigo q vc me falou e apareceu a seguinte mensagem...
[b:ed2e15e46b]transaction is not active[/b:ed2e15e46b]
olhei o q tava acontecendo e não vi nada de errado com os transactions
troquei o codigo q vc me falou e apareceu a seguinte mensagem...
[b:ed2e15e46b]transaction is not active[/b:ed2e15e46b]
olhei o q tava acontecendo e não vi nada de errado com os transactions
GOSTEI 0
Afarias
27/12/2003
|troquei o codigo q vc me falou e apareceu a seguinte mensagem...
sobre o código do Except ?? o erro não tem a ver com o código em si mas com o fato da transação não estar aberta... é bom vc verificar isso mas, basta mudar o código com::
T+
sobre o código do Except ?? o erro não tem a ver com o código em si mas com o fato da transação não estar aberta... é bom vc verificar isso mas, basta mudar o código com::
if dmCondominio.traAlteraQuarto.InTransaction then dmCondominio.traAlteraQuarto.Rollback;
T+
GOSTEI 0
Douglasf
27/12/2003
Mas olha essa linha de código não faz a mesma coisa???
[b:6e17280860][/b:6e17280860]
[b:6e17280860]
if not (traAlteraQuarto.InTransaction) then traAlteraQuarto.StartTransaction;
GOSTEI 0
Sremulador
27/12/2003
Amigo seus cod estão meio confusos mas eu sempre faço assim
Fazer uma transação: CommitRetaining;
Desfafazer uma transação: RollbackRetaining;
No componente Ibquery tem uma propriedade chamado generatorField onde você colocará o generator.
Fazer uma transação: CommitRetaining;
Desfafazer uma transação: RollbackRetaining;
No componente Ibquery tem uma propriedade chamado generatorField onde você colocará o generator.
GOSTEI 0
Afarias
27/12/2003
|Mas olha essa linha de código não faz a mesma coisa???
+/- cara... mas são coisas diferentes ok?!...
T+
+/- cara... mas são coisas diferentes ok?!...
T+
GOSTEI 0
Douglasf
27/12/2003
Primeiramente muito obrigado pela dica [b:3005652987]sremulador[/b:3005652987]
Afarias aconteceu outro erro que não entendo oq possa ser. Eu já conferi no codigo se tinha algum problema com as chaves estrangeiras, não encotrei, como sempre.
o erro é esse
[color=red:3005652987][b:3005652987] Violation of FOREING KEY constraint ´INTEG_16´ on TABLE ´HOSPEDE´[-530;335544466][/b:3005652987][/color:3005652987]
bem a tabela e vai ai o codigo:
Vou por tb a estrutura das outras tabelas só para facilitar
acho q é isso
muito obrigado
Afarias aconteceu outro erro que não entendo oq possa ser. Eu já conferi no codigo se tinha algum problema com as chaves estrangeiras, não encotrei, como sempre.
o erro é esse
[color=red:3005652987][b:3005652987] Violation of FOREING KEY constraint ´INTEG_16´ on TABLE ´HOSPEDE´[-530;335544466][/b:3005652987][/color:3005652987]
bem a tabela e vai ai o codigo:
with SQL do begin Clear; Add(´insert into Hospede(COD_HOSP, NOM_HOSP, TEL_HOSP, CEL_HOSP, BAI_HOSP, IDE_HOSP, CPF_HOSP, FOT_HOSP, FOT_IDE_FRE_HOSP, FOT_IDE_VER_HOSP, COD_ESTA, COD_QUAR, HOR_DAT_ENT_HOSP)´); Add(´values (GEN_ID (GEN_COD_HOSP,1),´´´ + txtNome.Text + ´´´,´´´ + txtTelefone.Text + ´´´,´´´ + txtCelular.Text + ´´´,´´´ + txtBairro.Text + ´´´,´´´ + txtIdentidade.Text + ´´´,´´´ + txtCPF.Text + ´´´,´´foto´´,´´foto´´,´´foto´´,´´2´´,´´´ + txtCodQuar.Text + ´´´,´´´ + DataHora + ´´´)´); end;
Vou por tb a estrutura das outras tabelas só para facilitar
TABLE "QUARTO"
(
"COD_QUAR"INTEGER NOT NULL,
"NUM_QUAR"CHAR(6) NOT NULL,
"AND_QUAR"CHAR(4) NOT NULL,
"DES_QUAR"CHAR(40),
"SIT_QUAR"CHAR(20) NOT NULL,
PRIMARY KEY ("COD_QUAR")
);
ABLE "ESTADO"
(
"COD_ESTA"INTEGER NOT NULL,
"COD_REG_ESTA"INTEGER NOT NULL,
"NOM_ESTA"CHAR(30) NOT NULL,
PRIMARY KEY ("COD_ESTA")
);
CREATE TABLE "HOSPEDE"
(
"COD_HOSP"INTEGER NOT NULL,
"NOM_HOSP"CHAR(50) NOT NULL,
"TEL_HOSP"CHAR(15),
"CEL_HOSP"CHAR(15),
"END_HOSP"CHAR(70),
"BAI_HOSP"CHAR(40),
"CID_HOSP"CHAR(50),
"IDE_HOSP"CHAR(10),
"CPF_HOSP"CHAR(11),
"FOT_HOSP"CHAR(254) NOT NULL,
"FOT_IDE_FRE_HOSP"CHAR(254),
"FOT_IDE_VER_HOSP"CHAR(254),
"COD_ESTA"INTEGER NOT NULL,
"COD_QUAR"INTEGER NOT NULL,
"HOR_DAT_SAI_HOSP"TIMESTAMP,
"HOR_DAT_ENT_HOSP"TIMESTAMP,
PRIMARY KEY ("COD_HOSP")
);
ALTER TABLE "HOSPEDE" ADD FOREIGN KEY ("COD_QUAR") REFERENCES QUARTO ("COD_QUAR");
ALTER TABLE "HOSPEDE" ADD FOREIGN KEY ("COD_ESTA") REFERENCES ESTADO ("COD_ESTA");acho q é isso
muito obrigado
GOSTEI 0
Afarias
27/12/2003
bom, os valores nos campos COD_QUAR, e COD_ESTA devem estar cadastrados nas tabelas QUARTOS e ESTADOS respectivamente.
E, como estes valores são INTEIROS, vc *não* devia estar passando entre ASPAS-simples no seu INSERT!
T+
E, como estes valores são INTEIROS, vc *não* devia estar passando entre ASPAS-simples no seu INSERT!
T+
GOSTEI 0
Douglasf
27/12/2003
Que eu saiba os valores que devem ser passados para o [color=darkblue:7ba863d5a1][size=12:7ba863d5a1][size=18][b:7ba863d5a1]ADD [/b:7ba863d5a1][/size:7ba863d5a1][/size][/color:7ba863d5a1] tem q ser string por isso q ponho as ASPAS.
Ou estou errado?
Ou estou errado?
GOSTEI 0
Douglasf
27/12/2003
Add(´insert into Hospede(COD_HOSP, NOM_HOSP, TEL_HOSP, CEL_HOSP, BAI_HOSP, IDE_HOSP, CPF_HOSP, FOT_HOSP, FOT_IDE_FRE_HOSP, FOT_IDE_VER_HOSP, COD_ESTA, COD_QUAR, HOR_DAT_ENT_HOSP)´); Add(´values (GEN_ID (GEN_COD_HOSP,1),´´´ + txtNome.Text + ´´´,´´´ + txtTelefone.Text + ´´´,´´´ + txtCelular.Text + ´´´,´´´ + txtBairro.Text + ´´´,´´´ + txtIdentidade.Text + ´´´,´´´ + txtCPF.Text + ´´´,´´foto´´,´´foto´´,´´foto´´,´ + ´2´ + ´,´ + txtCodQuar.Text + ´,´ + DataHora + ´)´);
Alterei algumas coisinhas onde vc me falou e tirei algumas aspas q estavam dando problema perto da variavel DataHora, só q esta acontecendo outro erro q é este:
Dynamic SQL ERROR
SQL error code = -104
Token unknownm -line2, char 117
18[-104;335544569]
GOSTEI 0
Afarias
27/12/2003
As datas, horas e datas/hora são passadas como char/varchar... com as aspas.
T+
T+
GOSTEI 0
Nish
27/12/2003
Para que serve a transacao? Como faço para utiliza-la?
GOSTEI 0
Afarias
27/12/2003
Uma transação define um conjunto de operações (inserts/updates/deletes) que poderam ser descartadas ou confiramadas como um bloco (tudo ou nada)!
Devido a arquitetura do IB, toda ação no IB ocorre no contexto de uma transação (a exceção dos generators) -- mesmo a seleção de dados (selects).
Sendo assim, sempre q se comunica com o IB, vc terá necessáriamente q ter uma transação iniciada.
Como utilizá-las, depende do contexto -- depende do conjundo de componentes q vc utiliza para programar suas aplicações por exemplo.
T+
Devido a arquitetura do IB, toda ação no IB ocorre no contexto de uma transação (a exceção dos generators) -- mesmo a seleção de dados (selects).
Sendo assim, sempre q se comunica com o IB, vc terá necessáriamente q ter uma transação iniciada.
Como utilizá-las, depende do contexto -- depende do conjundo de componentes q vc utiliza para programar suas aplicações por exemplo.
T+
GOSTEI 0