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ódulo | Código | Uso |
|---|
| Parâmetros de Faturamento | MFA001 | Único local de configuração (cmbST_CONTENTREGA) |
| Pedido de Venda | MPD002 | Lê o valor da PARMFATUR e passa em ParametrosEntrega[6] para ControleEntrega(...) (UMPD002.pas:3245) |
| Nota Fiscal de Saída | MNF002 | Idem - passa em ParametrosEntrega[6] (UMNF002.pas:4583) |
| Gerar NF de Ordem/Cotação | MPD011 | Passa o valor em ParametrosEntrega[6] ao transformar ordem em NF (UNFORDEM.pas:837) |
| Venda Mobile / Pré-venda | MPD020 | Carrega em dmMPD020.iST_CONTENTREGA e envia em ParametrosEntrega[6] (UdmMPD020.pas:368, UMPD020.pas:958) |
| Conferência de Pedido para NF | MNF017 | Armazena em dmMNF017.iST_CONTENTREGA (UMNF017.pas:200) e usa em duas chamadas ControleEntrega (uMNF017ConfPedido.pas:1138 e :1876) |
| Agendamento/Pesquisa de Entregas | MNF019 | Carrega em dmMNF019.iST_CONTENTREGA (UdmMNF019.pas:654) e usa em ParametrosEntrega[6] (UMNF019.pas:1875) |
| Pesquisa de Controle de Entrega | MNF016 | Chama VIEW_CONTROLEENTREGA2(...) que lê internamente o parâmetro (UMNF016.pas:620,1037) |
| Digitação de Nota de Entrega | MNF007 | Chama VIEW_CONTROLEENTREGA e VIEW_CONTROLEENTREGA2 (UdmMNF007.dfm:3145,3186, UdmMNF007.pas:5092,5119) |
| Requisição (Layout N) | REQ001 | Chama VIEW_CONTROLEENTREGA2(...) (UREQ001.pas:1719) |
| Consulta interna de parâmetros | MNF008, MCO006 | Lê P.ST_CONTENTREGA junto com outros parâmetros (UdmMNF008.pas:763, UdmMCO006.pas:2107) |
Procedures/Views impactadas
| Objeto | Arquivo | Papel |
|---|
VIEW_CONTROLEENTREGA | Scripts/VIEW_CONTROLEENTREGA.sql linhas 49-57 | Lê 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_CONTROLEENTREGA2 | Scripts/VIEW_CONTROLEENTREGA2.sql linhas 56-63 | Apesar 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 |
CarregarControleEntrega | source/jControleEntrega/UDadosEntrega.pas linhas 102-160 | Recebe 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.pas | Função pública que repassa iParametros para CarregarControleEntrega |
Campos envolvidos
| Tabela.Campo | Tipo | Descrição |
|---|
PARMFATUR.ST_CONTENTREGA | CHAR(1) / FixedChar | O próprio parâmetro (UdmMFA001.dfm:1313-1318) |
PARMFATUR.ST_ENTREGA | CHAR(1) | Parâmetro "pai" - quando = 'N', desabilita este combo (UMFA001.pas:1878) |
ITEM.TP_ITEM | CHAR(1) | Coluna filtrada: <> 'S' (não Serviço) quando ST_CONTENTREGA = 'P' |
CONTROLEENTREGA.CD_ITEM | VARCHAR | Tabela-alvo do agendamento de entrega (populada após o filtro deste parâmetro) |
Opções disponíveis
P - Produto
| O que faz | Detalhe |
|---|
| Itens no agendamento | Somente produtos (itens com ITEM.TP_ITEM <> 'S') |
Grid de TfrmEntrega | Oculta 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ção | Combo só é editável se ST_ENTREGA <> 'N' (UMFA001.pas:1868-1872) |
Simulação passo a passo
- Em MFA001 → aba Controle Entrega → Controle de Entrega (
ST_ENTREGA) = Pedido Atendido (P)
- No mesmo grupo, Controla Item (
cmbST_CONTENTREGA) fica habilitado → selecione Produto (P)
- Salve os parâmetros (F6) -
PARMFATUR.ST_CONTENTREGA = 'P'
- Abra um Pedido em MPD002, inclua um produto (ex.:
I001 - Pneu, TP_ITEM = 'P') e um serviço (ex.: S100 - Montagem, TP_ITEM = 'S')
- Salve o pedido → bloco
ControleEntrega dispara (UMPD002.pas:3236-3257) passando ParametrosEntrega[6] = 'P'
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
- 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 faz | Detalhe |
|---|
| Itens no agendamento | Produtos E serviços - nenhum filtro por TP_ITEM é aplicado |
Grid de TfrmEntrega | A 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ípico | Empresas 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
- Em MFA001 → Controle de Entrega (
ST_ENTREGA) = Pedido Atendido (P)
- Controla Item (
cmbST_CONTENTREGA) = Produto e Serviço (S)
- Salve os parâmetros (F6) -
PARMFATUR.ST_CONTENTREGA = 'S'
- Abra um pedido em MPD002 com um produto (
I001 - Ar-condicionado) e um serviço (S050 - Instalação)
- Salve o pedido →
ControleEntrega recebe ParametrosEntrega[6] = 'S'
- 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
- 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ção | Nome | Filtro em TfrmEntrega | Filtro em VIEW_CONTROLEENTREGA | Cenário típico |
|---|
| P | Produto (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 |
| S | Produto e Serviço | Sem filtro | INNER JOIN ITEM I ON (NI.CD_ITEM = I.CD_ITEM) | Serviço também é entregue/executado em domicílio |
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;
...
SELECT P.ST_ENTREGA
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
| Arquivo | Linha(s) | Trecho |
|---|
source/MFA001/UMFA001.dfm | 11234-11260 | cmbST_CONTENTREGA: TwwDBComboBox com Items.Strings = ('Produto'#9'P', 'Produto e Serviço'#9'S') |
source/MFA001/UMFA001.pas | 516 | Declaração cmbST_CONTENTREGA: TwwDBComboBox |
source/MFA001/UMFA001.pas | 1870, 1878 | cmbST_ENTREGAChange habilita/desabilita o combo conforme ST_ENTREGA |
source/MFA001/UdmMFA001.dfm | 1313-1318 | Campo tabPARMFATURST_CONTENTREGA (FieldName = 'ST_CONTENTREGA', FixedChar = True, Size = 1) |
source/MFA001/UdmMFA001.pas | 169 | Declaração tabPARMFATURST_CONTENTREGA: TStringField |
source/MFA001/UdmMFA001.pas | 497 | AfterInsert: tabPARMFATURST_CONTENTREGA.AsString := 'P' (valor padrão) |
source/MFA001/UdmMFA001.dfm | 176, 2395, 3056 | ST_CONTENTREGA nos SELECTs do tabPARMFATUR |
source/MFA001/UdmMFA001.dfm | 2557, 2779 | ST_CONTENTREGA nos INSERT/UPDATE gerados pelo FireDAC |
Consumidores (leem o parâmetro)
| Arquivo | Linha | Uso |
|---|
source/MPD002/UMPD002.pas | 3245 | ParametrosEntrega[6] := parmfatur.values['ST_CONTENTREGA'] |
source/MPD002/UdmMPD002.pas | 5745 | SELECT ... P.ST_CONTENTREGA ... FROM PARMFATUR P |
source/MNF002/UMNF002.pas | 4583 | ParametrosEntrega[6] := parmfatur.values['ST_CONTENTREGA'] |
source/MNF002/UdmMNF002.pas | 10498 | SELECT ... P.ST_CONTENTREGA ... |
source/MPD011/UNFORDEM.pas | 837 | ParametrosEntrega[6] := parmfatur.values['ST_CONTENTREGA'] |
source/MPD020/UdmMPD020.pas | 241, 324, 368 | Declara iST_CONTENTREGA, seleciona ST_CONTENTREGA, armazena Resultado[31] |
source/MPD020/UMPD020.pas | 958 | ParametrosEntrega[6] := dmMPD020.iST_CONTENTREGA |
source/MNF017/UdmMNF017.pas | 286 | Declaração iST_CONTENTREGA |
source/MNF017/UMNF017.pas | 164, 200 | SELECT e dmMNF017.iST_CONTENTREGA := Resultado[26] |
source/MNF017/uMNF017ConfPedido.pas | 1138, 1876 | Duas chamadas de ControleEntrega passando iST_CONTENTREGA em [6] |
source/MNF019/UdmMNF019.pas | 451, 633, 654 | Declara e carrega iST_CONTENTREGA |
source/MNF019/UMNF019.pas | 1875 | ParametrosEntrega[6] := dmMNF019.iST_CONTENTREGA |
source/MNF008/UdmMNF008.pas | 763 | SELECT ... P.ST_CONTENTREGA ... |
source/MCO006/UdmMCO006.pas | 2107 | SELECT ... P.ST_CONTENTREGA ... |
source/jControleEntrega/UDadosEntrega.pas | 118, 151-152 | Comentário do parâmetro 6 e uso efetivo: if (Parametros[6] = 'P') then iTp := iTp + 'AND I.TP_ITEM <> ''S''' |
Scripts SQL (Firebird)
| Arquivo | Linha | Uso |
|---|
Scripts/VIEW_CONTROLEENTREGA.sql | 49, 54-57 | Declara V_ST_CONTENTREGA e carrega com SELECT P.ST_CONTENTREGA ... |
Scripts/VIEW_CONTROLEENTREGA.sql | 62, 78 | Ramo I_TP_ENTREGA = 'P' AND V_ST_CONTENTREGA = 'P' - aplica I.TP_ITEM <> 'S' |
Scripts/VIEW_CONTROLEENTREGA.sql | 105, 121 | Ramo V_ST_CONTENTREGA <> 'P' - SELECT sem filtro de TP_ITEM |
Scripts/VIEW_CONTROLEENTREGA.sql | 149, 192, 238, 298 | Demais ramos para I_TP_ENTREGA = 'H' e 'S' cruzando com V_ST_CONTENTREGA |
Scripts/VIEW_CONTROLEENTREGA2.sql | 56, 60, 63 | Declara V_ST_CONTENTREGA mas lê P.ST_ENTREGA (nome enganoso - ver Armadilha acima) |