Erro no código abaixo.
Estou com um problema no código abaixo ... sempre que coloco um novo aluguel mesmo já tendo outro registro igual ele da a mensagem, mas salva igual e quando não tem outro registro igual ele faz a mesma coisa.
Se algue puder me ajudar.
procedure TFmAluguel.salvarClick(Sender: TObject);
begin
If (modcadastro.tbAluguel.FieldByName(´Data_Alu´).AsString = DBEdit4.text) and (modcadastro.TbAluguel.FieldByName(´Alu_rou_cod´).AsString = DBEdit3.text) then
begin
ShowMessage(´Esta peça já está locada ou agendada para locação nessa data por: ´ + modcadastro.TbClientes.FieldByName(´Cli_nom´).AsString)
end;
modcadastro.TbAluguel.post;
salvar.Enabled :=false;
end;
Se algue puder me ajudar.
procedure TFmAluguel.salvarClick(Sender: TObject);
begin
If (modcadastro.tbAluguel.FieldByName(´Data_Alu´).AsString = DBEdit4.text) and (modcadastro.TbAluguel.FieldByName(´Alu_rou_cod´).AsString = DBEdit3.text) then
begin
ShowMessage(´Esta peça já está locada ou agendada para locação nessa data por: ´ + modcadastro.TbClientes.FieldByName(´Cli_nom´).AsString)
end;
modcadastro.TbAluguel.post;
salvar.Enabled :=false;
end;
Mano_froids
Curtidas 0
Respostas
Alexandrej
06/11/2007
Estou com um problema no código abaixo ... sempre que coloco um novo aluguel mesmo já tendo outro registro igual ele da a mensagem, mas salva igual e quando não tem outro registro igual ele faz a mesma coisa.
Se algue puder me ajudar.
procedure TFmAluguel.salvarClick(Sender: TObject);
begin
If (modcadastro.tbAluguel.FieldByName(´Data_Alu´).AsString = DBEdit4.text) and (modcadastro.TbAluguel.FieldByName(´Alu_rou_cod´).AsString = DBEdit3.text) then
begin
ShowMessage(´Esta peça já está locada ou agendada para locação nessa data por: ´ + modcadastro.TbClientes.FieldByName(´Cli_nom´).AsString)
end;
modcadastro.TbAluguel.post;
salvar.Enabled :=false;
end;
Coloque um Exit após o ShowMessage.
GOSTEI 0
Mano_froids
06/11/2007
Tentei colocar o EXIT, mas ainda não funcionou.
Se tiver mais algum dica mande.
Se tiver mais algum dica mande.
GOSTEI 0
Microbios
06/11/2007
Tenta modificar seu código como está destacado em negrito
procedure TFmAluguel.salvarClick(Sender: TObject);
begin
If (modcadastro.tbAluguel.FieldByName(´Data_Alu´).AsString = DBEdit4.text) and (modcadastro.TbAluguel.FieldByName(´Alu_rou_cod´).AsString = DBEdit3.text) then
begin
ShowMessage(´Esta peça já está locada ou agendada para locação nessa data por: ´ + modcadastro.TbClientes.FieldByName(´Cli_nom´).AsString)
[b:a87b130396]Exit;
end
else
begin
modcadastro.TbAluguel.post;
salvar.Enabled :=false;
end;
end;[/b:a87b130396]
procedure TFmAluguel.salvarClick(Sender: TObject);
begin
If (modcadastro.tbAluguel.FieldByName(´Data_Alu´).AsString = DBEdit4.text) and (modcadastro.TbAluguel.FieldByName(´Alu_rou_cod´).AsString = DBEdit3.text) then
begin
ShowMessage(´Esta peça já está locada ou agendada para locação nessa data por: ´ + modcadastro.TbClientes.FieldByName(´Cli_nom´).AsString)
[b:a87b130396]Exit;
end
else
begin
modcadastro.TbAluguel.post;
salvar.Enabled :=false;
end;
end;[/b:a87b130396]
GOSTEI 0
Microbios
06/11/2007
Ops :oops: Acho que tem um ´END´ a mais no final do código, por favor desconsidere-o! :D
GOSTEI 0
Felipeucc
06/11/2007
procedure TFmAluguel.salvarClick(Sender: TObject);
begin
If (modcadastro.tbAluguel.FieldByName(´Data_Alu´).AsString = DBEdit4.text) and (modcadastro.TbAluguel.FieldByName(´Alu_rou_cod´).AsString = DBEdit3.text) then
begin
ShowMessage(´Esta peça já está locada ou agendada para locação nessa data por: ´ + modcadastro.TbClientes.FieldByName(´Cli_nom´).AsString)
end[b:92d3cc3952] // Você só quer gravar(post) se não atender a condição do if
else
begin
modcadastro.TbAluguel.post;
salvar.Enabled :=false;
end;[/b:92d3cc3952]
end;
begin
If (modcadastro.tbAluguel.FieldByName(´Data_Alu´).AsString = DBEdit4.text) and (modcadastro.TbAluguel.FieldByName(´Alu_rou_cod´).AsString = DBEdit3.text) then
begin
ShowMessage(´Esta peça já está locada ou agendada para locação nessa data por: ´ + modcadastro.TbClientes.FieldByName(´Cli_nom´).AsString)
end[b:92d3cc3952] // Você só quer gravar(post) se não atender a condição do if
else
begin
modcadastro.TbAluguel.post;
salvar.Enabled :=false;
end;[/b:92d3cc3952]
end;
GOSTEI 0
Mano_froids
06/11/2007
procedure TFmAluguel.salvarClick(Sender: TObject);
begin
If (modcadastro.tbAluguel.FieldByName(´Data_Alu´).AsString = DBEdit4.text) and (modcadastro.TbAluguel.FieldByName(´Alu_rou_cod´).AsString = DBEdit3.text) then
begin
ShowMessage(´Esta peça já está locada ou agendada para locação nessa data por: ´ + modcadastro.TbClientes.FieldByName(´Cli_nom´).AsString)
end[b:c88799ebf2] // Você só quer gravar(post) se não atender a condição do if
else
begin
modcadastro.TbAluguel.post;
salvar.Enabled :=false;
end;[/b:c88799ebf2]
end;
MUITO OBRIGADO PELA AJUDA, o problema deve ser em outra coisa e não nesse código, pois cloloquei os dois códigos que me falaram e tentei fzer algumas modificações neles e da a mensagem, mas quando dou OK na mesma o registro e salvo no banco de dados igual.
GOSTEI 0
Microbios
06/11/2007
Cara, deixa eu dar um palpite meio sem pensar muito!
Não é por que você tá comparando o DBEDIT (ligado ao campo da tabela) com o VALOR DA TABELA não? Sendo assim a sua entrada (a digitação antes de fazer a comparação...) seria igual ao valor do BANCO DE DADOS...
modcadastro.tbAluguel.FieldByName(´Data_Alu´).AsString = DBEdit4.text
Sei lá... Eu posso estar erradíssimo e se tiver desculpas mil!
Outra coisa, meu primeiro exemplo tinha um ´EXIT´ após a mensagem que foi retirado no exemplo do colega que postou em seguida. Não sei também mas acho que esse existe deveria existir de qualquer forma.
Mais uma vez, se eu estiver errado, desculpas!
Abraços
Não é por que você tá comparando o DBEDIT (ligado ao campo da tabela) com o VALOR DA TABELA não? Sendo assim a sua entrada (a digitação antes de fazer a comparação...) seria igual ao valor do BANCO DE DADOS...
modcadastro.tbAluguel.FieldByName(´Data_Alu´).AsString = DBEdit4.text
Sei lá... Eu posso estar erradíssimo e se tiver desculpas mil!
Outra coisa, meu primeiro exemplo tinha um ´EXIT´ após a mensagem que foi retirado no exemplo do colega que postou em seguida. Não sei também mas acho que esse existe deveria existir de qualquer forma.
Mais uma vez, se eu estiver errado, desculpas!
Abraços
GOSTEI 0
Martins
06/11/2007
Só metendo um pouco minha colher, eu usaria LOCATE e faria os tratamentos, usaria tb Abort.
GOSTEI 0
Mano_froids
06/11/2007
Cara, deixa eu dar um palpite meio sem pensar muito!
Não é por que você tá comparando o DBEDIT (ligado ao campo da tabela) com o VALOR DA TABELA não? Sendo assim a sua entrada (a digitação antes de fazer a comparação...) seria igual ao valor do BANCO DE DADOS...
modcadastro.tbAluguel.FieldByName(´Data_Alu´).AsString = DBEdit4.text
Sei lá... Eu posso estar erradíssimo e se tiver desculpas mil!
Outra coisa, meu primeiro exemplo tinha um ´EXIT´ após a mensagem que foi retirado no exemplo do colega que postou em seguida. Não sei também mas acho que esse existe deveria existir de qualquer forma.
Mais uma vez, se eu estiver errado, desculpas!
Abraços
Não precisa pedir descilpas nem se estiver erradíssimo, mas a sua colocação tem muita lógica, pois quando aparece a mensagem do código está o nome do cliente que estou incluindo e não o que já está na tabela.
Estou tentando fazer uma rotina de aluguel, só que o produto pode ser alugado mais de uma vez só que em datas diferentes, então quero consultar o banco de dados dos produtos alugados e saber se ele já está alugado e se está em que data se for a mesma o aluguel não pode ser feito.
Se alguem puder me ajudar eu agradeço muito.
GOSTEI 0
Microbios
06/11/2007
O colega Martins meteu bem a colher !!!! :P :P
Pelo que eu entendi, só vai incluir se não achar, né? Assim, como está, usando o locate, a rotina vai te retornar se achou no banco de dados. Mas me ocorre uma lembrança do tempo que eu comecei a dar meus primeiros passos em Delphi... eu tentava localizar algo no banco de dados e usava controles data-aware (Dbedits e afins) o que, no meu humilde entendimento não dá certo. Já que o ponteiro do banco de dados se move, e se movendo, conseqüentemente dá um post no que foi inserido pelos data-awares. Assim, ou usa-se controles não data-awares ou utiliza-se uma query para essa pesquisa. Me corrija se eu estiver errado mais uma vez em não ´enteder´ a sua necessidade, ok? :D
P.S: Esse código dará certo, claro, se você não estiver usando a mesma tabela, ou seja, se estiver incluindo de uma e pesquisando na outra.
procedure TFmAluguel.salvarClick(Sender: TObject); begin If not(ModCadastro.Locate(´Data_alu´,dbEdit4.text,[])) and not(ModCadastro.Locate(´Alu_rou_cod´,dbeEdit3.text,[])) then begin //Se não Achou, Vai Incluir modcadastro.TbAluguel.post; salvar.Enabled := false; end else begin // Se Achou, vai te dar a mensagem! ShowMessage(´Esta peça já está locada ou agendada para locação nessa data por: ´ + modcadastro.TbClientes.FieldByName(´Cli_nom´).AsString) Exit; end;
Pelo que eu entendi, só vai incluir se não achar, né? Assim, como está, usando o locate, a rotina vai te retornar se achou no banco de dados. Mas me ocorre uma lembrança do tempo que eu comecei a dar meus primeiros passos em Delphi... eu tentava localizar algo no banco de dados e usava controles data-aware (Dbedits e afins) o que, no meu humilde entendimento não dá certo. Já que o ponteiro do banco de dados se move, e se movendo, conseqüentemente dá um post no que foi inserido pelos data-awares. Assim, ou usa-se controles não data-awares ou utiliza-se uma query para essa pesquisa. Me corrija se eu estiver errado mais uma vez em não ´enteder´ a sua necessidade, ok? :D
P.S: Esse código dará certo, claro, se você não estiver usando a mesma tabela, ou seja, se estiver incluindo de uma e pesquisando na outra.
GOSTEI 0
Microbios
06/11/2007
O colega Martins meteu bem a colher !!!! :P :P
Pelo que eu entendi, só vai incluir se não achar, né? Assim, como está, usando o locate, a rotina vai te retornar se achou no banco de dados. Mas me ocorre uma lembrança do tempo que eu comecei a dar meus primeiros passos em Delphi... eu tentava localizar algo no banco de dados e usava controles data-aware (Dbedits e afins) o que, no meu humilde entendimento não dá certo. Já que o ponteiro do banco de dados se move, e se movendo, conseqüentemente dá um post no que foi inserido pelos data-awares. Assim, ou usa-se controles não data-awares ou utiliza-se uma query para essa pesquisa. Me corrija se eu estiver errado mais uma vez em não ´enteder´ a sua necessidade, ok? :D
P.S: Esse código dará certo, claro, se você não estiver usando a mesma tabela, ou seja, se estiver incluindo de uma e pesquisando na outra.
procedure TFmAluguel.salvarClick(Sender: TObject); begin If not(ModCadastro.TbAluguel.Locate(´Data_alu´,dbEdit4.text,[])) and not(ModCadastro.TbAluguel.Locate(´Alu_rou_cod´,dbeEdit3.text,[])) then begin //Se não Achou, Vai Incluir modcadastro.TbAluguel.post; salvar.Enabled := false; end else begin // Se Achou, vai te dar a mensagem! ShowMessage(´Esta peça já está locada ou agendada para locação nessa data por: ´ + modcadastro.TbClientes.FieldByName(´Cli_nom´).AsString) Exit; end;
Pelo que eu entendi, só vai incluir se não achar, né? Assim, como está, usando o locate, a rotina vai te retornar se achou no banco de dados. Mas me ocorre uma lembrança do tempo que eu comecei a dar meus primeiros passos em Delphi... eu tentava localizar algo no banco de dados e usava controles data-aware (Dbedits e afins) o que, no meu humilde entendimento não dá certo. Já que o ponteiro do banco de dados se move, e se movendo, conseqüentemente dá um post no que foi inserido pelos data-awares. Assim, ou usa-se controles não data-awares ou utiliza-se uma query para essa pesquisa. Me corrija se eu estiver errado mais uma vez em não ´enteder´ a sua necessidade, ok? :D
P.S: Esse código dará certo, claro, se você não estiver usando a mesma tabela, ou seja, se estiver incluindo de uma e pesquisando na outra.
GOSTEI 0
Microbios
06/11/2007
Cara... cometi um erro no código: esqueci de citar o nome da tabela onde o locate vai atuar. Desconsidere o primeiro e observe o segundo, tá?
GENTE! CADÊ O BOTÂO PRA EXCLUIR UM POST QUE SE COLOCA E VÊ QUE COMETEU ERROS? :oops: :P
GENTE! CADÊ O BOTÂO PRA EXCLUIR UM POST QUE SE COLOCA E VÊ QUE COMETEU ERROS? :oops: :P
GOSTEI 0
Mano_froids
06/11/2007
O colega Martins meteu bem a colher !!!! :P :P
Pelo que eu entendi, só vai incluir se não achar, né? Assim, como está, usando o locate, a rotina vai te retornar se achou no banco de dados. Mas me ocorre uma lembrança do tempo que eu comecei a dar meus primeiros passos em Delphi... eu tentava localizar algo no banco de dados e usava controles data-aware (Dbedits e afins) o que, no meu humilde entendimento não dá certo. Já que o ponteiro do banco de dados se move, e se movendo, conseqüentemente dá um post no que foi inserido pelos data-awares. Assim, ou usa-se controles não data-awares ou utiliza-se uma query para essa pesquisa. Me corrija se eu estiver errado mais uma vez em não ´enteder´ a sua necessidade, ok? :D
P.S: Esse código dará certo, claro, se você não estiver usando a mesma tabela, ou seja, se estiver incluindo de uma e pesquisando na outra.
procedure TFmAluguel.salvarClick(Sender: TObject); begin If not(ModCadastro.TbAluguel.Locate(´Data_alu´,dbEdit4.text,[])) and not(ModCadastro.TbAluguel.Locate(´Alu_rou_cod´,dbeEdit3.text,[])) then begin //Se não Achou, Vai Incluir modcadastro.TbAluguel.post; salvar.Enabled := false; end else begin // Se Achou, vai te dar a mensagem! ShowMessage(´Esta peça já está locada ou agendada para locação nessa data por: ´ + modcadastro.TbClientes.FieldByName(´Cli_nom´).AsString) Exit; end;
MUITO OBRIGADO PELA AJUDA.
Funcionou me parte ... quando tento incluir o registro com os mesmo dados de um já existente aparece a mensagem e o já existente aparece na tela... só que tem um problema o registro que estou tentando incluir aparece no bd mesmo sendo igual ao outro.
Estou colocando o código inteiro para ver se tem algum erro, pois o código que mandaram acho que está funcionando bem, meu código e pequeno e bem simples.
procedure TFmAluguel.Button1Click(Sender: TObject);
begin
modcadastro.TbAluguel.append;
salvar.Enabled :=true;
DBLookupComboBox1.setfocus; end;
procedure TFmAluguel.Button2Click(Sender: TObject);
begin
modcadastro.TbAluguel.delete;
end;
procedure TFmAluguel.Button3Click(Sender: TObject);
begin
modcadastro.TbAluguel.edit;
salvar.Enabled :=true;
DBLookupComboBox1.SetFocus
end;
procedure TFmAluguel.Button4Click(Sender: TObject);
begin
fmaluguel.close;
formabertura.show;
end;
procedure TFmAluguel.salvarClick(Sender: TObject);
begin
If not(ModCadastro.TbAluguel.Locate(´Data_alu´,dbEdit4.text,[])) and not(ModCadastro.TbAluguel.Locate(´Alu_rou_cod´,dbEdit3.text,[])) then
begin
//Se não Achou, Vai Incluir
modcadastro.TbAluguel.post;
salvar.Enabled := false;
end
else
begin
// Se Achou, vai te dar a mensagem!
ShowMessage(´Esta peça já está locada ou agendada para locação nessa data por: ´ + modcadastro.TbClientes.FieldByName(´Cli_nom´).AsString)
end;
end;
end.
GOSTEI 0
Martins
06/11/2007
Nos últimos dias estou sem tempo de trabalhar com Delphi, mas vou postar uma idéia q poderá ser avaliada e melhorada pela turma, assim q eu chegar em casa monto uma solução e posto aqui no fórum.
A idéia é criar um objeto em Run-Time para assumir o mesmo nome e campos de sua tabela e fazer a verificação, assim seu DataSet ficaria lá sem ser alterado.
Bons códigos.
A idéia é criar um objeto em Run-Time para assumir o mesmo nome e campos de sua tabela e fazer a verificação, assim seu DataSet ficaria lá sem ser alterado.
var
Tabela: TTable
begin
Tabela := TTable.Create(Self);
Tabela.DataBaseName := {Caminho de sua tabela}
Tabela.Name := ´Aluguel´;
Tabela.Firts;
....
end; Bons códigos.
GOSTEI 0
Microbios
06/11/2007
só que tem um problema o registro que estou tentando incluir aparece no bd mesmo sendo igual ao outro.
Não entendi! O Registro que você tá tentando incluir [b:b5aa6c9c9b]ESTÀ[/b:b5aa6c9c9b] sendo salvo no Banco de Dados independentemente de ter localizado um [b:b5aa6c9c9b]IGUAL[/b:b5aa6c9c9b]? Se for isso, é o que eu te falei... é por causa de usar os controles data-aware... movimentou,postou! Eu acho que é isso...
Mas aqui, por que não utiliza uma query auxiliar de pesquisa pra tentar fazer um teste? Caso queria conversar comigo: mbiosinformatica@hotmail.com (msn) e aí poderemos, em tempo real, resolver essa sua dúvida, ok?
GOSTEI 0
Martins
06/11/2007
Infelizmente só poderei usar o Delphi a noite quando estarei novamente em minha cidade e em casa, mas usando componentes Data-Ware vc está trabalhando diretamente no dataset, mesmo q vc não clique em post o registro vai aparecer no seu DBGrid q é um espelho do seu Dataset, então ou vc usa controles não Data-Ware ou usando controles Data-Ware vc terá q cancelar a operação ou uma outra solução é vc editar a operação, vc poderia testar esse código e nos informa depois se funcionou pq não tenho como testá-lo aqui.
[b:9cc74caf6f]Vamos criar uma função para q assim vc possa usar a vontade.[/b:9cc74caf6f]
[b:9cc74caf6f]Corpo da função[/b:9cc74caf6f]
Vc pode optar por não usar uma função, essa idéia surgiu agora, mas não é regra ok.
[b:9cc74caf6f]Salvando as informações.[/b:9cc74caf6f]
vc poderá adequar a sua realidade e depois informar os problemas para q possamos tentar ajudar.
Boa sorte e bons códigos.
[b:9cc74caf6f]Vamos criar uma função para q assim vc possa usar a vontade.[/b:9cc74caf6f]
function Localiza (Alias, Base, Campo: String; Criterio: TCustomEdit): Boolean;
[b:9cc74caf6f]Corpo da função[/b:9cc74caf6f]
function TFormulario.Localiza(Alias, Base, Campo: String; Criterio: TCustomEdit): Boolean; var Tabela: TTable; begin Tabela := TTable.Create(self); Tabela.DatabaseName := Alias; Tabela.TableName := Base; Tabela.Open; Tabela.First; if Tabela.Locate(Campo, Criterio.Text, []) then Result := True else Result := False; end;
Vc pode optar por não usar uma função, essa idéia surgiu agora, mas não é regra ok.
[b:9cc74caf6f]Salvando as informações.[/b:9cc74caf6f]
begin //Em um teste usaria as informações do Aliás DBDEMOS, tabela Customer.db //Você vai colocar as suas informações Aliás, Tabela, Campo, etc... If Localiza(´DBDEMOS´, ´Customer.db´, ´Company´, DBEdit2) then begin ShowMessage(´Foi encontrado um registro com essa Company...´); //Supondo q vc usaria um controle TTable de Nome Table1. Table1.Edit; end else Table1.Post; end;
vc poderá adequar a sua realidade e depois informar os problemas para q possamos tentar ajudar.
Boa sorte e bons códigos.
GOSTEI 0