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 

Como montar um metodo com parametro de array?

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Qui Fev 08, 2018 1:38 pm    Assunto: Como montar um metodo com parametro de array? Responder com Citação

Como montar um método com parâmetro de array?

Tentei assim, mais não esta certo


Código:
procedure TProduto.GerarCargaBalanca(const idClassificacao: array of Integer);
begin
  dmCadastros.qrySelect.Close;
  dmCadastros.qrySelect.SQL.Clear;
  dmCadastros.qrySelect.SQL.Text :=
           '    SELECT p.descricao, p.custo_medio_venda,'+
           '           p.id_unidade, p.codigo_barra, inf.dias '+
           '      FROM produto p '+
           ' LEFT JOIN produto_info_nutricionais inf '+
           '        ON p.id = inf.id_produto '+
           '     WHERE P.ID_CLASSIFICACAO IN (:pIDClassificacao) '+
           '       AND P.ATIVO = ''A'' '+
           '  ORDER BY P.ID_CLASSIFICACAO ';
  dmCadastros.qrySelect.ParamByName('pIDClassificacao').AsInteger := idClassificacao;
  dmCadastros.qrySelect.Open;
end;


E aproveitando como faço para passar para este parametro de array uma lista de um checklistbox

Tipo la no chekclistbox marcar o check e ir populando o parametro
Ai quando o parametro receber ja ter todos id's que preciso

Exemplo
idClassificacao := 123,345,432,1222

Uma vez acho que foi o Imex me ajudou num exemplo que faz isso, mais faz muito tempo e eu não achei mais aqui no forum, que inclusive esta bem zoado, não da pra postar direito.
_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
natanbh1
Colaborador
Colaborador


Registrado: Terça-Feira, 15 de Março de 2011
Mensagens: 3093
Localização: Belo Horizonte - MG

MensagemEnviada: Qui Fev 08, 2018 3:09 pm    Assunto: Responder com Citação

Sobre passar o Array of Integer como parâmetro, veja se a solução deste link lhe atende:
https://stackoverflow.com/questions/10091777/delphi-how-to-pass-a-list-as-a-parameter-to-a-sql-query
_________________
''A persistência é o caminho para o êxito.''
Charlie Chaplin
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
natanbh1
Colaborador
Colaborador


Registrado: Terça-Feira, 15 de Março de 2011
Mensagens: 3093
Localização: Belo Horizonte - MG

MensagemEnviada: Sex Fev 09, 2018 10:52 am    Assunto: Re: Como montar um metodo com parametro de array? Responder com Citação

adriano_servitec escreveu:
E aproveitando como faço para passar para este parametro de array uma lista de um checklistbox

Tipo la no chekclistbox marcar o check e ir populando o parametro
Ai quando o parametro receber ja ter todos id's que preciso

Exemplo
idClassificacao := 123,345,432,1222

Veja se a função abaixo ajuda:

Código:
function ListaItemsChecados(chkList: TCheckListBox): string;
var
  i: Integer;
begin
  for i := 0 to chkList.Count - 1 do
    if chkList.Checked[i] then
      Result := Result + chkList.Items[i] + ',';

  if Result <> EmptyStr then
    if Result[length(Result)] = ',' then
      delete(Result, length(Result), 1);
end;

Exemplo de uso:

Código:
ShowMessage(ListaItemsChecados(CheckListBox1));

A função irá retornar uma String com a lista de items checados separados por vírgula.
_________________
''A persistência é o caminho para o êxito.''
Charlie Chaplin
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Sex Fev 09, 2018 12:20 pm    Assunto: Responder com Citação

Vamos lá então natanbh1, parece que o forum esta de volta.

Fiz a função e adaptei a minha necessidade
Código:
function ListaItemsChecados(chkList: TCheckListBox): string;
  var
    I: Integer;
  begin
    for I := 0 to chkList.Count - 1 do
      if chkList.Checked[I] then
        Result := Result + Copy(chkList.Items[I].Trim,
          Pos('-', chkList.Items[I].Trim) + 1,
          Length(chkList.Items[I].Trim)) + ',';

    if Result <> EmptyStr then
      if Result[Length(Result)] = ',' then
        Delete(Result, Length(Result), 1);
  end;


Tenho aqui a função que preciso passar no where o result do checklistbox
Código:
function TProdutoCargaBalanca.GerarCargaBalanca(const Args: array of string)
  : TDataSource;
var
  ds: TDataSource;
  I: Integer;
begin
//  for I := Low(Args) to High(Args) do
//    Args[I] := StringReplace(Args[I], '''', '', [rfReplaceAll]);

  ds := TDataSource.Create(nil);
  ds.DataSet := dmCadastros.qrySelect;
  dmCadastros.qrySelect.Close;
  dmCadastros.qrySelect.SQL.Clear;
  dmCadastros.qrySelect.SQL.Text :=
    '    SELECT p.descricao, p.custo_medio_venda,' +
    '           p.id_unidade, p.codigo_barra, inf.dias, p.id_classificacao ' +
    '      FROM produto p ' +
    ' LEFT JOIN produto_info_nutricionais inf ' +
    '        ON p.id = inf.id_produto ' +
    '     WHERE p.id_classificacao in ' +  ListToText(Args)
    + '       AND p.id_cadastro = :pIDCadastro ' +
    '       AND p.ativo = ''A'' ' +
    '  ORDER BY p.id, p.descricao ';
  dmCadastros.qrySelect.ParamByName('pIDCadastro').AsInteger :=
    oUsuarioGlobal.IdCadastro;
  dmCadastros.qrySelect.Open;
  if not dmCadastros.qrySelect.IsEmpty then
    Result := ds;

end;


E aqui as 2 funções que vc me passou
Código:
function ListToText(const Args: array of string): string; overload;
var
  i: Integer;
begin
  Result := '(';
  for i := 0 to high(Args) do
    Result := Result + QuotedStr(Args[i]) + ',';
  Result[length(Result)] := ')';
end;

function ListToText(const Args: array of Integer): string; overload;
var
  i: Integer;
begin
  Result := '(';
  for i := 0 to high(Args) do
    Result := Result + IntToStr(Args[i]) + ',';
  Result[length(Result)] := ')';
end;


Chequei a tentar excluir as aspas do array, mais não consegui.
Código:
//  for I := Low(Args) to High(Args) do
//    Args[I] := StringReplace(Args[I], '''', '', [rfReplaceAll]);


Porém não deu certo
Citação:
---------------------------
Debugger Exception Notification
---------------------------
Project WebControlOffline.exe raised exception class EPgNativeException with message '[FireDAC][Phys][PG][libpq] ERROR: invalid input syntax for integer: "5653232,5654111"'.
---------------------------
Break Continue Help
---------------------------


Preciso que retorne os parametros assim
Código:
 WHERE p.id_classificacao in ('5653232','5653740')   

ou assim
Código:
 WHERE p.id_classificacao in (5653232,5653740)   

_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Sex Fev 09, 2018 1:23 pm    Assunto: Responder com Citação

Bom fazendo testes aqui, resolvi o problema assim:

A função
Código:
function ListaItemsChecados(chkList: TCheckListBox): string;
  var
    I: Integer;
  begin
    for I := 0 to chkList.Count - 1 do
      if chkList.Checked[I] then
        Result := Result + QuotedStr(Copy(chkList.Items[I].Trim,
          Pos('-', chkList.Items[I].Trim) + 1,
          Length(chkList.Items[I].Trim))) + ',';

    if Result <> EmptyStr then
      if Result[Length(Result)] = ',' then
        Delete(Result, Length(Result), 1);
  end;


A outra função do Listtext
f
Código:
unction ListToText(const Args: array of string): string; overload;
var
  i: Integer;
begin
  Result := '(';
  for i := 0 to high(Args) do
    Result := Result + (Args[i]) + ',';
  Result[length(Result)] := ')';
end;


E a função final coloquei dentro de uma variavel, não sei porque, mais assim funcionou.

Código:
function TProdutoCargaBalanca.GerarCargaBalanca(const Args: array of string)
  : TDataSource;
var
  ds: TDataSource;
  I: Integer;
  sSQL: String;
begin
  sSQL :=
    '    SELECT p.descricao, p.custo_medio_venda,' +
    '           p.id_unidade, p.codigo_barra, inf.dias, p.id_classificacao ' +
    '      FROM '+ TB_PRODUTO +' p ' +
    ' LEFT JOIN produto_info_nutricionais inf ' +
    '        ON p.id = inf.id_produto ' +
    '     WHERE p.id_classificacao in ' +  ListToText(Args) +
    '     AND p.id_cadastro = :pIDCadastro ' +
    '       AND p.ativo = ''A'' ' +
    '  ORDER BY p.id, p.descricao ';

  ds := TDataSource.Create(nil);
  ds.DataSet := dmCadastros.qrySelect;
  dmCadastros.qrySelect.Close;
  dmCadastros.qrySelect.SQL.Clear;
  dmCadastros.qrySelect.SQL.Text := sSQL;
  dmCadastros.qrySelect.ParamByName('pIDCadastro').AsInteger :=
    oUsuarioGlobal.IdCadastro;

  dmCadastros.qrySelect.Open;
  if not dmCadastros.qrySelect.IsEmpty then
    Result := ds;

end;


Valeu amigo.
_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
natanbh1
Colaborador
Colaborador


Registrado: Terça-Feira, 15 de Março de 2011
Mensagens: 3093
Localização: Belo Horizonte - MG

MensagemEnviada: Sex Fev 09, 2018 1:25 pm    Assunto: Responder com Citação

Blz, amigo. Que bom que conseguiu fazer funcionar aí.

Abraco.
_________________
''A persistência é o caminho para o êxito.''
Charlie Chaplin
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados 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