Ir para conteúdo

Arquivado

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

tiriciasf

[Resolvido] buscando uma data

Recommended Posts

Oi pessoal,Preciso da ajuda de vcs.Possuo uma cadastro de Folga dos MotoristasTbFolga_mot (cod,data_inicial,cod_mot(chave estrangeira de motorista, ...)Tb possuo um formulario de busca de folgas, onde em um radiogroup escolho o dado que desejo procurar, que esta data_inicial e motorista, digito num edit a data que desejo procurar e clico em buscar, e o resultado dos folgas com aquela data tem q aparecer num DBgrid.Consigo apenas fazer a busca qndo escolho motorista, mas a nao consigo efetuar a consulta escohendo a data.Segue abaixo como está o codigo no botao de busca.procedure TFormConsFolga.BitBtn1Click(Sender: TObject);begin case RGBUSCA.ItemIndex of 0 : begin DMBUSCA.TBFOLGA_DATA.CLOSE; DBGRIDBUSCAFOLGA.DataSource:=DMBUSCA.DSFOLGA_DATA; DMBUSCA.SQLDATASETFOLGA_DATA.ParamByName('DATA').Value:=StrToDate(EDIT1.Text); Edit1.Clear; Edit1.SetFocus; DMBUSCA.TBFOLGA_DATA.OPEN; IF DMBUSCA.TBFOLGA_DATA.IsEmpty THEN DMBUSCA.TBFOLGA_DATA.Close; end; 1 : begin DMBUSCA.TBBUSCAFOLGA_MOT.CLOSE; DBGRIDBUSCAFOLGA.DataSource:=DMBUSCA.DSBUSCAFOLGA_MOT; DMBUSCA.SQLDATASETBUSCAFOLGA_MOT.ParamByName('NOME').Value:='%' + EDIT1.Text+'%'; Edit1.Clear; Edit1.SetFocus; DMBUSCA.TBBUSCAFOLGA_MOT.OPEN; IF DMBUSCA.TBBUSCAFOLGA_MOT.IsEmpty THEN DMBUSCA.TBBUSCAFOLGA_MOT.Close; end; end;end;Preciso q o reultado apareça no DBGrid, para que um duplo click eu abra o formulario de Folga, para visualização ou alteração.Aguardo a ajuda de alguém.Grata

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pq você não usa uma query passando SQL de busca para a mesma ?

Ficaria muito mais simples e rápido...

Poderia fazer algo como:

 

procedure TFormConsFolga.BitBtn1Click(Sender: TObject);begincase RGBUSCA.ItemIndex of	0 :		begin		qry.Close;		qry.SQL.Clear;		qry.SQL.Add('comando SQL para busca por data');		qry.Open;		end;	1 :		begin		qry.Close;		qry.SQL.Clear;		qry.SQL.Add('comando SQL para busca por motorista');		qry.Open;		end;	end;end;

Compartilhar este post


Link para o post
Compartilhar em outros sites

OI, DESCUPE A MINHA IGNORANCIA :( MAS EU NAO USO O QRY, EU USO OS COMPONENTES SQLDATASET,DATASET.PROVIDER, CLIENTEDATASET, DATA SOURCE. TODOS INTERLIGADOS.GOSTARIA DE SABER COMO FICARIA O CODIGO.GRATA

Compartilhar este post


Link para o post
Compartilhar em outros sites

Consegui fazer a busca, só que tem um problema, so consigo se digitar a data conforme o banco de dados, com o mes antes do dia por ex: "01/20/07", saberia me ajudar como transformo para a data normal 20/01/07....Estou usando o Firebird 1.5

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estou usando estacase RGBUSCA.ItemIndex of 0 : begin DMBUSCA.TBBUSCAFOLGA_MOT.CLOSE; DBGRIDBUSCAFOLGA.DataSource:=DMBUSCA.DSFOLGA_DATA; DMBUSCA.SQLDATASETFOLGA_DATA.CommandText := 'select FOLGA.COD_FOLGA, NR_DIAS,DATA_INICIAL,DATA_FINAL, MOTORISTA.NOME_MOT from FOLGA iNNER JOIN MOTORISTA ON FOLGA.COD_MOTORISTA= MOTORISTA.COD_MOTORISTA WHERE DATA_INICIAL= ''' + edit1.Text + ''' ORDER BY FOLGA.COD_FOLGA,MOTORISTA.NOME_MOT'; Edit1.Clear; Edit1.SetFocus; DMBUSCA.TBFOLGA_DATA.OPEN; IF DMBUSCA.TBFOLGA_DATA.IsEmpty THEN DMBUSCA.TBFOLGA_DATA.Close; end;Se puder ser feito uma função, me diga como, pq não tenho ideia de como se faça esta função, ou me diga onde posso encontrar.Grata

Compartilhar este post


Link para o post
Compartilhar em outros sites

A função seria algo desta forma:

 

function InverteData(dt: string): string;beginInverteData:=dt[4]+dt[5]+'/'+dt[1]+dt[2]+'/'+dt[7]+dt[8]+dt[9]+dt[10];end;

Ficando:

 

case RGBUSCA.ItemIndex of	0 : begin		DMBUSCA.TBBUSCAFOLGA_MOT.CLOSE;		DBGRIDBUSCAFOLGA.DataSource:=DMBUSCA.DSFOLGA_DATA;		DMBUSCA.SQLDATASETFOLGA_DATA.SQL.CLEAR;		DMBUSCA.SQLDATASETFOLGA_DATA.SQL.ADD('select FOLGA.COD_FOLGA, NR_DIAS,DATA_INICIAL,DATA_FINAL, MOTORISTA.NOME_MOT');		DMBUSCA.SQLDATASETFOLGA_DATA.SQL.ADD('from FOLGA');		DMBUSCA.SQLDATASETFOLGA_DATA.SQL.ADD('iNNER JOIN MOTORISTA ON FOLGA.COD_MOTORISTA= MOTORISTA.COD_MOTORISTA');		DMBUSCA.SQLDATASETFOLGA_DATA.SQL.ADD('WHERE DATA_INICIAL= ''' + InverteData(edit1.Text) + '''');		DMBUSCA.SQLDATASETFOLGA_DATA.SQL.ADD('ORDER BY FOLGA.COD_FOLGA,MOTORISTA.NOME_MOT');		Edit1.Clear;		Edit1.SetFocus;		DMBUSCA.TBFOLGA_DATA.OPEN;		IF DMBUSCA.TBFOLGA_DATA.IsEmpty THEN			DMBUSCA.TBFOLGA_DATA.Close;		end;	end;

Com Parameters não precisaria inverter...

 

obs.: Quando usar códigos, use a tag CODE...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Márcio muito obrigada funcionou direitinho, estava precisando muiiito desta função.

Tentei incluir a mesma função para os relatórios onde o usuário escolhe a data dos relatórios.

Se você puder me ajudar, de repende ele nao serve para os relatórios.

 

Sem a função e digitando a data invertida ela funciona bem.

E com a função ela da um erro " UNEXPETED END OF COMMAND INVALID TO KEN"

 

Segue o Código que estou usando.

 

 

procedure TFRelFolga.BitBtn2Click(Sender: TObject);BeginDMRELATORIO.TBRELFOLGA.close;  DMRELATORIO.SQLDATASETRELFOLGA.CommandText := 'SELECT FOLGA.COD_FOLGA,DATA_INICIAL, DATA_FINAL, NR_DIAS, VALOR_DIARIA, VALOR_TOTAL_FOLGA, OBS, MOTORISTA.NOME_MOT from FOLGA INNER JOIN MOTORISTA ON FOLGA.COD_MOTORISTA = MOTORISTA.COD_MOTORISTA where DATA_INICIAL >= ''' + InverteData(maskedit1.Text) + ''' and DATA_INICIAL <= ''' + InverteData(maskedit2.Text) + ''' and MOTORISTA.NOME_MOT = ''' + DBLookupComboBox1.Text + '''';  DMRELATORIO.TBRELFOLGA.open;  QRRELFOLGA.PreviewModal;end;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Márcio arrumei outro problema.

Estou fazendo os relatórios, porém sao muito campos então dá erro no sql, dizendo que passa dos 255 elementos. tentei colocar conforme tinha me passado o outro código colocando varias vezes o SQLDATASE, mas da erro.

 

Este é o código que da erro " String literals may have at most 255 elements"

 

procedure TFRelViagemMot.BitBtn2Click(Sender: TObject);beginDMRELATORIO.TBVIAGEMMOT.close;  DMRELATORIO.SQLDASETVIAGEMMOT.CommandText := 'SELECT VIAGEM.COD_VIAGEM, NR_VIAGEM, DATA_VIAGEM, CRT, MIC, PESO_CARGA,DESTINO, VALOR_FRETE, VALE1, KM_SAIDA, KM_CHEGADA, CARGA_CIDADE,TOTAL_DESP_REAIS,VELOCIDADE, KM, TOTAL_ABAST_REAIS, TOTAL_LITROS, MEDIA, MOTORISTA.NOME_MOT, VEICULOS.PLACA from VIAGEM INNER JOIN VEICULOS ON VIAGEM.COD_VEIC = VEICULOS.COD_VEIC INNER JOIN MOTORISTA ON VIAGEM.COD_MOTORISTA = MOTORISTA.COD_MOTORISTA where DATA_VIAGEM >= ''' + InverteData(maskedit1.Text) + ''' and DATA_VIAGEM <= ''' + InverteData(maskedit2.Text) + ''' and MOTORISTA.NOME_MOT = ''' + DBLookupComboBox1.Text + '''';  DMRELATORIO.TBVIAGEMMOT.open;  QRVIAGEMVEIC.PreviewModal;end;

 

 

tentei colocar assim, mas da erro qndo e clico em imprimir, dá erro no inicio de cada parte separada do SQL

 

DMRELATORIO.TBVIAGEMMOT.close;DMBUSCA.SQLDASETVIAGEMMOT.CommandText := ('SELECT VIAGEM.COD_VIAGEM, NR_VIAGEM, DATA_VIAGEM, CRT, MIC, PESO_CARGA,DESTINO, VALOR_FRETE, VALE1, KM_SAIDA, KM_CHEGADA, CARGA_CIDADE,TOTAL_DESP_REAIS,VELOCIDADE, KM, TOTAL_ABAST_REAIS, TOTAL_LITROS, MEDIA, MOTORISTA.NOME_MOT, VEICULOS.PLACA);DMBUSCA.SQLDASETVIAGEMMOT.CommandText := ('from VIAGEM ');DMBUSCA. SQLDASETVIAGEMMOT.CommandText := (INNER JOIN MOTORISTA ON VIAGEM.COD_MOTORISTA = MOTORISTA.COD_MOTORISTA');DMBUSCA.SQLDASETVIAGEMMOT.CommandText := ('where DATA_VIAGEM >= ''' + InverteData(maskedit1.Text) + ''' and DATA_VIAGEM <= ''' + InverteData(maskedit2.Text) + ''' and MOTORISTA.NOME_MOT = ''' + DBLookupComboBox1.Text + ''''); DMRELATORIO.TBVIAGEMMOT.open; QRVIAGEMVEIC.PreviewModal;

também tentei incluir este código direto no componente SQLDATASET porém nao sei como faço para colocar a Data_viagem entre as datas digitadas pelos usuario.

 

SELECT VIAGEM.COD_VIAGEM, NR_VIAGEM, DATA_VIAGEM, CRT, MIC, PESO_CARGA,DESTINO, VALOR_FRETE, VALE1, KM_SAIDA, KM_CHEGADA, CARGA_CIDADE,TOTAL_DESP_REAIS,VELOCIDADE, KM, TOTAL_ABAST_REAIS, TOTAL_LITROS, MEDIA, MOTORISTA.NOME_MOT, VEICULOS.PLACAfrom VIAGEM INNER JOIN VEICULOS ON VIAGEM.COD_VEIC = VEICULOS.COD_VEICINNER JOIN MOTORISTA ON VIAGEM.COD_MOTORISTA = MOTORISTA.COD_MOTORISTAWHERE VIAGEM.DATA_VIAGEM= :DATA_INICIAL AND			   VIAGEM.DATA_VIAGEM= :DATA_FINAL AND			   MOTORISTA.NOME_MOT= : MOTORISTA

 

 

SE TIVER ALGUMA DICA COMO EU FAÇO

Compartilhar este post


Link para o post
Compartilhar em outros sites

O erro é por causa do CommandText...

Eu sempre faço assim:

 

procedure TFRelViagemMot.BitBtn2Click(Sender: TObject);beginDMRELATORIO.TBVIAGEMMOT.Close;DMRELATORIO.TBVIAGEMMOT.SQL.Clear;DMRELATORIO.TBVIAGEMMOT.SQL.Add('SELECT VIAGEM.COD_VIAGEM, NR_VIAGEM, DATA_VIAGEM, CRT, MIC,');DMRELATORIO.TBVIAGEMMOT.SQL.Add('PESO_CARGA,DESTINO, VALOR_FRETE, VALE1, KM_SAIDA, KM_CHEGADA,');DMRELATORIO.TBVIAGEMMOT.SQL.Add('CARGA_CIDADE,TOTAL_DESP_REAIS,VELOCIDADE, KM,');DMRELATORIO.TBVIAGEMMOT.SQL.Add('TOTAL_ABAST_REAIS, TOTAL_LITROS, MEDIA, MOTORISTA.NOME_MOT,');DMRELATORIO.TBVIAGEMMOT.SQL.Add('VEICULOS.PLACA');DMRELATORIO.TBVIAGEMMOT.SQL.Add('from VIAGEM');DMRELATORIO.TBVIAGEMMOT.SQL.Add('INNER JOIN VEICULOS ON VIAGEM.COD_VEIC = VEICULOS.COD_VEIC');DMRELATORIO.TBVIAGEMMOT.SQL.Add('INNER JOIN MOTORISTA ON VIAGEM.COD_MOTORISTA = MOTORISTA.COD_MOTORISTA');DMRELATORIO.TBVIAGEMMOT.SQL.Add('where DATA_VIAGEM >= ''' + InverteData(maskedit1.Text) + ''' and DATA_VIAGEM <= ''' + InverteData(maskedit2.Text) + '''');DMRELATORIO.TBVIAGEMMOT.SQL.Add('and MOTORISTA.NOME_MOT = ''' + DBLookupComboBox1.Text + '''');DMRELATORIO.TBVIAGEMMOT.open;QRVIAGEMVEIC.PreviewModal;end;

Ou seja, usando o:

DMRELATORIO.TBVIAGEMMOT.SQL.Add();
Particularmente acho que fica mais organizado, e mais fácil de passar o SQL.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Márcio ja tentei assim, mas os componentes que uso, SQLDATASET E CLIENTEDATASET,tem que escrever o SQL no CommandText, por isto que tenho usado este.

 

Qndo tento fazer como você falou dá estes erros.Quem sabe está faltando eu colocar alguma coisa.

 

[Error] UFRelViagemMot.pas(42): Undeclared identifier: 'TBVIAGEMMOT'

[Error] UFRelViagemMot.pas(42): Missing operator or semicolon

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi, já que é preciso fazer uso do CommandText poderia criar uma variável para armazenar o SQL e depois atribuir ao CommandText...Os erros que deram verifique o SQL, o primeiro diz que não foi identificado TBVIAGEMMOT, verifique se o mesmo esta digitado de forma correta e sem erros, o outro erro informado, provavelmente falta um ponto e vírgula em uma linha próxima ao erro...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Márcio tentei assim,

procedure TFRelViagemMot.BitBtn2Click(Sender: TObject);varsql:String;sql2:String;sqlwhere:string;begin  DMRELATORIO.TBVIAGEMMOT.close;  sql:= 'SELECT VIAGEM.COD_VIAGEM, NR_VIAGEM, DATA_VIAGEM, CRT, MIC, PESO_CARGA,DESTINO, VALOR_FRETE, VALE1, KM_SAIDA, KM_CHEGADA, CARGA_CIDADE,TOTAL_DESP_REAIS,VELOCIDADE, KM, TOTAL_ABAST_REAIS, TOTAL_LITROS, MEDIA, MOTORISTA.NOME_MOT, VEICULOS.PLACA';  sql2:= ' from VIAGEM INNER JOIN VEICULOS ON VIAGEM.COD_VEIC = VEICULOS.COD_VEIC INNER JOIN MOTORISTA ON VIAGEM.COD_MOTORISTA = MOTORISTA.COD_MOTORISTA';  sqlwhere:= 'where DATA_VIAGEM >= ''' + InverteData(maskedit1.Text) + ''' and DATA_VIAGEM <= ''' + InverteData(maskedit2.Text) + ''' and MOTORISTA.NOME_MOT = ''' + DBLookupComboBox1.Text + '''';  DMRELATORIO.SQLDASETVIAGEMMOT.CommandText:= ' sql,sql2,sqlwhere';  DMRELATORIO.TBVIAGEMMOT.open;  QRVIAGEMVEIC.PreviewModal;end;

 

ele compila mas não hora de abrir o relatório da um erro

 

" Dynamic SQL Error SQL erro code= -104

token Unknown - line 1 char 1

SQL

Invalid to ken"

 

 

Pelo que entendi erro nesta parte ( sql:= 'SELECT VIAGEM.COD_VIAGEM, NR_VIAGEM, DATA_VIAGEM, CRT, MIC.... )

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não entendi, porém mudei as variáveis para não confundir, mas segue o mesmo erro

 

" Dynamic SQL Error SQL erro code= -104

token Unknown - line 1 char 1

SQL

Invalid to ken"

 

 

procedure TFRelViagemMot.BitBtn2Click(Sender: TObject);varsql:String;sql2:String;sql3:string;begin  DMRELATORIO.TBVIAGEMMOT.close;  sql:= 'SELECT VIAGEM.COD_VIAGEM, NR_VIAGEM, DATA_VIAGEM, CRT, MIC, PESO_CARGA,DESTINO, VALOR_FRETE, VALE1, KM_SAIDA, KM_CHEGADA, CARGA_CIDADE,TOTAL_DESP_REAIS,VELOCIDADE, KM, TOTAL_ABAST_REAIS, TOTAL_LITROS, MEDIA, MOTORISTA.NOME_MOT, VEICULOS.PLACA';  sql2:= 'from VIAGEM INNER JOIN VEICULOS ON VIAGEM.COD_VEIC = VEICULOS.COD_VEIC INNER JOIN MOTORISTA ON VIAGEM.COD_MOTORISTA = MOTORISTA.COD_MOTORISTA';  sql3:= 'where DATA_VIAGEM >= ''' + InverteData(maskedit1.Text) + ''' and DATA_VIAGEM <= ''' + InverteData(maskedit2.Text) + ''' and MOTORISTA.NOME_MOT = ''' + DBLookupComboBox1.Text + '''';  DMRELATORIO.SQLDASETVIAGEMMOT.CommandText:= ' sql,sql2,sql3';  DMRELATORIO.TBVIAGEMMOT.open;  QRVIAGEMVEIC.PreviewModal;end;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esta faltando um espaço antes do WHERE, no momento que junta os três comandos fica o WHERE junto com COD_MOTORISTA, hj esta assim:

sql3:= 'where DATA_VIAGEM >= ''' + InverteData(maskedit1.Text) + ''' and DATA_VIAGEM <= ''' + InverteData(maskedit2.Text) + ''' and MOTORISTA.NOME_MOT = ''' + DBLookupComboBox1.Text + '''';
Troque para:

sql3:= ' where DATA_VIAGEM >= ''' + InverteData(maskedit1.Text) + ''' and DATA_VIAGEM <= ''' + InverteData(maskedit2.Text) + ''' and MOTORISTA.NOME_MOT = ''' + DBLookupComboBox1.Text + '''';

Compartilhar este post


Link para o post
Compartilhar em outros sites

Márcio testei mas deu o mesmo erro.

Estou pensando em fazer diretamente no SQLDATASET , e depois passar por parametro,conforme vinha fazendo antes de me dar esta dica. Porém não sei como faço para colocar entre as datas e o motorista.

 

Tentei assim no commandText do SQLDATASET

 

SELECT VIAGEM.COD_VIAGEM, NR_VIAGEM, DATA_VIAGEM, CRT, MIC, PESO_CARGA,DESTINO, VALOR_FRETE, VALE1, KM_SAIDA, KM_CHEGADA, CARGA_CIDADE,TOTAL_DESP_REAIS,VELOCIDADE, KM, TOTAL_ABAST_REAIS, TOTAL_LITROS, MEDIA, MOTORISTA.NOME_MOT, VEICULOS.PLACAfrom VIAGEM INNER JOIN VEICULOS ON VIAGEM.COD_VEIC = VEICULOS.COD_VEICINNER JOIN MOTORISTA ON VIAGEM.COD_MOTORISTA = MOTORISTA.COD_MOTORISTAWHERE (VIAGEM.DATA_VIAGEM >= :DATA_INICIAL) AND		   (VIAGEM.DATA_VIAGEM <= :DATA_FINAL) AND		   (MOTORISTA.NOME_MOT= :MOTORISTA)

 

Mas da erro que o paramentro nao vale "No value parameter DATA_INICIAL"

 

Se souber como eu passo estes dados por parametro.

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.