ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Passar parâmetros para um objeto TDBXCommand

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
BrTattoo
Novato
Novato


Registrado: Domingo, 19 de Mai de 2013
Mensagens: 13

MensagemEnviada: Dom Mai 19, 2013 7:47 pm    Assunto: Passar parâmetros para um objeto TDBXCommand Responder com Citação

Boa noite galera, estou tentando passar parâmetros para uma instrução SQL sem dataset, ou seja utilizando TDBXCommandTypes.DbxSQL do SQLConnection, mas esta dando o erro: TDBXError with message 'Inavalid Ordinal: -1'

Segue abaixo o código:

Código:
function TServerMethods1.PesquisaData: TDBXReader;
var
DataIni, DataFin: TDate;
begin
  ShortDateFormat := 'dd.mm.yyyy';
  DataIni := Date;
  DataFin := Date + 1;
  SQLConnection.Open;
  conn := SQLConnection.DBXConnection.CreateCommand;
  conn.CommandType := TDBXCommandTypes.DbxSQL;
  conn.Text := 'select NOME_CLIENTE, DATA_PREVISTA from PROPOSTA where (:DataIni >= and :DataFin<=)';
  conn.Parameters.Parameter[QuotedStr(DateToStr(Dataini))];TDBXError with message 'Inavalid Ordinal: -1'
  conn.Parameters.Parameter[QuotedStr(DateToStr(DataFin))];
  if not conn.IsPrepared then
  begin
    conn.Prepare;
  end;
  Result := conn.ExecuteQuery;
end;
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
marcosalles
Moderador
Moderador


Registrado: Quarta-Feira, 26 de Março de 2008
Mensagens: 1695
Localização: Muriaé Mg

MensagemEnviada: Dom Mai 19, 2013 7:52 pm    Assunto: Responder com Citação

talves te ajude

http://marcosalles.wordpress.com/?s=Dbxreader
_________________
http://marcosalles.wordpress.com

Desenvolvo FreeLancer e presto Consultoria
Orientação Online DataSnap DbX ClientDataSet
POO , Padrões de Projeto e dúvidas de Delphi em
Geral
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Visitar a homepage do Usuário
BrTattoo
Novato
Novato


Registrado: Domingo, 19 de Mai de 2013
Mensagens: 13

MensagemEnviada: Seg Mai 20, 2013 11:56 am    Assunto: Responder com Citação

marcosalles escreveu:
talves te ajude

http://marcosalles.wordpress.com/?s=Dbxreader


muito obrigado pela ajuda marcosalles, mas agora o delphi não esta reconhecendo o parametro informando que o campo Data1 é desconhecido, mas na verdade ele é um parametro.

Segue o código:

Código:
function TServerMethods1.PesquisaData: TDBXReader;
var
DataIni, DataFin: TDate;
Param: TDBXParameter;
begin
  FormatSettings.ShortDateFormat := 'dd.mm.yyyy';

  DataIni := Date;
  DataFin := Date + 1;

  SQLConnection.Open;
  conn := SQLConnection.DBXConnection.CreateCommand;
  conn.CommandType := TDBXCommandTypes.DbxSQL;
  conn.Text := 'select NOME_CLIENTE, DATA_PREVISTA from PROPOSTA where (PROPOSTA.DATA_PREVISTA >= :Data1 and PROPOSTA.DATA_PREVISTA <= :Data2)';

  Param := conn.CreateParameter;
  Param.DataType := TDBXDataTypes.WideStringType;
  Param.Name := 'Data1';
  conn.Parameters.AddParameter(Param);
  Conn.Parameters.Parameter['Data1'].Value.SetWideString(DateToStr(DataIni));

  Param := conn.CreateParameter;
  Param.DataType := TDBXDataTypes.WideStringType;
  Param.Name := 'Data2';
  conn.Parameters.AddParameter(Param);
  Conn.Parameters.Parameter['Data2'].Value.SetWideString(DateToStr(DataFin));

  if not conn.IsPrepared then
  begin
    conn.Prepare;
  end;
  Result := conn.ExecuteQuery;
  conn.Free;
end;


A mensagem de erro é: Project Servidor.exe raised exception class TDBXError with message 'Column unknown DATA1
At line 1, column 84'.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
Batera
Colaborador
Colaborador


Registrado: Quarta-Feira, 23 de Julho de 2008
Mensagens: 4899
Localização: Maringá

MensagemEnviada: Seg Mai 20, 2013 1:11 pm    Assunto: Responder com Citação

Rapaz, não sei se pode ser isso, mas para especificar parâmetros na SQL usa-se o sinal de interrogação ("?"), e para preenchê-lo você precisa indicar o índice (0, 1...), conforme esse artigo do marcosalles:

http://marcosalles.wordpress.com/2011/07/03/executar-stored-procedures-com-parametros-e-copiar-a-estrutura-e-dados-do-dbxreader-para-clientdataset-parte-vi/
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Visitar a homepage do Usuário
BrTattoo
Novato
Novato


Registrado: Domingo, 19 de Mai de 2013
Mensagens: 13

MensagemEnviada: Sáb Mai 25, 2013 5:34 pm    Assunto: Responder com Citação

Batera escreveu:
Rapaz, não sei se pode ser isso, mas para especificar parâmetros na SQL usa-se o sinal de interrogação ("?"), e para preenchê-lo você precisa indicar o índice (0, 1...), conforme esse artigo do marcosalles:

http://marcosalles.wordpress.com/2011/07/03/executar-stored-procedures-com-parametros-e-copiar-a-estrutura-e-dados-do-dbxreader-para-clientdataset-parte-vi/


Então Batera obrigado pela dica, ajudou bastante, mas agora o meu sql não esta retornado informação alguma segue o trecho do código:

Código:
SQLConnection.Open;
  conn := SQLConnection.DBXConnection.CreateCommand;
  conn.CommandType := TDBXCommandTypes.DbxSQL;
  conn.Text := 'select NOME_CLIENTE, DATA_PREVISTA from PROPOSTA where (PROPOSTA.DATA_PREVISTA >= (?) and PROPOSTA.DATA_PREVISTA <= (?))';

  Param := conn.CreateParameter;
  Param.DataType := TDBXDataTypes.WideStringType;
  Param.Name := 'Data1';
  conn.Parameters.AddParameter(Param);
  Conn.Parameters.Parameter[0].Value.SetWideString(DateToStr(DataIni));

  Param := conn.CreateParameter;
  Param.DataType := TDBXDataTypes.WideStringType;
  Param.Name := 'Data2';
  conn.Parameters.AddParameter(Param);
  Conn.Parameters.Parameter[1].Value.SetWideString(DateToStr(DataFin));

  if not conn.IsPrepared then
  begin
    conn.Prepare;
  end;
  Result := conn.ExecuteQuery;
  conn.Free;


Se alguem puder ajudar com a forma correta de construir esta consulta agradeço.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
Batera
Colaborador
Colaborador


Registrado: Quarta-Feira, 23 de Julho de 2008
Mensagens: 4899
Localização: Maringá

MensagemEnviada: Sáb Mai 25, 2013 7:26 pm    Assunto: Responder com Citação

Se você rodar essa SQL direto no banco de dados, a busca retorna resultados?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Visitar a homepage do Usuário
BrTattoo
Novato
Novato


Registrado: Domingo, 19 de Mai de 2013
Mensagens: 13

MensagemEnviada: Sáb Mai 25, 2013 7:37 pm    Assunto: Responder com Citação

Batera escreveu:
Se você rodar essa SQL direto no banco de dados, a busca retorna resultados?


retorna sim, mostra os dados da consulta corretamente.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
Batera
Colaborador
Colaborador


Registrado: Quarta-Feira, 23 de Julho de 2008
Mensagens: 4899
Localização: Maringá

MensagemEnviada: Sáb Mai 25, 2013 9:45 pm    Assunto: Responder com Citação

BrTattoo, só uma observação: você sabe que o ExecuteQuery retorna um dado do tipo TDBXReader, certo?
Como você está recebendo esse dado quando chama o método?
No meu caso, eu criei um ClientDataSet em tempo de execução, copiei os dados do TDBXReader para ele e retornei o dado como OleVariant:
Código:
var
  Reader: TDBXReader;
  Dados: TClientDataSet;
begin
  Dados := TClientDataSet.Create(nil);
  try
    .
    .
    .
    Reader := conn.ExecuteQuery;
    TDBXDataSetReader.CopyReaderToClientDataSet(Reader, Dados);
    result := Dados.Data;
  finally
    .
    .
    FreeAndNil(Dados);
  end;
end;
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Visitar a homepage do Usuário
BrTattoo
Novato
Novato


Registrado: Domingo, 19 de Mai de 2013
Mensagens: 13

MensagemEnviada: Sáb Mai 25, 2013 9:52 pm    Assunto: Responder com Citação

Batera escreveu:
BrTattoo, só uma observação: você sabe que o ExecuteQuery retorna um dado do tipo TDBXReader, certo?
Como você está recebendo esse dado quando chama o método?
No meu caso, eu criei um ClientDataSet em tempo de execução, copiei os dados do TDBXReader para ele e retornei o dado como OleVariant:
Código:
var
  Reader: TDBXReader;
  Dados: TClientDataSet;
begin
  Dados := TClientDataSet.Create(nil);
  try
    .
    .
    .
    Reader := conn.ExecuteQuery;
    TDBXDataSetReader.CopyReaderToClientDataSet(Reader, Dados);
    result := Dados.Data;
  finally
    .
    .
    FreeAndNil(Dados);
  end;
end;


Bom Batera eu estou recebendo estes dados em uma aplicação android
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
Batera
Colaborador
Colaborador


Registrado: Quarta-Feira, 23 de Julho de 2008
Mensagens: 4899
Localização: Maringá

MensagemEnviada: Sáb Mai 25, 2013 10:04 pm    Assunto: Responder com Citação

Entendi...
Bom, então acho que você só precisa tratar o retorno desses dados. Por exemplo, a função recebe o result como TDBXReader, certo? Agora você precisa "traduzir" esse TDBXReader para ser exibido na aplicação. É por isso que te dei a ideia do TClientDataSet. O problema é que eu não tenho experiência com Android, então não sei se a solução que te passei é funcional...
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Visitar a homepage do Usuário
BrTattoo
Novato
Novato


Registrado: Domingo, 19 de Mai de 2013
Mensagens: 13

MensagemEnviada: Sáb Mai 25, 2013 10:07 pm    Assunto: Responder com Citação

Batera escreveu:
Entendi...
Bom, então acho que você só precisa tratar o retorno desses dados. Por exemplo, a função recebe o result como TDBXReader, certo? Agora você precisa "traduzir" esse TDBXReader para ser exibido na aplicação. É por isso que te dei a ideia do TClientDataSet. O problema é que eu não tenho experiência com Android, então não sei se a solução que te passei é funcional...


Muito obrigado pela ajuda Batera, continuarei fazendo teste aqui e quando conseguir posto a solução.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
Batera
Colaborador
Colaborador


Registrado: Quarta-Feira, 23 de Julho de 2008
Mensagens: 4899
Localização: Maringá

MensagemEnviada: Sáb Mai 25, 2013 10:15 pm    Assunto: Responder com Citação

Quem sabe o marcosalles não dá uma passadinha por aqui e sugere uma solução melhor! Wink
Ele é o mestre do DBX4, rsrs.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Visitar a homepage do Usuário
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB