Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Passar parametros nulo Stored Procedure MYSQL


maxley_gyn

Pergunta

Boa noite.
Sou estudante e estou fazendo um trabalho para a faculdade em delphi 2010 utilizando o mysql e preciso fazer relatorios. Preciso criar varios tipos de filtros no formulario delphi, como por exemplo, forma de pagamento, vendas canceladas, finalizadas, usuarios, data. O problema e que se o usuario deixar esses filtos em branco devo buscar tudo de venda do banco, com o componente query programando sql no formulaario eu sei fazer mas com TZStored Procedure do zeos separando sql da aplicação, deixando sql no banco, não, pois quando passo algum campo nulo a consulta fica toda em branco, fica então a questao o que devo passar?? Segue abaixo o codigo.

CREATE PROCEDURE `relatorioVenda`(IN oDs_FormaPagamento VARCHAR(50), IN oDs_Status CHAR(1), IN oid_Usuario VARCHAR(10), IN oDtI DATE, IN oDtF DATE) 
NOT DETERMINISTIC 
CONTAINS SQL 
SQL SECURITY DEFINER 
COMMENT '' 
BEGIN 
SELECT a.*, b.Ds_FormaPagamento, c.Ds_Login, d.No_Cliente_Rz 
FROM tb_venda a 
INNER JOIN tb_formapagamento b ON (a.id_FormaPagamento = b.id_FormaPagamento) 
INNER JOIN tb_usuario c ON (a.id_Usuario = c.id_Usuario) 
INNER JOIN tb_cliente d ON (a.id_Cliente = d.id_Cliente) 
WHERE b.Ds_FormaPagamento = oDs_FormaPagamento 
AND a.Ds_Status = oDs_Status 
AND a.id_Usuario = oid_Usuario 
AND (a.Dt_Venda >= oDtI AND a.Dt_Venda <= oDtF) 
ORDER BY a.id_Venda; 
END;
Editado por Denis Courcy
colocar código em code
Link para o comentário
Compartilhar em outros sites

3 respostass a esta questão

Posts Recomendados

  • 0

Vou fazer com um dos parâmetros e você completa com os outros.

CREATE PROCEDURE `relatorioVenda`(IN oDs_FormaPagamento VARCHAR(50), IN oDs_Status CHAR(1), IN oid_Usuario VARCHAR(10), IN oDtI DATE, IN oDtF DATE) 
NOT DETERMINISTIC 
CONTAINS SQL 
SQL SECURITY DEFINER 
COMMENT '' 
BEGIN 
SET @meuSQL = "SELECT a.*, b.Ds_FormaPagamento, c.Ds_Login, d.No_Cliente_Rz
FROM tb_venda a 
INNER JOIN tb_formapagamento b ON (a.id_FormaPagamento = b.id_FormaPagamento) 
INNER JOIN tb_usuario c ON (a.id_Usuario = c.id_Usuario) 
INNER JOIN tb_cliente d ON (a.id_Cliente = d.id_Cliente) ";
IF oDs_FormaPagamento <> "" THEN
   SET @meuSQL = CONCAT(@meuSQL, " WHERE b.Ds_FormaPagamento = oDs_FormaPagamento ");
END IF;
SET @meuSQL  = CONCAT(@meuSQL, " ORDER BY a.id_Venda"); 
PREPARE stmt FROM @meuSQL;
EXECUTE stmt;
END;
Link para o comentário
Compartilhar em outros sites

  • 0

Muito Obrigado Denis, consegui resolver aqui com o código abaixo, se tiver como da uma olhada pra mim se ficou bom, se pode ser mais enxuto. Tive que declarar variáveis pois o sql não queria concatenar com os parâmetros, não sei o motivo.

CREATE PROCEDURE `relatorioVenda`(IN oDs_FormaPagamento VARCHAR(20), IN oDs_Status VARCHAR(10), IN oid_Usuario VARCHAR(10), IN oDtI DATE, IN oDtF DATE)
    NOT DETERMINISTIC
    CONTAINS SQL
    SQL SECURITY DEFINER
    COMMENT ''
BEGIN
SET @formapag = oDs_FormaPagamento;
SET @status   = oDs_Status;
SET @usuario  = oid_Usuario;


  SET @meuSQL = "SELECT a.*, b.Ds_FormaPagamento, c.Ds_Login, d.No_Cliente_Rz
  FROM tb_venda a
  INNER JOIN tb_formapagamento b ON (a.id_FormaPagamento = b.id_FormaPagamento)
  INNER JOIN tb_usuario c ON (a.id_Usuario = c.id_Usuario)
  INNER JOIN tb_cliente d ON (a.id_Cliente = d.id_Cliente) ";
  
  IF ((oDs_FormaPagamento <> "") AND (oDs_Status = "") AND (oid_Usuario = "")) THEN
     SET @meuSQL = CONCAT(@meuSQL, " WHERE b.Ds_FormaPagamento = @formapag");
  END IF;
  
  IF ((oDs_FormaPagamento <> "") AND (oDs_Status <> "") AND (oid_Usuario = "")) THEN
     SET @meuSQL = CONCAT(@meuSQL, " WHERE b.Ds_FormaPagamento = @formapag
                                     AND a.Ds_Status = @status");
  END IF;
  
  IF ((oDs_FormaPagamento <> "") AND (oDs_Status <> "") AND (oid_Usuario <> "")) THEN
     SET @meuSQL = CONCAT(@meuSQL, " WHERE b.Ds_FormaPagamento = @formapag
                                     AND a.Ds_Status = @status
                                     AND c.id_Usuario = @usuario");
  END IF;
  
  IF ((oDs_FormaPagamento = "") AND (oDs_Status <> "") AND (oid_Usuario = "")) THEN
     SET @meuSQL = CONCAT(@meuSQL, " WHERE a.Ds_Status = @status");
  END IF;
  
  IF ((oDs_FormaPagamento = "") AND (oDs_Status <> "") AND (oid_Usuario <> "")) THEN
     SET @meuSQL = CONCAT(@meuSQL, " WHERE a.Ds_Status = @status
                                     AND c.id_Usuario = @usuario");
  END IF;
  
  IF ((oDs_FormaPagamento = "") AND (oDs_Status = "") AND (oid_Usuario <> "")) THEN
     SET @meuSQL = CONCAT(@meuSQL, " WHERE c.id_Usuario = @usuario");
  END IF;
  
  SET @meuSQL  = CONCAT(@meuSQL, " ORDER BY a.id_Venda");
  PREPARE stmt FROM @meuSQL;
  EXECUTE stmt;


END;
Editado por maxley_gyn
Link para o comentário
Compartilhar em outros sites

  • 0

A sintaxe para pssagem de parametros usando PREPARED STATMENTs é a seguinte:

EXECUTE stmt_name [USING @var_name [, @var_name] ...]

Leia mais em http://dev.mysql.com/doc/refman/5.1/en/prepare.html

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.


  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...