Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

bdexterholland

Problemas com tipos de dados em ADOquery...

Recommended Posts

unit untemprestimo;interfaceuses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, StdCtrls, ComCtrls, ExtCtrls, Buttons, DBCtrls, DB, ADODB;type  Tfrmemprestimo = class(TForm)	Image1: TImage;	Image2: TImage;	Label1: TLabel;	DateTimePicker1: TDateTimePicker;	Label2: TLabel;	Label3: TLabel;	ComboBox1: TComboBox;	Label4: TLabel;	Label5: TLabel;	btnfechar: TBitBtn;	btnconfirmar: TBitBtn;	btnlimpar: TBitBtn;	CBmidia: TDBLookupComboBox;	CBlocatario: TDBLookupComboBox;	QRYbuscamidia: TADOQuery;	QRYempresta: TADOQuery;	QRYbuscalocatario: TADOQuery;	DataSource1: TDataSource;	DataSource2: TDataSource;	procedure ComboBox1Change(Sender: TObject);	procedure btnfecharClick(Sender: TObject);	procedure btnlimparClick(Sender: TObject);	procedure btnconfirmarClick(Sender: TObject);	procedure FormShow(Sender: TObject);  private	{ Private declarations }  public	{ Public declarations }  end;var  frmemprestimo: Tfrmemprestimo;implementationuses dm;{$R *.dfm}procedure Tfrmemprestimo.ComboBox1Change(Sender: TObject);begin  QRYbuscamidia.Close;  QRYbuscalocatario.close;  case combobox1.ItemIndex of	0:label1.caption:='Nome do CD';	1:label1.caption:='Nome do DVD';	2:label1.caption:='Nome do LIVRO';  end;  label1.Enabled:=true;  label2.Enabled:=true;  label3.Enabled:=true;  CBmidia.Enabled:=true;  CBlocatario.Enabled:=true;  DateTimePicker1.Enabled:=true;  DateTimePicker1.DateTime:=Now;  QRYbuscamidia.Open;  QRYbuscalocatario.Open;  btnconfirmar.Enabled:=true;end;procedure Tfrmemprestimo.btnfecharClick(Sender: TObject);begin  close;end;procedure Tfrmemprestimo.btnlimparClick(Sender: TObject);begin  ComboBox1.ItemIndex:=-1;  ComboBox1.Text:='Selecione...';  Label1.Enabled:=false;  CBmidia.Enabled:=false;  Label2.Enabled:=false;  CBlocatario.Enabled:=false;  Label3.Enabled:=false;  DateTimePicker1.Enabled:=false;  DateTimePicker1.DateTime:=now;  btnconfirmar.Enabled:=false;end;procedure Tfrmemprestimo.btnconfirmarClick(Sender: TObject);begin  QRYempresta.Close;  QRYempresta.Parameters.ParamByName('plocatario').Value:=CBlocatario.KeyValue;  QRYempresta.Parameters.ParamByName('pdata').Value:=DateTimePicker1.Date;  QRYempresta.Parameters.ParamByName('Pcodigo').Value:=int(CBmidia.KeyValue);  QRYempresta.Parameters.ParamByName('Ptitulo').Value:=CBmidia.Text;  QRYempresta.ExecSQL;  btnlimpar.Click;  dm.DataModule1.QRYmidia.Open;end;procedure Tfrmemprestimo.FormShow(Sender: TObject);begin  btnlimpar.Click;end;end.

SQL usada na query:

 

UPDATE MidiaSET Midia.emprestado=true,		Midia.locatario=:plocatario,		Midia.data=:pdata,		Midia.titulo=:ptituloWHERE Midia.Codigo=:pcodigo
Minha tabela (em access)

 

codigo:numeração automáticatitulo:textoartista: textogenero:textoeditora:textopaginas:numerotipo:numeroavaliacao:textoemprestado:sim/naodata:data/horalocatario:numero		{esse campo guarda o código da pessoa cadastrada na tabela de locatários
Quando vou executar o Tfrmemprestimo.btnconfirmarClick, o delphi alega que os tipos de dados são incompatíveis...

 

 

...Alguém sabe me dizer porque?

 

 

Ah! quando eu clico no OK da mensagem, cai na linha do execSQL...

 

 

Isso ocorre no form:

 

Imagem Postada

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esse foi um chute?Bom, agora ele tá falando que o campo Midia.titulo não pode receber valor nulo porque está marcado como requiredMidia é o nome da tabela que eu mostrei e realmente marquei como requerido, mas, de onde ele está tirando que esse campo tá nulo?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Realmente configurei masesse 'QRYempresta.Parameters.ParamByName('Ptitulo').Value:=CBmidia.Text;' dentro do onclick deveria resolver. ou estou enganado?Lembrando que estou começando a mexer com banco de dados^^

Compartilhar este post


Link para o post
Compartilhar em outros sites

aquele Dbmidia tem sim (ao menos deveria ter), naquele formulário, você escolhe o nome do CD que você quer emprestar, esse campo é do tipo TDBLookupComboBox. nos testes, eu escolho o nome do CD para poder fazer o empréstimo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom... você pode acessar o valor diretamente da tabela vinculada com o DBLookUpComboBox, pois no momento que você seleciona o item, ele automaticamente fica parado no registro selecionado na tabela, poderia fazer algo do tipo:

 

 

QRYempresta.Parameters.ParamByName('Ptitulo').Value:=tblMidiaNOME_MIDIA.Value;

Compartilhar este post


Link para o post
Compartilhar em outros sites

(karaka, tá parecendo MSN rsrsrsrrs)Mas tipo, eu declaro direto Midia.value ou uso DBLookUpComboBox.(alguma coisa que não sei oque)?O campo datafield está em branco no componente CBmidiaEu não usei nenhum Table e usei um ADOdatasetKaraka, vou acabar desisitindo desse projeto...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Faz o seguinte então, roda passo-a-passo o seu projeto e veja se ele passa alguma coisa na linha do Ptitulo... somente para vermos se esta funcionando o seu DBLookUpComboBox, se quiser testar o SQL mesmo, altera e coloca qualquer texto para validar, tipo:

 

QRYempresta.Parameters.ParamByName('Ptitulo').Value:='TESTE';

Compartilhar este post


Link para o post
Compartilhar em outros sites

Kara, tá passando...

 

fiz um showmessage(qRYempresta.Parameters.ParamByName('Ptitulo').Value);

 

e ele mostrou direitinho o TESTE (adicionei a linha que você mostrou de exemplo)

aqui tem link do banco de dados que eu estou usando.

 

Se você ainda estiver com paciência, por favor, faça download e me ilumine... http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Faça da seguinte forma:

 

QRYempresta.Close;QRYempresta.Parameters.ParamByName('plocatario').Value:=QRYbuscalocatario.FieldByName('Codigo').Value;QRYempresta.Parameters.ParamByName('pdata').Value:=StrToDate(DateToStr(DateTimePicker1.Date));QRYempresta.Parameters.ParamByName('Pcodigo').Value:=QRYbuscamidia.FieldByName('Codigo').Value;QRYempresta.Parameters.ParamByName('Ptitulo').Value:=QRYbuscamidia.FieldByName('Titulo').Value;QRYempresta.ExecSQL;btnlimpar.Click;dm.DataModule1.ADODataSet1.Close;dm.DataModule1.ADODataSet1.Open;
você estava passa a linha dm.DataModule1.QRYmidia.Open; errado, dentro desta qry tem um Insert, por isto do erro, onde que o certo seria:

 

dm.DataModule1.ADODataSet1.Close;dm.DataModule1.ADODataSet1.Open;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Agora só posso testar a tarde......mostrei o caso para um amigo meu e ele alterou o select do ADOconnection dentro do datamodule e parou de mostrar os empréstimos duplicados mas ainda é estranho essa solução (na minha opinião) e vou testar a sua alternativa....VLW ;]

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok, não sei o que se referiu como estranho, mas programo usando desta forma e sempre funciona... Mas dê uma olhada e veja se funciona para você, aqui deu certinho... http://forum.imasters.com.br/public/style_emoticons/default/joia.gif http://forum.imasters.com.br/public/style_emoticons/default/joia.gif

 

Se você quisesse poderia fazer o cadastro diretamente sobre a tabela, sem precisa fazer este esquema de insert... mas beleza... vamos ver se agora funcionará... http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Que isso, o "estranho" não era para a sua solução... ;]O estranho é pro select que o meu amigo me passou, no ADOconncetion tem a linha {where emprestado=true}, ele adicionou uma outra condição que não estou me lembrando e o dbgrid parou de mostrar os empréstimos errados

Compartilhar este post


Link para o post
Compartilhar em outros sites

O que você me passou resolvou o problema que eu havia citado, mas agora tenho outro problema:

 

Essa qryemprestimo faz empréstimo de uma mídia para todas as pessoas cadastradas no banco de dados

 

No adodataset, meu amigo recomendou fazer um

SELECT Midia.Codigo, Midia.Titulo,  Locatario.Nome, Midia.DataFROM Midia,LocatarioWHERE Midia.Emprestado=true and Midia.Locatario=locatario.codigoORDER BY Midia.Data
para resolver o problema (esse que era o estranho que eu tava falando). Acho que isso só tá tampando o sol com a peneira. Tem uma sugestão para isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.