E' stata creata una Reusable Part che calcola il fabbisogno.
E' stata fatta un analisi abbastanza approfondita in modo da poterla usare in tutti i programmi ma per ora è stata usata solo dai buoni di prelievo, quindi quando deve essere richiamata da qualche altro programma potrebbe esserci il bisogno di implementarla con eventuali pezzi mancanti.
Il calcolo del fabbisogno deve essere richiamato per cartellino o per riga ordine.
La Reusable-Part si chiama PRED0001
Proprietà:
£p_Stagione - 'Stagione' (Obbligatorio)
£p_Cartellino - 'Numero Cartellino' (Se non viene passato viene preso 0)
£p_Ordine - 'Ordine' (Se non viene passato viene preso 0)
£p_Riga - 'Riga' (Se non viene passato viene preso 0)
£p_TogliScarti - 'Togliere Scarti/Ritardi' (Variabile booleana se non viene inizializzata viene preso il valore TRUE)
£p_DittaReparto - 'Ditta Reparto' (Se non viene passato viene preso ' ')
£p_TipoCalcolo - 'Tipo Calcolo da Effettuare' (Nei buoni indica il tipo calcolo da effettuare, può assumere i valori:
M - se si vogliono calcolare solo i materiali all'interno della DB al primo livello,
S - se si vogliono calcolare solo i materiali all'interno dei semilavorati,
X - se si vogliono esplodere tutti i materiali di un reparto su tutti i livelli, ossia sia materiali di PRVARG che materiali all'interno dei semilavorati;
se non viene passato vie impostato ad M)
£p_TipoFabbisogno - ('N-Normale, B-Buono') (Se non passato viene preso N)
£p_CalcoloperReparto - 'Calcolo per reparto, se FALSE calcolo per categoria' (Se non viene passato viene preso il valore TRUE)
£p_Reparto - 'Reparto a cui calcolare il fabbisogno' (Se non viene passato viene preso ' ')
£p_AllCat - 'Calcola tutte le categorie' (Variabile booleana se non viene inizializzata viene preso il valore FALSE)
£p_Categorie - 'Categorie da Calcolare' PASS(*BY_REFERENCE) (Se si vuole effettuare il calcolo per categorie questa Collection deve
contenere le categorie da calcolare, in questo caso la collection va creata nel programma chiamante; nel caso che venga effettuato il calcolo per reparto la collection viene creata nella Rp perchè vengono restituite indietro le categorie calcolate.)
£p_ListaMater - 'Oggetto record PRED0002 ritornato' (Reference della collection che contiene il risultato del calcolo)
Nella WAM in cui si deve calcolare il fabbisogno si deve definire la reusable-part e le due Collection
DEFINE_COM CLASS(£PRED0001) NAME(£vi_Fabbisogno)
DEFINE_COM CLASS(£PRIM_ACOL<£PRIM_ALPH>) NAME(£vi_ListaCat)
DEFINE_COM CLASS(£PRIM_ACOL<£PRED0002>) NAME(£vi_ListaMat)
DEFINE_COM CLASS(£PRIM_ALPH) NAME(£TMPCATEG) REFERENCE(*DYNAMIC)
Prima di richiamare il Calcolo del Fabbisogno si deve creare ed inizializzare la collection delle categorie, se necessario
£vi_ListaCat.RemoveAll
BEGIN_LOOP USING(£CC) TO(20)
SET_REF COM(£TMPCATEG) TO(*CREATE_AS £PRIM_ALPH)
£TMPCATEG.VALUE := £CAT£CC
£vi_ListaCat.Insert ITEM(£TMPCATEG)
SET_REF COM(£TMPCATEG) TO(*NULL)
END_LOOP
*
* Richiama la Reusable Part per il calcolo del Fabbisogno.
*
£vi_Fabbisogno.um_CalcolaFabbisogno P_CARTELLINO(£BUKBO) P_TIPOFABBISOGNO(B) P_STAGIONE(£BUKSTA) P_TIPOCALCOLO(£BUTPCALC) P_DITTAREPARTO(£RGRPET) P_REPARTO(£BURECO) P_ALLCAT(£ALLCAT) P_CATEGORIE(£vi_ListaCat) P_LISTAMATER(£vi_ListaMat) P_CALCOLOPERREPARTO(£CALCXREP)
A questo punto abbiamo la referenza alla collection del risultato e quindi dobbiamo lavorare su questa, questa collection ha all'interno un'altra collection per le quantità per taglia (se il materiale non è a taglie la collection contiene una sola entrata con taglia= '')
Le proprietà di questa collection sono:
up_PAKAR - 'Codice Articolo'
up_PAKNUP - 'Codice Numerata'
up_PACTME - 'Categoria Merceologica'
up_LEKRGT - 'Raggruppamento'
up_PRRGREPA - 'Reparto a cui si scarica il materiale'
up_PATP - 'Tipo Parte'
up_PAUMAR - 'Prima Unità di Misura'
up_PAUM2 - 'Seconda Unità di Misura'
up_QUANTITA - 'Punta alla lista interna delle taglie'
up_TAGLIA - 'Taglia da 4'
up_PRQTFAB - 'Fabbisogno'
up_PRQTFABEST - 'Fabbisogno con Seconda Unità di Misura'
up_PRQTORD - 'Quantità Riga ordine su cui è stato calcolato il fabbisogno'
up_TipoRecord - 'Stabilisce se si tratta di un Materiale o un Semilavorato')
Per leggere i dati della collection si devono eseguire due cicli FOR EACH, uno dentro l'altro:
*
* Legge la lista del risultato per scrivere i record su BUOM00F, BUTG00F e BUOS00F
*
FOR EACH(£ARTICOLO) IN(£vi_ListaMat)
*
* Inizializzo i campi
*
£PACTME := £ARTICOLO.up_PACTME
£BUKTG £BUTGKTG := £ARTICOLO.up_PAKNUP
£TOTQTA £TOTQTA2 := 0
* Lettura delle q.tà per Taglia
FOR EACH(£TAGLIA) IN(£ARTICOLO.up_QUANTITA)
*
* Sommo la Quantità da scrivere su BUOM00F o su BUOS00F
*
£TOTQTA += £TAGLIA.up_PRQTFAB
£TOTQTA2 += £TAGLIA.up_PRQTFABEST
IF COND(£BUKTG <> '')
£BUTG := £TAGLIA.up_TAGLIA
*
* Carico il risultato su BUTG00F
*
IF COND(£ARTICOLO.up_TipoRecord = '')
* Se si tratta di un materiale inizializzo il codice articolo e azzero il codice del semilavorato
£PAKAR := £ARTICOLO.up_PAKAR
£BUTGKS := ''
* Controllo se esiste il record
FETCH FIELDS(£BUQTTG £BUQTTE) FROM_FILE(BUTG01L) WITH_KEY(£BUCOD £PAKAR £BUTGKTG £BUTG)
IF_STATUS IS(*OKAY)
£BUQTTG += £TAGLIA.up_PRQTFAB
£BUQTTE += £TAGLIA.up_PRQTFAB
UPDATE FIELDS(£BUQTTG £BUQTTE) IN_FILE(BUTG01L)
ELSE
£BUQTTG £BUQTTE := £TAGLIA.up_PRQTFAB
£BUQTRS := 0
INSERT FIELDS(£BUCOD £PAKAR £BUTG £BUQTTG £BUTGKTG £BUQTTE £BUTGKS £BUQTRS) TO_FILE(BUTG00F)
ENDIF
ELSE
* Se si tratta di un semilavorato che andrà scritto su BUOS00F si deve azzerare l'articolo e inizializzare il codice del semilavorato
£BUTGKS := £ARTICOLO.up_PAKAR
£PAKAR := ''
* Controllo se esiste il record
FETCH FIELDS(£BUQTTG £BUQTTE) FROM_FILE(BUTG02L) WITH_KEY(£BUCOD £BUTGKS £BUTGKTG £BUTG)
IF_STATUS IS(*OKAY)
£BUQTTG += £TAGLIA.up_PRQTFAB
£BUQTTE += £TAGLIA.up_PRQTFAB
UPDATE FIELDS(£BUQTTG £BUQTTE) IN_FILE(BUTG01L)
ELSE
£BUQTTG £BUQTTE := £TAGLIA.up_PRQTFAB
£BUQTRS := 0
INSERT FIELDS(£BUCOD £PAKAR £BUTG £BUQTTG £BUTGKTG £BUQTTE £BUTGKS £BUQTRS) TO_FILE(BUTG00F)
ENDIF
ENDIF
£TOTQTA2 := £TOTQTA
ENDIF
ENDFOR
IF COND(£ARTICOLO.up_TipoRecord = '')
* Carico il record su BUOM00F
£PAKAR := £ARTICOLO.up_PAKAR
FETCH FIELDS(£BUQTA1 £BUPAI £BUKBO2) FROM_FILE(BUOM01L) WITH_KEY(£BUCOD £PAKAR £BUKTG)
IF_STATUS IS(*OKAY)
IF (£vi_ImpBuoni.up_Record.up_UnitadiMisura = 'I')
£BUQTA1 += £TOTQTA
ELSE
£BUQTA1 += £TOTQTA2
ENDIF
£BUQTA2 := £BUQTA1
£BURESID := 0
UPDATE FIELDS(£BUQTA1 £BUQTA2 £BUPAI £BUKBO2 £BURESID) IN_FILE(BUOM01L)
ELSE
IF (£vi_ImpBuoni.up_Record.up_UnitadiMisura = 'I')
£BUQTA1 £BUQTA2 := £TOTQTA
ELSE
£BUQTA1 £BUQTA2 := £TOTQTA2
ENDIF
£BURESID := 0
INSERT FIELDS(£BUCOD £PAKAR £BUQTA1 £BUQTA2 £PACTME £BUPAI £BUKTG £BUKBO2 £BURESID) TO_FILE(BUOM00F)
ENDIF
ELSE
* Carico il record su BUOS00F
ENDIF
ENDFOR