campo-sirio/ve/ve6gen.cpp
alex 8792453bd0 This commit was generated by cvs2svn to compensate for changes in r1680,
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
1995-08-07 07:59:09 +00:00

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
}