Erro no código abaixo.

Delphi

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;


Mano_froids

Mano_froids

Curtidas 0

Respostas

Alexandrej

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

Mano_froids

06/11/2007

Tentei colocar o EXIT, mas ainda não funcionou.
Se tiver mais algum dica mande.


GOSTEI 0
Microbios

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]


GOSTEI 0
Microbios

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

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;


GOSTEI 0
Mano_froids

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

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


GOSTEI 0
Martins

Martins

06/11/2007

Só metendo um pouco minha colher, eu usaria LOCATE e faria os tratamentos, usaria tb Abort.


GOSTEI 0
Mano_froids

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

Microbios

06/11/2007

O colega Martins meteu bem a colher !!!! :P :P

 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

Microbios

06/11/2007

O colega Martins meteu bem a colher !!!! :P :P

 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

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


GOSTEI 0
Mano_froids

Mano_froids

06/11/2007

O colega Martins meteu bem a colher !!!! :P :P
 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.


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

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.

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

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

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]
  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
POSTAR