Filtro Query SQL

Bom dia pessoal, tudo bom?

Estou com uma dúvida referente a um filtro do relatório tenho dois paramêtros Materia Prima Disponível (Em branco,Sim e Não) e Numero do Pedido de venda, gostaria que ao deixar parametro da materia prima disponível em branco ele traga todos os pedidos que possuem materia prima disponível com sim e não, e quando filtrar direto pelo pedido ele traga as duas informações também, podem me auxiliar por gentileza? em anexo segue minha query.

:warning: Atenção: Esta publicação foi transferida automaticamente do fórum antigo, mas os anexos não foram incluídos.

Não entendi bem como é esse filtro, ficou confuso o texto. Tenta explicar melhor, talvez até com um exemplo simples.

Olá,

Uma vez que você não filtre um conteúdo numa query, todos os registros serão exibidos.

Logo se seus parâmetros estiverem em branco e assim você deseja trazer todos, basta não inserir qualquer condição no where da query.

Se entendi bem, seguindo sua lógica, o trecho abaixo pode resolver esse problema:


//Se ambas as datas forem informadas, eu adicione a condição no where para fazer um between
//Aqui eu poderia tratar também pontualmente as datas e fazer um maior igual, menor igual...
If !Empty(MV_PAR01) .And. !Empty(MV_PAR02)
    cQryDad += "C6_ENTREG BETWEEN '" + DtoS(MV_PAR01) + "' AND '" + DtoS(MV_PAR02) + "' " + CRLF
EndIf

//Se o número do pedido foi informado, eu filtro somente ele, caso não tenha sido informado, eu não adiciono a condição no where e com isso vai trazer todos os pedidos independente do número
If !Empty(MV_PAR04)
    cQryDad += "C5_NUM = '" + MV_PAR04 + "' "+ CRLF
EndIf

//Aqui eu filtro somente se os valores estão entre 1 ('S') e 2 ('N'), caso esteja vazio, a condição será ignorada trazendo valores vazios, 'N', 'S' ou qualquer outra valor possível
If Val(cValToChar(MV_PAR03)) == 2
    cQryDad += "AND C6_ZZMAT = 'N' " + CRLF
ElseIf Val(cValToChar(MV_PAR03)) == 1
    cQryDad += "AND C6_ZZMAT = 'S' " + CRLF
EndIf

Existem alguns pontos que você pode estudar melhor, como se eu filtrar o número de um pedido em uma data incorreta, eu não vou encontrar esse pedido, faz sentido filtrar por data caso o número do pedido tenha sido informado?

Nos parâmetros MV_PAR03 você faz uma conversão para character e depois converte para número, existe essa necessidade? Comparar diretamente com 2 como character, talvez fazer um AllTrim não resolveria?

Após cada linha da query você adiciona uma quebra de linha, isso não traz qualquer benefício além de estético caso a string da query seja exibida no console por exemplo, na verdade, quanto mais caracteres, mais lento se torna o parse, caso passe na changequery, serão mais caracteres para serem lidos, o DBAccess possui limites no tamanho da query etc.

Desculpe qualquer mal entendido, se tiver outra dúvida, coloca um comentário que tento melhorar a resposta.

Realmente Daniel esse hábito de acrescentar uma quebra de linha eu também uso aqui para que a string da query seja exibida formata. Isso ajuda demais na leitura, seja no debug, no console ou até mesmo no log do dbaccess, com a penalidade de ter esses caracteres adicionais.

Ola Daniel desculpe a Demora, esta uma correria aqui rs, fiz um teste porém ele trouxe o erro ": Error : 156 (37000) (RC=-1) - [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]Incorrect syntax near the keyword ‘AND’.
Error : 156 (00000) (RC=-1) - ", sabe o que pode ser?