Ir para conteúdo

POWERED BY:

Arquivado

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

Junior.just.it

SQL no Delphi 2007 retorna Field not found

Recommended Posts

Olá Pessoal, to surtando aqui, problema dos diabos.

 

É o seguinte, vou explicar o problema e como deve funcionar.

 

Trabalho numa empresa de papelão ondulado, e precisam de um controle de corrugadores (é o q faz o papel ficar ondulado) e é calculado em metros, vamos ao que interessa.

 

To usando RAD Studio Delphi 2007, e banco MSSQL Server 2005, tenho um DataModule com 2 ADOQuery, ADOQOnd (Tarefas Onduladeira) e ADOQCorrugador (Corrugadores), funciona assim, o usuário deve saber a metragem do corrugador (isso eu pego no banco do sistema q controla a produção através da ADOQOnd) mas esta metragem é diaria somente, e não tem controle da troca destes equipamentos q devem ser feitas quando se atinge uma metragem expecífica, só pra informação, existem alguns tipos de 'ONDAS' que são especificadas com letras, Ex: Onda E, B, C, a diferença é no comprimento e altura da onda, e cada onda passa por um corrugador expecífico, no formulário de troca de corrugador, o sistema terá os dados principais de trocas, como a Onduladeira q rodou pois temos 2, o tipo da Onda, a Data do início do uso do corrugador, a Data da Troca q é tbm a data final do uso do corrugador antigo, o Horário da troca e metragem total. Vejam o código do combobox ONDULADEIRA E ONDA

 

procedure TFCorrugadores.CBOndaSelect(Sender: TObject);
begin
    with DM.ADOQCorrugador do
    begin
      Close;
      SQL.Clear;
      SQL.Add(' SELECT * FROM CORRUGADORES ');
      SQL.Add(' WHERE DATAINICIO = (SELECT MAX(DATAINICIO) FROM CORRUGADORES ');
      SQL.Add(' WHERE ONDULADEIRA LIKE ' +#39+CBOnd.Text+'%'+#39);
      SQL.Add(' AND CORRUGADORONDA LIKE ' +#39+CBOnda.Text+'%'+#39')');
      Open;
    end;
    DTPIni.Date := DM.ADOQCorrugadorDataInicio.Value;
end;

DTP é um DateTimePicker

 

então o usuário seleciona a Onduladeira e a Onda do corrugador a ser trocado, logo após ele seta a data início da query para o DateTimePicker o DTPIni, depois disso ele informa o dia da troca, a hora, e pressiona o botão trocar corrugador que executa o código abaixo.

 

procedure TFCorrugadores.SPBTrocaClick(Sender: TObject);
var MET: integer;
begin
    with DM.ADOQOnd do
    begin
      Close;
      SQL.Clear;
      SQL.Add(
      ' SELECT ONDULADEIRA, ONDA, SUM(METRAGEMPRODUZIDA)AS METRAGEMPRODUZIDA ' +
      ' FROM TAREFOND ' +
      ' WHERE ONDULADEIRA LIKE :ONDULADEIRA AND ONDA LIKE :ONDA ' +
      ' AND DIADATURMA BETWEEN :DATAINICIO AND :DATAFINAL ' +
      ' AND FIM <= :HORAFINAL GROUP BY ONDULADEIRA, ONDA ');
      DM.ADOQOnd.Parameters.ParamByName('ONDULADEIRA').Value:=CBOnd.Text;
      DM.ADOQOnd.Parameters.ParamByName('ONDA').Value:=CBOnda.Text;
      DM.ADOQOnd.Parameters.ParamByName('DATAINICIO').Value:=DTPIni.Date;
      DM.ADOQOnd.Parameters.ParamByName('DATAFINAL').Value:=DTPTroca.Date;
      DM.ADOQOnd.Parameters.ParamByName('HORAFINAL').Value:=DTPHora.DateTime;
      Open;
    end;
    MET:=DM.ADOQOndMETRAGEMPRODUZIDA.Value;
    DM.ADOQCorrugador.Edit;
    DM.ADOQOnd.Edit;
    DBEditTotal.Text:= IntToStr(MET);
    DM.ADOQCorrugadorDataFinal.Value := DTPTroca.DateTime;
    DM.ADOQCorrugadorHorarioTroca.Value := DTPHora.DateTime;
    DM.ADOQCorrugador.Post;
end;

Eis o problema, no tempo de execução ele da ERRO no campo DIADATURMA, da FIELD DIADATURMA NOT FOUND, e o pior, na Query no banco MSSQL q eu fiz ele funciona normal, me dá a metragem total do corrugador bem certo entre estas datas e horas.

 

se puderem me ajudar, agradeço muito, valeu pessoal.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Junior você já tentou jogar essa consulta no SQL do componente e ver se ele reconhece todos os campos??

 

 

 

Olá Pessoal, to surtando aqui, problema dos diabos.

 

É o seguinte, vou explicar o problema e como deve funcionar.

 

Trabalho numa empresa de papelão ondulado, e precisam de um controle de corrugadores (é o q faz o papel ficar ondulado) e é calculado em metros, vamos ao que interessa.

 

To usando RAD Studio Delphi 2007, e banco MSSQL Server 2005, tenho um DataModule com 2 ADOQuery, ADOQOnd (Tarefas Onduladeira) e ADOQCorrugador (Corrugadores), funciona assim, o usuário deve saber a metragem do corrugador (isso eu pego no banco do sistema q controla a produção através da ADOQOnd) mas esta metragem é diaria somente, e não tem controle da troca destes equipamentos q devem ser feitas quando se atinge uma metragem expecífica, só pra informação, existem alguns tipos de 'ONDAS' que são especificadas com letras, Ex: Onda E, B, C, a diferença é no comprimento e altura da onda, e cada onda passa por um corrugador expecífico, no formulário de troca de corrugador, o sistema terá os dados principais de trocas, como a Onduladeira q rodou pois temos 2, o tipo da Onda, a Data do início do uso do corrugador, a Data da Troca q é tbm a data final do uso do corrugador antigo, o Horário da troca e metragem total. Vejam o código do combobox ONDULADEIRA E ONDA

 

procedure TFCorrugadores.CBOndaSelect(Sender: TObject);
begin
    with DM.ADOQCorrugador do
    begin
      Close;
      SQL.Clear;
      SQL.Add(' SELECT * FROM CORRUGADORES ');
      SQL.Add(' WHERE DATAINICIO = (SELECT MAX(DATAINICIO) FROM CORRUGADORES ');
      SQL.Add(' WHERE ONDULADEIRA LIKE ' +#39+CBOnd.Text+'%'+#39);
      SQL.Add(' AND CORRUGADORONDA LIKE ' +#39+CBOnda.Text+'%'+#39')');
      Open;
    end;
    DTPIni.Date := DM.ADOQCorrugadorDataInicio.Value;
end;

DTP é um DateTimePicker

 

então o usuário seleciona a Onduladeira e a Onda do corrugador a ser trocado, logo após ele seta a data início da query para o DateTimePicker o DTPIni, depois disso ele informa o dia da troca, a hora, e pressiona o botão trocar corrugador que executa o código abaixo.

 

procedure TFCorrugadores.SPBTrocaClick(Sender: TObject);
var MET: integer;
begin
    with DM.ADOQOnd do
    begin
      Close;
      SQL.Clear;
      SQL.Add(
      ' SELECT ONDULADEIRA, ONDA, SUM(METRAGEMPRODUZIDA)AS METRAGEMPRODUZIDA ' +
      ' FROM TAREFOND ' +
      ' WHERE ONDULADEIRA LIKE :ONDULADEIRA AND ONDA LIKE :ONDA ' +
      ' AND DIADATURMA BETWEEN :DATAINICIO AND :DATAFINAL ' +
      ' AND FIM <= :HORAFINAL GROUP BY ONDULADEIRA, ONDA ');
      DM.ADOQOnd.Parameters.ParamByName('ONDULADEIRA').Value:=CBOnd.Text;
      DM.ADOQOnd.Parameters.ParamByName('ONDA').Value:=CBOnda.Text;
      DM.ADOQOnd.Parameters.ParamByName('DATAINICIO').Value:=DTPIni.Date;
      DM.ADOQOnd.Parameters.ParamByName('DATAFINAL').Value:=DTPTroca.Date;
      DM.ADOQOnd.Parameters.ParamByName('HORAFINAL').Value:=DTPHora.DateTime;
      Open;
    end;
    MET:=DM.ADOQOndMETRAGEMPRODUZIDA.Value;
    DM.ADOQCorrugador.Edit;
    DM.ADOQOnd.Edit;
    DBEditTotal.Text:= IntToStr(MET);
    DM.ADOQCorrugadorDataFinal.Value := DTPTroca.DateTime;
    DM.ADOQCorrugadorHorarioTroca.Value := DTPHora.DateTime;
    DM.ADOQCorrugador.Post;
end;

Eis o problema, no tempo de execução ele da ERRO no campo DIADATURMA, da FIELD DIADATURMA NOT FOUND, e o pior, na Query no banco MSSQL q eu fiz ele funciona normal, me dá a metragem total do corrugador bem certo entre estas datas e horas.

 

se puderem me ajudar, agradeço muito, valeu pessoal.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Junior você já tentou jogar essa consulta no SQL do componente e ver se ele reconhece todos os campos??

 

 

 

Olá Karina, obrigado pela resposta.

 

Pois é, o SQL do ADOQuery da assim.

 

SELECT ONDULADEIRA, ONDA,

METRAGEMPRODUZIDA, DIADATURMA, INICIO, FIM

FROM TAREFOND

 

ele acessa normalmente essa coluna, e no Fields Editor também ta add, o meu problema é que tenho em outro formulario uma consulta nessa query que faz tudo correto, veja o código, esse aí não ta engasgando.

 

procedure TFOnduladeiras.SpeedButton1Click(Sender: TObject);
begin
    with DM.ADOQOnd do
    begin
      Close;
      SQL.Clear;
      SQL.Add('SELECT ONDULADEIRA, TURMA, ONDA, METRAGEMPRODUZIDA, DIADATURMA, INICIO, FIM FROM TAREFOND ');
      SQL.Add('WHERE ONDULADEIRA LIKE '+#39+ComboBox1.Text+'%'+#39 + ' AND ONDA LIKE '+#39+ComboBox2.Text+'%'+#39);
      SQL.Add('AND DIADATURMA BETWEEN :DATAINICIO AND :DATAFINAL');
      DM.ADOQOnd.Parameters.ParamByName('DATAINICIO').Value:=DateTimePicker1.Date;
      DM.ADOQOnd.Parameters.ParamByName('DATAFINAL').Value:=DateTimePicker2.Date;
      Open;

      Total.Text := '';
      Total.Text := IntToStr(DM.ADOQOnd.RecordCount);

      DM.ADOQOnd.Edit;
      contador := DM.ADOQOnd.RecordCount;
      if contador = 0 then
      exit
      else
      soma := 0;
      DM.ADOQOnd.First;
      repeat
      soma := (DM.ADOQOndMETRAGEMPRODUZIDA.Value) + soma;
      DM.ADOQOnd.Next;
      contador := contador -1;
      until contador = 0;
      DM.ADOQOnd.Edit;
      Total.Text := '';
      Total.Text := FloatToStr(soma);
      Total.Text := IntToStr(soma);
    end;
end;

esse ta normal e note q eu to usando o BETWEEN com o DIADATURMA q na outra coluna da not found, a diferença é q uso o SUM naquela e nessa eu uso essa tripa ali pra contar registro por registro na coluna, só que meu maior problema é que cada cada corrugador roda milhões de metros lineares, e pense numa coisa que demora, por isso to com o SUM, q é rápido, mas na Query do MSSQL funciona e no Delphi não =/

 

Abraços!

Obrigado.

 

Att.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Os valores que está passando nestas linhas abaixo estão entre aspas simples no momento da execução? O like pode ser o seu problema... Já tentou capturar o SQL final antes do open e ver o que ele montou via debug?

 

      DM.ADOQOnd.Parameters.ParamByName('ONDULADEIRA').Value:=CBOnd.Text;
      DM.ADOQOnd.Parameters.ParamByName('ONDA').Value:=CBOnda.Text;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Os valores que está passando nestas linhas abaixo estão entre aspas simples no momento da execução? O like pode ser o seu problema... Já tentou capturar o SQL final antes do open e ver o que ele montou via debug?

 

      DM.ADOQOnd.Parameters.ParamByName('ONDULADEIRA').Value:=CBOnd.Text;
      DM.ADOQOnd.Parameters.ParamByName('ONDA').Value:=CBOnda.Text;

Olá, obrigado pela resposta

 

Tirei os parâmetros e fiz pra pegar direto, de uma olhada

 

with DM.ADOQOnd do
    begin
      Close;
      SQL.Clear;
      SQL.Add(
      ' SELECT ONDULADEIRA, ONDA, SUM(METRAGEMPRODUZIDA)AS METRAGEMPRODUZIDA ' +
      ' FROM TAREFOND ' +
      ' WHERE ONDULADEIRA LIKE ' +#39+CBOnd.Text+'%'+#39+' AND ONDA LIKE ' +#39+CBOnd.Text+'%'+#39 +
      ' AND DIADATURMA BETWEEN ' +#39+DTPIni.Date+'%'+#39+' AND ' +#39+DTPTroca.Date+'%'+#39 +
      ' AND FIM <= ' +#39+DTPHora.DateTime+'%'+#39+' GROUP BY ONDULADEIRA, ONDA ');
      //DM.ADOQOnd.Parameters.ParamByName('ONDULADEIRA').Value:=CBOnd.Text;
      //DM.ADOQOnd.Parameters.ParamByName('ONDA').Value:=CBOnda.Text;
      //DM.ADOQOnd.Parameters.ParamByName('DATAINICIO').Value:=DTPIni.Date;
      //DM.ADOQOnd.Parameters.ParamByName('DATAFINAL').Value:=DTPTroca.Date;
      //DM.ADOQOnd.Parameters.ParamByName('HORAFINAL').Value:=DTPHora.DateTime;
      Open;

Os DTPIni/DTPTroca/DTPHora são DateTimePicker, o problema é que dá erro em tempo de compilação, dá tipos incompatíveis 'string' e 'TDate' nos comandos '+#39+DTPIni.Date+'%'+#39+' não entendo porque ele dá tipos incompatíveis se o componente tem o Date, Time e DateTime e armazena a Data e hora nos mesmos.

 

Capturar SQL final antes do Open eu não sei fazer (acho).

Compartilhar este post


Link para o post
Compartilhar em outros sites

O erro que está dando agora é porque está jogando no ADD da SQL uma data ao invés de uma string... toda query que for mandar executar no banco tem que ser enviada como STRING no SQL.ADD ou dará erro mesmo. Das duas uma: ou você formata a data em uma string no formato usando no seu BD antes de jogar no add da SQL ou passa ela por parâmetro, como já fazia em outra query que você mesmo postou anteriormente.

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ae pessoal, continua dando erro, agora tirei os campos DateTimePicker e puxei tudo direto do Fields Editor como campo DBEdit com máscara para data e hora, mas da o erro "Convertion failed when converting datetime from character string", realmente eu não entendo, pois como mostrei aqui num outro form onde há uma consulta semelhante com campos data ele nunca deu estes erros. Vejam o codigo como está

 

begin
    with DM.ADOQOnd do
    begin
      Close;
      SQL.Clear;
      SQL.Add(
      ' SELECT ONDULADEIRA, ONDA SUM(METRAGEMPRODUZIDA)AS METRAGEMPRODUZIDA ' +
      ' FROM TAREFOND ' +
      ' WHERE ONDULADEIRA LIKE ' +#39+CBOnd.Text+'%'+#39+' AND ONDA LIKE ' +#39+CBOnd.Text+'%'+#39 +
      ' AND DIADATURMA BETWEEN ' +#39+DBEIni.Text+'%'+#39+' AND '+#39+DBEFim.Text+'%'+#39+
      ' AND FIM <= ' +#39+DBEHorario.Text+'%'+#39+' GROUP BY ONDULADEIRA, ONDA ');
      Open;
    end;

Abraços!

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.