Vai al contenuto

COGG69HT -- Inserimento Buoni di Prelievo (variante terminalino)

Sorgente: cbl/cogg69ht.cbl | Tipo: Programma con interfaccia grafica (lettura terminalino/pistola) | Program-ID: COGG69HT

Menu: Non presente nel menu. E' la variante personalizzata richiamata dal dispatcher COGG69 (versione "HT" = handheld terminal).


Scopo

Variante personalizzata di COGG69 per l'inserimento dei Buoni di Prelievo (BDP) tramite terminalino o pistola di lettura barcode. Rispetto alla versione standard, gestisce l'evasione di commesse di produzione con lotti e l'assemblaggio tramite COGG77, oltre alla creazione/chiusura dei BDP provvisori "Packaging".

L'operatore legge in sequenza: codice operatore, consegna cliente, codici articolo/lotto e quantita'. Il programma costruisce una griglia di transito e, alla conferma (F3), crea uno o piu' BDP.

Sono previste due modalita' di evasione, alternabili a video con F5 o F7 (in qualsiasi momento, anche dopo aver letto l'operatore):

  • Modula (tm-modula = "S", default): evasione di una lista Modula. E' la modalita' standard, con i controlli interattivi (conferma BDP).
  • Evadi accantonato / Packaging (tm-evadi-accantonato = "S"): evasione attingendo ai BDP provvisori "Packaging" del cliente, con quadratura, eventuale sdoppiamento e chiusura dei provvisori.

La precedente acquisizione batch da terminalino (paragrafi x5-emulazione-tast / x6-sca-terminalino via COGU60) e' stata rimossa.


File e tabelle utilizzati

File/Tabella Tipo Descrizione
COGTABEL (feurtab) Input Tabella generica
COGGEANA (ana) Input Anagrafiche clienti
COGMERCI (mer) Input Anagrafica articoli (anche chiave EAN)
COGMERLT (mlt) Input Lotti merce
COGRACMC (rcm) Input Codici merce avanzati
COGCONOR (cor) Input Righe consegna
COGTESOR (tor) Input Testate ordine
COGLAVOR (cla) Input Commesse di lavorazione/produzione
COGISIRR (isir) Input Approvazioni ISIR (blocco evasione merce in approvazione)
PRNTOPER (ptop) Input Operatori
COGTESBP (tbp) I-O Testate BDP
COGRIGBP (rbp) I-O Righe BDP
COGTBPAP (tb2) I-O Stato invio BDP a Modula (flag tb2-invio-modula-prev / tb2-inviato-modula); valorizzata sui provvisori creati dallo sdoppiamento
TRAN-G77 Transito Tabella di transito assemblaggio COGG77
TRAN-S26 Transito (external) Tabella di transito

Chiamate a sottoprogrammi (CALL)

Programma Scopo
COGG77 Assemblaggio / evasione commesse collegate
COGM65 Consultazione BDP del cliente (S-F8)
COGSA0 Creazione BDP singolo (CREA-BDP-SINGOLO): crea il provvisorio per il "resto" nello sdoppiamento
COGU12 Aggiornamento giacenze e prenotato (movimentazione)
COGS25 Numeratore documenti (numero testata BDP)
COGU10W Recupero divisa di conto
WIN006 / WIN159 Ricerca cliente / ricerca codice merce avanzato
GRIDADMN Gestione avanzata della griglia (S-F4)

Copybook principali

  • cogg69ht.select, cogg69ht.fd, cogg69ht.wrk, cogg69ht.scr, cogg69ht.prc, cogg69ht.decla -- generati da Screens
  • feurtab.fd, cogfiles.cpy -- tabella generica COGTABEL
  • tran-g77.fd / tran-g77.cpy, tran-s26.fd / tran-s26.cpy -- tabelle di transito
  • cogrigbp.k03 (chia3 = cli+merce+data), cogrigbp.k04, cogmdrig.k02 -- chiavi secondarie (aggiunte manualmente: Screens genera solo la primaria)
  • utilcogg77.cpy, utilcogm65.cpy, utilu12.cpy, utilcogsa0.cpy -- linkage sottoprogrammi (COGG77 / COGM65 / COGU12 / COGSA0)
  • wgrid.cpy, utilgdad.cpy, utildlg.cpy -- gestione griglia/dialoghi
  • wgrave.cpy, wnscr.cpy, wopenf.cpy, wstato.cpy, cogazien.cpy, utilncnf.cpy, utilgesdebug.cpy -- standard

Logica di elaborazione

Lettura dati (a-tm-lettura)

Ogni lettura viene interpretata per tipo:

  • C-nnnnn / C-stringa: ricerca cliente (diretta o alfabetica via WIN006).
  • Codice operatore (se non ancora letto).
  • .xxx: codice cartellino.
  • Codice consegna (12 o 16 cifre, con o senza riga): x1-cerca-consegna -- recupera ordine, cliente, divisa; rifiuta consegne chiuse o legate a ordini chiusi.
  • Codice lotto merce nel formato GGSSCCCCCMLLLLLL (lettura COGMERLT).
  • Codice merce avanzato (COGRACMC) o codice EAN (COGMERCI chiave 2).
  • Quantita' (con o senza virgola).

S-F8 apre COGM65 per consultare i BDP del cliente attivo (testate stato "A", ultimi ~10000 giorni). F5 o F7 alternano la modalita' di evasione tra Modula e Evadi accantonato (il tasto F7 e' sempre attivo; il tasto F5 e' attivo in modalita' Modula con almeno una riga in tabella). La precedente azione "F5 dettaglio griglia" non e' piu' attiva: entrambi i tasti ora commutano la modalita'.

Aggiunta merce in tabella (x2-nuova-merce)

Verifica esistenza articolo e blocco ISIR (merce in fase di approvazione con BDP gia' agganciato -> evasione non consentita). Per gli articoli da produrre/assemblare richiama x21-aggiungo-merce -> COGG77.

Per default non e' consentito inserire piu' di una riga nel BDP (tm-cfg-split-bdp <> "S"); nel programma tm-cfg-split-bdp viene forzato a "S".

Commesse collegate e lotti (x212-aggiungi-commessa-collegata)

Se la richiesta di evasione e' gia' collegata a una commessa di lavorazione (COGLAVOR), aggancia la commessa e valorizza i campi lotto della riga (tm-ll-merce, tm-ll-prog, tm-ll-mag, tm-ll-lotto) dai dati correnti della riga di prelievo.

Aggancio consegna (x22-cerca-consegna)

Cerca la riga di consegna da scaricare: prima tramite la commessa di produzione (COGLAVOR -> COGCONOR), poi tramite la prima riga disponibile della consegna letta.

Conferma e creazione BDP (x3-aggiorna)

Validazioni finali, poi creazione testata BDP (numeratore COGS25) e righe. Per ciascuna riga richiama COGU12 per la movimentazione giacenza/prenotato. Se e' presente un ISIR la testata viene marcata provvisoria (tbp-fl-provvisorio = "P").


Quadratura e chiusura BDP provvisori "Packaging"

L'accantonamento merce dal reparto packaging avviene tramite BDP provvisori (testata con tbp-fl-provvisorio = "P") sul magazzino principale. Quando si evade attingendo agli accantonamenti (modalita' Evadi accantonato, tm-evadi-accantonato = "S"), questi provvisori vanno quadrati con la quantita' in evasione e poi chiusi (prenotato rilasciato), per evitare doppie allocazioni.

Dispatcher di quadratura (x3-quadra-provvisori)

Pianificato in x3-aggiorna, prima della scrittura del BDP (solo se tm-ok-aggio <> "N"). Raccoglie sempre i provvisori (x3-collect-provvisori), poi:

  • se tm-evadi-accantonato = "S" -> ramo Packaging: esegue la quadratura/sdoppiamento (x3-quadra-piano);
  • altrimenti ramo Modula (default): se esistono comunque provvisori per quel cliente/lotto/merce (pv-coll-pnt > 0), avvisa l'operatore (x3-avviso-provvisori-non-usati) che sta evadendo da Modula senza usare gli accantonamenti, e in caso di mancata conferma pone tm-ok-aggio = "N".

Raccolta provvisori (x3-collect-provvisori)

Scorre COGRIGBP per chiave chia3 (st-cogrigbp-notmin-chia3) filtrando per rbp-cli = tm-cli e rbp-merce = tm-merce (1); per ogni riga con rbp-lotto = tm-lotto-int (1) e rbp-consegna = tm-riga-cons (1) legge la testata COGTESBP (tbp-chia1 = rbp-testa) e, se provvisoria (tbp-fl-provvisorio = "P") e non chiusa (tbp-fl-cls <> "C"), accumula chiave (rbp-testa) e quantita' (rbp-qta) in pv-coll-tab (max 100 elementi).

La condizione rbp-consegna = tm-riga-cons (1) restringe la quadratura alla sola consegna in evasione: i provvisori sono per-consegna e chiudere/sdoppiare quelli di un altro ordine ne rilascerebbe il prenotato senza evaderlo. rbp-consegna non fa parte di chia3 (che rompe su rbp-cli + rbp-merce), quindi e' un filtro interno, non condizione di rottura chiave.

Quadratura per sottoinsiemi (x3-quadra-piano)

Cerca un insieme di provvisori la cui somma delle quantita' eguagli (o si avvicini al meglio per difetto) la quantita' in evasione tm-qta (1).

Guardia preliminare: se la modalita' e' packaging ma non esiste alcun provvisorio (pv-coll-pnt = 0), emette il messaggio "Nessun accantonamento packaging per questo cliente/lotto/merce" e blocca (tm-ok-aggio = "N").

  • Enumerazione esatta (fino a k-max-subset = 16 provvisori): x3-ss-incrementa enumera tutti i sottoinsiemi (vettore di flag pv-sel), cercando il match esatto e, in mancanza, il miglior sottoinsieme con somma <= tm-qta (1) (memorizzato in pv-best-sel / w-ss-best-sum). Oltre la soglia si usa il fallback greedy x3-quadra-greedy. Entrambi i percorsi impostano l'esito in w-caso.
  • Esito (A) match esatto (w-caso = "A"): chiude i provvisori del sottoinsieme, nessuno sdoppiamento.
  • Esito (C) residuo coperto da uno split (w-caso = "C"): residuo pv-residuo = tm-qta (1) - w-ss-best-sum; x3-trova-split-residuo individua il provvisorio non chiuso piu' piccolo (pv-split-idx) e marca w-sdp-da-fare = "S" per lo sdoppiamento successivo.
  • Esito (B) quantita' superiore a tutti gli accantonamenti (w-caso = "B"): nessun provvisorio da sdoppiare; verranno chiusi comunque tutti i provvisori esistenti (l'eccedenza e' merce non-packaging).

A differenza della versione precedente, lo sforamento parziale non blocca piu' incondizionatamente la creazione ne' apre COGM65: viene gestito tramite sdoppiamento del provvisorio (C) o conferma operatore (B).

Conferma con riepilogo (x3-riepilogo-conferma)

Determinato il piano, una conferma unica (acc-conf-custom) riepiloga l'operazione in base a w-caso: numero di BDP da chiudere e quantita' totale; per l'esito (C) il dettaglio dello sdoppiamento (BDP interessato, pz chiusi, pz lasciati nel nuovo BDP "resto"); per l'esito (B) l'avviso che la quantita' eccede gli accantonamenti. Se l'operatore non conferma con F3, pone tm-ok-aggio = "N" e la creazione del BDP viene bloccata.

Sul ramo Modula (default), in luogo del riepilogo, se esistono provvisori non utilizzati per quel cliente/lotto/merce scatta l'avviso x3-avviso-provvisori-non-usati (vedi dispatcher).

Chiusura e sdoppiamento (in x3-fine-righe, dopo la scrittura)

Eseguiti dopo la scrittura del BDP definitivo, solo se tm-evadi-accantonato = "S":

  • x3-chiudi-piano-provvisori scorre i provvisori marcati pv-coll-chiudi = "S" e per ciascuno (x3-chiudi-un-provvisorio) scorre tutte le righe (rbp-testa = pv-bdp-chia), accumula rbp-qta, rilascia il prenotato di ogni riga (x3-rilascia-prenotato-riga -> COGU12, tipo "P", qta-new = 0, nota "chiudi-provv"), pone tbp-fl-cls = "C" sulla testata e da' conferma a video;
  • se w-sdp-da-fare = "S", x3-sdoppia-e-chiudi opera sul provvisorio pv-split-idx: (1) riduce la riga originale a pv-residuo e detrae il prenotato corrispondente via COGU12; (2) crea un nuovo BDP provvisorio per il "resto" (w-sdp-qta-resto) chiamando COGSA0 (CREA-BDP-SINGOLO, cogsa0-i-fl-provv = "S") e registra lo stato di invio Modula su COGTBPAP (tb2-invio-modula-prev = "N", tb2-inviato-modula = "N"); (3) chiude l'originale ridotto (x3-chiudi-un-provvisorio).

Stampa etichetta e ripristino della chiave del definitivo (x3-fine-righe)

Dopo la scrittura, il dialog "Operazioni seguenti" (x3-agg-bol-ini/x3-agg-bol-acc) consente con F4 "Et. Sovrappacco" la stampa dell'etichetta del BDP: move tbp-chia1 to p78-documento + call "COGP78" (doc-tip "B"). Per il personal Artic Seals COGP78 delega subito a COGP78HT, che legge la chiave BDP da p78-bdp-mag/ann/num (campo che redefines p78-documento, utilp78.cpy) e ne risolve il lotto di produzione a partire dalla consegna/commessa della riga BDP (rbp-consegna -> COGCONOR -> COGLAVOR).

Problema: x3-chiudi-un-provvisorio esegue initialize tbp-rec + carica la chiave del provvisorio, quindi al termine della chiusura/sdoppiamento tbp-chia1 punta all'ultimo provvisorio chiuso, non al definitivo. Senza correzione il dialog di conferma, la stampa COGP78/COGP78HT e il certificato COGD76 userebbero la chiave sbagliata: in particolare, se il provvisorio chiuso e' di una consegna/commessa diversa, l'etichetta riporta un lotto di produzione errato dello stesso articolo (sintomo raro; la ristampa da COGM65, che passa la chiave del definitivo, e' corretta).

Correzione: in x3-fine-righe la chiave del definitivo viene salvata in w-bdp-stampa prima del ramo provvisori e ripristinata dopo le chiusure (move w-bdp-stampa to tbp-chia1 + perform rd-cogtesbp), cosi' tutti e tre i consumatori di tbp-chia1 (dialog conferma, stampa, certificato) operano sul BDP definitivo. La restrizione alla sola consegna in evasione (vedi Raccolta provvisori) mitiga di per se' il sintomo, ma il ripristino della chiave e' la correzione di fondo.

Esclusione dei provvisori dal calcolo del prenotato (x31-cerca-bdp)

Nel calcolo della quantita' gia' impegnata da BDP aperti vengono ora scartati sia i BDP chiusi (tbp-fl-cls = "C") sia quelli provvisori (tbp-fl-provvisorio = "P"). La precedente logica di esclusione dei BDP sul magazzino logistico non e' piu' usata: l'accantonamento non passa piu' dal magazzino logistico ma dai BDP provvisori sul magazzino principale.


Note tecniche

  • Le chiavi secondarie cogrigbp.k03 (cli+merce+data), cogrigbp.k04 e cogmdrig.k02 sono incluse manualmente nella catena di COPY a fine procedure division (Screens genera solo la chiave primaria).
  • I campi di lavoro della quadratura provvisori sono nei gruppi pv-* (pv-coll-tab con occurs 100, pv-cumulato, pv-residuo, vettori pv-sel / pv-best-sel) e w-sdp-* / w-ss-* (stato dell'enumerazione sottoinsiemi e dello sdoppiamento). La soglia oltre la quale si passa al greedy e' la 78 k-max-subset value 16.
  • Il marcatore *>DOC: nel sorgente segnala la separazione tra la pianificazione/quadratura (in x3-aggiorna -> x3-quadra-provvisori, prima della scrittura) e la chiusura/sdoppiamento effettivi (in x3-fine-righe, dopo la scrittura).

Storico modifiche

2026-04-04 -- Correzione assegnazione lotti in assemblaggio

Nel paragrafo x212-aggiungi-commessa-collegata i campi lotto della riga (tm-ll-merce, tm-ll-prog, tm-ll-mag, tm-ll-lotto) vengono valorizzati dai dati correnti della riga di prelievo dopo l'aggancio della commessa collegata. Nel caricamento dati in tabella corretta l'assegnazione dei campi lotto e commessa, ora basata sui valori x212-mlt-prog, x212-mlt-mag, x212-lotto, x212-cla-ann, x212-cla-num (al posto dei campi trs-g77-* che potevano contenere dati del ciclo precedente).

2026-06-23 -- Quadratura e chiusura dei BDP provvisori "Packaging"

Alla creazione del BDP definitivo viene introdotta la gestione di quadratura dei BDP provvisori "Packaging" del cliente: prima della scrittura (x3-aggiorna -> x3-quadra-provvisori) i provvisori compatibili vengono selezionati per chiave chia3 (cli+merce+data) confrontando la quantita' complessiva con quella in evasione; in caso di sforamento parziale la creazione viene bloccata e si apre COGM65. Dopo la scrittura (x3-fine-righe -> x3-chiudi-piano-provvisori) i provvisori selezionati vengono chiusi (tbp-fl-cls = "C") e il loro prenotato rilasciato via COGU12.

Inoltre, in x31-cerca-bdp i BDP provvisori (tbp-fl-provvisorio = "P") vengono esclusi dal calcolo del prenotato, sostituendo la precedente esclusione basata sul magazzino logistico (non piu' in uso). Aggiunte working pv-* e la chiave cogrigbp.k03.

Nota: questa revisione sostituisce l'impostazione "1 BDP -> 1 riga -> 1 consegna" basata sulla chiave consegna (chia4) descritta in precedenza nello storico di COGG69; l'aggancio dei provvisori da chiudere avviene ora per cliente+merce (chia3) con logica di quadratura sulle quantita'.

2026-06-24 -- Quadratura per sottoinsiemi, sdoppiamento BDP e doppia modalita' di evasione

Revisione della logica del 2026-06-23, allineata al sorgente corrente:

  • Doppia modalita' di evasione: i vecchi campi/modi tm-termi (terminalino) e tm-pistola sono stati rinominati in tm-evadi-accantonato (Packaging) e tm-modula (default), alternabili con F7. La modalita' batch da terminalino (x5-emulazione-tast / x6-sca-terminalino via COGU60, file OUT-U60-FILE) e' stata rimossa.
  • Quadratura per sottoinsiemi (x3-quadra-piano): la selezione "salta e continua" e' sostituita da un'enumerazione esatta dei sottoinsiemi (fino a k-max-subset = 16 provvisori, vettori pv-sel/pv-best-sel) con fallback greedy (x3-quadra-greedy). Tre esiti: (A) match esatto, (B) quantita' superiore a tutti gli accantonamenti -> conferma operatore, (C) residuo coperto da sdoppiamento.
  • Sdoppiamento BDP (x3-sdoppia-e-chiudi): nel caso (C) il provvisorio non chiuso piu' piccolo viene ridotto al residuo (con detrazione prenotato via COGU12) e il "resto" diventa un nuovo BDP provvisorio creato da COGSA0 (CREA-BDP-SINGOLO), con stato invio Modula registrato su COGTBPAP (tb2-invio-modula-prev/tb2-inviato-modula = "N").
  • Niente blocco/COGM65 su sforamento: lo sforamento parziale non blocca piu' incondizionatamente ne' apre COGM65; COGM65 resta solo per la consultazione BDP (S-F8). Nel ramo Modula, se esistono provvisori non usati, x3-avviso-provvisori-non-usati chiede conferma.
  • Copybook/file: aggiunti utilcogsa0.cpy, cogmdrig.k02 e il file COGTBPAP (tb2-*); rimossi COGU60 / OUT-U60-FILE. Nuove working w-sdp-*, w-ss-*, pv-sel/pv-best-sel.

2026-06-25 -- Restrizione alla consegna in evasione e fix etichetta

  • Quadratura ristretta alla consegna in evasione (x3-collect-provvisori): al filtro cli + merce + lotto e' aggiunta la condizione rbp-consegna = tm-riga-cons (1). I provvisori sono per-consegna: chiudere/sdoppiare quelli di un altro ordine ne rilascerebbe il prenotato senza evaderlo. La modifica restringe automaticamente anche la guardia preliminare e l'avviso del ramo Modula (stesso collect). Supera l'impostazione cross-consegna della revisione precedente.
  • Fix etichetta (lotto di produzione errato): la chiusura dei provvisori (x3-chiudi-un-provvisorio) lasciava tbp-chia1 sull'ultimo provvisorio chiuso; la stampa F4 (COGP78 -> COGP78HT per Artic Seals) ne ricavava il lotto di produzione dalla consegna/commessa, stampando un lotto errato dello stesso articolo quando il provvisorio era di una consegna diversa. In x3-fine-righe la chiave del definitivo viene ora salvata (w-bdp-stampa) prima del ramo provvisori e ripristinata dopo le chiusure (rd-cogtesbp), correggendo dialog di conferma, stampa e certificato COGD76.

2026-06-26 -- Commutazione modalita' su F5/F7 senza vincolo sull'operatore

La commutazione tra Modula ed Evadi accantonato non e' piu' legata al tasto F7 con operatore non ancora letto: ora sia F5 sia F7 alternano la modalita' (if f5 or f7) in qualsiasi momento, ed e' stata rimossa la guardia tm-ope = zero su x-attiva-f7-inverti (il tasto F7 e' sempre attivo). La precedente azione di F5 "dettaglio griglia" (salto a a2-90) e' stata disattivata (commentata). Rimossi i campi di lavoro w-sav-termi / w-sav-pistola non piu' utilizzati.


Documentazione tecnica -- aggiornata 2026-06-26