Ir para conteúdo

POWERED BY:

Arquivado

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

Renanbg

[Resolvido] Select em 2 tables

Recommended Posts

Boa tarde

 

Atualmente tenho o codigo abaixo para verificar se um numero ja existe no banco

 

if (frmdm.tbduplicatas.State in[dsInsert]) then begin
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('select Num_doc from tbduplicatas');
Query1.SQL.Add('where Num_doc =:paramItem');
Query1.Params[0].AsString;
Query1.ParamByName('paramItem').AsString := frmdm.tbduplicatasNum_doc.AsString;
Query1.Open;
if Query1.RecordCount <> 0 then begin
Mensagem := 'A duplicata de Nº '+ frmdm.tbduplicatasNum_doc.AsString + ' já encontra-se cadastrada,'+#13+'por favor verifique os dados e tente novamente !';
Application.MessageBox(PCHAR(Mensagem), 'Duplicatas', MB_ICONERROR + MB_OK);
dbedit4.SetFocus;
end;
end;

Como podem ver é verificado se o campo num_doc ja existe na tabela tbduplicatas

 

Preciso que ele verifique tbm na tbvencidas

 

qual seria a maneira mais correta de montar o codigo?

 

pensei em fazer ele 2 vezes..1 para cada tabela...é o mais correto?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pode fazer um UNION, ficando assim tudo no mesmo SQL, algo como:

 

if (frmdm.tbduplicatas.State = dsInsert) then
	begin
	Query1.Close;
	Query1.SQL.Clear;
	Query1.SQL.Add('select tbduplicatas.Num_doc');
	Query1.SQL.Add('from tbduplicatas');
	Query1.SQL.Add('where tbduplicatas.Num_doc = ' + frmdm.tbduplicatasNum_doc.AsString);
	Query1.SQL.Add('union');
	Query1.SQL.Add('select tbvencidas.Num_doc');
	Query1.SQL.Add('from tbvencidas');
	Query1.SQL.Add('where tbvencidas.Num_doc = ' + frmdm.tbduplicatasNum_doc.AsString);
	Query1.Open;
	if (not Query1.IsEmpty) then
		begin
		Application.MessageBox(PCHAR('A duplicata de Nº '+ frmdm.tbduplicatasNum_doc.AsString + ' já encontra-se cadastrada,'+#13+'por favor verifique os dados e tente novamente !'), 'Duplicatas', MB_ICONERROR + MB_OK);
		dbedit4.SetFocus;
		end;
	end;

Alterei um pouco seu fonte :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

hum..n conhecia esse codigo marcio...

 

mas da erro de type mismatch in expression se digito um numero q ja existe

 

e se n digito nada ou digito por exemplo 8H da erro de invalid use of keyword

Compartilhar este post


Link para o post
Compartilhar em outros sites

Num_doc é do tipo String, pq esse campo pode ser numeros e letras ao mesmo tempo

 

outro detalhe é q esse campo pode ser deixado em banco em alguns casos e ser preenchido posteriormente

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tente assim então:

 

if (frmdm.tbduplicatas.State = dsInsert) then
	begin
	Query1.Close;
	Query1.SQL.Clear;
	Query1.SQL.Add('select tbduplicatas.Num_doc');
	Query1.SQL.Add('from tbduplicatas');
	Query1.SQL.Add('where tbduplicatas.Num_doc = ''' + frmdm.tbduplicatasNum_doc.AsString + '''');
	Query1.SQL.Add('union');
	Query1.SQL.Add('select tbvencidas.Num_doc');
	Query1.SQL.Add('from tbvencidas');
	Query1.SQL.Add('where tbvencidas.Num_doc = ''' + frmdm.tbduplicatasNum_doc.AsString + '''');
	Query1.Open;
	if (not Query1.IsEmpty) then
		begin
		Application.MessageBox(PCHAR('A duplicata de Nº '+ frmdm.tbduplicatasNum_doc.AsString + ' já encontra-se cadastrada,'+#13+'por favor verifique os dados e tente novamente !'), 'Duplicatas', MB_ICONERROR + MB_OK);
		dbedit4.SetFocus;
		end;
	end;

Compartilhar este post


Link para o post
Compartilhar em outros sites

marcio http://forum.imasters.com.br/public/style_emoticons/default/clap.gif

 

Td certo, muito obrigado

 

sem querer abusar de sua paciencia, agora para ficar td ok falta só o relatorio que eu tbm devo pesquisar nas 2 tabelas

 

atualmente esta assim

BitBtn2.Enabled:=false;
  BitBtn2.Caption:='Aguarde...';
  Inicio := DateToStr(DateTimePicker1.Date);
  Final := DateToStr(DateTimePicker2.Date);
  Application.CreateForm(Tfrmrelduplicatas, frmrelduplicatas);
  frmrelduplicatas.Query1.Close;
  frmrelduplicatas.Query1.SQL.Clear;
  frmrelduplicatas.Query1.SQL.Text := 'SELECT * FROM tbduplicatas WHERE Data_doc >=:pInicial and Data_doc<=:pFinal and Status="RECEBIDO"';
  frmrelduplicatas.Query1.ParamByName('pInicial').AsDateTime := StrToDate(Inicio);
  frmrelduplicatas.Query1.ParamByName('pFinal').AsDateTime := StrToDate(Final);
  frmrelduplicatas.Query1.Prepare;
  frmrelduplicatas.Query1.Open;
  if (frmrelduplicatas.query1.RecordCount = 0) then
	begin
	Mensagem := 'Não existem dados para o critério selecionado!';
	Application.MessageBox(PCHAR(Mensagem), 'Duplicatas', MB_ICONINFORMATION + MB_OK);
	close;
	exit;
	end;
  frmrelduplicatas.QRLabelini.caption:= DatetoStr(DateTimePicker1.Date);
  frmrelduplicatas.QRLabelfim.caption:= DatetoStr(DateTimePicker2.Date);
  frmrelduplicatas.QRLabeltipo.caption:= 'Período de';
  frmrelduplicatas.QRLabelcedente.caption:= ComboBox1.Text;
  frmrelduplicatas.quickrep1.preview;
  close;

alterei a linha do select para

 

 

frmrelduplicatas.Query1.SQL.Text := 'SELECT * FROM tbduplicatas, tbvencidas WHERE Data_doc >=:pInicial and Data_doc<=:pFinal and Status="RECEBIDO"';

Ele me traz m total de 8 registros porem os dados são todos iguais no relatorio..ou seja cedente, num_doc, valor...td igual.

 

pq será?

 

uso quickreport

Compartilhar este post


Link para o post
Compartilhar em outros sites

marcio http://forum.imasters.com.br/public/style_emoticons/default/clap.gif

 

Td certo, muito obrigado

 

sem querer abusar de sua paciencia, agora para ficar td ok falta só o relatorio que eu tbm devo pesquisar nas 2 tabelas

 

atualmente esta assim

BitBtn2.Enabled:=false;
  BitBtn2.Caption:='Aguarde...';
  Inicio := DateToStr(DateTimePicker1.Date);
  Final := DateToStr(DateTimePicker2.Date);
  Application.CreateForm(Tfrmrelduplicatas, frmrelduplicatas);
  frmrelduplicatas.Query1.Close;
  frmrelduplicatas.Query1.SQL.Clear;
  frmrelduplicatas.Query1.SQL.Text := 'SELECT * FROM tbduplicatas WHERE Data_doc >=:pInicial and Data_doc<=:pFinal and Status="RECEBIDO"';
  frmrelduplicatas.Query1.ParamByName('pInicial').AsDateTime := StrToDate(Inicio);
  frmrelduplicatas.Query1.ParamByName('pFinal').AsDateTime := StrToDate(Final);
  frmrelduplicatas.Query1.Prepare;
  frmrelduplicatas.Query1.Open;
  if (frmrelduplicatas.query1.RecordCount = 0) then
	begin
	Mensagem := 'Não existem dados para o critério selecionado!';
	Application.MessageBox(PCHAR(Mensagem), 'Duplicatas', MB_ICONINFORMATION + MB_OK);
	close;
	exit;
	end;
  frmrelduplicatas.QRLabelini.caption:= DatetoStr(DateTimePicker1.Date);
  frmrelduplicatas.QRLabelfim.caption:= DatetoStr(DateTimePicker2.Date);
  frmrelduplicatas.QRLabeltipo.caption:= 'Período de';
  frmrelduplicatas.QRLabelcedente.caption:= ComboBox1.Text;
  frmrelduplicatas.quickrep1.preview;
  close;

alterei a linha do select para

 

 

frmrelduplicatas.Query1.SQL.Text := 'SELECT * FROM tbduplicatas, tbvencidas WHERE Data_doc >=:pInicial and Data_doc<=:pFinal and Status="RECEBIDO"';

Ele me traz m total de 8 registros porem os dados são todos iguais no relatorio..ou seja cedente, num_doc, valor...td igual.

 

pq será?

 

uso quickreport

 

Abre um novo tópico sobre esta dúvida do relatório, para não misturar com a questão anterior...

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.