Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá pessoal, só novo no forumBom estou com dificuladades em montar um Query, é o seguinte, eu tenho 2 tabelas, uma tabela de "Cliente" e a outra de "Datas", estou tentando fazer uma SQL que descubra qual é a ultima data de Cada Cliente, ex:Tabela ClienteCod Nome1 aaaaaTabela DataCod CodCleinte Data1 1 02/12/22052 1 03/12/22053 1 04/12/22054 1 05/12/22055 1 06/12/2205No meu Form eu tenho um DBGrid e dois Componentes DateTimePicker, um eu chamo Data Inicial e outra Data Final, então o que a Query tem que fazer, ela tem que selecionar a maior data dos clientes que estejam em a Data Inicial e a data Final selecionada pelo usuario, ex:Data Incial:01/12/2005 Data Final: 31/12/2005A query teria que retornar:Nome Dataaaaa 06/12/2005Claro que a tabela Cleinte não vai ter apenas 1 cliente, ela terá varios, então a query terá que mostrar os resultados de acordo com a Data Inicial e Final que forem selecionadas, tentei montar a seguinte query:With QueryUVeic DoBegin Close; SQL.Clear; SQL.Text:='SELECT MAX(DataVeiculacao) FROM veiculacao WHERE DataVeiculacao BETWEEN :DataInicial AND :DataFinal AND Cod="'+EditCod.Text+'" ParamByName('DataInicial').AsString := FormatDateTime('yyyy-mm-dd', DateTimePickerVeiculacao1.Date); ParamByName('DataFinal').AsString := FormatDateTime('yyyy-mm-dd', DateTimePickerVeiculacao2.Date); Open; Mais não funciono, gostaria de uma ajudaObrigado
bastard2003, eu testei o codigo mais não retorno nenhum valor, mais também não deu erro, eu vo postar tod a codigo e talvez você possa me explicar melhor:With QueryVeiculacao Do Begin Close; SQL.Clear; SQL.Add('SELECT * FROM veiculacao'); Open; QueryVeiculacao.First; CodCliente:=QueryVeiculacaoCodigoVeiculacao.Text; For Cont:=1 To QueryVeiculacao.RecordCount Do Begin CodCliente:=QueryVeiculacaoCodigoVeiculacao.Text; With QueryUVeic Do Begin Close; SQL.Clear; SQL.Add('SELECT NomeCliente,MAX(veiculacao.DataVeiculacao) FROM clientes,veiculacao'); SQL.Add('WHERE clientes.Codigo = "'+CodCliente+'" AND veiculacao.DataVeiculacao BETWEEN '' + DateToStr(DateTimePickerVeiculacao1.date) + '' AND '' + DateToStr(DateTimePickerVeiculacao2.date) + '''); SQL.Add('GROUP BY NomeCliente'); Open; Label1Nome.Visible:=true; Label1Nome.Caption:=''+DBEditNome.Text+''; BitBtnAlterar.Enabled:=true; BitBtnRepBon.Enabled:=true; QueryVeiculacao.Next;end; end;Obrigado
bom vamos la...
With QueryVeiculacao Do Begin Close; SQL.Clear; SQL.Add('SELECT * FROM veiculacao'); Open; QueryVeiculacao.First; CodCliente:=QueryVeiculacaoCodigoVeiculacao.Text; For Cont:=1 To QueryVeiculacao.RecordCount Do Begin CodCliente:=QueryVeiculacaoCodigoVeiculacao.Text; With QueryUVeic Do Begin Close; SQL.Clear; SQL.Add('SELECT NomeCliente,MAX(veiculacao.DataVeiculacao) FROM clientes,veiculacao'); SQL.Add('WHERE clientes.Codigo = '''+CodCliente+''' AND veiculacao.DataVeiculacao BETWEEN ''' + DateToStr(DateTimePickerVeiculacao1.date) + ''' AND ''' + DateToStr(DateTimePickerVeiculacao2.date) + ''''); SQL.Add('GROUP BY NomeCliente'); Open; Label1Nome.Visible:=true; Label1Nome.Caption:=''+DBEditNome.Text+''; BitBtnAlterar.Enabled:=true; BitBtnRepBon.Enabled:=true; QueryVeiculacao.Next; end; end; //coloquei um aqui end;//outro aqui
primeiro faltaram alguns END´s.. so que eu não sei se essa é a tu identação.. verifica isso.. no '''+CodCliente+''' são aspas simples... 3 de cada lado... o delphi reconhec a cada duas uma.... verifica se isso resolve... outra coisa.. pq o for? pra pegar o numero do veiculo e passar pra qry? não daria pra você pegar com um GROUP BY?! testa ai! qualquer coisa.. tamo ai!
abraços!
bastard2003, eu utilizei o for, para verificar a quantidade de registro da tabela veiculacão, dei First para ele ponterar o primeiro registro, depois ele vai contar cada cliente e verificar se a ultima data está dentro da seleção da Data Inicial e Data Final, não sei se este é o procedimento é correto mais acho que é isso que está danto problema, outra coisa, eu estou utilizando o MySQL, a formatação de data dele é yyyy-MM-dd, como eu faço para deixar a formatão dele como dd-MM-yyyy utilizando a Query ?Agora pelo menos ele está me mostrando os registros, tenho que colocar ele no padrão dd-MM-yyyy para ver se ele está mostrando os registro corretamente. Aguardo respostaObrigado pela ajuda
cara... com o eu trabalho com varios bancos diferentes eu criei uma função pra formata data... usa ela
function FormataData(Data: String): String;beginresult := data[7]+data[8]+data[9]+data[10] + '/' + data[4]+data[5]+'/'+data[1]+data[2]end;no caso ai eu adaptei ela pra você usar... pra chamar ela usa:
FormataData(DateToStr(DateTimePickerVeiculacao2.date));
ai so coloca essa linha a onde tiver DateToStr(DateTimePickerVeiculacao2.date)
testa ai !
Mais essa formatação de data eu terei que exibi-la no DBGrid, e para fazer o SELECT MAX, eu tive que tirar os fields da Query porque senão da um erro, então não tenho como fomata-la, gostaria de saber como posso fazer essa formatação na propria queryObrigado
essa função ali é pra você passar os dados pra qry... pra poder fazer o sql... o resultado se eu não me engano vem formatado ja... :\q erro q ta dando qnd você tem os field na qry?! cola ele ai!
Query1:Field 'Codigo' not found.É esse o erro que está dando na query quando eu coloco os field, agora quando eu tiro, a Query funciona normalmente, outra coisa, aquela função que você passo de conversão de Datas, eu ainda não consegui imaginar como posso utiliza-la com o DBGrid, será que você pode me passa algum exemplo ?Desculpe pela falta de conhecimento, mais eu estou aprendendo agora sobre SQL.Obrigado
qq deu esse esquema ali?! procura sempre colocar qual o erro que deu pq fica mais facil pra nos te ajudar... mas valor la.. desconfio que o problema ta no teu sql... faz assim..
isso deve resolver teu problema... testa ai.. qualquer coisa volta..
PS: o nome dos campos tem que ser o da tua tabela ne :D