Pular para o conteúdo principal

Parâmetro Controla Item do Controle de Entrega

Tela de configuração: MFA001 - Parâmetros de Faturamento Localização: Parâmetros → aba Controle Entrega (pagControleEntrega / grupo grpControleEntrega) Tabela: PARMFATUR.ST_CONTENTREGA Valor padrão: P (Produto)

Define quais tipos de itens entram na janela de agendamento de entrega (TfrmEntrega da shared unit jControleEntrega) quando o sistema abre o controle de entrega pelo pedido/nota. Só é relevante quando ST_ENTREGA <> 'N' - o combo é habilitado/desabilitado pelo OnChange de cmbST_ENTREGA em UMFA001.pas:1864-1893.

Decide se o controle de entrega enxerga apenas produtos (itens com ITEM.TP_ITEM <> 'S') ou produtos + serviços. Afeta tanto o filtro exibido na tela de agendamento quanto as consultas da VIEW_CONTROLEENTREGA (usada em MNF007, MNF016, REQ001).

Telas impactadas​

MóduloCódigoUso
Parâmetros de FaturamentoMFA001Único local de configuração (cmbST_CONTENTREGA)
Pedido de VendaMPD002Lê o valor da PARMFATUR e passa em ParametrosEntrega[6] para ControleEntrega(...) (UMPD002.pas:3245)
Nota Fiscal de SaídaMNF002Idem - passa em ParametrosEntrega[6] (UMNF002.pas:4583)
Gerar NF de Ordem/CotaçãoMPD011Passa o valor em ParametrosEntrega[6] ao transformar ordem em NF (UNFORDEM.pas:837)
Venda Mobile / Pré-vendaMPD020Carrega em dmMPD020.iST_CONTENTREGA e envia em ParametrosEntrega[6] (UdmMPD020.pas:368, UMPD020.pas:958)
Conferência de Pedido para NFMNF017Armazena em dmMNF017.iST_CONTENTREGA (UMNF017.pas:200) e usa em duas chamadas ControleEntrega (uMNF017ConfPedido.pas:1138 e :1876)
Agendamento/Pesquisa de EntregasMNF019Carrega em dmMNF019.iST_CONTENTREGA (UdmMNF019.pas:654) e usa em ParametrosEntrega[6] (UMNF019.pas:1875)
Pesquisa de Controle de EntregaMNF016Chama VIEW_CONTROLEENTREGA2(...) que lê internamente o parâmetro (UMNF016.pas:620,1037)
Digitação de Nota de EntregaMNF007Chama VIEW_CONTROLEENTREGA e VIEW_CONTROLEENTREGA2 (UdmMNF007.dfm:3145,3186, UdmMNF007.pas:5092,5119)
Requisição (Layout N)REQ001Chama VIEW_CONTROLEENTREGA2(...) (UREQ001.pas:1719)
Consulta interna de parâmetrosMNF008, MCO006Lê P.ST_CONTENTREGA junto com outros parâmetros (UdmMNF008.pas:763, UdmMCO006.pas:2107)

Procedures/Views impactadas​

ObjetoArquivoPapel
VIEW_CONTROLEENTREGAScripts/VIEW_CONTROLEENTREGA.sql linhas 49-57Lê P.ST_CONTENTREGA em V_ST_CONTENTREGA e varia a query conforme o par (I_TP_ENTREGA, V_ST_CONTENTREGA). Quando V_ST_CONTENTREGA = 'P', o INNER JOIN ITEM força I.TP_ITEM <> 'S' (linha 78). Caso <> 'P' (valor S), não filtra serviços (linha 121)
VIEW_CONTROLEENTREGA2Scripts/VIEW_CONTROLEENTREGA2.sql linhas 56-63Apesar do nome da variável ser V_ST_CONTENTREGA, o SELECT lê P.ST_ENTREGA (linha 60) - ou seja, a procedure 2 na verdade usa ST_ENTREGA para decidir entre Pedido/Nota/Ambos, apesar do identificador sugerir o contrário. Confunde ao ler, mas é o que está em produção
CarregarControleEntregasource/jControleEntrega/UDadosEntrega.pas linhas 102-160Recebe o valor em Parametros[6]. Linha 151: if (Parametros[6] = 'P') then iTp := iTp + ' AND I.TP_ITEM <> ''S'' '; - quando = 'P' aplica filtro que remove serviços do grid de agendamento
ControleEntrega (wrapper)source/jControleEntrega/jEntrega.pasFunção pública que repassa iParametros para CarregarControleEntrega

Campos envolvidos​

Tabela.CampoTipoDescrição
PARMFATUR.ST_CONTENTREGACHAR(1) / FixedCharO próprio parâmetro (UdmMFA001.dfm:1313-1318)
PARMFATUR.ST_ENTREGACHAR(1)Parâmetro "pai" - quando = 'N', desabilita este combo (UMFA001.pas:1878)
ITEM.TP_ITEMCHAR(1)Coluna filtrada: <> 'S' (não Serviço) quando ST_CONTENTREGA = 'P'
CONTROLEENTREGA.CD_ITEMVARCHARTabela-alvo do agendamento de entrega (populada após o filtro deste parâmetro)

Opções disponíveis​

P - Produto​

O que fazDetalhe
Itens no agendamentoSomente produtos (itens com ITEM.TP_ITEM <> 'S')
Grid de TfrmEntregaOculta serviços - filtro AND I.TP_ITEM <> 'S' é adicionado em UDadosEntrega.pas:151-152
VIEW_CONTROLEENTREGA (pedido)Ramo IF (( I_TP_ENTREGA = 'P' )AND(V_ST_CONTENTREGA = 'P')) em VIEW_CONTROLEENTREGA.sql:62 - gera SELECT com INNER JOIN ITEM I ON (NI.CD_ITEM = I.CD_ITEM AND I.TP_ITEM <> 'S') (linha 78)
VIEW_CONTROLEENTREGA (nota)Ramo IF (( I_TP_ENTREGA = 'S' ) AND (V_ST_CONTENTREGA = 'P')) em VIEW_CONTROLEENTREGA.sql:238 - mesmo filtro para notas
HabilitaçãoCombo só é editável se ST_ENTREGA <> 'N' (UMFA001.pas:1868-1872)

Simulação passo a passo​

  1. Em MFA001 → aba Controle Entrega → Controle de Entrega (ST_ENTREGA) = Pedido Atendido (P)
  2. No mesmo grupo, Controla Item (cmbST_CONTENTREGA) fica habilitado → selecione Produto (P)
  3. Salve os parâmetros (F6) - PARMFATUR.ST_CONTENTREGA = 'P'
  4. Abra um Pedido em MPD002, inclua um produto (ex.: I001 - Pneu, TP_ITEM = 'P') e um serviço (ex.: S100 - Montagem, TP_ITEM = 'S')
  5. Salve o pedido → bloco ControleEntrega dispara (UMPD002.pas:3236-3257) passando ParametrosEntrega[6] = 'P'
  6. CarregarControleEntrega (UDadosEntrega.pas:151) aplica AND I.TP_ITEM <> 'S' → abre TfrmEntrega mostrando apenas o produto I001; o serviço S100 não aparece para agendamento
  7. Em MNF016 (pesquisa), a VIEW_CONTROLEENTREGA devolve somente registros de produtos

Resultado esperado: O controle de entrega trabalha apenas com produtos físicos. Serviços seguem direto no pedido/nota mas não entram na agenda de entrega - comportamento padrão para empresas que entregam produtos e executam serviços no ato (ex.: montagem de pneu na loja).


S - Produto e Serviço​

O que fazDetalhe
Itens no agendamentoProdutos E serviços - nenhum filtro por TP_ITEM é aplicado
Grid de TfrmEntregaA condição if (Parametros[6] = 'P') em UDadosEntrega.pas:151 não é satisfeita, iTp não recebe o filtro → todos os itens aparecem
VIEW_CONTROLEENTREGA (pedido)Ramo IF (( I_TP_ENTREGA = 'P' ) AND (V_ST_CONTENTREGA <> 'P')) em VIEW_CONTROLEENTREGA.sql:105 - SELECT com INNER JOIN ITEM I ON (NI.CD_ITEM = I.CD_ITEM) sem o I.TP_ITEM <> 'S' (linha 121)
VIEW_CONTROLEENTREGA (nota)Ramo IF (( I_TP_ENTREGA = 'S' ) AND (V_ST_CONTENTREGA <> 'P')) em VIEW_CONTROLEENTREGA.sql:298
Cenário típicoEmpresas onde o serviço também é entregue em domicílio (instalação, assistência técnica) e precisa ser agendado

Simulação passo a passo​

  1. Em MFA001 → Controle de Entrega (ST_ENTREGA) = Pedido Atendido (P)
  2. Controla Item (cmbST_CONTENTREGA) = Produto e Serviço (S)
  3. Salve os parâmetros (F6) - PARMFATUR.ST_CONTENTREGA = 'S'
  4. Abra um pedido em MPD002 com um produto (I001 - Ar-condicionado) e um serviço (S050 - Instalação)
  5. Salve o pedido → ControleEntrega recebe ParametrosEntrega[6] = 'S'
  6. Como Parametros[6] <> 'P', o if em UDadosEntrega.pas:151 é falso → iTp fica vazio → abre TfrmEntrega listando ambos os itens (produto + serviço) para agendar entrega/instalação
  7. Em MNF016, a VIEW_CONTROLEENTREGA retorna ambos, pois o ramo do ELSE (V_ST_CONTENTREGA <> 'P') não aplica I.TP_ITEM <> 'S'

Resultado esperado: Tanto produtos quanto serviços são agendáveis no controle de entrega. Útil para empresas de instalação/montagem que precisam controlar data/motorista/ajudante do serviço executado no cliente.


Tabela Comparativa Resumida​

OpçãoNomeFiltro em TfrmEntregaFiltro em VIEW_CONTROLEENTREGACenário típico
PProduto (padrão)AND I.TP_ITEM <> 'S'INNER JOIN ITEM I ON (... AND I.TP_ITEM <> 'S')Entrega apenas de produtos físicos; serviço executado no balcão
SProduto e ServiçoSem filtroINNER JOIN ITEM I ON (NI.CD_ITEM = I.CD_ITEM)Serviço também é entregue/executado em domicílio

Interação com outros parâmetros​

  • ST_ENTREGA: parâmetro "pai". Quando = 'N', cmbST_ENTREGAChange (UMFA001.pas:1878) desabilita cmbST_CONTENTREGA (impossível editar). Quando <> 'N', o combo é habilitado (UMFA001.pas:1870).
  • ST_ENTREGACONSUMIDORFINAL, TP_MOVCONTENTREGA, ST_CONFIRMAENTREGAREMESSA: demais parâmetros da mesma aba - todos condicionados à mesma regra (ST_ENTREGA <> 'N').
  • ST_CONTENTREGACONF (não confundir): campo diferente, controla conferência de entrega por separação em OS/Pedido (usado em MPD002, MPD005, MOF001). ST_CONTENTREGA é "Controla Item", ST_CONTENTREGACONF é "Controla Conferência".

Armadilha conhecida no SQL​

O script Scripts/VIEW_CONTROLEENTREGA2.sql linha 60 declara a variável V_ST_CONTENTREGA mas o SELECT carrega P.ST_ENTREGA (não P.ST_CONTENTREGA):

DECLARE VARIABLE V_ST_CONTENTREGA DOM_CHAR1;
...
-- BUSCA PARAMETRO "CONTROLE DE ENTREGA DE" [MFA001]
SELECT P.ST_ENTREGA -- <<< mapeia para o campo "errado"
FROM PARMFATUR P
WHERE P.CD_EMPRESA = :I_CD_EMPRESA
INTO :V_ST_CONTENTREGA;

Portanto, as comparações V_ST_CONTENTREGA = 'P', 'H', 'T', 'S' em VIEW_CONTROLEENTREGA2.sql (linhas 67, 119, 191, 196) na prática testam o parâmetro ST_ENTREGA, não ST_CONTENTREGA. É um nome de variável enganoso mantido assim em produção. Já o VIEW_CONTROLEENTREGA (sem o "2") lê corretamente P.ST_CONTENTREGA (linha 54).


Referências no Código Fonte​

ComboBox e valor padrão​

ArquivoLinha(s)Trecho
source/MFA001/UMFA001.dfm11234-11260cmbST_CONTENTREGA: TwwDBComboBox com Items.Strings = ('Produto'#9'P', 'Produto e Serviço'#9'S')
source/MFA001/UMFA001.pas516Declaração cmbST_CONTENTREGA: TwwDBComboBox
source/MFA001/UMFA001.pas1870, 1878cmbST_ENTREGAChange habilita/desabilita o combo conforme ST_ENTREGA
source/MFA001/UdmMFA001.dfm1313-1318Campo tabPARMFATURST_CONTENTREGA (FieldName = 'ST_CONTENTREGA', FixedChar = True, Size = 1)
source/MFA001/UdmMFA001.pas169Declaração tabPARMFATURST_CONTENTREGA: TStringField
source/MFA001/UdmMFA001.pas497AfterInsert: tabPARMFATURST_CONTENTREGA.AsString := 'P' (valor padrão)
source/MFA001/UdmMFA001.dfm176, 2395, 3056ST_CONTENTREGA nos SELECTs do tabPARMFATUR
source/MFA001/UdmMFA001.dfm2557, 2779ST_CONTENTREGA nos INSERT/UPDATE gerados pelo FireDAC

Consumidores (leem o parâmetro)​

ArquivoLinhaUso
source/MPD002/UMPD002.pas3245ParametrosEntrega[6] := parmfatur.values['ST_CONTENTREGA']
source/MPD002/UdmMPD002.pas5745SELECT ... P.ST_CONTENTREGA ... FROM PARMFATUR P
source/MNF002/UMNF002.pas4583ParametrosEntrega[6] := parmfatur.values['ST_CONTENTREGA']
source/MNF002/UdmMNF002.pas10498SELECT ... P.ST_CONTENTREGA ...
source/MPD011/UNFORDEM.pas837ParametrosEntrega[6] := parmfatur.values['ST_CONTENTREGA']
source/MPD020/UdmMPD020.pas241, 324, 368Declara iST_CONTENTREGA, seleciona ST_CONTENTREGA, armazena Resultado[31]
source/MPD020/UMPD020.pas958ParametrosEntrega[6] := dmMPD020.iST_CONTENTREGA
source/MNF017/UdmMNF017.pas286Declaração iST_CONTENTREGA
source/MNF017/UMNF017.pas164, 200SELECT e dmMNF017.iST_CONTENTREGA := Resultado[26]
source/MNF017/uMNF017ConfPedido.pas1138, 1876Duas chamadas de ControleEntrega passando iST_CONTENTREGA em [6]
source/MNF019/UdmMNF019.pas451, 633, 654Declara e carrega iST_CONTENTREGA
source/MNF019/UMNF019.pas1875ParametrosEntrega[6] := dmMNF019.iST_CONTENTREGA
source/MNF008/UdmMNF008.pas763SELECT ... P.ST_CONTENTREGA ...
source/MCO006/UdmMCO006.pas2107SELECT ... P.ST_CONTENTREGA ...
source/jControleEntrega/UDadosEntrega.pas118, 151-152Comentário do parâmetro 6 e uso efetivo: if (Parametros[6] = 'P') then iTp := iTp + 'AND I.TP_ITEM <> ''S'''

Scripts SQL (Firebird)​

ArquivoLinhaUso
Scripts/VIEW_CONTROLEENTREGA.sql49, 54-57Declara V_ST_CONTENTREGA e carrega com SELECT P.ST_CONTENTREGA ...
Scripts/VIEW_CONTROLEENTREGA.sql62, 78Ramo I_TP_ENTREGA = 'P' AND V_ST_CONTENTREGA = 'P' - aplica I.TP_ITEM <> 'S'
Scripts/VIEW_CONTROLEENTREGA.sql105, 121Ramo V_ST_CONTENTREGA <> 'P' - SELECT sem filtro de TP_ITEM
Scripts/VIEW_CONTROLEENTREGA.sql149, 192, 238, 298Demais ramos para I_TP_ENTREGA = 'H' e 'S' cruzando com V_ST_CONTENTREGA
Scripts/VIEW_CONTROLEENTREGA2.sql56, 60, 63Declara V_ST_CONTENTREGA mas lê P.ST_ENTREGA (nome enganoso - ver Armadilha acima)