Redistribuite le funzioni di magazzino nelle librerie e unico .h
git-svn-id: svn://10.65.10.50/trunk@4545 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
parent
634c3a9d03
commit
1b21272515
610
mg/mglib.h
Executable file
610
mg/mglib.h
Executable file
@ -0,0 +1,610 @@
|
||||
// *******************************
|
||||
// LIBRERIA di magazzino
|
||||
// *******************************
|
||||
#ifndef __MGLIB_H
|
||||
#define __MGLIB_H
|
||||
|
||||
#ifndef __RELATION_H
|
||||
#include <relation.h>
|
||||
#endif
|
||||
#ifndef __RECARRAY_H
|
||||
#include <recarray.h>
|
||||
#endif
|
||||
#ifndef __VARREC_H
|
||||
#include <varrec.h>
|
||||
#endif
|
||||
#ifndef __MSKSHEET_H
|
||||
#include <msksheet.h>
|
||||
#endif
|
||||
#ifndef __FORM_H
|
||||
#include "form.h"
|
||||
#endif
|
||||
#ifndef __ANAMAG_H
|
||||
#include "anamag.h"
|
||||
#endif
|
||||
#ifndef __UMART_H
|
||||
#include "umart.h"
|
||||
#endif
|
||||
#ifndef __CODCORR_H
|
||||
#include "codcorr.h"
|
||||
#endif
|
||||
#ifndef __DESLIN_H
|
||||
#include "deslin.h"
|
||||
#endif
|
||||
#ifndef __MAG_H
|
||||
#include "mag.h"
|
||||
#endif
|
||||
#ifndef __STOMAG_H
|
||||
#include "stomag.h"
|
||||
#endif
|
||||
|
||||
#include <multirec.h>
|
||||
|
||||
#include "..\cg\cglib.h"
|
||||
|
||||
/*class TMultiple_rectype ;
|
||||
//**************************************
|
||||
// classe per il controllo dei record composti da una testata e N file di righe
|
||||
// è implementato come un TRectype che contiene anche un TRecord_array
|
||||
//
|
||||
class TMultiple_rectype : public TAuto_variable_rectype
|
||||
{
|
||||
enum { maxfiles = 20};
|
||||
// @ cmember Array di TRecord array per le righe
|
||||
TArray _files; //
|
||||
// @ cmember flag indicatore di record nuovo
|
||||
bool _nuovo;
|
||||
// @ cmember numero di file righe
|
||||
short _nfiles;
|
||||
// @ cmember file delle righe
|
||||
int _logicnums[maxfiles];
|
||||
// @ cmember Array di nomi di campo "numeratore" delle righe
|
||||
TString_array _numfields;
|
||||
|
||||
protected:
|
||||
const TArray & files() const { return _files;}
|
||||
// @ cmember funzione per costruire la chiave delle righe
|
||||
virtual void set_body_key(TRectype & rowrec) pure;
|
||||
// @ cmember renumber la chiave del corpo
|
||||
virtual long renum(long numdoc = -1) { return -1; }
|
||||
virtual TRectype & get_body_record(int logicnum = 0) { return *(new TRectype(logicnum ? logicnum : _logicnums[0])); }
|
||||
virtual void load_rows_file(int logicnum);
|
||||
// @cmember Ritorna l'indice di <p _files> del numero logico passato
|
||||
int log2ind(int logicnum) const;
|
||||
virtual int find(int logicnum, const char * fieldname, const char * s, int from = 0, bool reverse = FALSE) const ;
|
||||
virtual int write_rewrite(TBaseisamfile& f, bool re = FALSE) const;
|
||||
void remove_body(int logicnum);
|
||||
|
||||
public:
|
||||
//***********************
|
||||
// struttura
|
||||
// @ cmember restituisce il record di testata
|
||||
const TAuto_variable_rectype& head() const { return *this; } // Ritorna la testata del documento
|
||||
// @ cmember restituisce il record di testata
|
||||
TAuto_variable_rectype& head() { return *this; } // Ritorna la testata del documento
|
||||
|
||||
|
||||
// @ cmember restituisce il record array del corpo
|
||||
TRecord_array & body(int logicnum = 0) const;
|
||||
// @ cmember restituisce il numero di record nel corpo
|
||||
int rows(int logicnum = 0) const { return body(logicnum).rows(); }
|
||||
|
||||
// @ cmember restituisce il record n-esimo del del corpo
|
||||
virtual const TRecord_array & operator[](int logicnum) const { return (const TRecord_array &)((TMultiple_rectype *)this)->body(logicnum); }
|
||||
// @ cmember restituisce il record n-esimo del del corpo
|
||||
virtual TRecord_array & operator[](int logicnum) { return (TRecord_array &)body(logicnum); }
|
||||
|
||||
bool destroy_row(int n, bool pack = FALSE, int logicnum = 0) { return body(logicnum).destroy_row(n, pack); }
|
||||
void destroy_rows(int logicnum = 0) { body(logicnum).destroy_rows(); }
|
||||
|
||||
//***********************
|
||||
// record e I/O
|
||||
virtual void dirty_fields() {}
|
||||
virtual void set_fields(TAuto_variable_rectype & rec) {}
|
||||
virtual void reset_fields(TAuto_variable_rectype & rec) { rec.remove_field(); }
|
||||
|
||||
virtual void renum_key(const char * kfield,const char * val);
|
||||
virtual TRectype & operator =(const TRectype & r);
|
||||
virtual TRectype & operator =(const char * r);
|
||||
virtual void zero(char c = '\0');
|
||||
|
||||
virtual int read(TRectype & rec, word op = _isequal, word lockop = _nolock);
|
||||
virtual int read(word op = _isequal, word lockop = _nolock) { return read(*this, op, lockop); }
|
||||
int read(TBaseisamfile & f, word op = _isequal, word lockop = _nolock) { return read(f.curr(), op, lockop); }
|
||||
|
||||
virtual int write(TBaseisamfile& f) const
|
||||
{ return write_rewrite(f);}
|
||||
virtual int rewrite(TBaseisamfile& f) const
|
||||
{ return write_rewrite(f,TRUE);}
|
||||
virtual int remove(TBaseisamfile& f) const;
|
||||
|
||||
int write() const { TBaseisamfile f(num()); return write(f);}
|
||||
int rewrite() const { TBaseisamfile f(num()); return rewrite(f);}
|
||||
int remove() const { TBaseisamfile f(num()); return remove(f);}
|
||||
|
||||
|
||||
void add_file(int logicnum, const char * numfield);
|
||||
//**************************
|
||||
// @ cmember costruttore dal numero del file
|
||||
TMultiple_rectype(int hfn);
|
||||
// @ cmember costruttore dal file
|
||||
TMultiple_rectype(const TBaseisamfile* file);
|
||||
// @ cmember costruttore dal record
|
||||
TMultiple_rectype(const TRectype & rec);
|
||||
// @ cmember costruttore di copia
|
||||
TMultiple_rectype(const TMultiple_rectype& r);
|
||||
virtual ~TMultiple_rectype() {}
|
||||
};
|
||||
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
char * TNome_valorizz[];
|
||||
|
||||
typedef enum {
|
||||
valorizz_ultcos , valorizz_mediacos , valorizz_przlist ,
|
||||
valorizz_coststd , valorizz_costmedio ,
|
||||
valorizz_FIFOa , valorizz_LIFOa ,
|
||||
valorizz_FIFO , valorizz_LIFO,
|
||||
valorizz_FIFOr , valorizz_LIFOr
|
||||
} TTipo_valorizz;
|
||||
|
||||
class TArticolo : public TMultiple_rectype
|
||||
{
|
||||
TRecfield * _codice;
|
||||
|
||||
protected:
|
||||
virtual const TString & get_str(const char* fieldname) const ;
|
||||
virtual void set_body_key(TRectype & rowrec);
|
||||
|
||||
public:
|
||||
|
||||
virtual int read(const char * cod, word op = _isequal, word lockop = _nolock);
|
||||
virtual int read(TRectype & rec, word op = _isequal, word lockop = _nolock) { return read( rec.get(ANAMAG_CODART), op, lockop); }
|
||||
|
||||
TObject* dup() const { return new TArticolo(codice()); }
|
||||
|
||||
const TString codice() const { return (const char *) *_codice;}
|
||||
const TString& descrizione(const char * lingua = NULL) const;
|
||||
|
||||
bool unlock() ;
|
||||
bool lock_and_prompt() ;
|
||||
void update_ultcosti(real costo,TDate data) ;
|
||||
|
||||
int find_um(const char * um, int from = 0) const { return find(LF_UMART, UMART_UM, um, from); }
|
||||
int find_deslin(const char * deslin, int from = 0) const { return find(LF_DESLIN, DESLIN_CODLIN, deslin, from); }
|
||||
int find_codcorr(const char * codcorr, int from = 0) const { return find(LF_CODCORR, CODCORR_CODARTALT, codcorr, from); }
|
||||
TRecord_array & um() const { return body(LF_UMART); }
|
||||
TRecord_array & deslin() const { return body(LF_DESLIN); }
|
||||
TRecord_array & codcorr() const { return body(LF_CODCORR); }
|
||||
|
||||
TArticolo(const char* codice = NULL);
|
||||
TArticolo(const TRectype& rec);
|
||||
virtual ~TArticolo();
|
||||
};
|
||||
|
||||
class TArticolo_giacenza : public TArticolo
|
||||
{
|
||||
TString16 _anno_mag;
|
||||
TString16 _anno_sto;
|
||||
|
||||
protected:
|
||||
virtual const TString & get_str(const char* fieldname) const ;
|
||||
virtual void set_body_key(TRectype & rowrec);
|
||||
void set_anno_mag (const char * anno = NULL);
|
||||
void set_anno_sto (const char * anno = NULL);
|
||||
void reset_anno_mag () { set_anno_mag();}
|
||||
void reset_anno_sto () { set_anno_sto();}
|
||||
|
||||
public:
|
||||
|
||||
TObject* dup() const { return new TArticolo_giacenza(codice()); }
|
||||
virtual void zero(char c = '\0');
|
||||
|
||||
int find_mag(const char * annoes, const char * codmag = NULL, const char * livello = NULL, int from = 0) const ;
|
||||
int find_storico(const char * annoesrif, const char * annoes = NULL, int from = 0) const;
|
||||
TRecord_array & mag(const char * annoes) const;
|
||||
TRecord_array & storico(const char * annoesrif) const;
|
||||
|
||||
real ultimo_costo(const char * annoes) const;
|
||||
real media_costi(const char * annoes) const;
|
||||
real prezzo_listino(const char * annoes, const char * catven ,const char * codlist) const;
|
||||
real costo_standard(const char * annoes) const;
|
||||
real costo_medio(const char * annoes, const char * codmag, const char * livello) const;
|
||||
real LIFO_annuale(const char * annoes, const char * codmag, const char * livello,
|
||||
bool giacenza_effettiva = TRUE, bool valorizza_componenti = TRUE) const;
|
||||
real FIFO_annuale(const char * annoes, const char * codmag, const char * livello,
|
||||
bool giacenza_effettiva = TRUE, bool valorizza_componenti = TRUE) const;
|
||||
real LIFO(const char * annoes, const char * codmag, const char * livello,
|
||||
bool giacenza_effettiva = TRUE, bool valorizza_componenti = TRUE) const;
|
||||
real FIFO(const char * annoes, const char * codmag, const char * livello,
|
||||
bool giacenza_effettiva = TRUE, bool valorizza_componenti = TRUE) const;
|
||||
real LIFO_ragionieristico(const char * annoes, const char * codmag, const char * livello,
|
||||
bool giacenza_effettiva = TRUE, bool valorizza_componenti = TRUE) const;
|
||||
real FIFO_ragionieristico(const char * annoes, const char * codmag, const char * livello,
|
||||
bool giacenza_effettiva = TRUE, bool valorizza_componenti = TRUE) const;
|
||||
|
||||
TArticolo_giacenza(const char* codice = NULL);
|
||||
TArticolo_giacenza(const TRectype& rec);
|
||||
virtual ~TArticolo_giacenza() {}
|
||||
};
|
||||
|
||||
class THead_lines_record ;
|
||||
//**************************************
|
||||
// classe per il controllo dei record composti da una testata e N righe
|
||||
// è implementato come un TRectype che contiene anche un TRecord_array
|
||||
//
|
||||
class THead_lines_record : public TAuto_variable_rectype {
|
||||
|
||||
// @ cmember Array di TRectype per le righe
|
||||
TRecord_array * _rows; //
|
||||
// @ cmember flag indicatore di record nuovo
|
||||
bool _nuovo;
|
||||
// @ cmember file principale
|
||||
int _file;
|
||||
// @ cmember file delle righe
|
||||
int _rfile;
|
||||
// @ cmember nome del campo "numeratore" delle righe
|
||||
TString _numfield;
|
||||
|
||||
|
||||
protected:
|
||||
// @ cmember restituisce la riga del corpo
|
||||
virtual TRectype & row(int index) const;
|
||||
virtual void put_str(const char* fieldname, const char* val);
|
||||
// @ cmember funzione per estrarre dal record della testata la chiave delle righe
|
||||
virtual void copy_linekey(const TRectype & headrecord, TRectype & linesrecord)=0;
|
||||
// @ cmember renumer la chiave del corpo
|
||||
virtual long renum(long numdoc=-1)=0;
|
||||
|
||||
int write_rewrite(TBaseisamfile& f ,bool re = FALSE) const ;
|
||||
public:
|
||||
//***********************
|
||||
// struttura
|
||||
// @ cmember restituisce il record di testata
|
||||
const TAuto_variable_rectype& head() const { return *this; } // Ritorna la testata del documento
|
||||
// @ cmember restituisce il record di testata
|
||||
TAuto_variable_rectype& head() { return *this; } // Ritorna la testata del documento
|
||||
|
||||
// @ cmember restituisce il numero di record nel corpo
|
||||
int rows() const { return _rows->rows(); }
|
||||
// @ cmember restituisce il record array del corpo
|
||||
TRecord_array * rows_record() { return _rows; }
|
||||
|
||||
// @ cmember restituisce il record n-esimo del del corpo
|
||||
virtual const TRectype& operator[](int index) const
|
||||
{ return (const TRectype&)((THead_lines_record *)this)->row(index); }
|
||||
// @ cmember restituisce il record n-esimo del del corpo
|
||||
virtual TRectype& operator[](int index)
|
||||
{ return (TRectype&)row(index); }
|
||||
|
||||
TRectype & insert_row(int row, const char *tipo = NULL);
|
||||
TRectype & new_row(const char *tipo = NULL);
|
||||
bool destroy_row(int n, bool pack = FALSE) { return _rows->destroy_row(n, pack); }
|
||||
void destroy_rows() { _rows->destroy_rows(); }
|
||||
|
||||
//***********************
|
||||
// record e I/O
|
||||
virtual void dirty_fields();
|
||||
|
||||
virtual const char *get_next_key() =0 ;
|
||||
virtual void renum_key(const char * kfield,const char * val);
|
||||
virtual TRectype & operator =(const TRectype & r);
|
||||
virtual TRectype & operator =(const char * r);
|
||||
virtual void zero(const char * fieldname);
|
||||
virtual void zero(char c = '\0');
|
||||
|
||||
void reset_fields(TAuto_variable_rectype & rec) { rec.remove_field(); }
|
||||
virtual void set_fields(TAuto_variable_rectype & rec);
|
||||
|
||||
virtual int readat(TBaseisamfile& f, TRecnotype nrec, word lockop= _nolock);
|
||||
virtual int read(TBaseisamfile& f, word op = _isequal, word lockop = _nolock);
|
||||
|
||||
virtual int write(TBaseisamfile& f) const ;
|
||||
virtual int rewrite(TBaseisamfile& f) const ;
|
||||
virtual int remove(TBaseisamfile& f) const ;
|
||||
|
||||
//**************************
|
||||
// @ cmember costruttore dal numero del file
|
||||
THead_lines_record(int hfn, int rfn,const char *numfield);
|
||||
// @ cmember costruttore dal file
|
||||
THead_lines_record(const TBaseisamfile* head_file,int rfn,const char *numfield);
|
||||
// @ cmember costruttore dal record
|
||||
THead_lines_record(const TRectype & r,int rfn,const char *numfield);
|
||||
// @ cmember costruttore di copia
|
||||
THead_lines_record(const THead_lines_record& r);
|
||||
virtual ~THead_lines_record();
|
||||
};
|
||||
|
||||
|
||||
// **************************************
|
||||
// **************************************
|
||||
// **************************************
|
||||
// fine classi da portare in libreria:
|
||||
|
||||
// *******************************
|
||||
// LIBRERIA DI utility del magazzino
|
||||
// *******************************
|
||||
//#include "..\ve\velib03.h"
|
||||
|
||||
|
||||
#define MANY_MAG_LEV 10
|
||||
#define MAX_GIAC_LEVEL 4
|
||||
class TMag_livelli {
|
||||
bool _enabled[MANY_MAG_LEV];
|
||||
int _code_lenght[MANY_MAG_LEV];
|
||||
TString _name[MANY_MAG_LEV];
|
||||
TString _picture[MANY_MAG_LEV];
|
||||
int _last_level;
|
||||
|
||||
public:
|
||||
int last_level() const {return _last_level;}; // Ritorna il numero di livelli abilitati
|
||||
const bool enabled(int levnum=1); // Ritorna se il livello è abilitato
|
||||
const TString & name(int levnum); // Ritorna il nome (descrizione) di quel livello
|
||||
const TString & picture(int levnum);// Ritorna la stringa di picture per i codici gruppo di quel livello
|
||||
const int code_lenght(int levnum); // Ritorna la lunghezza dei codici gruppo di quel livello
|
||||
const int packed_lenght(int levnum); // Ritorna la lunghezza del codice compatto fino a quel livello
|
||||
|
||||
void pack_grpcode(TString & pc, const TString &codlev, const int levnum); // Inserisce il codice del gruppo del livello levnum in pc
|
||||
TString unpack_grpcode(const TString & pc, const int levnum); // Estrae il codice del gruppo del livello levnum da pc
|
||||
TString build_tabcode(const TString & pc, const int levnum);
|
||||
|
||||
TMag_livelli(const char *tabname); // costruttore
|
||||
~TMag_livelli() {}; // distruttore
|
||||
};
|
||||
|
||||
|
||||
|
||||
// *******************************
|
||||
// *******************************
|
||||
// riconoscimento di metacaratteri
|
||||
class TR_automa;
|
||||
class TMetachar {
|
||||
TR_automa * _au;
|
||||
TString _language;
|
||||
char _metach_mand[10];
|
||||
char _metach_opz[10];
|
||||
|
||||
void set_language(const char * language); // setta l'automa che ricosce il linguaggio passato
|
||||
void add_tran(int statenum,unsigned char symbol,int next);// aggiunge le transizioni all'automa
|
||||
public:
|
||||
const char * language() const; // restituisce la stringa di metacaratteri del linguaggio riconosciuto
|
||||
bool recognized(const char * pattern);
|
||||
|
||||
bool has_opzchars(const char * pattern);
|
||||
bool has_mandchars(const char * pattern);
|
||||
|
||||
int maxstrlen(const char * pattern) const;
|
||||
const char *mand_chars() {return _metach_mand;};
|
||||
const char *opz_chars() {return _metach_opz;};
|
||||
TMetachar(const char * str);
|
||||
TMetachar();
|
||||
~TMetachar();
|
||||
};
|
||||
|
||||
// *********************
|
||||
// classe che incapsula le causali di magazzino (record della tabella CAU)
|
||||
typedef enum {
|
||||
s_giac,
|
||||
s_acq,s_ent,
|
||||
s_ven,s_usc,
|
||||
s_ordc,s_ordf,
|
||||
s_acl,s_incl,
|
||||
s_prodc,s_prodf,
|
||||
s_rim,
|
||||
s_scart,
|
||||
s_label
|
||||
} TTipo_saldomag;
|
||||
|
||||
class TCausale_magazzino : public TRectype {
|
||||
public:
|
||||
const char * get_descr() {return get("S0");}
|
||||
const char get_tipoprz() {return get_char("S6");}
|
||||
const char get_tipomov() {return get_char("S7");}
|
||||
const char * get_raggfisc() {return get("S8");}
|
||||
int sgn(TTipo_saldomag fieldname) ;
|
||||
TCausale_magazzino(const char * codice);
|
||||
~TCausale_magazzino();
|
||||
};
|
||||
|
||||
class TLine_movmag ; // convenience...
|
||||
|
||||
// dati della linea di movimento di magazzino
|
||||
class TLine_movmag : public TObject {
|
||||
public:
|
||||
TString16 um;
|
||||
real quant;
|
||||
real prezzo;
|
||||
int operator==(TLine_movmag &);
|
||||
|
||||
virtual TObject* dup() const {return new TLine_movmag(*this);};
|
||||
|
||||
TLine_movmag() {};
|
||||
TLine_movmag(const TLine_movmag &);
|
||||
virtual ~TLine_movmag() {};
|
||||
};
|
||||
|
||||
// classe per la definizione dei movimenti di magazzino
|
||||
// ( un movimento (testata+righe) == un oggetto TMov_mag )
|
||||
class TMov_mag : public TMultiple_rectype {
|
||||
|
||||
//
|
||||
TString16 _codcaus;
|
||||
TString16 _annoes;
|
||||
//
|
||||
TString16 _nextcod;
|
||||
//
|
||||
TAssoc_array lines_to_add;
|
||||
TAssoc_array lines_to_subtract;
|
||||
|
||||
protected:
|
||||
virtual void set_body_key(TRectype & rowrec);
|
||||
virtual bool renum(); // rinumerazione ;
|
||||
|
||||
// ************ gestione saldi
|
||||
// @member: compone le parti chiave + dati a partire dalla riga dello sheet
|
||||
void line2key_data(int numriga, TToken_string &key,TLine_movmag &rest) const;
|
||||
// @member: compone la chiave a partire dalla riga dello sheet
|
||||
TToken_string line2key(int numriga) const;
|
||||
// @member: compone la dati a partire dalla riga dello sheet
|
||||
TLine_movmag line2data(int numriga) const;
|
||||
// @member: estrae dalla Tokenstring della chiave i valori corrispondenti ai campi del file
|
||||
static TString key2field(TToken_string &key,const char * f);
|
||||
// @member: memorizza la linea come "da togliere"
|
||||
int delete_line(TToken_string &key,TLine_movmag &rest);
|
||||
// @member: memorizza la linea come "da aggiungere"
|
||||
int insert_line(TToken_string &key,TLine_movmag &rest);
|
||||
// @member: effettua l'aggiornamento dei saldi relativi alle giacenze interessate al movimento
|
||||
int update_balances() const;
|
||||
// @member: effettua l'aggiornamento dei saldi di una giacenza
|
||||
int update_balances(TRectype & magrec, const TLine_movmag &l,TString16 codcaus,int sign) const;
|
||||
// @member: effettua l'aggiornamento di un saldo di una giacenza
|
||||
void update_balance(TRectype & magrec, const char * fieldname, real diff) const;
|
||||
|
||||
static void giac_putkey(TLocalisamfile & mag,TString16 annoes,TToken_string curr_key);
|
||||
static bool lock_anamag(const char *codart);
|
||||
static bool unlock_anamag(const char *codart) ;
|
||||
|
||||
public:
|
||||
// IO ad alto livello
|
||||
const char *get_next_key() ;
|
||||
virtual int read(TBaseisamfile& f, word op = _isequal, word lockop = _nolock);
|
||||
virtual int remove(TBaseisamfile& f) const ;
|
||||
virtual int write(TBaseisamfile& f) const ;
|
||||
virtual int rewrite(TBaseisamfile& f) const ;
|
||||
int force_update_bal();
|
||||
|
||||
//
|
||||
int codice_esercizio(TDate &d);
|
||||
// costruttori e distruttori
|
||||
TMov_mag(bool autoload=FALSE);
|
||||
virtual ~TMov_mag();
|
||||
|
||||
};
|
||||
|
||||
bool rebuild_balances(TString16 annoes, bool reset_giac=FALSE);
|
||||
|
||||
#define FORM_MAXGIACLEV 4 // numero di livelli giacenza nel form
|
||||
#define FORM_MAXARTLEV 8 // numero di livelli codice nel form
|
||||
#define UNKNOWN_NAME "-"
|
||||
|
||||
class TForm_stampemg : public TForm
|
||||
{
|
||||
bool _permag;
|
||||
int _fromlivgiac,_tolivgiac,_fromlivart,_tolivart;
|
||||
bool _sottocatmer;
|
||||
TMag_livelli * _giaclev,*_artlev;
|
||||
TDecoder *_giacgrp,*_artgrp;
|
||||
bool setdettaglio(bool show, int fromlivart,int livart,int fromlivgiac,int livgiac,bool dettgiac);
|
||||
void add_giaclev(TString &levname);
|
||||
|
||||
public:
|
||||
void gruppogiac(TForm_item &cf, TToken_string &s);
|
||||
void gruppoart(TForm_item &cf, TToken_string &s);
|
||||
bool validate(TForm_item &cf, TToken_string &s);
|
||||
void setcatmer(bool catmer,bool sottoc=FALSE);
|
||||
bool setdett_perart(int fromlivart,int livart,int fromlivgiac,int livgiac,bool showmag, bool showdep);
|
||||
bool setdett_permag(int fromlivart,int livart,int fromlivgiac,int livgiac,bool showmag, bool showdep,bool showdett);
|
||||
TForm_stampemg(const char *name,const char *code) ;
|
||||
~TForm_stampemg();
|
||||
};
|
||||
|
||||
|
||||
#include "..\ve\sconti.h"
|
||||
|
||||
class TCondizione_vendita : public TObject
|
||||
{
|
||||
TString80 _sconto;
|
||||
TString16 _codiva;
|
||||
bool _ivarid;
|
||||
real _prezzo;
|
||||
real _provv;
|
||||
real _molt_sconto;
|
||||
TCliFor * _clifo;
|
||||
TLocalisamfile _condv;
|
||||
TLocalisamfile _rcondv;
|
||||
TLocalisamfile _sconti;
|
||||
TLocalisamfile * _anamag; // file passato e posizionato esternamente
|
||||
TLocalisamfile * _umart; // file passato e posizionato esternamente
|
||||
TConfig * _config_ditta;
|
||||
bool _load_mask;
|
||||
|
||||
bool cerca(int tiporicerca,const char * cod, const real & qta);
|
||||
|
||||
protected:
|
||||
|
||||
TRectype & testa() const { return (_condv.curr()); }
|
||||
TRectype & riga() const { return (_rcondv.curr()); }
|
||||
TLocalisamfile & anamag() const { CHECK(_anamag, "Anagrafica di magazzino non inizializzata") ; return *_anamag; }
|
||||
TLocalisamfile & umart() const { CHECK(_umart, "Anagrafica di unita' di misura magazzino non inizializzata") ; return *_umart; }
|
||||
|
||||
public:
|
||||
real get_prezzo() const { return _prezzo; }
|
||||
|
||||
TConfig &config_ditta() const { return *_config_ditta; }
|
||||
void set_config( TConfig & ditta){ _config_ditta = &ditta; }
|
||||
void set_anamag(TLocalisamfile & anamag) { _anamag = &anamag; }
|
||||
void set_umart(TLocalisamfile & umart) { _umart = &umart; }
|
||||
|
||||
bool gestum() const { return _condv.get_bool("GESTUM"); }
|
||||
|
||||
// prepara la ricerca
|
||||
void put_condv(const char *tipocv,const char * codcv,const char *catven,const char *tipocf,const char *codcf);
|
||||
void put_listino(const char * codlist,const char *catven);
|
||||
void put_contratto(const char * codcontr,const char *tipocf,const char *codcf);
|
||||
void put_offerta(const char * codoff);
|
||||
// ricerca il codice
|
||||
bool ricerca(const char * cod,const real & qta=0) ;
|
||||
|
||||
TCondizione_vendita(TConfig * _ditta = NULL, TLocalisamfile * anamag = NULL, TLocalisamfile * umart = NULL);
|
||||
~TCondizione_vendita() {}
|
||||
};
|
||||
|
||||
|
||||
#define TIPOREG_VEN 1
|
||||
#define TIPOREG_ACQ 2
|
||||
#define TIPOREG_IVA 3
|
||||
#define TIPOREG_INCPAG 4
|
||||
#define TIPOREG_GIO 5
|
||||
#define TIPOREG_LIBSOC 6
|
||||
#define TIPOREG_CESPIT 7
|
||||
#define TIPOREG_INVENT 8
|
||||
#define TIPOREG_GIOMAG 9
|
||||
|
||||
class TRegistro_std : public TRectype
|
||||
{
|
||||
TString80 _intest;
|
||||
|
||||
protected:
|
||||
bool read(const char* cod, int year);
|
||||
|
||||
public:
|
||||
int year() const;
|
||||
const TString& code() const ;
|
||||
|
||||
const TString & descr() const { return get("S0"); }
|
||||
int tipo() const { return get_int("I0"); }
|
||||
|
||||
const TString & cod_intest() const { return get("S7"); }
|
||||
const TString intest() const;
|
||||
const TString & luogo_conserv() const { return get("S1"); }
|
||||
int pag_stampate() const{ return get_int("I1"); }
|
||||
int pag_numerate() const{ return get_int("I2"); }
|
||||
TDate vidimazione() const { return get_date("D0"); }
|
||||
TDate scadenza() const { return get_date("D1"); }
|
||||
TDate last_print() const { return get_date("D3"); }
|
||||
bool stampa_intditta() const { return get_bool("B9"); }
|
||||
|
||||
void set_pag_stampate(int p) { put("I1",p); }
|
||||
void set_last_print(TDate &d) { put("D3",d); }
|
||||
|
||||
bool write(bool re) const ;
|
||||
bool rewrite() const {return write(TRUE);}
|
||||
|
||||
TRegistro_std(const char* code = "", int year = 0);
|
||||
virtual ~TRegistro_std() {}
|
||||
};
|
||||
|
||||
#endif //__MGLIB_H
|
893
mg/mglib01.cpp
893
mg/mglib01.cpp
@ -8,287 +8,10 @@
|
||||
#include <checks.h>
|
||||
#include <defmask.h>
|
||||
|
||||
#include "mglib01.h"
|
||||
#include "mglib02.h"
|
||||
#include "mglib.h"
|
||||
#include "anamag.h"
|
||||
#include "umart.h"
|
||||
#include "mag.h"
|
||||
#include "..\cg\cglib.h"
|
||||
|
||||
// **************************************
|
||||
// **************************************
|
||||
// **************************************
|
||||
// *** classi per la libreria
|
||||
// ***
|
||||
//*****
|
||||
// THead_lines_record
|
||||
// metodi protected
|
||||
void THead_lines_record::renum_key(const char * kfield,const char * val)
|
||||
{
|
||||
TRectype::renum_key(kfield, val); // Aggiorna testata
|
||||
_rows->renum_key(kfield, val); // Aggiorna righe
|
||||
}
|
||||
|
||||
TRectype & THead_lines_record::row(int index) const // riga del corpo
|
||||
{
|
||||
if (index > _rows->rows() || index < 0)
|
||||
CHECKD(FALSE, "Riga non esistente ", index);
|
||||
return _rows->row(index, FALSE);
|
||||
}
|
||||
|
||||
void THead_lines_record::put_str(const char* fieldname, const char* val)
|
||||
{
|
||||
TString v(val);
|
||||
// cambio
|
||||
//if (strcmp(fieldname, "TIPODOC") == 0 && TRectype::get("TIPODOC") != v)
|
||||
//{
|
||||
// TAuto_variable_rectype::put_str(fieldname, v);
|
||||
// reset_fields(*this);
|
||||
// set_fields(*this);
|
||||
//}
|
||||
//else
|
||||
{
|
||||
TAuto_variable_rectype::put_str(fieldname, v);
|
||||
dirty_fields();
|
||||
}
|
||||
}
|
||||
|
||||
//*****
|
||||
// metodi public
|
||||
THead_lines_record::THead_lines_record(int hfn, int rfn,const char *numfield):
|
||||
TAuto_variable_rectype(hfn),
|
||||
_file(hfn),
|
||||
_rfile(rfn),
|
||||
_numfield(numfield)
|
||||
{
|
||||
_rows= new TRecord_array(rfn,numfield); // inizializza il record array delle righe
|
||||
}
|
||||
|
||||
THead_lines_record::THead_lines_record(const TBaseisamfile* i,int rfn,const char *numfield):
|
||||
TAuto_variable_rectype(i),
|
||||
_numfield(numfield)
|
||||
{
|
||||
_rows= new TRecord_array(rfn,numfield); // inizializza il record array delle righe
|
||||
}
|
||||
|
||||
THead_lines_record::THead_lines_record(const TRectype & r,int rfn,const char *numfield):
|
||||
TAuto_variable_rectype(r),
|
||||
_numfield(numfield)
|
||||
{
|
||||
_rows= new TRecord_array(rfn,numfield); // inizializza il record array delle righe
|
||||
}
|
||||
|
||||
// @doc INTERNAL
|
||||
|
||||
// @mfunc costruttore di copia
|
||||
THead_lines_record::THead_lines_record(const THead_lines_record& r):
|
||||
TAuto_variable_rectype((TAuto_variable_rectype &)r)
|
||||
{
|
||||
// copia..
|
||||
_rows= new TRecord_array(* r._rows); // inizializza il record array delle righe
|
||||
_nuovo=r._nuovo;
|
||||
_file=r._file; // file principale
|
||||
_rfile=r._rfile; // file delle righe
|
||||
_numfield=r._numfield;
|
||||
}
|
||||
|
||||
THead_lines_record::~THead_lines_record()
|
||||
{
|
||||
delete _rows;
|
||||
}
|
||||
|
||||
|
||||
// setta a dirty i campi
|
||||
void THead_lines_record::dirty_fields()
|
||||
{
|
||||
}
|
||||
|
||||
TRectype & THead_lines_record::operator =(const TRectype & r)
|
||||
{
|
||||
TRectype::operator=(r);
|
||||
reset_fields(*this);
|
||||
set_fields(*this);
|
||||
return *this;
|
||||
}
|
||||
|
||||
TRectype & THead_lines_record::operator =(const char * r)
|
||||
{
|
||||
TRectype::operator=(r);
|
||||
reset_fields(*this);
|
||||
set_fields(*this);
|
||||
return *this;
|
||||
}
|
||||
|
||||
void THead_lines_record::zero(const char * fieldname)
|
||||
{
|
||||
// resetta il record righe solo se .....
|
||||
// if (strcmp(fieldname, "TIPODOC") == 0)
|
||||
reset_fields(*this);
|
||||
TAuto_variable_rectype::zero(fieldname);
|
||||
dirty_fields();
|
||||
}
|
||||
|
||||
void THead_lines_record::zero(char c)
|
||||
{
|
||||
reset_fields(*this);
|
||||
TAuto_variable_rectype::zero(c);
|
||||
}
|
||||
|
||||
|
||||
// settaggio campi variabili
|
||||
void THead_lines_record::set_fields(TAuto_variable_rectype & rec)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
int THead_lines_record::read(TBaseisamfile& f, word op, word lockop)
|
||||
{
|
||||
TRectype line_key(_rfile);
|
||||
|
||||
int err = TRectype::read(f,op,lockop);
|
||||
|
||||
copy_linekey(head(),line_key);
|
||||
if (err == NOERR)
|
||||
{
|
||||
_nuovo = FALSE;
|
||||
_rows->read(line_key); //ok
|
||||
}
|
||||
else
|
||||
{
|
||||
// nuovo oggetto: resetta tutto
|
||||
_nuovo = TRUE;
|
||||
destroy_rows();
|
||||
_rows->set_key((TRectype *)(line_key.dup())); // ok
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
int THead_lines_record::readat(TBaseisamfile& f, TRecnotype nrec, word lockop)
|
||||
{
|
||||
TRectype line_key(_rfile);
|
||||
|
||||
int err = TRectype::readat(f,nrec,lockop);
|
||||
|
||||
if (err == NOERR)
|
||||
{
|
||||
_nuovo = FALSE;
|
||||
_rows->read(line_key); //ok
|
||||
}
|
||||
else
|
||||
{
|
||||
// nuovo oggetto: resetta tutto
|
||||
_nuovo = TRUE;
|
||||
destroy_rows();
|
||||
_rows->set_key((TRectype *)(line_key.dup())); // ok
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
/*int THead_lines_record::read(const TRectype& rec)
|
||||
{
|
||||
head() = rec;
|
||||
TRectype line_key(_rows->key());
|
||||
|
||||
copy_linekey(head(),line_key);
|
||||
|
||||
TLocalisamfile afile(_file);
|
||||
int err = TRectype::read(afile);
|
||||
if (err == NOERR)
|
||||
{
|
||||
_nuovo = FALSE;
|
||||
_rows->read(line_key); //ok
|
||||
}
|
||||
else
|
||||
{
|
||||
// nuovo oggetto: resetta tutto
|
||||
_nuovo = TRUE;
|
||||
head() = rec;
|
||||
destroy_rows();
|
||||
_rows->set_key(&line_key); // ok
|
||||
}
|
||||
return err;
|
||||
}
|
||||
*/
|
||||
int THead_lines_record::write(TBaseisamfile& f) const
|
||||
{
|
||||
return write_rewrite(f,FALSE);
|
||||
}
|
||||
|
||||
int THead_lines_record::rewrite(TBaseisamfile& f) const
|
||||
{
|
||||
return write_rewrite(f,TRUE);
|
||||
}
|
||||
|
||||
|
||||
int THead_lines_record::write_rewrite(TBaseisamfile& f,bool re ) const
|
||||
{
|
||||
const bool nuovo = _nuovo; // E' nuovo di zecca!
|
||||
if (nuovo && re) // quindi ...
|
||||
re = FALSE; // ... non fare la rewrite
|
||||
|
||||
int err = NOERR;
|
||||
if (re)
|
||||
{
|
||||
// rewrite:
|
||||
err = _rows->write(re);
|
||||
if (err == NOERR)
|
||||
{
|
||||
err = TRectype::rewrite(f);
|
||||
if (err != NOERR)
|
||||
err = TRectype::write(f);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// write:
|
||||
if (nuovo)
|
||||
{
|
||||
//THead_lines_record &myself=*this;
|
||||
//if (numero() <= 0)
|
||||
// myself.renum();
|
||||
do
|
||||
{
|
||||
err = TRectype::write(f);
|
||||
if (err == _isreinsert) // usa il flag _nuovo per decidere se
|
||||
((THead_lines_record *)this)->renum();
|
||||
} while (err == _isreinsert);
|
||||
((THead_lines_record *)this)->_nuovo = FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
err = TRectype::write(f);
|
||||
if (err != NOERR)
|
||||
err = TRectype::rewrite(f);
|
||||
}
|
||||
if (err == NOERR)
|
||||
err = _rows->write(re);
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
int THead_lines_record::remove(TBaseisamfile& f) const
|
||||
{
|
||||
int err = _rows->remove();
|
||||
if (err == NOERR)
|
||||
err = TRectype::remove(f);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
// **********************************
|
||||
// **********************************
|
||||
// **********************************
|
||||
// **********************************
|
||||
// fine classi per la libreria
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@ -390,6 +113,68 @@ TString TMag_livelli::build_tabcode(const TString & pc, const int levnum)
|
||||
|
||||
// *******************************
|
||||
// *******************************
|
||||
#define MAXSIMBOLS 256
|
||||
#define MAXSTATES 25
|
||||
class TStateset {
|
||||
unsigned char _container[MAXSTATES];
|
||||
int _current;
|
||||
public:
|
||||
TStateset & empty();
|
||||
TStateset & enclose(int e);
|
||||
TStateset & singleton(int e);
|
||||
TStateset & cap(TStateset & s);
|
||||
int get_first() ;
|
||||
int get_next() ;
|
||||
bool is_empty() const;
|
||||
bool is_member(int e) const;
|
||||
TStateset();
|
||||
~TStateset() {};
|
||||
};
|
||||
|
||||
struct TAutoma_state {
|
||||
short _transaction[MAXSIMBOLS];
|
||||
TString16 * _label;
|
||||
bool _final;
|
||||
};
|
||||
|
||||
// *******************************
|
||||
// *******************************
|
||||
// automa per il riconoscimento di metacaratteri
|
||||
class TR_automa {
|
||||
TAutoma_state st[MAXSTATES];
|
||||
short _maxstate;
|
||||
protected:
|
||||
TStateset union_of_closures(TStateset &s);
|
||||
|
||||
bool is_final(int statenum) const;
|
||||
bool is_final(TStateset states) const;
|
||||
|
||||
TR_automa & set_label(int statenum, const char *label);
|
||||
bool is_state(int statenum);
|
||||
const char *label(int statenum);
|
||||
int label2state(const char * label);
|
||||
|
||||
void del_trans(int statenum,unsigned char symbol);
|
||||
int trans_to(int statenum,unsigned char symbol);
|
||||
bool _isdeterministic;
|
||||
|
||||
public:
|
||||
TR_automa & reset_state(int statenum=-1);
|
||||
|
||||
void add_tran(int statenum,unsigned char symbol,int next);// aggiunge una transizione
|
||||
int add_state(const char * label);// aggiunge uno stato
|
||||
TR_automa & set_final(int statenum,bool v=TRUE); // pone lo stato come finale
|
||||
|
||||
bool is_deterministic() {return _isdeterministic;}; //
|
||||
bool recognized(const char * s); // tenta di riconoscere la stringa passata
|
||||
|
||||
TR_automa(TR_automa *a=NULL,bool makedet=FALSE); // duplica un automa (e lo rende deterministico)
|
||||
~TR_automa();
|
||||
static void set2label(const TStateset ss,TString16 & label);
|
||||
static void label2set(const TString16 & label,TStateset & ss);
|
||||
|
||||
};
|
||||
|
||||
|
||||
// *******************************
|
||||
TStateset::TStateset()
|
||||
@ -891,557 +676,5 @@ TMetachar::~TMetachar ()
|
||||
// **************************************
|
||||
// *** classi per il magazzino
|
||||
// ***
|
||||
long giac_last_item(const char * annoes, const char *codart)
|
||||
{
|
||||
long r=0;
|
||||
TLocalisamfile mag(LF_MAG);
|
||||
mag.put("ANNOES",annoes);
|
||||
mag.put("CODART",codart);
|
||||
mag.put("NRIGA",1);
|
||||
if (mag.read()==NOERR)
|
||||
{
|
||||
do {
|
||||
r=mag.get_long("NRIGA");
|
||||
} while (mag.next()==NOERR && mag.get("CODART")==codart);
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
||||
// *********************
|
||||
// movimenti di magazzino
|
||||
|
||||
// causali
|
||||
|
||||
int TCausale_magazzino::sgn(TTipo_saldomag tiposaldo)
|
||||
{
|
||||
switch (tiposaldo) {
|
||||
case s_giac:
|
||||
return get_int("I0");
|
||||
case s_acq:
|
||||
return get_int("I1");
|
||||
case s_ent:
|
||||
return get_int("I2");
|
||||
case s_ven:
|
||||
return get_int("I3");
|
||||
case s_usc:
|
||||
return get_int("I4");
|
||||
case s_ordc:
|
||||
return get_int("I5");
|
||||
case s_ordf:
|
||||
return get_int("I6");
|
||||
case s_incl:
|
||||
return get_int("I7");
|
||||
case s_acl:
|
||||
return get_int("I8");
|
||||
case s_prodc:
|
||||
return get_int("I9");
|
||||
case s_prodf:
|
||||
return get_int("I10");
|
||||
case s_rim:
|
||||
return get_int("I11");
|
||||
case s_scart:
|
||||
return get_int("I12");
|
||||
case s_label:
|
||||
return get_int("I13");
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
TCausale_magazzino::TCausale_magazzino(const char * codice):
|
||||
TRectype(LF_TAB)
|
||||
{
|
||||
TTable f("CAU");
|
||||
f.put("CODTAB",codice);
|
||||
if (f.read() != NOERR)
|
||||
zero();
|
||||
else
|
||||
*this=(TCausale_magazzino &)f.curr();
|
||||
}
|
||||
TCausale_magazzino::~TCausale_magazzino()
|
||||
{
|
||||
}
|
||||
|
||||
// movimenti
|
||||
TLine_movmag ::TLine_movmag(const TLine_movmag &l)
|
||||
{
|
||||
um=l.um;
|
||||
quant=l.quant;
|
||||
prezzo=l.prezzo;
|
||||
}
|
||||
|
||||
int TLine_movmag::operator==(TLine_movmag &l)
|
||||
{
|
||||
return (um==l.um)&&(quant==l.quant)&&(prezzo==l.prezzo);
|
||||
}
|
||||
|
||||
|
||||
|
||||
TMov_mag::TMov_mag() :
|
||||
THead_lines_record(LF_MOVMAG,LF_RMOVMAG,"NRIG"),
|
||||
lines_to_add(), lines_to_subtract()
|
||||
{
|
||||
}
|
||||
|
||||
TMov_mag::~TMov_mag()
|
||||
{
|
||||
}
|
||||
//void TMov_mag::dirty_fields()
|
||||
//{
|
||||
//}
|
||||
|
||||
// rinumerazione automatica: numdoc>=0
|
||||
// (con creazione nuova chiave)
|
||||
long TMov_mag::renum(long numdoc)
|
||||
{
|
||||
if (numdoc <= 0)
|
||||
numdoc = atoi(get_next_key());
|
||||
char num[16]; sprintf(num, "%ld", numdoc);
|
||||
renum_key("NUMREG", num); // Aggiorna testata
|
||||
return numdoc;
|
||||
}
|
||||
|
||||
// copia la chiave dal file principale a quello delle righe
|
||||
void TMov_mag::copy_linekey(const TRectype & headrec, TRectype & linesrec)
|
||||
{
|
||||
// ...qui basta una put tra Rectype....
|
||||
linesrec.put("NUMREG",headrec.get("NUMREG")) ;
|
||||
}
|
||||
|
||||
int TMov_mag::read(TBaseisamfile& f, word op , word lockop)
|
||||
{
|
||||
TToken_string l_key;
|
||||
TLine_movmag l_data;
|
||||
|
||||
int res=THead_lines_record::read(f,op,lockop);
|
||||
// reset delle strutture per il controlli delle variazioni dei saldi
|
||||
_codcaus=get("CODCAUS");
|
||||
_annoes=get("ANNOES");
|
||||
lines_to_add.destroy();
|
||||
lines_to_subtract.destroy();
|
||||
for (int i=0; i<rows(); i++) {
|
||||
l_key=line2key(i+1);
|
||||
l_data=line2data(i+1);
|
||||
delete_line(l_key,l_data);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
int TMov_mag::remove(TBaseisamfile& f) const
|
||||
{
|
||||
int res;
|
||||
if ((res=THead_lines_record::remove(f))==NOERR )
|
||||
// effettua la variazione dei saldi
|
||||
res=update_balances();
|
||||
return res;
|
||||
}
|
||||
|
||||
int TMov_mag::force_update_bal()
|
||||
{
|
||||
int res;
|
||||
TToken_string l_key;
|
||||
TLine_movmag l_data;
|
||||
|
||||
// reset delle strutture per il controlli delle variazioni dei saldi
|
||||
_codcaus=get("CODCAUS");
|
||||
_annoes=get("ANNOES");
|
||||
lines_to_add.destroy();
|
||||
lines_to_subtract.destroy();
|
||||
// memorizza le variazioni
|
||||
for (int i=0; i<rows(); i++) {
|
||||
l_key=line2key(i+1);
|
||||
l_data=line2data(i+1);
|
||||
((TMov_mag *)this)->insert_line(l_key,l_data);
|
||||
}
|
||||
res=update_balances();
|
||||
return res;
|
||||
}
|
||||
|
||||
int TMov_mag::write(TBaseisamfile& f) const
|
||||
{
|
||||
int res;
|
||||
TToken_string l_key;
|
||||
TLine_movmag l_data;
|
||||
// memorizza le variazioni
|
||||
for (int i=0; i<rows(); i++) {
|
||||
l_key=line2key(i+1);
|
||||
l_data=line2data(i+1);
|
||||
((TMov_mag *)this)->insert_line(l_key,l_data);
|
||||
}
|
||||
if ((res=THead_lines_record::write(f))==NOERR )
|
||||
// effettua la variazione dei saldi
|
||||
res=update_balances();
|
||||
return res;
|
||||
}
|
||||
|
||||
int TMov_mag::rewrite(TBaseisamfile& f) const
|
||||
{
|
||||
int res;
|
||||
TToken_string l_key;
|
||||
TLine_movmag l_data;
|
||||
// memorizza le variazioni
|
||||
for (int i=0; i<rows(); i++) {
|
||||
l_key=line2key(i+1);
|
||||
l_data=line2data(i+1);
|
||||
((TMov_mag *)this)->insert_line(l_key,l_data);
|
||||
}
|
||||
if ((res=THead_lines_record::rewrite(f))==NOERR )
|
||||
// effettua la variazione dei saldi
|
||||
res=update_balances();
|
||||
return res;
|
||||
}
|
||||
|
||||
const char *TMov_mag::get_next_key()
|
||||
{
|
||||
TLocalisamfile f(LF_MOVMAG);
|
||||
f.last();
|
||||
int a=atoi(f.get("NUMREG"))+1;
|
||||
return _nextcod.format("%d",a);
|
||||
}
|
||||
|
||||
|
||||
// settaggio campi variabili
|
||||
//void TMov_mag::set_fields(TAuto_variable_rectype & rec)
|
||||
//{
|
||||
//}
|
||||
|
||||
|
||||
//*******
|
||||
// gestione delle variazione dei saldi
|
||||
//
|
||||
//
|
||||
TLine_movmag TMov_mag::line2data(int numriga) const
|
||||
{
|
||||
TLine_movmag rest;
|
||||
rest.um=row(numriga).get("UM");
|
||||
rest.quant=(const char *)row(numriga).get("QUANT");
|
||||
rest.prezzo=(const char *)row(numriga).get("PREZZO");
|
||||
return rest;
|
||||
}
|
||||
|
||||
TToken_string TMov_mag::line2key(int numriga) const
|
||||
{
|
||||
TToken_string key;
|
||||
key.add(row(numriga).get("CODART"));
|
||||
key.add(row(numriga).get("CODMAG"));
|
||||
key.add(row(numriga).get("LIVGIAC"));
|
||||
return key;
|
||||
}
|
||||
|
||||
TString TMov_mag::key2field(TToken_string &key,const char *fieldname)
|
||||
{
|
||||
if (strcmp(fieldname,"CODART")==0)
|
||||
return key.get(0);
|
||||
if (strcmp(fieldname,"CODMAG")==0)
|
||||
return key.get(1);
|
||||
if (strcmp(fieldname,"LIVGIAC")==0)
|
||||
return key.get(2);
|
||||
CHECKS(FALSE, "Nome di campo non appartenente al file righe mov ", fieldname);
|
||||
return "";
|
||||
}
|
||||
|
||||
|
||||
int TMov_mag::insert_line(TToken_string &k,TLine_movmag &r)
|
||||
{
|
||||
if (_codcaus != get("CODCAUS") || _annoes != get("ANNOES")) {
|
||||
lines_to_add.add(k,r);
|
||||
} else {
|
||||
if (lines_to_subtract.is_key(k)&& (TLine_movmag &)lines_to_subtract[k]==r)
|
||||
// modifica annullata
|
||||
lines_to_subtract.remove(k);
|
||||
else
|
||||
// linea modificata
|
||||
lines_to_add.add(k,r);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int TMov_mag::delete_line(TToken_string &k,TLine_movmag &r)
|
||||
{
|
||||
if (_codcaus != get("CODCAUS") || _annoes != get("ANNOES")) {
|
||||
lines_to_subtract.add(k,r);
|
||||
} else {
|
||||
if (lines_to_add.is_key(k)&& r==(TLine_movmag &)lines_to_add[k] )
|
||||
// modifica annullata
|
||||
lines_to_add.remove(k);
|
||||
else
|
||||
// linea modificata
|
||||
lines_to_subtract.add(k,r);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool TMov_mag::unlock_anamag(const char *codart)
|
||||
{
|
||||
TLocalisamfile anamag(LF_ANAMAG);
|
||||
anamag.put("CODART",codart);
|
||||
return (anamag.read(_isequal,_unlock)==NOERR);
|
||||
}
|
||||
|
||||
bool TMov_mag::lock_anamag(const char *codart)
|
||||
{
|
||||
TLocalisamfile anamag(LF_ANAMAG);
|
||||
anamag.put("CODART",codart);
|
||||
bool insert_new=TRUE;
|
||||
TString mess;
|
||||
mess << "Il record di anagrafica dell'articolo ''"<< codart << "'' risulta essere già in uso.\n Interrompo ?";
|
||||
TTimed_breakbox bbox((const char *)mess,10);
|
||||
do {
|
||||
if (anamag.read(_isequal,_testandlock)==NOERR)
|
||||
return TRUE;
|
||||
} while (bbox.run()!=K_ESC);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
void TMov_mag::giac_putkey(TLocalisamfile & mag,TString16 annoes,TToken_string curr_key)
|
||||
{
|
||||
mag.zero(' ');
|
||||
mag.put("ANNOES",annoes);
|
||||
mag.put("CODMAG",key2field(curr_key,"CODMAG"));
|
||||
mag.put("CODART",key2field(curr_key,"CODART"));
|
||||
mag.put("LIVELLO",key2field(curr_key,"LIVGIAC"));
|
||||
}
|
||||
|
||||
|
||||
// aggiorna tutti i saldi in base alle modifiche fatte.
|
||||
// il lock su anagrafica dovrebbe garantire il lock su tutte le
|
||||
// giacenze dell'articolo
|
||||
int TMov_mag::update_balances() const
|
||||
{
|
||||
bool updated_bal=TRUE;
|
||||
TLocalisamfile mag(LF_MAG);
|
||||
mag.setkey(2);
|
||||
|
||||
|
||||
TString_array keys_to_add,keys_to_remove;
|
||||
((TMov_mag *)this)->lines_to_add.get_keys(keys_to_add);
|
||||
((TMov_mag *)this)->lines_to_subtract.get_keys(keys_to_remove);
|
||||
|
||||
// aggiunge i saldi nuovi
|
||||
keys_to_add.sort();
|
||||
TToken_string * curr_key=(TToken_string *)keys_to_add.first_item();
|
||||
|
||||
while (curr_key) {
|
||||
TArticolo articolo(key2field(*curr_key,"CODART"));
|
||||
if (articolo.lock_and_prompt()) {
|
||||
TLine_movmag & line_mov=(TLine_movmag &)lines_to_add[*curr_key];
|
||||
articolo.update_ultcosti(line_mov.prezzo,get_date("DATACOMP"));
|
||||
// lock gained
|
||||
giac_putkey(mag,get("ANNOES"),*curr_key);
|
||||
if (mag.read()!=NOERR) {
|
||||
// non trovato: aggiungo
|
||||
giac_putkey(mag,get("ANNOES"),*curr_key);
|
||||
mag.put("NRIGA",giac_last_item(get("ANNOES"),key2field(*curr_key,"CODART"))+1);
|
||||
mag.write();
|
||||
}
|
||||
// modifica questo record (e lo sblocca)
|
||||
update_balances(mag.curr(),line_mov,get("CODCAUS"),+1);
|
||||
/*// ottimizzazione :(cerca di sfruttare la lettura fatta per un eventuale saldo vecchio)
|
||||
// ciò causa la modifica dell'oggetto TMov_mag (il metodo non è più const)
|
||||
if (_annoes == get("ANNOES")
|
||||
&& lines_to_subtract.is_key(*curr_key)) {
|
||||
update_balances(mag.curr(),(TLine_movmag &)lines_to_subtract[*curr_key],_codcaus,-1);
|
||||
((TMov_mag *)this)->lines_to_add.remove(*curr_key);
|
||||
((TMov_mag *)this)->lines_to_subtract.remove(*curr_key);
|
||||
}*/
|
||||
mag.rewrite();
|
||||
// conclude la TRANSAZIONE prima di sbloccare il record dell'articolo
|
||||
TToken_string *rem_key=(TToken_string *)keys_to_remove.first_item();
|
||||
while ( rem_key) {
|
||||
if (key2field(*rem_key,"CODART")==key2field(*curr_key,"CODART")) {
|
||||
giac_putkey(mag,_annoes,*rem_key);
|
||||
if (mag.read()==NOERR) {
|
||||
update_balances(mag.curr(),(TLine_movmag &)lines_to_subtract[*rem_key],_codcaus,-1);
|
||||
mag.rewrite();
|
||||
}
|
||||
keys_to_remove.remove_item();
|
||||
}
|
||||
rem_key=(TToken_string *)keys_to_remove.succ_item();
|
||||
}
|
||||
articolo.unlock();
|
||||
} else {
|
||||
updated_bal=FALSE;
|
||||
}
|
||||
curr_key=(TToken_string *)keys_to_add.succ_item();
|
||||
}
|
||||
// togli i saldi vecchi
|
||||
curr_key=(TToken_string *)keys_to_remove.first_item();
|
||||
|
||||
while (curr_key) {
|
||||
TArticolo articolo(key2field(*curr_key,"CODART"));
|
||||
if (articolo.lock_and_prompt()) {
|
||||
giac_putkey(mag,_annoes,*curr_key);
|
||||
// modifica questo record (e lo sblocca)
|
||||
if (mag.read()==NOERR) {
|
||||
update_balances(mag.curr(),(TLine_movmag &)lines_to_subtract[*curr_key],_codcaus,-1);
|
||||
mag.rewrite();
|
||||
}
|
||||
articolo.unlock();
|
||||
} else {
|
||||
updated_bal=FALSE;
|
||||
}
|
||||
curr_key=(TToken_string *)keys_to_remove.succ_item();
|
||||
}
|
||||
if (!updated_bal) {
|
||||
// saldi non aggiornati
|
||||
warning_box("I saldi di magazzino non sono stati del tutto aggiornati. \nProcedere ad una operazione di ''Ricostruzione saldi''");
|
||||
}
|
||||
return updated_bal;
|
||||
}
|
||||
|
||||
// aggiorna i saldi del record corrente
|
||||
// in base alla causale e alla modifica fatta (con segno + o -)
|
||||
int TMov_mag::update_balances(TRectype & magrec, const TLine_movmag &l,TString16 codcaus,int rett_sign) const
|
||||
{
|
||||
TCausale_magazzino caus(codcaus);
|
||||
TLocalisamfile umart(LF_UMART);
|
||||
real diff,diff_val;
|
||||
umart.setkey(2);
|
||||
umart.put(UMART_CODART,magrec.get(MAG_CODART));
|
||||
umart.put(UMART_UM , l.um);
|
||||
umart.read();
|
||||
real fc=umart.get_real("FC");
|
||||
|
||||
diff=fc*rett_sign*l.quant;
|
||||
diff_val=rett_sign*l.quant*l.prezzo;
|
||||
update_balance(magrec,"GIAC",diff*caus.sgn(s_giac)); // update ..
|
||||
update_balance(magrec,"ACQ",diff*caus.sgn(s_acq)); // update ..
|
||||
update_balance(magrec,"VALACQ",diff_val*caus.sgn(s_acq)); // update ..
|
||||
update_balance(magrec,"ENT",diff*caus.sgn(s_ent));
|
||||
update_balance(magrec,"VALENT",diff_val*caus.sgn(s_ent));
|
||||
update_balance(magrec,"VEN",diff*caus.sgn(s_ven));
|
||||
update_balance(magrec,"VALVEN",diff_val*caus.sgn(s_ven));
|
||||
update_balance(magrec,"USC",diff*caus.sgn(s_usc));
|
||||
update_balance(magrec,"VALUSC",diff_val*caus.sgn(s_usc));
|
||||
update_balance(magrec,"ORDC",diff*caus.sgn(s_ordc));
|
||||
update_balance(magrec,"VALORDC",diff_val*caus.sgn(s_ordc));
|
||||
update_balance(magrec,"ORDF",diff*caus.sgn(s_ordf));
|
||||
update_balance(magrec,"VALORDF",diff_val*caus.sgn(s_ordf));
|
||||
update_balance(magrec,"RIM",diff*caus.sgn(s_rim));
|
||||
update_balance(magrec,"VALRIM",diff_val*caus.sgn(s_rim));
|
||||
update_balance(magrec,"SCARTI",diff*caus.sgn(s_scart));
|
||||
update_balance(magrec,"VALSCARTI",diff_val*caus.sgn(s_scart));
|
||||
update_balance(magrec,"INCL",diff*caus.sgn(s_incl));
|
||||
update_balance(magrec,"ACL",diff*caus.sgn(s_acl));
|
||||
update_balance(magrec,"PRODCOMP",diff*caus.sgn(s_prodc));
|
||||
update_balance(magrec,"PRODFIN",diff*caus.sgn(s_prodf));
|
||||
update_balance(magrec,"NLABEL",diff*caus.sgn(s_label));
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void TMov_mag::update_balance(TRectype & magrec, const char * fieldname, real diff) const
|
||||
{
|
||||
magrec.put(fieldname,magrec.get_int(fieldname)+diff);
|
||||
}
|
||||
|
||||
HIDDEN TEsercizi_contabili _esercizi;
|
||||
|
||||
int TMov_mag::codice_esercizio(TDate &d)
|
||||
{
|
||||
return _esercizi.date2esc(d);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
//**********************
|
||||
bool rebuild_balances(TString16 annoes, bool reset_giac)
|
||||
{
|
||||
TArray used_files;
|
||||
used_files.add(new TLocalisamfile(LF_RMOVMAG),LF_RMOVMAG);
|
||||
used_files.add(new TLocalisamfile(LF_MOVMAG),LF_MOVMAG);
|
||||
used_files.add(new TTable("CAU"),5);
|
||||
TMov_mag * m_m= new TMov_mag; // record del movimento di magazzino
|
||||
|
||||
// relazione con un solo file (LF_MOVMAG) ma col record Head_Body
|
||||
TRelation rel(LF_MOVMAG);
|
||||
rel.lfile().set_curr(m_m);
|
||||
int ok=TRUE;
|
||||
TLocalisamfile mag(LF_MAG);
|
||||
if (reset_giac) {
|
||||
// azzera tutte giacenze (ciclo sulle giacenze)
|
||||
mag.put("ANNOES",annoes);
|
||||
mag.read(_isgteq);
|
||||
while (!mag.eof() && annoes==mag.get("ANNOES"))
|
||||
{
|
||||
TString currcode(mag.get("CODART"));
|
||||
TArticolo articolo(currcode);
|
||||
if (articolo.lock_and_prompt())
|
||||
{
|
||||
while (!mag.eof() && currcode==mag.get("CODART"))
|
||||
{
|
||||
mag.put("ACQ",0);mag.put("VALACQ",0);
|
||||
mag.put("ENT",0);mag.put("VALENT",0);
|
||||
mag.put("VEN",0);mag.put("VALVEN",0);
|
||||
mag.put("USC",0);mag.put("VALUSC",0);
|
||||
mag.put("ORDF",0);mag.put("VALORDF",0);
|
||||
mag.put("ORDC",0);mag.put("VALORDC",0);
|
||||
mag.put("SCARTI",0);mag.put("VALSCARTI",0);
|
||||
mag.put("GIAC",0);
|
||||
mag.put("PRODCOMP",0);
|
||||
mag.put("PRODFIN",0);
|
||||
mag.put("INCL",0);
|
||||
mag.put("ACL",0);
|
||||
mag.put("NLABEL",0);
|
||||
mag.rewrite();
|
||||
mag.next();
|
||||
}
|
||||
articolo.unlock();
|
||||
} else {
|
||||
ok=FALSE;
|
||||
mag.next();
|
||||
}
|
||||
}
|
||||
}
|
||||
// ricostruisce i saldi (ciclo sui movimenti)
|
||||
TString filterexpr;
|
||||
filterexpr << LF_MOVMAG << "->ANNOES==" << annoes;
|
||||
TCursor cur(&rel,filterexpr); // cursore filtrato
|
||||
|
||||
for (int i=0; i<cur.objects(); i++)
|
||||
{
|
||||
cur=i;
|
||||
TMov_mag & mov_rec=(TMov_mag &)cur.file().curr();
|
||||
if (!mov_rec.force_update_bal())
|
||||
ok=FALSE;
|
||||
}
|
||||
|
||||
return ok;
|
||||
}
|
||||
|
||||
static TLocalisamfile *anamag=NULL;
|
||||
|
||||
bool unlock_anamag(const char *codart)
|
||||
{
|
||||
bool rv;
|
||||
if (anamag)
|
||||
{
|
||||
anamag->put("CODART",codart);
|
||||
rv=(anamag->read(_isequal,_unlock)==NOERR);
|
||||
delete anamag;
|
||||
anamag=NULL;
|
||||
return rv;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool lock_anamag(const char *codart)
|
||||
{
|
||||
if (!anamag)
|
||||
anamag = new TLocalisamfile(LF_ANAMAG);
|
||||
anamag->put("CODART",codart);
|
||||
bool insert_new=TRUE;
|
||||
TString mess;
|
||||
mess << "Il record di anagrafica dell'articolo ''"<< codart << "'' risulta essere già in uso.\n Interrompo ?";
|
||||
TTimed_breakbox bbox((const char *)mess,10);
|
||||
do {
|
||||
if (anamag->read(_isequal,_testandlock)==NOERR)
|
||||
return TRUE;
|
||||
} while (bbox.run()!=K_ESC);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
930
mg/mglib02.cpp
930
mg/mglib02.cpp
@ -1,6 +1,9 @@
|
||||
#include "mglib02.h"
|
||||
#include "mglib.h"
|
||||
#include "anamag.h"
|
||||
#include "mag.h"
|
||||
#include <mask.h>
|
||||
#include "../cg/cglib.h"
|
||||
|
||||
// libreira per i movimenti
|
||||
|
||||
char * TNome_valorizz[]= {
|
||||
"Ultimo costo", "Media ultimi costi", "Prezzo di listino",
|
||||
@ -10,237 +13,11 @@ char * TNome_valorizz[]= {
|
||||
"FIFO Ragionieristico", "LIFO Ragionieristico"
|
||||
} ;
|
||||
|
||||
/*bool TArticolo::load_um()
|
||||
{
|
||||
const int index = log2ind(logicnum);
|
||||
TRectype & rec = get_body_record(logicnum);
|
||||
|
||||
set_body_key(rec);
|
||||
TRecord_array * r = new TRecord_array(logicnum, (TString &) _numfields[index]);
|
||||
_files.add( r, index);
|
||||
}*/
|
||||
|
||||
int TMultiple_rectype::find(int logicnum, const char * fieldname, const char * s, int from, bool reverse) const
|
||||
{
|
||||
const TRecord_array & recarray = body(logicnum);
|
||||
const int last = recarray.last_row();
|
||||
const int len = s ? strlen(s) : 0;
|
||||
|
||||
if (reverse)
|
||||
{
|
||||
if (from > 0)
|
||||
{
|
||||
if (len == 0)
|
||||
return from - 1;
|
||||
for (int i = recarray.pred_row(from); i > 0; i = recarray.pred_row(i))
|
||||
if (((TRectype &)recarray[i]).get(fieldname) == s)
|
||||
return i;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (last > from)
|
||||
{
|
||||
if (len == 0)
|
||||
return from + 1;
|
||||
for (int i = recarray.succ_row(from); i <= last; i = recarray.succ_row(i))
|
||||
if (((TRectype &)recarray[i]).get(fieldname) == s)
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
int TMultiple_rectype::write_rewrite(TBaseisamfile & f, bool re) const
|
||||
{
|
||||
int err = NOERR;
|
||||
|
||||
if (_nuovo && re) // E' nuovo di zecca! quindi ...
|
||||
re = FALSE; // ... non fare la rewrite
|
||||
|
||||
if (re)
|
||||
{
|
||||
for (int i = _nfiles - 1; err == NOERR && i >= 0 ; i--)
|
||||
{
|
||||
TRecord_array * r = (TRecord_array *) _files.objptr(i);
|
||||
if (r)
|
||||
err = r->write(re);
|
||||
}
|
||||
// rewrite:
|
||||
if (err == NOERR)
|
||||
{
|
||||
err = TRectype::rewrite(f);
|
||||
if (err != NOERR)
|
||||
err = TRectype::write(f);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// write:
|
||||
if (_nuovo)
|
||||
{
|
||||
do
|
||||
{
|
||||
err = TRectype::write(f);
|
||||
if (err == _isreinsert) // usa il flag _nuovo per decidere se
|
||||
((TMultiple_rectype *)this)->renum();
|
||||
} while (err == _isreinsert);
|
||||
((TMultiple_rectype *)this)->_nuovo = FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
err = TRectype::write(f);
|
||||
if (err != NOERR)
|
||||
err = TRectype::rewrite(f);
|
||||
}
|
||||
for (int i = _nfiles - 1; err == NOERR && i >= 0 ; i--)
|
||||
{
|
||||
TRecord_array * r = (TRecord_array *)_files.objptr(i);
|
||||
if (r)
|
||||
err = r->write(re);
|
||||
}
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
void TMultiple_rectype::remove_body(int logicnum)
|
||||
{
|
||||
const int index = log2ind(logicnum);
|
||||
|
||||
if (_files.objptr(index) != NULL)
|
||||
_files.remove(index);
|
||||
}
|
||||
|
||||
int TMultiple_rectype::log2ind(int logicnum) const
|
||||
{
|
||||
if (logicnum == 0)
|
||||
return 0;
|
||||
for (int i = _nfiles - 1; i >= 0 ; i--)
|
||||
if (_logicnums[i] == logicnum)
|
||||
return i;
|
||||
NFCHECK("Can't find file %d in multiple record", logicnum);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void TMultiple_rectype::load_rows_file(int logicnum)
|
||||
{
|
||||
const int index = log2ind(logicnum);
|
||||
TRectype & rec = get_body_record(logicnum);
|
||||
|
||||
set_body_key(rec);
|
||||
TRecord_array * r = new TRecord_array(logicnum, (TString &) _numfields[index]);
|
||||
_files.add( r, index);
|
||||
}
|
||||
|
||||
TRecord_array & TMultiple_rectype::body(int logicnum) const
|
||||
{
|
||||
const int index = log2ind(logicnum);
|
||||
|
||||
if (_files.objptr(index) == NULL)
|
||||
((TMultiple_rectype *) this)->load_rows_file(logicnum);
|
||||
return (TRecord_array &) _files[index];
|
||||
}
|
||||
|
||||
void TMultiple_rectype::renum_key(const char * kfield,const char * val)
|
||||
{
|
||||
TRectype::renum_key(kfield, val); // Aggiorna testata
|
||||
for (int i = _nfiles - 1; i >= 0 ; i--)
|
||||
body(_logicnums[i]).renum_key(kfield, val); // Aggiorna righe
|
||||
}
|
||||
|
||||
|
||||
TRectype & TMultiple_rectype::operator =(const TRectype & r)
|
||||
{
|
||||
TRectype::operator=(r);
|
||||
reset_fields(*this);
|
||||
set_fields(*this);
|
||||
return *this;
|
||||
}
|
||||
|
||||
TRectype & TMultiple_rectype::operator =(const char * r)
|
||||
{
|
||||
TRectype::operator=(r);
|
||||
reset_fields(*this);
|
||||
set_fields(*this);
|
||||
return *this;
|
||||
}
|
||||
|
||||
void TMultiple_rectype::zero(char c)
|
||||
{
|
||||
reset_fields(*this);
|
||||
TAuto_variable_rectype::zero(c);
|
||||
for (int i = _nfiles - 1; i >= 0 ; i--)
|
||||
if (_files.objptr(i) != NULL)
|
||||
_files.remove(i);
|
||||
}
|
||||
|
||||
|
||||
int TMultiple_rectype::read(TRectype & rec, word op, word lockop)
|
||||
{
|
||||
TLocalisamfile f(num());
|
||||
|
||||
*this = rec;
|
||||
|
||||
int err = TRectype::read(f, op, lockop);
|
||||
|
||||
for (int i = _nfiles - 1; i >= 0 ; i--)
|
||||
if (_files.objptr(i) != NULL)
|
||||
_files.remove(i);
|
||||
_nuovo = err != NOERR;
|
||||
return err;
|
||||
}
|
||||
|
||||
int TMultiple_rectype::remove(TBaseisamfile & f) const
|
||||
{
|
||||
int err = NOERR;
|
||||
|
||||
for (int i = _nfiles - 1; err == NOERR && i >= 0 ; i--)
|
||||
{
|
||||
TRecord_array & r = body(_logicnums[i]);
|
||||
r.remove();
|
||||
}
|
||||
if (err == NOERR)
|
||||
err = TRectype::remove(f);
|
||||
return err;
|
||||
}
|
||||
|
||||
// @doc INTERNAL
|
||||
TMultiple_rectype::TMultiple_rectype(int hfn)
|
||||
: TAuto_variable_rectype(hfn), _nuovo(TRUE), _nfiles(0)
|
||||
{
|
||||
}
|
||||
|
||||
// @ cmember costruttore dal file
|
||||
void TMultiple_rectype::add_file(int logicnum, const char * numfield)
|
||||
{
|
||||
CHECK(_nfiles < maxfiles, "Too many files added");
|
||||
_logicnums[_nfiles] = logicnum;
|
||||
_numfields.add(numfield, _nfiles++);
|
||||
}
|
||||
|
||||
TMultiple_rectype::TMultiple_rectype(const TBaseisamfile* file)
|
||||
:TAuto_variable_rectype(file), _nuovo(TRUE), _nfiles(0)
|
||||
{
|
||||
}
|
||||
|
||||
// @ cmember costruttore dal record
|
||||
TMultiple_rectype::TMultiple_rectype(const TRectype & rec)
|
||||
:TAuto_variable_rectype(rec), _nuovo(TRUE), _nfiles(0)
|
||||
{
|
||||
}
|
||||
|
||||
// @mfunc costruttore di copia
|
||||
TMultiple_rectype::TMultiple_rectype(const TMultiple_rectype& r)
|
||||
:TAuto_variable_rectype(r), _files(r._files)
|
||||
{
|
||||
// copia..
|
||||
_nuovo=r._nuovo;
|
||||
_nfiles=r._nfiles; // file delle righe
|
||||
_numfields=r._numfields;
|
||||
}
|
||||
|
||||
HIDDEN TString16 _mg_null_str;
|
||||
|
||||
|
||||
|
||||
const TString & TArticolo::get_str(const char* fieldname) const
|
||||
{
|
||||
if (*fieldname != '#')
|
||||
@ -356,7 +133,7 @@ bool TArticolo::unlock()
|
||||
if (*(const char *)_codice)
|
||||
{
|
||||
TLocalisamfile anag(LF_ANAMAG);
|
||||
anag.set_curr(this);
|
||||
anag.curr()=*this;
|
||||
rv=(anag.read(_isequal,_unlock)==NOERR);
|
||||
return rv;
|
||||
}
|
||||
@ -370,7 +147,7 @@ bool TArticolo::lock_and_prompt()
|
||||
TTimed_breakbox bbox((const char *)mess,10);
|
||||
do {
|
||||
TLocalisamfile anag(LF_ANAMAG);
|
||||
anag.set_curr(this);
|
||||
anag.curr()=*this;
|
||||
if (anag.read(_isequal,_testandlock)==NOERR)
|
||||
return TRUE;
|
||||
} while (bbox.run()!=K_ESC);
|
||||
@ -382,6 +159,9 @@ TArticolo::TArticolo(const char* codice)
|
||||
: TMultiple_rectype(LF_ANAMAG)
|
||||
|
||||
{
|
||||
add_file(LF_UMART,"NRIGA");
|
||||
add_file(LF_CODCORR,"NRIGA");
|
||||
add_file(LF_DESLIN,"NRIGA");
|
||||
_codice = new TRecfield(*this, ANAMAG_CODART);
|
||||
if (codice && *codice)
|
||||
read(codice);
|
||||
@ -398,6 +178,11 @@ TArticolo::~TArticolo()
|
||||
delete _codice;
|
||||
}
|
||||
|
||||
// *****************
|
||||
//
|
||||
|
||||
|
||||
|
||||
const TString & TArticolo_giacenza::get_str(const char* fieldname) const
|
||||
{
|
||||
if (*fieldname != '#')
|
||||
@ -800,6 +585,8 @@ real TArticolo_giacenza::LIFO_ragionieristico(const char * annoes, const char *
|
||||
TArticolo_giacenza::TArticolo_giacenza(const char* codice)
|
||||
: TArticolo(codice)
|
||||
{
|
||||
add_file(LF_MAG,"NRIGA");
|
||||
add_file(LF_STOMAG,"NRIGA");
|
||||
if (last_esercizio < 0 )
|
||||
{
|
||||
TEsercizi_contabili e;
|
||||
@ -820,3 +607,682 @@ TArticolo_giacenza::TArticolo_giacenza(const TRectype& rec)
|
||||
}
|
||||
|
||||
|
||||
#include <relapp.h>
|
||||
#include <utility.h>
|
||||
#include <tabutil.h>
|
||||
#include <msksheet.h>
|
||||
#include <recarray.h>
|
||||
#include <assoc.h>
|
||||
#include <checks.h>
|
||||
#include <defmask.h>
|
||||
#include <varrec.h>
|
||||
#include "..\ve\velib01.h"
|
||||
#include "..\ve\sconti.h"
|
||||
#include "..\ve\veconf.h"
|
||||
|
||||
|
||||
const real CENTO=real(100.0);
|
||||
|
||||
|
||||
bool TCondizione_vendita:: ricerca(const char * codice, const real & qta)
|
||||
{
|
||||
int tiporic;
|
||||
switch (_condv.get_char("TIPO")) {
|
||||
case 'L':
|
||||
tiporic=A_LISTINI;
|
||||
break;
|
||||
case 'C':
|
||||
tiporic=A_CONTRATTI;
|
||||
break;
|
||||
case 'O':
|
||||
tiporic=A_OFFERTE;
|
||||
break;
|
||||
}
|
||||
return cerca(tiporic,codice, qta);
|
||||
}
|
||||
|
||||
|
||||
bool TCondizione_vendita::cerca( int tiporicerca, const char * codriga , const real & qta)
|
||||
{
|
||||
if( config_ditta().get_bool( "GES", "ve", tiporicerca ) )
|
||||
{
|
||||
_condv.setkey( 1 );
|
||||
|
||||
if (_condv.get("COD").empty())
|
||||
return FALSE;
|
||||
switch( tiporicerca )
|
||||
{
|
||||
case A_CONTRATTI:
|
||||
{
|
||||
}
|
||||
break;
|
||||
case A_LISTINI:
|
||||
{
|
||||
_condv.put("TIPOCF", "");
|
||||
_condv.put("CODCF", "");
|
||||
if( !config_ditta().get_bool("GESLISCV", "ve"))
|
||||
_condv.put("CATVEN", "");
|
||||
}
|
||||
break;
|
||||
case A_OFFERTE:
|
||||
{
|
||||
}
|
||||
break;
|
||||
}
|
||||
if( _condv.read( ) == NOERR )
|
||||
{
|
||||
// si posiziona sulla riga
|
||||
const bool gest_scagl = _condv.get_bool("GESTSCAGL");
|
||||
const TString16 seqricrighe( _condv.get( "SEQRIC" ) );
|
||||
bool found = FALSE;
|
||||
|
||||
for( int i = 0; !found && i < seqricrighe.len( ); i ++ )
|
||||
{
|
||||
_rcondv.zero( );
|
||||
_rcondv.put( "TIPO", _condv.get( "TIPO"));
|
||||
_rcondv.put( "CATVEN", _condv.get( "CATVEN"));
|
||||
_rcondv.put( "TIPOCF", _condv.get( "TIPOCF"));
|
||||
_rcondv.put( "CODCF", _condv.get( "CODCF"));
|
||||
_rcondv.put("COD", _condv.get("COD"));
|
||||
if (gest_scagl)
|
||||
_rcondv.put("NSCAGL", 1);
|
||||
|
||||
char ricerca = seqricrighe[ i ];
|
||||
_rcondv.put( "TIPORIGA", ricerca );
|
||||
switch( ricerca )
|
||||
{
|
||||
case 'A':
|
||||
{
|
||||
_rcondv.put( "CODRIGA", codriga);
|
||||
if (_rcondv.read() != NOERR &&
|
||||
_rcondv.prev() == NOERR &&
|
||||
_rcondv.get("TIPORIGA")[0] == 'A')
|
||||
{
|
||||
const TString cod_found(_rcondv.get("CODRIGA"));
|
||||
return cod_found.compare(codriga, cod_found.len()) == 0;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'R':
|
||||
_rcondv.put("CODRIGA", anamag().get( "RAGGFIS"));
|
||||
_rcondv.read();
|
||||
break;
|
||||
case 'S':
|
||||
{
|
||||
_rcondv.put( "CODRIGA", anamag().get("GRMERC"));
|
||||
_rcondv.read( );
|
||||
}
|
||||
break;
|
||||
case 'G':
|
||||
{
|
||||
_rcondv.put( "CODRIGA", anamag().get("GRMERC").left(3));
|
||||
_rcondv.read( );
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
found = _rcondv.good();
|
||||
}
|
||||
// individua lo scaglione corretto in base alla quantita'
|
||||
if (found && gest_scagl)
|
||||
{
|
||||
TRectype rec(_rcondv.curr());
|
||||
int last_scagl = 0;
|
||||
int scagl = _rcondv.get_int("NSCAGL");
|
||||
real qta_lim(_rcondv.get_real("QLIM"));
|
||||
while (_rcondv.good() && scagl > last_scagl && qta_lim > ZERO && qta > qta_lim)
|
||||
{
|
||||
if (_rcondv.next() == NOERR)
|
||||
{
|
||||
last_scagl = scagl;
|
||||
scagl = _rcondv.get_int("NSCAGL");
|
||||
qta_lim =_rcondv.get_real("QLIM");
|
||||
rec = _rcondv.curr();
|
||||
}
|
||||
}
|
||||
_rcondv.read(rec);
|
||||
}
|
||||
_prezzo = _rcondv.get_real("PREZZO");
|
||||
return found;
|
||||
}
|
||||
}
|
||||
// Ricerca fallita
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
void TCondizione_vendita::put_condv(const char *tipocv,const char *codicecv,const char *catven,const char *tipocf,const char *codcf)
|
||||
{
|
||||
_condv.put("TIPO",tipocv);
|
||||
_condv.put("CATVEN",catven);
|
||||
_condv.put("TIPOCF",tipocf);
|
||||
_condv.put("CODCF",codcf);
|
||||
_condv.put("COD",codicecv);
|
||||
}
|
||||
|
||||
void TCondizione_vendita::put_listino(const char * codlist,const char *catven)
|
||||
{
|
||||
if( !config_ditta().get_bool("GESLISCV", "ve"))
|
||||
put_condv("L",codlist,"","","");
|
||||
else
|
||||
put_condv("L",codlist,catven,"","");
|
||||
}
|
||||
void TCondizione_vendita::put_contratto(const char * codcontr,const char *tipocf,const char *codcf)
|
||||
{
|
||||
put_condv("C",codcontr,"",tipocf,codcf);
|
||||
}
|
||||
void TCondizione_vendita::put_offerta(const char * codoff)
|
||||
{
|
||||
put_condv("C",codoff,"","","");
|
||||
}
|
||||
|
||||
|
||||
TCondizione_vendita::TCondizione_vendita(TConfig * ditta,
|
||||
TLocalisamfile * anamag, TLocalisamfile * umart)
|
||||
: _condv(LF_CONDV), _rcondv(LF_RCONDV),
|
||||
_sconti( LF_SCONTI ),
|
||||
_anamag(anamag), _umart(umart), _config_ditta(ditta), _ivarid(FALSE)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
// *********************
|
||||
// movimenti di magazzino
|
||||
|
||||
// causali
|
||||
|
||||
int TCausale_magazzino::sgn(TTipo_saldomag tiposaldo)
|
||||
{
|
||||
switch (tiposaldo) {
|
||||
case s_giac:
|
||||
return get_int("I0");
|
||||
case s_acq:
|
||||
return get_int("I1");
|
||||
case s_ent:
|
||||
return get_int("I2");
|
||||
case s_ven:
|
||||
return get_int("I3");
|
||||
case s_usc:
|
||||
return get_int("I4");
|
||||
case s_ordc:
|
||||
return get_int("I5");
|
||||
case s_ordf:
|
||||
return get_int("I6");
|
||||
case s_incl:
|
||||
return get_int("I7");
|
||||
case s_acl:
|
||||
return get_int("I8");
|
||||
case s_prodc:
|
||||
return get_int("I9");
|
||||
case s_prodf:
|
||||
return get_int("I10");
|
||||
case s_rim:
|
||||
return get_int("I11");
|
||||
case s_scart:
|
||||
return get_int("I12");
|
||||
case s_label:
|
||||
return get_int("I13");
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
TCausale_magazzino::TCausale_magazzino(const char * codice):
|
||||
TRectype(LF_TAB)
|
||||
{
|
||||
TTable f("CAU");
|
||||
f.put("CODTAB",codice);
|
||||
if (f.read() != NOERR)
|
||||
zero();
|
||||
else
|
||||
*this=(TCausale_magazzino &)f.curr();
|
||||
}
|
||||
TCausale_magazzino::~TCausale_magazzino()
|
||||
{
|
||||
}
|
||||
|
||||
// movimenti
|
||||
TLine_movmag ::TLine_movmag(const TLine_movmag &l)
|
||||
{
|
||||
um=l.um;
|
||||
quant=l.quant;
|
||||
prezzo=l.prezzo;
|
||||
}
|
||||
|
||||
int TLine_movmag::operator==(TLine_movmag &l)
|
||||
{
|
||||
return (um==l.um)&&(quant==l.quant)&&(prezzo==l.prezzo);
|
||||
}
|
||||
|
||||
|
||||
|
||||
TMov_mag::TMov_mag(bool autoload_rows) :
|
||||
TMultiple_rectype(LF_MOVMAG),
|
||||
lines_to_add(), lines_to_subtract()
|
||||
{
|
||||
add_file(LF_RMOVMAG,"NRIG",autoload_rows);
|
||||
}
|
||||
|
||||
TMov_mag::~TMov_mag()
|
||||
{
|
||||
}
|
||||
|
||||
// valuta il valore della chiave per un nuovo record
|
||||
bool TMov_mag::renum()
|
||||
{
|
||||
put("NUMREG",get_next_key());
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// copia la chiave dal file principale a quello delle righe
|
||||
void TMov_mag::set_body_key(TRectype & rowrec)
|
||||
{
|
||||
rowrec.put("NUMREG",get("NUMREG")) ;
|
||||
}
|
||||
|
||||
int TMov_mag::read(TBaseisamfile& f, word op , word lockop)
|
||||
{
|
||||
TToken_string l_key;
|
||||
TLine_movmag l_data;
|
||||
|
||||
int res=TMultiple_rectype::read(f,op,lockop);
|
||||
|
||||
// reset delle strutture per il controlli delle variazioni dei saldi
|
||||
_codcaus=get("CODCAUS");
|
||||
_annoes=get("ANNOES");
|
||||
lines_to_add.destroy();
|
||||
lines_to_subtract.destroy();
|
||||
for (int i=0; i<rows(); i++) {
|
||||
l_key=line2key(i+1);
|
||||
l_data=line2data(i+1);
|
||||
delete_line(l_key,l_data);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
int TMov_mag::remove(TBaseisamfile& f) const
|
||||
{
|
||||
int res;
|
||||
if ((res=TMultiple_rectype::remove(f))==NOERR )
|
||||
// effettua la variazione dei saldi
|
||||
res=update_balances();
|
||||
return res;
|
||||
}
|
||||
|
||||
int TMov_mag::write(TBaseisamfile& f) const
|
||||
{
|
||||
int res;
|
||||
TToken_string l_key;
|
||||
TLine_movmag l_data;
|
||||
// memorizza le variazioni
|
||||
for (int i=0; i<rows(); i++) {
|
||||
l_key=line2key(i+1);
|
||||
l_data=line2data(i+1);
|
||||
((TMov_mag *)this)->insert_line(l_key,l_data);
|
||||
}
|
||||
if ((res=TMultiple_rectype::write(f))==NOERR )
|
||||
// effettua la variazione dei saldi
|
||||
res=update_balances();
|
||||
return res;
|
||||
}
|
||||
|
||||
int TMov_mag::rewrite(TBaseisamfile& f) const
|
||||
{
|
||||
int res;
|
||||
TToken_string l_key;
|
||||
TLine_movmag l_data;
|
||||
// memorizza le variazioni
|
||||
for (int i=0; i<rows(); i++) {
|
||||
l_key=line2key(i+1);
|
||||
l_data=line2data(i+1);
|
||||
((TMov_mag *)this)->insert_line(l_key,l_data);
|
||||
}
|
||||
if ((res=TMultiple_rectype::rewrite(f))==NOERR )
|
||||
// effettua la variazione dei saldi
|
||||
res=update_balances();
|
||||
return res;
|
||||
}
|
||||
|
||||
const char *TMov_mag::get_next_key()
|
||||
{
|
||||
TLocalisamfile f(LF_MOVMAG);
|
||||
f.last();
|
||||
int a=atoi(f.get("NUMREG"))+1;
|
||||
return _nextcod.format("%d",a);
|
||||
}
|
||||
|
||||
//*******
|
||||
// gestione delle variazione dei saldi
|
||||
//
|
||||
//
|
||||
int TMov_mag::force_update_bal()
|
||||
{
|
||||
int res;
|
||||
TToken_string l_key;
|
||||
TLine_movmag l_data;
|
||||
|
||||
// reset delle strutture per il controlli delle variazioni dei saldi
|
||||
_codcaus=get("CODCAUS");
|
||||
_annoes=get("ANNOES");
|
||||
lines_to_add.destroy();
|
||||
lines_to_subtract.destroy();
|
||||
// memorizza le variazioni
|
||||
for (int i=0; i<rows(); i++) {
|
||||
l_key=line2key(i+1);
|
||||
l_data=line2data(i+1);
|
||||
((TMov_mag *)this)->insert_line(l_key,l_data);
|
||||
}
|
||||
res=update_balances();
|
||||
return res;
|
||||
}
|
||||
|
||||
TLine_movmag TMov_mag::line2data(int numriga) const
|
||||
{
|
||||
TLine_movmag rest;
|
||||
rest.um =(const char *)body().row(numriga).get("UM");
|
||||
rest.quant =(const char *)body().row(numriga).get("QUANT");
|
||||
rest.prezzo=(const char *)body().row(numriga).get("PREZZO");
|
||||
return rest;
|
||||
}
|
||||
|
||||
TToken_string TMov_mag::line2key(int numriga) const
|
||||
{
|
||||
TToken_string key;
|
||||
TString16 nr;
|
||||
nr << numriga;
|
||||
key.add(body().row(numriga).get("CODART"));
|
||||
key.add(body().row(numriga).get("CODMAG"));
|
||||
key.add(body().row(numriga).get("LIVGIAC"));
|
||||
key.add(nr);
|
||||
return key;
|
||||
}
|
||||
|
||||
TString TMov_mag::key2field(TToken_string &key,const char *fieldname)
|
||||
{
|
||||
if (strcmp(fieldname,"CODART")==0)
|
||||
return key.get(0);
|
||||
if (strcmp(fieldname,"CODMAG")==0)
|
||||
return key.get(1);
|
||||
if (strcmp(fieldname,"LIVGIAC")==0)
|
||||
return key.get(2);
|
||||
CHECKS(FALSE, "Nome di campo non appartenente al file righe mov ", fieldname);
|
||||
return "";
|
||||
}
|
||||
|
||||
|
||||
int TMov_mag::insert_line(TToken_string &k,TLine_movmag &r)
|
||||
{
|
||||
if (_codcaus != get("CODCAUS") || _annoes != get("ANNOES")) {
|
||||
lines_to_add.add(k,r);
|
||||
} else {
|
||||
if (lines_to_subtract.is_key(k)&& (TLine_movmag &)lines_to_subtract[k]==r)
|
||||
// modifica annullata
|
||||
lines_to_subtract.remove(k);
|
||||
else
|
||||
// linea modificata
|
||||
lines_to_add.add(k,r);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int TMov_mag::delete_line(TToken_string &k,TLine_movmag &r)
|
||||
{
|
||||
if (_codcaus != get("CODCAUS") || _annoes != get("ANNOES")) {
|
||||
lines_to_subtract.add(k,r);
|
||||
} else {
|
||||
if (lines_to_add.is_key(k)&& r==(TLine_movmag &)lines_to_add[k] )
|
||||
// modifica annullata
|
||||
lines_to_add.remove(k);
|
||||
else
|
||||
// linea modificata
|
||||
lines_to_subtract.add(k,r);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool TMov_mag::unlock_anamag(const char *codart)
|
||||
{
|
||||
TLocalisamfile anamag(LF_ANAMAG);
|
||||
anamag.put("CODART",codart);
|
||||
return (anamag.read(_isequal,_unlock)==NOERR);
|
||||
}
|
||||
|
||||
bool TMov_mag::lock_anamag(const char *codart)
|
||||
{
|
||||
TLocalisamfile anamag(LF_ANAMAG);
|
||||
anamag.put("CODART",codart);
|
||||
bool insert_new=TRUE;
|
||||
TString mess;
|
||||
mess << "Il record di anagrafica dell'articolo ''"<< codart << "'' risulta essere già in uso.\n Interrompo ?";
|
||||
TTimed_breakbox bbox((const char *)mess,10);
|
||||
do {
|
||||
if (anamag.read(_isequal,_testandlock)==NOERR)
|
||||
return TRUE;
|
||||
} while (bbox.run()!=K_ESC);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
void TMov_mag::giac_putkey(TLocalisamfile & mag,TString16 annoes,TToken_string curr_key)
|
||||
{
|
||||
mag.zero(' ');
|
||||
mag.put("ANNOES",annoes);
|
||||
mag.put("CODMAG",key2field(curr_key,"CODMAG"));
|
||||
mag.put("CODART",key2field(curr_key,"CODART"));
|
||||
mag.put("LIVELLO",key2field(curr_key,"LIVGIAC"));
|
||||
}
|
||||
|
||||
|
||||
// aggiorna tutti i saldi in base alle modifiche fatte.
|
||||
// il lock su anagrafica dovrebbe garantire il lock su tutte le
|
||||
// giacenze dell'articolo
|
||||
int TMov_mag::update_balances() const
|
||||
{
|
||||
bool updated_bal=TRUE;
|
||||
TLocalisamfile mag(LF_MAG);
|
||||
mag.setkey(2);
|
||||
|
||||
|
||||
TString_array keys_to_add,keys_to_remove;
|
||||
((TMov_mag *)this)->lines_to_add.get_keys(keys_to_add);
|
||||
((TMov_mag *)this)->lines_to_subtract.get_keys(keys_to_remove);
|
||||
|
||||
// aggiunge i saldi nuovi
|
||||
keys_to_add.sort();
|
||||
TToken_string * curr_key=(TToken_string *)keys_to_add.first_item();
|
||||
|
||||
while (curr_key) {
|
||||
TArticolo_giacenza articolo(key2field(*curr_key,"CODART"));
|
||||
if (articolo.lock_and_prompt()) {
|
||||
TLine_movmag & line_mov=(TLine_movmag &)lines_to_add[*curr_key];
|
||||
articolo.update_ultcosti(line_mov.prezzo,get_date("DATACOMP"));
|
||||
// lock gained
|
||||
giac_putkey(mag,get("ANNOES"),*curr_key);
|
||||
if (mag.read()!=NOERR) {
|
||||
// non trovato: aggiungo
|
||||
giac_putkey(mag,get("ANNOES"),*curr_key);
|
||||
mag.put("NRIGA",1+articolo.mag(get("ANNOES")).rows());
|
||||
mag.write();
|
||||
}
|
||||
// modifica questo record (e lo sblocca)
|
||||
update_balances(mag.curr(),line_mov,get("CODCAUS"),+1);
|
||||
/*// ottimizzazione :(cerca di sfruttare la lettura fatta per un eventuale saldo vecchio)
|
||||
// ciò causa la modifica dell'oggetto TMov_mag (il metodo non è più const)
|
||||
if (_annoes == get("ANNOES")
|
||||
&& lines_to_subtract.is_key(*curr_key)) {
|
||||
update_balances(mag.curr(),(TLine_movmag &)lines_to_subtract[*curr_key],_codcaus,-1);
|
||||
((TMov_mag *)this)->lines_to_add.remove(*curr_key);
|
||||
((TMov_mag *)this)->lines_to_subtract.remove(*curr_key);
|
||||
}*/
|
||||
mag.rewrite();
|
||||
// conclude la TRANSAZIONE prima di sbloccare il record dell'articolo
|
||||
TToken_string *rem_key=(TToken_string *)keys_to_remove.first_item();
|
||||
while ( rem_key) {
|
||||
if (key2field(*rem_key,"CODART")==key2field(*curr_key,"CODART")) {
|
||||
giac_putkey(mag,_annoes,*rem_key);
|
||||
if (mag.read()==NOERR) {
|
||||
update_balances(mag.curr(),(TLine_movmag &)lines_to_subtract[*rem_key],_codcaus,-1);
|
||||
mag.rewrite();
|
||||
}
|
||||
keys_to_remove.remove_item();
|
||||
}
|
||||
rem_key=(TToken_string *)keys_to_remove.succ_item();
|
||||
}
|
||||
articolo.unlock();
|
||||
} else {
|
||||
updated_bal=FALSE;
|
||||
}
|
||||
curr_key=(TToken_string *)keys_to_add.succ_item();
|
||||
}
|
||||
// togli i saldi vecchi
|
||||
curr_key=(TToken_string *)keys_to_remove.first_item();
|
||||
|
||||
while (curr_key) {
|
||||
TArticolo articolo(key2field(*curr_key,"CODART"));
|
||||
if (articolo.lock_and_prompt()) {
|
||||
giac_putkey(mag,_annoes,*curr_key);
|
||||
// modifica questo record (e lo sblocca)
|
||||
if (mag.read()==NOERR) {
|
||||
update_balances(mag.curr(),(TLine_movmag &)lines_to_subtract[*curr_key],_codcaus,-1);
|
||||
mag.rewrite();
|
||||
}
|
||||
articolo.unlock();
|
||||
} else {
|
||||
updated_bal=FALSE;
|
||||
}
|
||||
curr_key=(TToken_string *)keys_to_remove.succ_item();
|
||||
}
|
||||
if (!updated_bal) {
|
||||
// saldi non aggiornati
|
||||
warning_box("I saldi di magazzino non sono stati del tutto aggiornati. \nProcedere ad una operazione di ''Ricostruzione saldi''");
|
||||
}
|
||||
return updated_bal;
|
||||
}
|
||||
|
||||
// aggiorna i saldi del record corrente
|
||||
// in base alla causale e alla modifica fatta (con segno + o -)
|
||||
int TMov_mag::update_balances(TRectype & magrec, const TLine_movmag &l,TString16 codcaus,int rett_sign) const
|
||||
{
|
||||
TCausale_magazzino caus(codcaus);
|
||||
TLocalisamfile umart(LF_UMART);
|
||||
real diff,diff_val;
|
||||
umart.setkey(2);
|
||||
umart.put(UMART_CODART,magrec.get(MAG_CODART));
|
||||
umart.put(UMART_UM , l.um);
|
||||
umart.read();
|
||||
real fc=umart.get_real("FC");
|
||||
|
||||
diff=fc*rett_sign*l.quant;
|
||||
diff_val=rett_sign*l.quant*l.prezzo;
|
||||
update_balance(magrec,"GIAC",diff*caus.sgn(s_giac)); // update ..
|
||||
update_balance(magrec,"ACQ",diff*caus.sgn(s_acq)); // update ..
|
||||
update_balance(magrec,"VALACQ",diff_val*caus.sgn(s_acq)); // update ..
|
||||
update_balance(magrec,"ENT",diff*caus.sgn(s_ent));
|
||||
update_balance(magrec,"VALENT",diff_val*caus.sgn(s_ent));
|
||||
update_balance(magrec,"VEN",diff*caus.sgn(s_ven));
|
||||
update_balance(magrec,"VALVEN",diff_val*caus.sgn(s_ven));
|
||||
update_balance(magrec,"USC",diff*caus.sgn(s_usc));
|
||||
update_balance(magrec,"VALUSC",diff_val*caus.sgn(s_usc));
|
||||
update_balance(magrec,"ORDC",diff*caus.sgn(s_ordc));
|
||||
update_balance(magrec,"VALORDC",diff_val*caus.sgn(s_ordc));
|
||||
update_balance(magrec,"ORDF",diff*caus.sgn(s_ordf));
|
||||
update_balance(magrec,"VALORDF",diff_val*caus.sgn(s_ordf));
|
||||
update_balance(magrec,"RIM",diff*caus.sgn(s_rim));
|
||||
update_balance(magrec,"VALRIM",diff_val*caus.sgn(s_rim));
|
||||
update_balance(magrec,"SCARTI",diff*caus.sgn(s_scart));
|
||||
update_balance(magrec,"VALSCARTI",diff_val*caus.sgn(s_scart));
|
||||
update_balance(magrec,"INCL",diff*caus.sgn(s_incl));
|
||||
update_balance(magrec,"ACL",diff*caus.sgn(s_acl));
|
||||
update_balance(magrec,"PRODCOMP",diff*caus.sgn(s_prodc));
|
||||
update_balance(magrec,"PRODFIN",diff*caus.sgn(s_prodf));
|
||||
update_balance(magrec,"NLABEL",diff*caus.sgn(s_label));
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void TMov_mag::update_balance(TRectype & magrec, const char * fieldname, real diff) const
|
||||
{
|
||||
magrec.put(fieldname,magrec.get_int(fieldname)+diff);
|
||||
}
|
||||
|
||||
HIDDEN TEsercizi_contabili _esercizi;
|
||||
|
||||
int TMov_mag::codice_esercizio(TDate &d)
|
||||
{
|
||||
return _esercizi.date2esc(d);
|
||||
}
|
||||
|
||||
|
||||
//**********************
|
||||
bool rebuild_balances(TString16 annoes, bool reset_giac)
|
||||
{
|
||||
TArray used_files;
|
||||
used_files.add(new TLocalisamfile(LF_RMOVMAG),LF_RMOVMAG);
|
||||
used_files.add(new TLocalisamfile(LF_MOVMAG),LF_MOVMAG);
|
||||
used_files.add(new TTable("CAU"),5);
|
||||
TMov_mag * m_m= new TMov_mag; // record del movimento di magazzino
|
||||
|
||||
// relazione con un solo file (LF_MOVMAG) ma col record Head_Body
|
||||
TRelation rel(LF_MOVMAG);
|
||||
rel.lfile().set_curr(m_m);
|
||||
int ok=TRUE;
|
||||
TLocalisamfile mag(LF_MAG);
|
||||
if (reset_giac) {
|
||||
// azzera tutte giacenze (ciclo sulle giacenze)
|
||||
mag.put("ANNOES",annoes);
|
||||
mag.read(_isgteq);
|
||||
while (!mag.eof() && annoes==mag.get("ANNOES"))
|
||||
{
|
||||
TString currcode(mag.get("CODART"));
|
||||
TArticolo articolo(currcode);
|
||||
if (articolo.lock_and_prompt())
|
||||
{
|
||||
while (!mag.eof() && currcode==mag.get("CODART"))
|
||||
{
|
||||
mag.put("ACQ",0);mag.put("VALACQ",0);
|
||||
mag.put("ENT",0);mag.put("VALENT",0);
|
||||
mag.put("VEN",0);mag.put("VALVEN",0);
|
||||
mag.put("USC",0);mag.put("VALUSC",0);
|
||||
mag.put("ORDF",0);mag.put("VALORDF",0);
|
||||
mag.put("ORDC",0);mag.put("VALORDC",0);
|
||||
mag.put("SCARTI",0);mag.put("VALSCARTI",0);
|
||||
mag.put("GIAC",0);
|
||||
mag.put("PRODCOMP",0);
|
||||
mag.put("PRODFIN",0);
|
||||
mag.put("INCL",0);
|
||||
mag.put("ACL",0);
|
||||
mag.put("NLABEL",0);
|
||||
mag.rewrite();
|
||||
mag.next();
|
||||
}
|
||||
articolo.unlock();
|
||||
} else {
|
||||
ok=FALSE;
|
||||
mag.next();
|
||||
}
|
||||
}
|
||||
}
|
||||
// ricostruisce i saldi (ciclo sui movimenti)
|
||||
TString filterexpr;
|
||||
filterexpr << LF_MOVMAG << "->ANNOES==" << annoes;
|
||||
TCursor cur(&rel,filterexpr); // cursore filtrato
|
||||
|
||||
for (int i=0; i<cur.objects(); i++)
|
||||
{
|
||||
cur=i;
|
||||
TMov_mag & mov_rec=(TMov_mag &)cur.file().curr();
|
||||
if (!mov_rec.force_update_bal())
|
||||
ok=FALSE;
|
||||
}
|
||||
|
||||
return ok;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
238
mg/mglib03.cpp
Executable file
238
mg/mglib03.cpp
Executable file
@ -0,0 +1,238 @@
|
||||
#include "form.h"
|
||||
#include "mglib.h"
|
||||
|
||||
|
||||
void TForm_stampemg::add_giaclev(TString &levname)
|
||||
{
|
||||
int lv=1;
|
||||
do {
|
||||
const TString & piece = _giaclev->unpack_grpcode(relation()->lfile(LF_MAG).get("LIVELLO"),lv);
|
||||
if (piece.not_empty()) {
|
||||
levname << '/' << piece ;
|
||||
}
|
||||
} while (++lv< (_tolivgiac ? _tolivgiac: _giaclev->last_level()) );
|
||||
}
|
||||
|
||||
|
||||
void TForm_stampemg::gruppogiac(TForm_item &cf, TToken_string &s)
|
||||
{
|
||||
TString valore,levname;
|
||||
int livello=atoi(s.get());
|
||||
|
||||
if (_fromlivgiac) {
|
||||
levname=relation()->lfile(LF_MAG).get("CODART");
|
||||
if (_fromlivgiac>1) {
|
||||
add_giaclev(levname);
|
||||
}
|
||||
}
|
||||
levname << ' ' << _giaclev->name(livello) ;
|
||||
valore=_giacgrp->decode(_giaclev->build_tabcode(relation()->lfile(LF_MAG).get("LIVELLO"),livello));
|
||||
if (valore.empty())
|
||||
valore=UNKNOWN_NAME;
|
||||
cf.set(levname << ' ' << valore);
|
||||
}
|
||||
|
||||
|
||||
void TForm_stampemg::gruppoart(TForm_item &cf, TToken_string &s)
|
||||
{
|
||||
int lv=atoi(s.get());
|
||||
TString valore;
|
||||
|
||||
valore=_artgrp->decode(_artlev->build_tabcode(relation()->lfile(LF_ANAMAG).get("CODART"),lv));
|
||||
if (valore.not_empty())
|
||||
cf.set(valore);
|
||||
else
|
||||
cf.set(UNKNOWN_NAME);
|
||||
}
|
||||
|
||||
bool TForm_stampemg::validate(TForm_item &cf, TToken_string &s)
|
||||
{
|
||||
const TString code(s.get(0)); // prende il primo parametro, il codice del messaggio
|
||||
TString subcode;
|
||||
TString valore,levname;
|
||||
|
||||
if (code=="_USER") {
|
||||
subcode=s.get();
|
||||
|
||||
if (subcode=="GRUPPOGIAC") {
|
||||
/*
|
||||
int lv=atoi(s.get());
|
||||
do {
|
||||
valore=_giaclev->build_tabcode(relation()->lfile(LF_MAG).get("LIVELLO"),lv);
|
||||
} while (--lv>0 && valore=="");
|
||||
if (valore!="")
|
||||
levname=_giaclev->name(lv+1) ;
|
||||
else
|
||||
levname="giacenza";
|
||||
cf.set(levname << ' ' << _giacgrp->decode(valore));
|
||||
*/
|
||||
gruppogiac(cf,s);
|
||||
}
|
||||
if (subcode=="GRUPPOART") {
|
||||
/*
|
||||
int lv=atoi(s.get());
|
||||
do {
|
||||
valore=_artlev->build_tabcode(relation()->lfile(LF_ANAMAG).get("CODART"),lv);
|
||||
} while (--lv>0 && valore=="");
|
||||
cf.set(_artgrp->decode(valore));
|
||||
*/
|
||||
gruppoart(cf,s);
|
||||
}
|
||||
if (subcode=="CODGRUPPOART") {
|
||||
int lv=atoi(s.get());
|
||||
do {
|
||||
valore=relation()->lfile(LF_ANAMAG).get("CODART");
|
||||
valore.cut(_artlev->packed_lenght(lv));
|
||||
} while (--lv>0 && valore=="");
|
||||
cf.set(valore);
|
||||
|
||||
}
|
||||
if (subcode=="CATMER") {
|
||||
valore=relation()->lfile(_sottocatmer ? -401 : -400).get("S0");
|
||||
cf.set(valore);
|
||||
}
|
||||
if (subcode=="CODCATMER") {
|
||||
valore=relation()->lfile(LF_ANAMAG).get("GRMERC");
|
||||
valore.cut(_sottocatmer ? 5:3);
|
||||
cf.set(valore);
|
||||
}
|
||||
if (subcode=="LIVELLIGIAC") {
|
||||
int lv=_tolivgiac;
|
||||
valore="";
|
||||
do {
|
||||
const TString & piece = _giaclev->unpack_grpcode(relation()->lfile(LF_MAG).get("LIVELLO"),lv+1);
|
||||
if (piece.not_empty()) {
|
||||
if (valore.not_empty())
|
||||
valore << '/';
|
||||
valore << piece ;
|
||||
}
|
||||
} while (lv++<_giaclev->last_level());
|
||||
if (valore!="")
|
||||
levname=_giaclev->name(_tolivgiac+1);
|
||||
else
|
||||
levname="Giacenza";
|
||||
cf.set(levname << ' ' << valore);
|
||||
}
|
||||
return TRUE;
|
||||
} else
|
||||
return TForm::validate(cf, s);
|
||||
}
|
||||
|
||||
void TForm_stampemg::setcatmer(bool catmer,bool sottoc)
|
||||
{
|
||||
TForm_subsection &s=((TForm_subsection &)find_field('B',odd_page,"GRUPPI_CATMER"));
|
||||
TString cond("GRMERC");
|
||||
if (catmer)
|
||||
cond << "[1," << (sottoc ? 5 : 3) <<']';
|
||||
else
|
||||
cond ="CODART[1,1]";
|
||||
s.setcondition(cond,_strexpr);
|
||||
_sottocatmer=sottoc;
|
||||
}
|
||||
|
||||
bool TForm_stampemg::setdett_perart(int fromlivart,int livart,int fromlivgiac,int livgiac,bool showmag, bool showdep)
|
||||
{
|
||||
find_field('B',odd_page,"H_MAGAZZINO").show(showmag && showdep);
|
||||
find_field('B',odd_page,"TOT_MAGAZZINO").show(showmag);
|
||||
find_field('B',odd_page,"H_DEPOSITO").show(FALSE);
|
||||
find_field('B',odd_page,"TOT_DEPOSITO").show(showdep);
|
||||
return setdettaglio(TRUE,fromlivart,livart,fromlivgiac,livgiac,showmag||showdep);
|
||||
}
|
||||
|
||||
bool TForm_stampemg::setdett_permag(int fromlivart,int livart,int fromlivgiac,int livgiac,bool showmag, bool showdep,bool showdett)
|
||||
{
|
||||
find_field('B',odd_page,"H_MAGAZZINO").show(showmag && (showdep) );
|
||||
find_field('B',odd_page,"TOT_MAGAZZINO").show(showmag);
|
||||
find_field('B',odd_page,"H_DEPOSITO").show(showdep && showdett);
|
||||
find_field('B',odd_page,"TOT_DEPOSITO").show(showdep);
|
||||
return setdettaglio(showdett,fromlivart,livart,fromlivgiac,livgiac,FALSE);
|
||||
}
|
||||
|
||||
bool TForm_stampemg::setdettaglio(bool show, int fromlivart,int livart,int fromlivgiac,int livgiac,bool dettgiac)
|
||||
{
|
||||
_fromlivart=fromlivart;
|
||||
_fromlivgiac=fromlivgiac;
|
||||
_tolivart=livart;
|
||||
_tolivgiac=livgiac;
|
||||
// ***********
|
||||
int i, tolivart,tolivgiac;
|
||||
// abilita le sezioni dei livelli di codice
|
||||
TForm_subsection &s1=(TForm_subsection &)find_field('B',odd_page,"H_ARTICOLO");
|
||||
TForm_subsection &s2=(TForm_subsection &)find_field('B',odd_page,"TOT_ARTICOLO");
|
||||
if (fromlivgiac==0 && (livart==0 ||livart==_artlev->last_level())) {
|
||||
s1.show(show && livart<_artlev->last_level() || dettgiac);
|
||||
s2.show(show);
|
||||
} else {
|
||||
s1.hide();
|
||||
s2.hide();
|
||||
}
|
||||
tolivart =min(( livart ? livart :_artlev->last_level()),_artlev->last_level()-1) ;
|
||||
tolivgiac=livgiac ? livgiac :_giaclev->last_level();
|
||||
for (i=1; i<=FORM_MAXARTLEV; i++)
|
||||
{
|
||||
TString sname("TOT_GART");
|
||||
sname << i;
|
||||
TForm_subsection &s1=(TForm_subsection &)find_field('B',odd_page,sname);
|
||||
s1.show(show && i>=fromlivart && i<=tolivart && fromlivgiac==0);
|
||||
sname="H_GCODART";
|
||||
sname << i;
|
||||
TForm_subsection &s2=(TForm_subsection &)find_field('B',odd_page,sname);
|
||||
s2.show(show && i>=fromlivart &&
|
||||
(i<tolivart || (i==tolivart && (livart>tolivart || livgiac || dettgiac))) && fromlivgiac==0);
|
||||
}
|
||||
// abilita le sezioni del codice livelli giacenza
|
||||
for (i=1; i<=FORM_MAXGIACLEV; i++)
|
||||
{
|
||||
TString sname("TOT_GLIVGIAC");
|
||||
sname << i;
|
||||
TForm_subsection &s1=(TForm_subsection &)find_field('B',odd_page,sname);
|
||||
s1.show(show && i>=fromlivgiac && (i<=tolivgiac) && livart==0);
|
||||
sname="H_GLIVGIAC";
|
||||
sname << i;
|
||||
TForm_subsection &s2=(TForm_subsection &)find_field('B',odd_page,sname);
|
||||
s2.show(show && i>=fromlivgiac && (i<tolivgiac ||(i==tolivgiac && dettgiac)) && livart==0);
|
||||
}
|
||||
|
||||
// ***********
|
||||
fromlivart = fromlivart ? fromlivart :1;
|
||||
fromlivgiac=fromlivgiac ? fromlivgiac :1;
|
||||
// codice livello giacenza
|
||||
for (i=fromlivgiac;i<=tolivgiac ; i++) {
|
||||
TString sname=("GRUPPI_LIVGIAC");
|
||||
sname << i;
|
||||
TForm_subsection &s=(TForm_subsection &)find_field('B',odd_page,sname);
|
||||
TString cond(s.condition());
|
||||
cond << "[1," << _giaclev->packed_lenght(i) <<']';
|
||||
s.setcondition(cond,_strexpr);
|
||||
}
|
||||
// sezioni livello codice
|
||||
for (i=fromlivart;i<=tolivart ; i++) {
|
||||
TString sname("GRUPPI_CODART");
|
||||
sname << i;
|
||||
TForm_subsection &s=(TForm_subsection &)find_field('B',odd_page,sname);
|
||||
TString cond(s.condition());
|
||||
cond << '[' << (i==1 ? 1:_artlev->packed_lenght(i-1))<<',' << _artlev->packed_lenght(i) <<']';
|
||||
s.setcondition(cond,_strexpr);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
TForm_stampemg::TForm_stampemg(const char *name,const char *code)
|
||||
: TForm(name,code)
|
||||
{
|
||||
_giaclev= new TMag_livelli("FCG");
|
||||
_artlev= new TMag_livelli("FCA");
|
||||
_giacgrp= new TDecoder("GCG");
|
||||
_artgrp= new TDecoder("GCA");
|
||||
_fromlivgiac=_tolivgiac=0;
|
||||
_fromlivart=_tolivart=0;
|
||||
}
|
||||
TForm_stampemg::~TForm_stampemg()
|
||||
{
|
||||
delete _giaclev;
|
||||
delete _artlev;
|
||||
delete _giacgrp;
|
||||
delete _artgrp;
|
||||
}
|
555
mg/mglib06.cpp
Executable file
555
mg/mglib06.cpp
Executable file
@ -0,0 +1,555 @@
|
||||
// **************************************
|
||||
// **************************************
|
||||
// **************************************
|
||||
// *** classi per la libreria
|
||||
// ***
|
||||
//*****
|
||||
#include "mglib.h"
|
||||
|
||||
|
||||
|
||||
int TMultiple_rectype::find(int logicnum, const char * fieldname, const char * s, int from, bool reverse) const
|
||||
{
|
||||
const TRecord_array & recarray = body(logicnum);
|
||||
const int last = recarray.last_row();
|
||||
const int len = s ? strlen(s) : 0;
|
||||
|
||||
if (reverse)
|
||||
{
|
||||
if (from > 0)
|
||||
{
|
||||
if (len == 0)
|
||||
return from - 1;
|
||||
for (int i = recarray.pred_row(from); i > 0; i = recarray.pred_row(i))
|
||||
if (((TRectype &)recarray[i]).get(fieldname) == s)
|
||||
return i;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (last > from)
|
||||
{
|
||||
if (len == 0)
|
||||
return from + 1;
|
||||
for (int i = recarray.succ_row(from); i <= last; i = recarray.succ_row(i))
|
||||
if (((TRectype &)recarray[i]).get(fieldname) == s)
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
int TMultiple_rectype::write_rewrite(TBaseisamfile & f, bool re) const
|
||||
{
|
||||
int err = NOERR;
|
||||
|
||||
if (_nuovo && re) // E' nuovo di zecca! quindi ...
|
||||
re = FALSE; // ... non fare la rewrite
|
||||
|
||||
if (re)
|
||||
{
|
||||
for (int i = _nfiles - 1; err == NOERR && i >= 0 ; i--)
|
||||
{
|
||||
TRecord_array * r = (TRecord_array *) _files.objptr(i);
|
||||
if (r)
|
||||
err = r->write(re);
|
||||
}
|
||||
// rewrite:
|
||||
if (err == NOERR)
|
||||
{
|
||||
err = TRectype::rewrite(f);
|
||||
if (err != NOERR)
|
||||
err = TRectype::write(f);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// write:
|
||||
if (_nuovo)
|
||||
{
|
||||
do
|
||||
{
|
||||
err = TRectype::write(f);
|
||||
if (err == _isreinsert) // usa il flag _nuovo per decidere se
|
||||
((TMultiple_rectype *)this)->renum();
|
||||
} while (err == _isreinsert);
|
||||
((TMultiple_rectype *)this)->_nuovo = FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
err = TRectype::write(f);
|
||||
if (err != NOERR)
|
||||
err = TRectype::rewrite(f);
|
||||
}
|
||||
for (int i = _nfiles - 1; err == NOERR && i >= 0 ; i--)
|
||||
{
|
||||
TRecord_array * r = (TRecord_array *)_files.objptr(i);
|
||||
if (r)
|
||||
err = r->write(re);
|
||||
}
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
void TMultiple_rectype::remove_body(int logicnum)
|
||||
{
|
||||
const int index = log2ind(logicnum);
|
||||
|
||||
if (_files.objptr(index) != NULL)
|
||||
_files.remove(index);
|
||||
}
|
||||
|
||||
int TMultiple_rectype::log2ind(int logicnum) const
|
||||
{
|
||||
if (logicnum == 0)
|
||||
return 0;
|
||||
for (int i = _nfiles - 1; i >= 0 ; i--)
|
||||
if (_logicnums[i] == logicnum)
|
||||
return i;
|
||||
NFCHECK("Can't find file %d in multiple record", logicnum);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void TMultiple_rectype::load_rows_file(int logicnum)
|
||||
{
|
||||
const int index = log2ind(logicnum);
|
||||
TRectype & rec = get_body_record(logicnum);
|
||||
|
||||
set_body_key(rec);
|
||||
TRecord_array * r = new TRecord_array(logicnum, (TString &) _numfields[index]);
|
||||
_files.add( r, index);
|
||||
}
|
||||
|
||||
TRecord_array & TMultiple_rectype::body(int logicnum) const
|
||||
{
|
||||
const int index = log2ind(logicnum);
|
||||
|
||||
if (_files.objptr(index) == NULL)
|
||||
((TMultiple_rectype *) this)->load_rows_file(logicnum);
|
||||
return (TRecord_array &) _files[index];
|
||||
}
|
||||
|
||||
void TMultiple_rectype::renum_key(const char * kfield,const char * val)
|
||||
{
|
||||
TRectype::renum_key(kfield, val); // Aggiorna testata
|
||||
for (int i = _nfiles - 1; i >= 0 ; i--)
|
||||
body(_logicnums[i]).renum_key(kfield, val); // Aggiorna righe
|
||||
}
|
||||
|
||||
|
||||
TRectype & TMultiple_rectype::operator =(const TRectype & r)
|
||||
{
|
||||
TRectype::operator=(r);
|
||||
reset_fields(*this);
|
||||
set_fields(*this);
|
||||
return *this;
|
||||
}
|
||||
|
||||
TRectype & TMultiple_rectype::operator =(const char * r)
|
||||
{
|
||||
TRectype::operator=(r);
|
||||
reset_fields(*this);
|
||||
set_fields(*this);
|
||||
return *this;
|
||||
}
|
||||
|
||||
void TMultiple_rectype::zero(char c)
|
||||
{
|
||||
reset_fields(*this);
|
||||
TAuto_variable_rectype::zero(c);
|
||||
for (int i = _nfiles - 1; i >= 0 ; i--)
|
||||
if (_files.objptr(i) != NULL)
|
||||
_files.remove(i);
|
||||
}
|
||||
|
||||
|
||||
int TMultiple_rectype::read(TRectype & rec, word op, word lockop)
|
||||
{
|
||||
TLocalisamfile f(num());
|
||||
|
||||
*this = rec;
|
||||
|
||||
int err = TRectype::read(f, op, lockop);
|
||||
|
||||
for (int i = _nfiles - 1; i >= 0 ; i--)
|
||||
if (_files.objptr(i) != NULL)
|
||||
_files.remove(i);
|
||||
_nuovo = err != NOERR;
|
||||
return err;
|
||||
}
|
||||
|
||||
int TMultiple_rectype::remove(TBaseisamfile & f) const
|
||||
{
|
||||
int err = NOERR;
|
||||
|
||||
for (int i = _nfiles - 1; err == NOERR && i >= 0 ; i--)
|
||||
{
|
||||
TRecord_array & r = body(_logicnums[i]);
|
||||
r.remove();
|
||||
}
|
||||
if (err == NOERR)
|
||||
err = TRectype::remove(f);
|
||||
return err;
|
||||
}
|
||||
|
||||
// @doc INTERNAL
|
||||
TMultiple_rectype::TMultiple_rectype(int hfn)
|
||||
: TAuto_variable_rectype(hfn), _nuovo(TRUE), _nfiles(0)
|
||||
{
|
||||
}
|
||||
|
||||
// @ cmember costruttore dal file
|
||||
void TMultiple_rectype::add_file(int logicnum, const char * numfield)
|
||||
{
|
||||
CHECK(_nfiles < maxfiles, "Too many files added");
|
||||
_logicnums[_nfiles] = logicnum;
|
||||
_numfields.add(numfield, _nfiles++);
|
||||
}
|
||||
|
||||
TMultiple_rectype::TMultiple_rectype(const TBaseisamfile* file)
|
||||
:TAuto_variable_rectype(file), _nuovo(TRUE), _nfiles(0)
|
||||
{
|
||||
}
|
||||
|
||||
// @ cmember costruttore dal record
|
||||
TMultiple_rectype::TMultiple_rectype(const TRectype & rec)
|
||||
:TAuto_variable_rectype(rec), _nuovo(TRUE), _nfiles(0)
|
||||
{
|
||||
}
|
||||
|
||||
// @mfunc costruttore di copia
|
||||
TMultiple_rectype::TMultiple_rectype(const TMultiple_rectype& r)
|
||||
:TAuto_variable_rectype(r), _files(r._files)
|
||||
{
|
||||
// copia..
|
||||
_nuovo=r._nuovo;
|
||||
_nfiles=r._nfiles; // file delle righe
|
||||
_numfields=r._numfields;
|
||||
}
|
||||
|
||||
|
||||
// THead_lines_record
|
||||
// metodi protected
|
||||
|
||||
void THead_lines_record::renum_key(const char * kfield,const char * val)
|
||||
{
|
||||
TRectype::renum_key(kfield, val); // Aggiorna testata
|
||||
_rows->renum_key(kfield, val); // Aggiorna righe
|
||||
}
|
||||
|
||||
TRectype & THead_lines_record::row(int index) const // riga del corpo
|
||||
{
|
||||
if (index > _rows->rows() || index < 0)
|
||||
CHECKD(FALSE, "Riga non esistente ", index);
|
||||
return _rows->row(index, FALSE);
|
||||
}
|
||||
|
||||
void THead_lines_record::put_str(const char* fieldname, const char* val)
|
||||
{
|
||||
TString v(val);
|
||||
// cambio
|
||||
//if (strcmp(fieldname, "TIPODOC") == 0 && TRectype::get("TIPODOC") != v)
|
||||
//{
|
||||
// TAuto_variable_rectype::put_str(fieldname, v);
|
||||
// reset_fields(*this);
|
||||
// set_fields(*this);
|
||||
//}
|
||||
//else
|
||||
{
|
||||
TAuto_variable_rectype::put_str(fieldname, v);
|
||||
dirty_fields();
|
||||
}
|
||||
}
|
||||
|
||||
//*****
|
||||
// metodi public
|
||||
THead_lines_record::THead_lines_record(int hfn, int rfn,const char *numfield):
|
||||
TAuto_variable_rectype(hfn),
|
||||
_file(hfn),
|
||||
_rfile(rfn),
|
||||
_numfield(numfield)
|
||||
{
|
||||
_rows= new TRecord_array(rfn,numfield); // inizializza il record array delle righe
|
||||
}
|
||||
|
||||
THead_lines_record::THead_lines_record(const TBaseisamfile* i,int rfn,const char *numfield):
|
||||
TAuto_variable_rectype(i),
|
||||
_numfield(numfield)
|
||||
{
|
||||
_rows= new TRecord_array(rfn,numfield); // inizializza il record array delle righe
|
||||
}
|
||||
|
||||
THead_lines_record::THead_lines_record(const TRectype & r,int rfn,const char *numfield):
|
||||
TAuto_variable_rectype(r),
|
||||
_numfield(numfield)
|
||||
{
|
||||
_rows= new TRecord_array(rfn,numfield); // inizializza il record array delle righe
|
||||
}
|
||||
|
||||
// @doc INTERNAL
|
||||
|
||||
// @mfunc costruttore di copia
|
||||
THead_lines_record::THead_lines_record(const THead_lines_record& r):
|
||||
TAuto_variable_rectype((TAuto_variable_rectype &)r)
|
||||
{
|
||||
// copia..
|
||||
_rows= new TRecord_array(* r._rows); // inizializza il record array delle righe
|
||||
_nuovo=r._nuovo;
|
||||
_file=r._file; // file principale
|
||||
_rfile=r._rfile; // file delle righe
|
||||
_numfield=r._numfield;
|
||||
}
|
||||
|
||||
THead_lines_record::~THead_lines_record()
|
||||
{
|
||||
delete _rows;
|
||||
}
|
||||
|
||||
|
||||
// setta a dirty i campi
|
||||
void THead_lines_record::dirty_fields()
|
||||
{
|
||||
}
|
||||
|
||||
TRectype & THead_lines_record::operator =(const TRectype & r)
|
||||
{
|
||||
TRectype::operator=(r);
|
||||
reset_fields(*this);
|
||||
set_fields(*this);
|
||||
return *this;
|
||||
}
|
||||
|
||||
TRectype & THead_lines_record::operator =(const char * r)
|
||||
{
|
||||
TRectype::operator=(r);
|
||||
reset_fields(*this);
|
||||
set_fields(*this);
|
||||
return *this;
|
||||
}
|
||||
|
||||
void THead_lines_record::zero(const char * fieldname)
|
||||
{
|
||||
// resetta il record righe solo se .....
|
||||
// if (strcmp(fieldname, "TIPODOC") == 0)
|
||||
reset_fields(*this);
|
||||
TAuto_variable_rectype::zero(fieldname);
|
||||
dirty_fields();
|
||||
}
|
||||
|
||||
void THead_lines_record::zero(char c)
|
||||
{
|
||||
reset_fields(*this);
|
||||
TAuto_variable_rectype::zero(c);
|
||||
}
|
||||
|
||||
|
||||
// settaggio campi variabili
|
||||
void THead_lines_record::set_fields(TAuto_variable_rectype & rec)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
int THead_lines_record::read(TBaseisamfile& f, word op, word lockop)
|
||||
{
|
||||
TRectype line_key(_rfile);
|
||||
|
||||
int err = TRectype::read(f,op,lockop);
|
||||
|
||||
copy_linekey(head(),line_key);
|
||||
if (err == NOERR)
|
||||
{
|
||||
_nuovo = FALSE;
|
||||
_rows->read(line_key); //ok
|
||||
}
|
||||
else
|
||||
{
|
||||
// nuovo oggetto: resetta tutto
|
||||
_nuovo = TRUE;
|
||||
destroy_rows();
|
||||
_rows->set_key((TRectype *)(line_key.dup())); // ok
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
int THead_lines_record::readat(TBaseisamfile& f, TRecnotype nrec, word lockop)
|
||||
{
|
||||
TRectype line_key(_rfile);
|
||||
|
||||
int err = TRectype::readat(f,nrec,lockop);
|
||||
|
||||
if (err == NOERR)
|
||||
{
|
||||
_nuovo = FALSE;
|
||||
_rows->read(line_key); //ok
|
||||
}
|
||||
else
|
||||
{
|
||||
// nuovo oggetto: resetta tutto
|
||||
_nuovo = TRUE;
|
||||
destroy_rows();
|
||||
_rows->set_key((TRectype *)(line_key.dup())); // ok
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
/*int THead_lines_record::read(const TRectype& rec)
|
||||
{
|
||||
head() = rec;
|
||||
TRectype line_key(_rows->key());
|
||||
|
||||
copy_linekey(head(),line_key);
|
||||
|
||||
TLocalisamfile afile(_file);
|
||||
int err = TRectype::read(afile);
|
||||
if (err == NOERR)
|
||||
{
|
||||
_nuovo = FALSE;
|
||||
_rows->read(line_key); //ok
|
||||
}
|
||||
else
|
||||
{
|
||||
// nuovo oggetto: resetta tutto
|
||||
_nuovo = TRUE;
|
||||
head() = rec;
|
||||
destroy_rows();
|
||||
_rows->set_key(&line_key); // ok
|
||||
}
|
||||
return err;
|
||||
}
|
||||
*/
|
||||
int THead_lines_record::write(TBaseisamfile& f) const
|
||||
{
|
||||
return write_rewrite(f,FALSE);
|
||||
}
|
||||
|
||||
int THead_lines_record::rewrite(TBaseisamfile& f) const
|
||||
{
|
||||
return write_rewrite(f,TRUE);
|
||||
}
|
||||
|
||||
|
||||
int THead_lines_record::write_rewrite(TBaseisamfile& f,bool re ) const
|
||||
{
|
||||
const bool nuovo = _nuovo; // E' nuovo di zecca!
|
||||
if (nuovo && re) // quindi ...
|
||||
re = FALSE; // ... non fare la rewrite
|
||||
|
||||
int err = NOERR;
|
||||
if (re)
|
||||
{
|
||||
// rewrite:
|
||||
err = _rows->write(re);
|
||||
if (err == NOERR)
|
||||
{
|
||||
err = TRectype::rewrite(f);
|
||||
if (err != NOERR)
|
||||
err = TRectype::write(f);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// write:
|
||||
if (nuovo)
|
||||
{
|
||||
//THead_lines_record &myself=*this;
|
||||
//if (numero() <= 0)
|
||||
// myself.renum();
|
||||
do
|
||||
{
|
||||
err = TRectype::write(f);
|
||||
if (err == _isreinsert) // usa il flag _nuovo per decidere se
|
||||
((THead_lines_record *)this)->renum();
|
||||
} while (err == _isreinsert);
|
||||
((THead_lines_record *)this)->_nuovo = FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
err = TRectype::write(f);
|
||||
if (err != NOERR)
|
||||
err = TRectype::rewrite(f);
|
||||
}
|
||||
if (err == NOERR)
|
||||
err = _rows->write(re);
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
int THead_lines_record::remove(TBaseisamfile& f) const
|
||||
{
|
||||
int err = _rows->remove();
|
||||
if (err == NOERR)
|
||||
err = TRectype::remove(f);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
// ************************************************
|
||||
// TEMP!!!!!!!!!!!!!!!!
|
||||
|
||||
TRegistro_std::TRegistro_std(const char* cod, int year) : TRectype(LF_TAB)
|
||||
{
|
||||
if (!read(cod, year))
|
||||
fatal_box("Il codice richiesto non è stato trovato nei registri");
|
||||
TTable itl("%ITL");
|
||||
itl.put("CODTAB",cod_intest());
|
||||
itl.read();
|
||||
_intest=itl.get("S0");
|
||||
}
|
||||
|
||||
bool TRegistro_std::read(const char* cod, int year)
|
||||
{
|
||||
if (year <= 0)
|
||||
{
|
||||
const TDate oggi(TODAY);
|
||||
year = oggi.year();
|
||||
}
|
||||
|
||||
int err = ~NOERR;
|
||||
|
||||
TTable reg("REG");
|
||||
reg.setkey(1);
|
||||
if (cod && *cod > ' ')
|
||||
{
|
||||
TString16 chiave; chiave.format("%04d%s", year, cod);
|
||||
reg.put("CODTAB", chiave);
|
||||
err = reg.read();
|
||||
}
|
||||
*((TRectype *)this) = reg.curr();
|
||||
|
||||
return err == NOERR;
|
||||
}
|
||||
|
||||
bool TRegistro_std::write(bool rewrite) const
|
||||
{
|
||||
int err = ~NOERR;
|
||||
TTable reg("REG");
|
||||
|
||||
reg.set_curr((TRectype *)this);
|
||||
if (rewrite)
|
||||
err = reg.rewrite();
|
||||
else
|
||||
err = reg.write();
|
||||
return err == NOERR;
|
||||
}
|
||||
|
||||
|
||||
|
||||
int TRegistro_std::year() const
|
||||
{
|
||||
TString16 anno(get("CODTAB"));
|
||||
anno.cut(4);
|
||||
return atoi(anno);
|
||||
}
|
||||
|
||||
|
||||
const TString& TRegistro_std::code() const
|
||||
{
|
||||
return get("CODTAB").mid(4);
|
||||
}
|
||||
|
||||
const TString TRegistro_std::intest() const
|
||||
{
|
||||
return _intest;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user