Mudanças entre as edições de "Relatório Dinâmico"
(Introdução) |
(→Tela de Cadastro) |
||
(25 revisões intermediárias por 3 usuários não estão sendo mostradas) | |||
Linha 1: | Linha 1: | ||
+ | __TOC__ | ||
=Introdução= | =Introdução= | ||
O Relatório Dinâmico foi desenvolvido com a finalidade de facilitar o processo de desenvolvimento dos relatórios para nossos clientes. | O Relatório Dinâmico foi desenvolvido com a finalidade de facilitar o processo de desenvolvimento dos relatórios para nossos clientes. | ||
Linha 8: | Linha 9: | ||
Além disso, o cliente não precisará aguardar a liberação de versão para ter a disponibilidade do relatório. | Além disso, o cliente não precisará aguardar a liberação de versão para ter a disponibilidade do relatório. | ||
+ | =Tela de Cadastro= | ||
+ | A tela de manutenção do Relatório Dinâmico encontra-se no Gerenciador Interno. | ||
+ | <br/> | ||
+ | Caminho: ''Desenvolvimento > Relatórios Dinâmicos > Relatório Dinâmico'' | ||
+ | <br/><br/> | ||
+ | '''<big>Aba Principal</big>''' | ||
+ | <br/> | ||
+ | [[Arquivo:Relatorio_dinamico_1.png|miniaturadaimagem|direita|400px|Campos da aba Principal]] | ||
+ | Descrição dos principais campos desta aba: | ||
+ | *'''Status:''' Define se o relatório irá aparecer no sistema do cliente. | ||
+ | *'''Padrão:''' Se estiver como ''Sim'', o relatório será enviado automaticamente para o cliente quando for executada uma atualização. | ||
+ | *'''Versão mínima:''' Campo para indicar a versão mínima que a base do cliente precisa estar para receber o relatório. | ||
+ | *'''Descrição:''' Título da tela do relatório. | ||
+ | *'''Cliente:''' Cliente que solicitou o relatório. | ||
+ | *'''Relatório:''' Campo para indicar o layout. Ao gravar o relatório, caso este campo estiver em branco, o sistema perguntará se o usuário deseja incluir um novo layout. Confirmando esta mensagem, o sistema exibirá uma tela onde será desenvolvido o layout. | ||
+ | *'''Menu:''' Caminho do relatório que será exibido no menu da tela principal do cliente. Para incluir as opções, é necessário clicar com o botão direito. Se já houver um menu com o mesmo caminho indicado neste campo, será exibida uma mensagem de erro para o cliente. | ||
+ | <br/> | ||
+ | Descrição dos campos do módulo (permissões): | ||
+ | *'''Modulo:''' Campo não editável, gerado automaticamente com base no ID do cliente e no nome do relatório. Este campo é o nome do modulo que será cadastrado na base do cliente, portanto não poderá conter mais de um modulo com o mesmo nome. | ||
+ | *'''Descrição:''' Nome da permissão que aparecerá na tela de Permissões de Usuário no sistema do cliente. | ||
+ | *'''Tipo''',''' Grupo''' e '''SubGrupo:''' Campos para indicar o caminho da permissão. Somente o campo ''SubGrupo'' é editável. | ||
+ | *'''Sistema:''' Sistema em que o cliente poderá acessar o relatório. Caso o sistema indicado for ''Futura Server'', o relatório também ficará disponível para os sistemas ''Gourmet Server'' e ''Futura Farmacia Server''. | ||
− | + | <br/> | |
− | + | '''<big>Aba Filtros</big>''' | |
+ | <br/> | ||
+ | [[Arquivo:Relatorio_dinamico_2.png|miniaturadaimagem|direita|400px|Campos da aba Filtros]] | ||
+ | Descrição dos campos desta aba: | ||
+ | *'''Descrição:''' Nome do campo que aparecerá na tela de filtros. | ||
+ | *'''Filtro Manual:''' A opção ''Sim'' será utilizada para filtros que necessitam passar algum valor por parâmetro. Ex: ''Empresa'', ''Status de Pedido'', ''Período'', etc... | ||
+ | A opção ''Não'' será utilizada para filtros que não precisam passar valor por parâmetro, como por exemplo, um filtro para trazer somente produtos com estoque positivo. | ||
+ | *'''Tipo de Dado:''' Campo para indicar o tipo de dado do filtro. Ficará habilitado somente se o ''Filtro Manual'' for ''Sim''. | ||
+ | **'''''Lookup:''''' Utilizado para indicar um registro da base de dados. Ex: ''Cliente'', ''Fornecedor'', ''Tipo de Pedido'', etc... | ||
+ | **'''''Lookup Lista:''''' Semelhante ao ''Lookup'', porém, é possível indicar mais de um registro neste campo. | ||
+ | **'''''Data:''''' Filtro para indicar uma data. | ||
+ | **'''''Data Período:''''' Filtro para indicar um período de data. | ||
+ | **'''''Data Período Composta:''''' Neste filtro, os campos de data serão exibidas em um ComboBox, e será possível filtrar por um período do campo selecionado. A descrição do campo e o tipo do filtro deverão ser preenchidas no campo ''Tipo Enumerado''. | ||
+ | [[Arquivo:DataPeriodoComposta.PNG|miniaturadaimagem|direita|400px|Exemplo de configuração do filtro Data Periodo Composta]] | ||
+ | **'''''Data Mês/Ano:''''' Neste tipo de filtro, serão indicados o mês e o ano de um período. Os meses serão listados em um ComboBox, e o ano será indicado manualmente. No SQL, o primeiro parâmetro será referente ao mês, e o segundo será ao ano. | ||
+ | **'''''Integer:''''' Utilizado para filtros em que é possível indicar somente números. | ||
+ | **'''''String:''''' Utilizado para filtros em que é possível indicar letras e números. | ||
+ | **'''''Enumerado:''''' Neste tipo de dado, as opções do filtro serão exibidas em um Combo Box. A descrição e o valor das opções deverão ser preenchidas no campo ''Tipo Enumerado''. | ||
+ | **'''''Sim/Não:''''' Exibirá um Combo Box com as opções ''Sim'' e ''Não''. | ||
+ | *'''Tipo Lookup:''' Ficará habilitado somente quando o ''Tipo de Dado'' for ''Lookup'' ou ''Lookup Lista''. Neste campo será informado o tipo de registro que o usuário irá indicar no filtro. | ||
+ | '''Obs 1:''' Se for necessário a inclusão de um novo tipo neste campo, favor não esquecer de incluir a tela de consulta na Unit ''uTOtr_RelatorioDinamicoUtils''. | ||
+ | <br/> | ||
+ | [[Arquivo:Relatorio dinamico 3.jpg|miniaturadaimagem|direita|250px|Exemplo de filtro Enumerado]] | ||
+ | '''Obs 2:''' A classe TPF_Consulta está em uma Unit específica ''(bPF_ConsultaRelatorioDinamico)'', utilizada somente para o relatório dinâmico. Qualquer alteração feita na Unit do Genérico, a mesma deverá ser feita nesta Unit. | ||
+ | *'''Posição:''' Posição em que o filtro será exibido na tela. Há uma validação para não permitir indicar uma posição duplicada. | ||
+ | *'''Tipo Enumerado:''' Ficará habilitado somente quando o filtro de dado for ''Enumerado''. No campo ''Valor'', podemos indicar números, letras e palavras. Para a opção ''Todos'', devemos indicar o valor ''-1'' ''(ver imagem)''. | ||
+ | *'''Parâmetro de Filtro:''' Campo para indicar o parâmetro do filtro que será utilizado no SQL. Este campo ficará habilitado somente quando o campo ''Filtro Manual'' estiver como ''Sim''. | ||
+ | *'''Parâmetro de Filtro (2):''' Campo para indicar o segundo parâmetro do filtro. Até o momento, é utilizado apenas para filtros de ''Data Período''. | ||
+ | *'''Parâmetro de Ativação:''' Campo para indicar o parâmetro de ativação. Mais detalhes deste campo estão logo abaixo. | ||
+ | *'''Valor Inicial:''' Campo para indicar o valor padrão para o campo ao abrir a tela | ||
+ | *'''Valor Inicial 2:''' Campo para indicar o valor padrão para o campo 2 ao abrir a tela | ||
+ | |||
+ | <br/> | ||
+ | '''<big>Valores Iniciais</big>''' | ||
+ | <br/> | ||
+ | Existem alguns atalhos de texto para os valores iniciais que podem ser utilizados, são eles: | ||
+ | *'''[DATA]:''' Retorna data atual, e pode ser usado juntamente com operador + e -. Exemplo: [DATA]-30 (retornará a data atual - 30 dias) | ||
+ | *'''[EMPRESA]:''' Retorna ID da empresa padrão | ||
+ | *'''[USUARIO]:''' Retorna ID do usuário logado | ||
+ | *'''[VENDEDOR]:''' Retorna ID do vendedor logado | ||
+ | *'''[CLIENTE]:''' Retorna ID do cliente padrão. | ||
+ | |||
+ | Para utilizar valor inicial em campos Lookup Lista, os valores deverão ser separados por virgula. Exemplo: 25,201,301 | ||
+ | |||
+ | Para utilizar valor inicial em combobox, é necessário utilizar o índice do campo. | ||
+ | |||
+ | Para utilizar valor inicial em campo mes/ano, é necessário utilizar o índice do mes (0 a 11) no primeiro valor inicial, e o ano (integer 4 digitos ex: 2020, 2021, 2024) no segundo campo de valor inicial | ||
+ | |||
+ | '''SEMPRE SE ATENTE DE COLOCAR VALORES COMPATIVEIS COM O CAMPO UTILIZADO.''' | ||
+ | |||
+ | <br/><br/> | ||
+ | |||
+ | =SQL / Parâmetros= | ||
+ | No código SQL, deveremos incluir os Parâmetros e os Parâmetros de Ativação. | ||
+ | <br/> | ||
+ | O Parâmetro de Ativação é utilizado para não quebrar o SQL quando algum parâmetro possuir valor ''Null''. | ||
+ | <br/> | ||
+ | As condições no ''Where'' devem seguir o seguinte padrão: <code>AND ((:PARAMETRO_ATIVACAO = 'N') OR (:PARAMETRO_VALOR = CAMPO))</code> | ||
+ | <br/> | ||
+ | O Parâmetro de Ativação deverá ser comparado com 'N', e a condição do parâmetro do valor deverá ser com ''OR''. | ||
+ | <br/><br/> | ||
+ | Para melhor entendimento, segue um exemplo de SQL utilizando todos os tipos de filtros possíveis: | ||
+ | <br/><br/> | ||
+ | '''<big>PEDIDO</big>''' | ||
+ | <code> | ||
+ | SELECT PED.ID | ||
+ | FROM PEDIDO PED | ||
+ | INNER JOIN CADASTRO CAD ON (CAD.ID = PED.FK_CADASTRO) | ||
+ | INNER JOIN TIPO_PEDIDO TPPED ON (TPPED.ID = PED.FK_TIPO_PEDIDO) | ||
+ | LEFT JOIN SYS_USUARIO USU ON (USU.ID = PED.FK_USUARIO_PED) | ||
+ | LEFT JOIN CADASTRO VEND ON (VEND.ID = PED.FK_VENDEDOR) | ||
+ | LEFT JOIN CADASTRO_GRUPO CAGR ON ( CAGR.ID = CAD.FK_CADASTRO_GRUPO) | ||
+ | LEFT JOIN NOTA_FISCAL NF ON (NF.FK_PEDIDO = PED.ID AND NF.MODELO_DOC_FISCAL IN (0,24)) | ||
+ | WHERE (TPPED.TIPO = 0) | ||
+ | AND ((:LOOKUP_EMPRESA_ATIVACAO = 'N') OR (:LOOKUP_EMPRESA = PED.FK_EMPRESA)) | ||
+ | AND ((:LOOKUP_LISTA_CLIENTES_ATIVACAO = 'N') OR (PED.FK_CADASTRO IN (SELECT RESULT FROM SP_GET_CONJUNTO_INTEIRO(:LOOKUP_LISTA_CLIENTES)))) | ||
+ | AND ((:ENUMERADO_STATUS_ATIVACAO = 'N') OR (:ENUMERADO_STATUS = PED.STATUS)) | ||
+ | AND ((:DATA_EMISSAO_ATIVACAO = 'N') OR (:DATA_EMISSAO = PED.DATA_EMISSAO)) | ||
+ | AND ((:DATA_PERIODO_EMISSAO_ATIVACAO = 'N') OR (PED.DATA_EMISSAO BETWEEN :DATA_PERIODO_EMISSAO AND :DATA_PERIODO_EMISSAO_2)) | ||
+ | AND ((:INTEGER_NRO_PEDIDO_ATIVACAO = 'N') OR (:INTEGER_NRO_PEDIDO = PED.NRO_PEDIDO)) | ||
+ | AND ( | ||
+ | ((:DATA_ATIVACAO = '1') AND (PED.DATA_EMISSAO between :DATA_INICIAL AND :DATA_FINAL)) OR | ||
+ | ((:DATA_ATIVACAO = '2') AND (PED.DATA_PREVISAO between :DATA_INICIAL AND :DATA_FINAL)) OR | ||
+ | ((:DATA_ATIVACAO = '3') AND (PED.DATA_SAIDA_ENTRADA between :DATA_INICIAL AND :DATA_FINAL)) | ||
+ | ) | ||
+ | AND ((EXTRACT(MONTH FROM PED.DATA_EMISSAO) = :DATA_MES) AND (EXTRACT(YEAR FROM PED.DATA_EMISSAO) = :DATA_ANO)) | ||
+ | </code> | ||
+ | '''<big>PEDIDO_ITEM</big>''' | ||
+ | <code> | ||
+ | SELECT IT.ID, | ||
+ | FROM PEDIDO_ITEM IT | ||
+ | INNER JOIN PEDIDO PED ON (PED.ID = IT.FK_PEDIDO) | ||
+ | INNER JOIN PRODUTO PR ON (PR.ID = IT.FK_PRODUTO) | ||
+ | LEFT JOIN PRODUTO_UNIDADE UN ON (UN.ID = PR.FK_PRODUTO_UNIDADE) | ||
+ | LEFT JOIN CLASSIFICACAO_FISCAL CF ON (PR.FK_CLASSIFICACAO_FISCAL = CF.ID) | ||
+ | WHERE ((:FILTRO_NAO_MANUAL_ESTOQUE_ATIVACAO = 'N') OR ((SELECT SALDO FROM SP_GET_PRODUTO_SALDO(PED.FK_EMPRESA, PR.ID)) > 0)) --Filtro manual: NÃO | ||
+ | AND ((:SIM_NAO_UTILIZA_BALANCA_ATIVACAO = 'N') OR (:SIM_NAO_UTILIZA_BALANCA = UN.UTILIZA_BALANCA)) | ||
+ | AND ((:STRING_CLASS_FISCAL_ATIVACAO = 'N') OR (:STRING_CLASS_FISCAL = CF.CLASSIFICACAO)) | ||
+ | </code> |
Edição atual tal como às 15h42min de 22 de fevereiro de 2024
Introdução
O Relatório Dinâmico foi desenvolvido com a finalidade de facilitar o processo de desenvolvimento dos relatórios para nossos clientes.
Com esta ferramenta, o tempo de desenvolvimento será reduzido, pois os filtros serão criados dinamicamente.
Não será necessária a compilação do sistema para subir as alterações do relatório, ou seja, o processo de teste será mais rápido.
Além disso, o cliente não precisará aguardar a liberação de versão para ter a disponibilidade do relatório.
Tela de Cadastro
A tela de manutenção do Relatório Dinâmico encontra-se no Gerenciador Interno.
Caminho: Desenvolvimento > Relatórios Dinâmicos > Relatório Dinâmico
Aba Principal
Descrição dos principais campos desta aba:
- Status: Define se o relatório irá aparecer no sistema do cliente.
- Padrão: Se estiver como Sim, o relatório será enviado automaticamente para o cliente quando for executada uma atualização.
- Versão mínima: Campo para indicar a versão mínima que a base do cliente precisa estar para receber o relatório.
- Descrição: Título da tela do relatório.
- Cliente: Cliente que solicitou o relatório.
- Relatório: Campo para indicar o layout. Ao gravar o relatório, caso este campo estiver em branco, o sistema perguntará se o usuário deseja incluir um novo layout. Confirmando esta mensagem, o sistema exibirá uma tela onde será desenvolvido o layout.
- Menu: Caminho do relatório que será exibido no menu da tela principal do cliente. Para incluir as opções, é necessário clicar com o botão direito. Se já houver um menu com o mesmo caminho indicado neste campo, será exibida uma mensagem de erro para o cliente.
Descrição dos campos do módulo (permissões):
- Modulo: Campo não editável, gerado automaticamente com base no ID do cliente e no nome do relatório. Este campo é o nome do modulo que será cadastrado na base do cliente, portanto não poderá conter mais de um modulo com o mesmo nome.
- Descrição: Nome da permissão que aparecerá na tela de Permissões de Usuário no sistema do cliente.
- Tipo, Grupo e SubGrupo: Campos para indicar o caminho da permissão. Somente o campo SubGrupo é editável.
- Sistema: Sistema em que o cliente poderá acessar o relatório. Caso o sistema indicado for Futura Server, o relatório também ficará disponível para os sistemas Gourmet Server e Futura Farmacia Server.
Aba Filtros
Descrição dos campos desta aba:
- Descrição: Nome do campo que aparecerá na tela de filtros.
- Filtro Manual: A opção Sim será utilizada para filtros que necessitam passar algum valor por parâmetro. Ex: Empresa, Status de Pedido, Período, etc...
A opção Não será utilizada para filtros que não precisam passar valor por parâmetro, como por exemplo, um filtro para trazer somente produtos com estoque positivo.
- Tipo de Dado: Campo para indicar o tipo de dado do filtro. Ficará habilitado somente se o Filtro Manual for Sim.
- Lookup: Utilizado para indicar um registro da base de dados. Ex: Cliente, Fornecedor, Tipo de Pedido, etc...
- Lookup Lista: Semelhante ao Lookup, porém, é possível indicar mais de um registro neste campo.
- Data: Filtro para indicar uma data.
- Data Período: Filtro para indicar um período de data.
- Data Período Composta: Neste filtro, os campos de data serão exibidas em um ComboBox, e será possível filtrar por um período do campo selecionado. A descrição do campo e o tipo do filtro deverão ser preenchidas no campo Tipo Enumerado.
- Data Mês/Ano: Neste tipo de filtro, serão indicados o mês e o ano de um período. Os meses serão listados em um ComboBox, e o ano será indicado manualmente. No SQL, o primeiro parâmetro será referente ao mês, e o segundo será ao ano.
- Integer: Utilizado para filtros em que é possível indicar somente números.
- String: Utilizado para filtros em que é possível indicar letras e números.
- Enumerado: Neste tipo de dado, as opções do filtro serão exibidas em um Combo Box. A descrição e o valor das opções deverão ser preenchidas no campo Tipo Enumerado.
- Sim/Não: Exibirá um Combo Box com as opções Sim e Não.
- Tipo Lookup: Ficará habilitado somente quando o Tipo de Dado for Lookup ou Lookup Lista. Neste campo será informado o tipo de registro que o usuário irá indicar no filtro.
Obs 1: Se for necessário a inclusão de um novo tipo neste campo, favor não esquecer de incluir a tela de consulta na Unit uTOtr_RelatorioDinamicoUtils.
Obs 2: A classe TPF_Consulta está em uma Unit específica (bPF_ConsultaRelatorioDinamico), utilizada somente para o relatório dinâmico. Qualquer alteração feita na Unit do Genérico, a mesma deverá ser feita nesta Unit.
- Posição: Posição em que o filtro será exibido na tela. Há uma validação para não permitir indicar uma posição duplicada.
- Tipo Enumerado: Ficará habilitado somente quando o filtro de dado for Enumerado. No campo Valor, podemos indicar números, letras e palavras. Para a opção Todos, devemos indicar o valor -1 (ver imagem).
- Parâmetro de Filtro: Campo para indicar o parâmetro do filtro que será utilizado no SQL. Este campo ficará habilitado somente quando o campo Filtro Manual estiver como Sim.
- Parâmetro de Filtro (2): Campo para indicar o segundo parâmetro do filtro. Até o momento, é utilizado apenas para filtros de Data Período.
- Parâmetro de Ativação: Campo para indicar o parâmetro de ativação. Mais detalhes deste campo estão logo abaixo.
- Valor Inicial: Campo para indicar o valor padrão para o campo ao abrir a tela
- Valor Inicial 2: Campo para indicar o valor padrão para o campo 2 ao abrir a tela
Valores Iniciais
Existem alguns atalhos de texto para os valores iniciais que podem ser utilizados, são eles:
- [DATA]: Retorna data atual, e pode ser usado juntamente com operador + e -. Exemplo: [DATA]-30 (retornará a data atual - 30 dias)
- [EMPRESA]: Retorna ID da empresa padrão
- [USUARIO]: Retorna ID do usuário logado
- [VENDEDOR]: Retorna ID do vendedor logado
- [CLIENTE]: Retorna ID do cliente padrão.
Para utilizar valor inicial em campos Lookup Lista, os valores deverão ser separados por virgula. Exemplo: 25,201,301
Para utilizar valor inicial em combobox, é necessário utilizar o índice do campo.
Para utilizar valor inicial em campo mes/ano, é necessário utilizar o índice do mes (0 a 11) no primeiro valor inicial, e o ano (integer 4 digitos ex: 2020, 2021, 2024) no segundo campo de valor inicial
SEMPRE SE ATENTE DE COLOCAR VALORES COMPATIVEIS COM O CAMPO UTILIZADO.
SQL / Parâmetros
No código SQL, deveremos incluir os Parâmetros e os Parâmetros de Ativação.
O Parâmetro de Ativação é utilizado para não quebrar o SQL quando algum parâmetro possuir valor Null.
As condições no Where devem seguir o seguinte padrão: AND ((:PARAMETRO_ATIVACAO = 'N') OR (:PARAMETRO_VALOR = CAMPO))
O Parâmetro de Ativação deverá ser comparado com 'N', e a condição do parâmetro do valor deverá ser com OR.
Para melhor entendimento, segue um exemplo de SQL utilizando todos os tipos de filtros possíveis:
PEDIDO
SELECT PED.ID FROM PEDIDO PED INNER JOIN CADASTRO CAD ON (CAD.ID = PED.FK_CADASTRO) INNER JOIN TIPO_PEDIDO TPPED ON (TPPED.ID = PED.FK_TIPO_PEDIDO) LEFT JOIN SYS_USUARIO USU ON (USU.ID = PED.FK_USUARIO_PED) LEFT JOIN CADASTRO VEND ON (VEND.ID = PED.FK_VENDEDOR) LEFT JOIN CADASTRO_GRUPO CAGR ON ( CAGR.ID = CAD.FK_CADASTRO_GRUPO) LEFT JOIN NOTA_FISCAL NF ON (NF.FK_PEDIDO = PED.ID AND NF.MODELO_DOC_FISCAL IN (0,24)) WHERE (TPPED.TIPO = 0) AND ((:LOOKUP_EMPRESA_ATIVACAO = 'N') OR (:LOOKUP_EMPRESA = PED.FK_EMPRESA)) AND ((:LOOKUP_LISTA_CLIENTES_ATIVACAO = 'N') OR (PED.FK_CADASTRO IN (SELECT RESULT FROM SP_GET_CONJUNTO_INTEIRO(:LOOKUP_LISTA_CLIENTES)))) AND ((:ENUMERADO_STATUS_ATIVACAO = 'N') OR (:ENUMERADO_STATUS = PED.STATUS)) AND ((:DATA_EMISSAO_ATIVACAO = 'N') OR (:DATA_EMISSAO = PED.DATA_EMISSAO)) AND ((:DATA_PERIODO_EMISSAO_ATIVACAO = 'N') OR (PED.DATA_EMISSAO BETWEEN :DATA_PERIODO_EMISSAO AND :DATA_PERIODO_EMISSAO_2)) AND ((:INTEGER_NRO_PEDIDO_ATIVACAO = 'N') OR (:INTEGER_NRO_PEDIDO = PED.NRO_PEDIDO)) AND ( ((:DATA_ATIVACAO = '1') AND (PED.DATA_EMISSAO between :DATA_INICIAL AND :DATA_FINAL)) OR ((:DATA_ATIVACAO = '2') AND (PED.DATA_PREVISAO between :DATA_INICIAL AND :DATA_FINAL)) OR ((:DATA_ATIVACAO = '3') AND (PED.DATA_SAIDA_ENTRADA between :DATA_INICIAL AND :DATA_FINAL)) ) AND ((EXTRACT(MONTH FROM PED.DATA_EMISSAO) = :DATA_MES) AND (EXTRACT(YEAR FROM PED.DATA_EMISSAO) = :DATA_ANO))
PEDIDO_ITEM
SELECT IT.ID, FROM PEDIDO_ITEM IT INNER JOIN PEDIDO PED ON (PED.ID = IT.FK_PEDIDO) INNER JOIN PRODUTO PR ON (PR.ID = IT.FK_PRODUTO) LEFT JOIN PRODUTO_UNIDADE UN ON (UN.ID = PR.FK_PRODUTO_UNIDADE) LEFT JOIN CLASSIFICACAO_FISCAL CF ON (PR.FK_CLASSIFICACAO_FISCAL = CF.ID) WHERE ((:FILTRO_NAO_MANUAL_ESTOQUE_ATIVACAO = 'N') OR ((SELECT SALDO FROM SP_GET_PRODUTO_SALDO(PED.FK_EMPRESA, PR.ID)) > 0)) --Filtro manual: NÃO AND ((:SIM_NAO_UTILIZA_BALANCA_ATIVACAO = 'N') OR (:SIM_NAO_UTILIZA_BALANCA = UN.UTILIZA_BALANCA)) AND ((:STRING_CLASS_FISCAL_ATIVACAO = 'N') OR (:STRING_CLASS_FISCAL = CF.CLASSIFICACAO))