which included commits to RCS files with non-trunk default branches. git-svn-id: svn://10.65.10.50/trunk@1681 c028cbd2-c16b-5b4b-a496-9718f37d4682
219 lines
8.9 KiB
C++
Executable File
219 lines
8.9 KiB
C++
Executable File
// Classe che contiene i data members comuni a tutti gli oggetti di creazione
|
|
// e la funzione di scansione.
|
|
|
|
#include <applicat.h>
|
|
#include <strings.h>
|
|
#include <mask.h>
|
|
#include <tabutil.h>
|
|
#include <lffiles.h>
|
|
#include <rectypes.h>
|
|
#include <config.h>
|
|
#include <checks.h>
|
|
|
|
#include "ve6retv.h" // definizione dei valori di ritorno
|
|
#include "ve6.h"
|
|
#include "ve6000.h" // identificativi dei campi della maschera
|
|
|
|
class TElaborazioni : public TApplication
|
|
{
|
|
protected:
|
|
// i data members sono protected in modo che gli oggetti generatori
|
|
// possano accedervi senza la necessità di funzioni specifiche
|
|
TString_array *_chiavi; // array contenente i valori delle chiavi per ogni record selezionato da scan_doc
|
|
TString _codelab; // codice elaborazione differita
|
|
TElab_struct _elab; // struttura per memorizzare i campi significativi dei records di doc
|
|
int _ordinamento; // indica il tipo di ordinamento
|
|
bool _raggruppa; // indica se si deve raggruppare o no
|
|
|
|
int scan_doc (void); // lancia le altre due procedure
|
|
int run_mask (void); // lancia la maschera e scandisce i records
|
|
int get_info (void); // imposta la struttura elab leggendo il record per l'elaborazione corrente
|
|
bool errore_fatale(int); // ritorna true se l'errore passato come argomento è nella lista degli errori fatali
|
|
};
|
|
|
|
bool TElaborazioni::errore_fatale (int err)
|
|
{
|
|
switch (err)
|
|
{
|
|
case NO_ORG_DOCS:
|
|
case RECORD_WRITE_ERROR:
|
|
case ELAB_NOT_FOUND:
|
|
case DOC_TYPE_NOT_FOUND:
|
|
case READ_ERROR:
|
|
return TRUE;
|
|
default:
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
int TElaborazioni::get_info(void)
|
|
{
|
|
int err;
|
|
|
|
// informazioni dalla tabella elaborazioni differite
|
|
TTable t("ELD"); // tabella elaborazioni differite
|
|
t.zero();
|
|
t.put ("CODTAB", _codelab); // imposta il codice elaborazione da cercare
|
|
if (!(err = t.read (_isgteq))) // si posiziona sul record dell'elab. differita con codice cod_elab
|
|
{
|
|
error_box ("TElaborazioni::get_info() : errore di lettura %d da tab(ELD)", err);
|
|
return READ_ERROR;
|
|
}
|
|
if (t.get("CODTAB") != _codelab) // controlla se il codice trovato è proprio cod_tab
|
|
{
|
|
error_box ("TElaborazioni::get_info() : non esiste l'elaborazione con codice %s in tab(ELD)", (const char *)_codelab);
|
|
return ELAB_NOT_FOUND;
|
|
}
|
|
|
|
// Imposta i dati relativi all'elaborazione differita corrente
|
|
_elab.tipo_doc_org = t.get("S6"); // tipo documento originale
|
|
_elab.tipo_doc_des = t.get ("S8"); // tipo documento destinazione
|
|
_elab.stato_doc_ini = t.get ("S7"); // stato iniziale del documento originale
|
|
_elab.stato_doc_fin = t.get ("S9"); // stato finale (dopo l'elaborazione) del documento originale
|
|
_elab.codnum = t.get ("S5"); // codice numerazione per il documento finale
|
|
|
|
return 0;
|
|
}
|
|
|
|
int TElaborazioni::run_mask(void)
|
|
{
|
|
int err;
|
|
TMask *_msk = new TMask ("ve6000"); // carica la maschera
|
|
|
|
// Imposta il flag di autorizzazione agente
|
|
TTable t("TIP"); // tabella tipi documento
|
|
t.zero(); // azzera i campi
|
|
t.put ("CODTAB", _elab.tipo_doc_org); // tipo del documento originale
|
|
if (!(err = t.read (_isgteq))) // si posiziona sul record relativo al documento del tipo specificato
|
|
{
|
|
error_box ("TElaborazioni::run_mask() : errore di lettura %d da tab(TIP)", err);
|
|
return READ_ERROR;
|
|
}
|
|
if (t.get ("CODTAB") != _elab.tipo_doc_org) // verifica che il tipo di documento trovato sia quello richiesto
|
|
{
|
|
error_box ("TElaborazioni::run_mask() : non esiste il tipo documento %s in tab(TIP)", (const char *)_elab.tipo_doc_org);
|
|
return DOC_TYPE_NOT_FOUND;
|
|
}
|
|
TFilename profilo(t.get ("S4")); // nome del profilo documento (nome del .ini associato al tipo documento originale)
|
|
profilo.ext("ini"); // necessario per aggiungere l'estensione
|
|
TConfig profilo_doc(profilo); // oggetto configurazione (file ini del documento)
|
|
TConfig p(CONFIG_DITTA); // crea l'oggetto per rilevare l'autorizzazione dall'ini della ditta
|
|
// gestione agente abilitata <==> abilitata in profilo documento e nell'ini della ditta
|
|
int agente = (profilo_doc.get_int ("CODAG", "PROFILO") && p.get_int("AGENTE", "VE"));
|
|
|
|
/* se il flag per la gestione agenti è != 0, allora visualizza i campi agente ed
|
|
adotta la stessa convenzione usata per codice cliente e zona per gestire l'eventualita' che
|
|
l'utente non specifichi nulla.
|
|
Se è disabilitata, allora lascia vuoti i campi codice agente da e codice agente a, in modo
|
|
da eliminare una condizione durante il test per il filtraggio dei records.
|
|
*/
|
|
|
|
// nasconde i campi se la gestione agenti è disabilitata
|
|
if (!agente)
|
|
{
|
|
_msk->show (F_CODICE_AGENTE_DA, FALSE);
|
|
_msk->show (F_CODICE_AGENTE_A, FALSE);
|
|
}
|
|
|
|
if (_msk->run() == K_ESC) // se premuto esc, esci
|
|
return ESC_PRESSED;
|
|
|
|
_ordinamento = _msk->get_int (F_ORDINAMENTO_EMISSIONE);
|
|
_raggruppa = _msk->get_int (F_RAGGRUPPA);
|
|
|
|
TString temps; // stringa temporanea
|
|
|
|
// Imposta i campi dei records campione per il filtraggio
|
|
TLocalisamfile f(LF_DOC); // file doc
|
|
f.zero(); // azzera i campi
|
|
TRectype first(f.curr()), last(f.curr()); // dichiara due records con la stessa struttura dei records di $doc
|
|
|
|
first.put("TIPOCF", 'C'); // trattare solo clienti
|
|
last.put ("TIPOCF", 'C');
|
|
first.put ("TIPODOC", _elab.tipo_doc_org); // tipo documento (da tab. ELD)
|
|
last.put ("TIPODOC", _elab.tipo_doc_org);
|
|
first.put ("STATO", _elab.stato_doc_ini); // stato documento originale
|
|
last.put ("STATO", _elab.stato_doc_ini);
|
|
|
|
// codice cliente
|
|
temps = _msk->get(F_CODICE_CLIENTE_DA);
|
|
if (temps.not_empty())
|
|
first.put ("CODCF", temps);
|
|
temps = _msk->get(F_CODICE_CLIENTE_A);
|
|
if (temps.not_empty())
|
|
last.put ("CODCF", temps);
|
|
|
|
// data
|
|
first.put ("DATADOC", _msk->get(F_DATA_DOCUMENTO_DA)); // nessun controllo perché data doc. da e data doc. a sono checktype required
|
|
last.put ("DATADOC", _msk->get(F_DATA_DOCUMENTO_A));
|
|
|
|
// codice zona
|
|
temps = _msk->get (F_CODICE_ZONA_DA); // mette in temps il valore del campo codice zona da
|
|
if (temps.not_empty()) // se è stato inserito un valore...
|
|
// ******************** N.B.: il campo ZONA va aggiunto a $doc. verificare se il campo è proprio ZONA *****************
|
|
first.put("ZONA", temps); // mettilo nel campo zona
|
|
temps = _msk->get (F_CODICE_ZONA_A);
|
|
if (temps.not_empty())
|
|
last.put ("ZONA", temps);
|
|
|
|
// codice agente: imposta i campi solo se ne è abilitata la gestione
|
|
// se agente è disabilitato, i campi agente rimangono vuoti
|
|
if (agente)
|
|
{
|
|
temps = _msk->get (F_CODICE_AGENTE_DA);
|
|
if (temps.not_empty())
|
|
first.put("CODCF", temps);
|
|
temps = _msk->get (F_CODICE_AGENTE_A);
|
|
if (temps.not_empty())
|
|
last.put ("CODCF", temps);
|
|
}
|
|
|
|
f.put ("STATO", _elab.stato_doc_ini);
|
|
if (! (err = f.read (_isgteq)))
|
|
error_box ("TElaborazioni::run_mask() : errore di lettura &d da doc", err);
|
|
if (f.get ("STATO") != _elab.stato_doc_ini)
|
|
{
|
|
error_box ("TElaborazioni::run_mask() : non esistrono documenti allo stato %s", (const char *)_elab.stato_doc_ini);
|
|
return NO_ORG_DOCS;
|
|
}
|
|
|
|
do // scandisce tutti i records a partire dal primo che ha lo stato richiesto
|
|
{
|
|
TToken_string tempt; // ttoken string per aggiungere chiavi all'array
|
|
if (f.curr() >= first && f.curr() <= last)
|
|
{
|
|
tempt = f.get("CODNUM"); // utilizza la chiave 1 di $doc
|
|
tempt.add( (const char *)f.get("ANNO") );
|
|
tempt.add( (const char *)f.get("PROVV") );
|
|
tempt.add( (const char *)f.get ("NDOC") );
|
|
_chiavi->add(tempt); // aggiunge la chiave del record alla lista
|
|
}
|
|
}
|
|
while (err = f.read(_isnext));
|
|
if (err !=NOERR)
|
|
{
|
|
error_box ("TElaborazioni::run_mask() : errore di lettura %d da doc", err);
|
|
return READ_ERROR;
|
|
}
|
|
|
|
if (!_chiavi->items()) // se l'array è vuoto, indica al chiamante che non ci sono documenti da raggruppare
|
|
{
|
|
error_box ("TElaborazioni::run_mask() : nessun documento originale soddisfa le condizioni richieste");
|
|
return NO_ORG_DOCS;
|
|
}
|
|
|
|
for (int i = 0; i<_chiavi->items()-1; i++)
|
|
message_box ("Record %d: %s", i, (const char *)_chiavi->row(i));
|
|
|
|
return 0;
|
|
}
|
|
|
|
int TElaborazioni::scan_doc(void)
|
|
{
|
|
int err; // codice ritornato dalle procedure
|
|
|
|
if (err = get_info())
|
|
return err; // ritorna al chiamante l'errore di get_info, senza eseguire run_mask
|
|
return run_mask(); // ritorna il codice di errore di run_mask
|
|
}
|