campo-sirio/mg/mg3300.cpp
luca f540893dfe Patch level :10.0 530
Files correlati     :mg3.exe
Ricompilazione Demo : [ ]
Commento            :
0001501: 001820 - codice livello di giacenza su stampa schede magazzino
Descrizione  Segnalano che se per un movimento di magazzino vengono caricate più righe con lo stesso articolo ma con lotti (livelli di giacenza) diversi, la stampa schede espone solo il primo lotto/livello di giacenza, per gli altri viene esposta solo la descrizione.

\\ftp:www.aga.it\ilaria\Pharmatex411

Vedi per esempio movimento di magazzino n. 11


git-svn-id: svn://10.65.10.50/trunk@19675 c028cbd2-c16b-5b4b-a496-9718f37d4682
2009-11-27 13:47:31 +00:00

939 lines
30 KiB
C++
Executable File
Raw Blame History

#include <applicat.h>
#include <execp.h>
#include <mailbox.h>
#include <printer.h>
#include "movmag.h"
#include "rmovmag.h"
#include "mglib.h"
#include "mg3300.h"
#include "../cg/cglib01.h"
#define VALUE_NOT_SET "~~"
TCausale_magazzino& get_cau(const char* codcaus)
{
/*
static TAssoc_array _c;
TCausale_magazzino * caus = (TCausale_magazzino*) _c.objptr(codcaus);
if (caus == NULL)
{
caus = new TCausale_magazzino(codcaus);
_c.add(codcaus, caus);
}
return *caus;
*/
return cached_causale_magazzino(codcaus);
}
class TForm_schedemag : public TForm_stampemg
{
int _tolivgiac,_tolivart;
TString4 _anno_prec;
bool _magazzino_chiuso;
bool _sottocatmer;
bool _sudd_mag;
bool _no_valori;
bool _no_ff;
bool _sintetica;
TDate _data_inizio, _data_fine;
TToken_string _rmov_sortexp;
TString _rmov_raggcond,_rmov_joinexp;
TTipo_saldomag _tiposcheda; // tipo scheda
int _annoes;
TString16 _user1;
bool ragg_exprs(int livart,int livgiac);
public:
TToken_string& rmov_sortexp() {return _rmov_sortexp;}
TString & rmov_joinexp() {return _rmov_joinexp;}
void set_description_field(const char* u) { _user1 = u; }
void set_tiposcheda(const char * tipo);
void set_chiusura_mag(const int val);
void set_data_inizio(const TDate& d) { _data_inizio = d; }
bool validate(TForm_item &cf, TToken_string &s);
void setdett_perart(bool percatmer, bool sottocatmer,int livart,int livgiac,bool sudd_mag, bool sudd_dep);
void setdett_permag(bool sudd_dep, bool showdett,int livart,int livgiac);
void set_date_limite(const int anno, const TDate& d, const TDate& e);
void set_options(bool no_valori, bool no_ff, bool sintetica);
const char* descr_tiposcheda() const;
const char* nomecampo_scheda() const;
TTipo_saldomag tiposcheda() const {return _tiposcheda;} ;
TForm_schedemag(const char *name,const char *code)
: TForm_stampemg(name,code), _tolivgiac(0), _tolivart(0) {}
virtual ~TForm_schedemag() {}
};
const char* TForm_schedemag::descr_tiposcheda() const
{
switch (_tiposcheda)
{
case s_giac: return (TR("Giacenza"));
case s_acl: return (TR("A conto lavoro"));
case s_incl: return (TR("In conto lavoro"));
case s_prodc: return (TR("In produzione componenti"));
case s_prodf: return (TR("In produzione finiti"));
case s_ordc: return (TR("Ordinato clienti"));
case s_ordf: return (TR("Ordinato fornitori"));
case s_acq:
default: break;
}
return "";
}
const char* TForm_schedemag::nomecampo_scheda() const
{
switch (_tiposcheda)
{
case s_giac: return (MAG_GIAC);
case s_acl: return (MAG_ACL);
case s_incl: return (MAG_INCL);
case s_prodc:return (MAG_PRODCOMP);
case s_prodf:return (MAG_PRODFIN);
case s_ordc: return (MAG_ORDC);
case s_ordf: return (MAG_ORDF);
case s_acq:
case s_ent:
case s_ven:
case s_usc:
default: break;
}
return "";
}
bool TForm_schedemag::validate(TForm_item &cf, TToken_string &s)
{
const TString code(s.get(0)); // prende il primo parametro, il codice del messaggio
if (code=="_USER")
{
const TString subcode(s.get());
TString valore(VALUE_NOT_SET);
if (subcode=="TIPOSCHEDA")
valore = descr_tiposcheda();
if (subcode=="GRUPPOART")
{
if (_tolivart < livelli_articolo().last_level())
valore = livelli_articolo().group_descr_packed(relation()->lfile(LF_ANAMAG).get("CODART"),_tolivart);
else
{
if (_user1.blank())
valore = relation()->lfile(LF_ANAMAG).get("DESCR");
else
valore = relation()->curr(LF_ANAMAG).get(_user1);
}
}
if (subcode=="CODGRUPPOGIAC")
{
int livello=_tolivgiac;
valore = livelli_giacenza().name(livello);
add_giaclev(valore, 1, livello);
valore << ' ';
TString s = livelli_giacenza().unpack_grpcode(relation()->lfile(LF_RMOVMAG).get("LIVGIAC"),livello);
if (s.empty())
s = UNKNOWN_NAME;
valore << s;
}
if (subcode=="CODGRUPPOART")
{
valore = relation()->lfile(LF_ANAMAG).get("CODART");
if (livelli_articolo().enabled())
valore.cut(min(valore.len(),livelli_articolo().packed_length(_tolivart)));
}
if (subcode=="GRUPPOGIAC")
valore = livelli_giacenza().group_descr_packed(relation()->lfile(LF_RMOVMAG).get("LIVGIAC"),_tolivgiac);
if (subcode=="CODCATMER")
{
valore = relation()->lfile(LF_ANAMAG).get("GRMERC");
if (!_sottocatmer && valore.full())
valore.cut(3);
}
if (subcode=="CATMER")
{
if (_sottocatmer)
valore = relation()->lfile(-ALIAS_SOTTOCATMER).get("S0");
else
valore = relation()->lfile(-ALIAS_CATMER).get("S0");
}
if (subcode=="DADATA")
valore = _data_inizio.string();
if (subcode=="ADATA")
valore = _data_fine.string();
const TRectype& rmovmag = relation()->curr(LF_RMOVMAG);
const TRectype& movmag = relation()->curr(LF_MOVMAG);
const TString16 cau_r= rmovmag.get(RMOVMAG_CODCAUS);
const TString16 cau_m= movmag.get(MOVMAG_CODCAUS);
const TCausale_magazzino & cau = get_cau(cau_r.empty() ? cau_m : cau_r);
if (subcode=="*SEGNOCAUS")
{
const char qv = s.get_char(); // Segno per Quantita'o Valore
int sgn = cau.sgn(_tiposcheda);
switch(qv)
{
case 'Q': if (!cau.update_qta()) sgn = 0; break;
case 'V': if (!cau.update_val()) sgn = 0; break;
default : break;
}
if (sgn)
{
real v(cf.get());
v *= real(sgn);
valore = v.string();
}
else
valore = "";
}
if (subcode=="CAUSALERIGA")
valore = cau.codice();
if (subcode=="DESCRCAUSALE")
valore = cau.descr();
if (subcode=="CANPRINTSALDOPREC") // Determina se e' possibile stampare il saldo precedente
{
bool printsaldoprec = true;
const TDate datareg = movmag.get_date(MOVMAG_DATAREG);
// Se il movimento corrente e' >= la data inizio stampa allora posso sempre stampare il saldo ...
if (datareg < _data_inizio) // ... altrimenti devo fare altri controlli
{
const bool stampa_perart = relation()->lfile().num() == LF_ANAMAG;
if (stampa_perart) // Stampa per articoli
{
TSortedfile& rmm = (TSortedfile&)relation()->lfile(LF_RMOVMAG);
const TRecnotype oldpos = rmm.recno();
TString80 old_art;
old_art << rmm.get(RMOVMAG_CODART); old_art << '|' << rmm.get(RMOVMAG_LIVGIAC);
const int err = rmm.next();
if (err == NOERR) // Se non sono sull'ultimo record ...
{
const TRectype& next_movmag = rmm.relation().curr(LF_MOVMAG);
const TDate next_datareg = next_movmag.get_date(MOVMAG_DATAREG);
// Se il prossimo record e' dopo la data iniziale devo stampre il saldo
// Lo stesso dicasi se la prossima data e' inferiore alla corrente (sono su un altro articolo!)
printsaldoprec = next_datareg >= _data_inizio || next_datareg < datareg;
if (!printsaldoprec)
{
// Se la prossima data e' >= della corrente verifico se cambio articolo
TString80 new_art;
new_art << rmm.get(RMOVMAG_CODART); new_art << '|' << rmm.get(RMOVMAG_LIVGIAC);
printsaldoprec = old_art != new_art;
}
}
rmm.readat(oldpos); // ripristino la posizione del file
}
else // Stampa per magazzini
{
TSortedfile& rmm = (TSortedfile&)relation()->lfile(LF_RMOVMAG);
const TRecnotype oldpos = rmm.recno();
TString80 old_art;
old_art << rmm.get(RMOVMAG_CODART);
old_art << '|' << rmm.get(RMOVMAG_LIVGIAC);
old_art << '|' << rmm.get(RMOVMAG_CODMAG);
const int err = rmm.next();
if (err == NOERR) // Se non sono sull'ultimo record ...
{
const long next_num_reg = rmm.get_long(RMOVMAG_NUMREG);
const TRectype& next_movmag = cache().get(LF_MOVMAG, next_num_reg);
const TDate next_datareg = next_movmag.get_date(MOVMAG_DATAREG);
// Se il prossimo record e' dopo la data iniziale devo stampre il saldo
// Lo stesso dicasi se la prossima data e' inferiore alla corrente (sono su un altro articolo!)
printsaldoprec = next_datareg >= _data_inizio || next_datareg < datareg;
if (!printsaldoprec)
{
// Se la prossima data e' >= della corrente verifico se cambio articolo
TString80 new_art;
new_art << rmm.get(RMOVMAG_CODART);
new_art << '|' << rmm.get(RMOVMAG_LIVGIAC);
new_art << '|' << rmm.get(RMOVMAG_CODMAG);
printsaldoprec = old_art != new_art;
}
}
rmm.readat(oldpos); // ripristino la posizione del file
}
}
valore = printsaldoprec ? "1" : "0";
}
if (subcode=="SALDOPREC")
{
valore = "";
if (!_magazzino_chiuso) // mag precedente non chiuso, mancano i saldi di apertura
{
TLocalisamfile mag_annoprec(LF_MAG);
TString codmag, codart, livello;
const bool stampa_perart = relation()->lfile().num() == LF_ANAMAG;
if (stampa_perart) // Stampa per articoli
{
const TRectype& rmovmag = cursor()->curr(LF_RMOVMAG); // Record collegato a LF_ANAMAG
codmag = rmovmag.get(RMOVMAG_CODMAG);
codart = rmovmag.get(RMOVMAG_CODART);
livello = rmovmag.get(RMOVMAG_LIVGIAC);
}
else
{
// Nella stampa per magazzini al momento del saldo sono avanti di un passo rispetto a dove mi serve
if (cursor()->pos() > 0L)
{
--(*cursor());
const TRectype& rmovmag = cursor()->curr(LF_RMOVMAG); // Record principale
codmag = rmovmag.get(RMOVMAG_CODMAG);
codart = rmovmag.get(RMOVMAG_CODART);
livello = rmovmag.get(RMOVMAG_LIVGIAC);
++(*cursor());
}
}
mag_annoprec.put(MAG_ANNOES, _anno_prec);
mag_annoprec.put(MAG_CODMAG, codmag);
mag_annoprec.put(MAG_CODART, codart);
mag_annoprec.put(MAG_LIVELLO, livello);
if (_sudd_mag) // Se e' una stampa dettagliata per magazzino
{
mag_annoprec.setkey(2);
if (mag_annoprec.read() == NOERR) // Ho trovato un saldo precedente del magazzino in questione
{
const real saldoprec = mag_annoprec.get_real(nomecampo_scheda());
if (!saldoprec.is_zero())
{
real currsaldo = cf.get();
currsaldo += saldoprec; // Sommo il saldo precedente al campo corrente
valore = currsaldo.string();
}
}
}
else
{
// Calcolo la somma dei saldi di tutti i magazzini
mag_annoprec.setkey(1);
real currsaldo = cf.get();
for (int r = 1; ; r++)
{
mag_annoprec.put(MAG_NRIGA, r);
if (mag_annoprec.read() != NOERR)
break;
const real saldoprec = mag_annoprec.get_real(nomecampo_scheda());
currsaldo += saldoprec; // Sommo il saldo precedente al campo corrente
}
valore = currsaldo.string();
}
}
}
if (subcode.left(3) == "ADD")
{
const TString16 cau = cf.section().find_field(FF_CAUSALE_RIGA).get();
TCausale_magazzino & ccrr = get_cau(cau);
const bool is_qta = subcode.right(3) == "QTA";
const bool ok = is_qta && ccrr.update_qta() || !is_qta && ccrr.update_val();
if (ok)
{
const short fld = s.get_int(2);
TForm_item& dest = cf.section().find_field(fld);
real v1(cf.get());
real v2(dest.get());
v2 += v1;
dest.set(v2.string());
}
return true;
}
if (valore != VALUE_NOT_SET)
{
cf.set(valore);
return true;
}
}
return TForm_stampemg::validate(cf, s);
}
bool TForm_schedemag::ragg_exprs(int livart, int livgiac)
{
TString piece,rest;
// ***********
int tolivart,tolivgiac;
tolivart =livart ? livart : livelli_articolo().last_level() ;
tolivgiac=livgiac ? livgiac : livelli_giacenza().last_level();
// sezioni livello codice
piece="CODART";
if (livelli_articolo().enabled())
piece << "[1," << livelli_articolo().packed_length(tolivart) <<']';
if (_rmov_raggcond.full())
_rmov_raggcond << "+";
_rmov_raggcond << piece;
_rmov_sortexp.add(piece);
_rmov_joinexp.cut(0);
_rmov_joinexp << piece << "==" << piece;
if (livart==0)
{
piece="LIVGIAC";
if (livelli_giacenza().enabled())
piece << "[1," << livelli_giacenza().packed_length(tolivgiac) <<']';
_rmov_raggcond << '+' << piece;
_rmov_sortexp.add(piece);
}
return true;
}
void TForm_schedemag::setdett_permag(bool sudd_dep,bool show_dett,int livart,int livgiac)
{
TForm_subsection &h_d=(TForm_subsection &)find_field('B',odd_page,"HEADER_DEP");
h_d.enable(sudd_dep);
TForm_subsection &h_a=(TForm_subsection &)find_field('B',odd_page,"HEADER_ARTICOLO");
h_a.enable(show_dett);
TForm_subsection &h_g=(TForm_subsection &)find_field('B',odd_page,"HEADER_LIVGIAC");
h_g.enable(livelli_giacenza().enabled() && (livart ==0 || livgiac !=0 ));
_rmov_raggcond = "CODMAG[1,3]";
_rmov_sortexp = "CODMAG[1,3]";
if (sudd_dep)
{
_rmov_raggcond << "+CODMAG[4,5]";
_rmov_sortexp.add("CODMAG[4,5]");
}
if (show_dett)
ragg_exprs(livart, livgiac);
TForm_subsection &s=(TForm_subsection &)find_field('B',odd_page,"GRUPPI_RMOVMAG");
s.setcondition(_rmov_raggcond,_strexpr);
TString cond;
cond << LF_MOVMAG << "->DATAREG";
_rmov_sortexp.add(cond);
_rmov_sortexp.add("NUMREG");
_tolivart=livart ? livart :livelli_articolo().last_level() ;
_tolivgiac=livgiac ? livgiac :livelli_giacenza().last_level();
_sudd_mag = true; // E' una stampa suddvisa per magazzini
}
void TForm_schedemag::setdett_perart(bool percatmer,bool sottocatmer,int livart,int livgiac,bool sudd_mag,bool sudd_dep)
{
_rmov_sortexp.cut(0);
// raggruppamento MAX fino all'articolo
TForm_subsection &h_cm=(TForm_subsection &)find_field('B',odd_page,"HEADER_CATMER");
h_cm.enable(percatmer);
TForm_subsection &h_cm2=(TForm_subsection &)find_field('B',odd_page,"HEADER_LIVGIACCATMER");
h_cm2.enable(percatmer);
TForm_subsection &h_a=(TForm_subsection &)find_field('B',odd_page,"HEADER_ARTICOLO");
h_a.enable (livart!=0 && !sudd_mag);
h_a.set_newpage(livart!=0 && !sudd_mag && !_no_ff);
TForm_subsection &t_a=(TForm_subsection &)find_field('B',odd_page,"TOTALI_GRUPPIART");
t_a.show( livart!=0 && !sudd_mag);
// raggruppamento MAX fino alla giacenza
TForm_subsection &h_g=(TForm_subsection &)find_field('B',odd_page,"HEADER_GRMOV");
h_g.enable(livart ==0 || livgiac !=0 || sudd_mag);
h_g.set_newpage(!_no_ff && (livart ==0 || livgiac !=0 || sudd_mag));
TForm_subsection &h_l=(TForm_subsection &)find_field('B',odd_page,"HEADER_LIVGIAC");
h_l.enable(livelli_giacenza().enabled() && (livart ==0 || livgiac !=0 ));
TForm_subsection &h_m=(TForm_subsection &)find_field('B',odd_page,"HEADER_MAG");
h_m.enable(sudd_mag );
TForm_subsection &h_d=(TForm_subsection &)find_field('B',odd_page,"HEADER_DEP");
h_d.enable(sudd_dep);
TForm_subsection &t_s=(TForm_subsection &)find_field('B',odd_page,"TOTALI_GRMOV");
t_s.show(livart==0 || livgiac !=0 || sudd_mag);
_tolivart=livart ? livart :livelli_articolo().last_level() ;
_tolivgiac=livgiac ? livgiac :livelli_giacenza().last_level();
_sottocatmer=sottocatmer;
// settaggio catmer/ragg codice
if (livart || percatmer) {
TForm_subsection &s=(TForm_subsection &)find_field('B',odd_page,"GRUPPI_ARTICOLO");
TString cond;
if (percatmer)
cond << "GRMERC" << (sottocatmer ? "[1,3]" : "") << '+';
cond << "CODART[1," << livelli_articolo().packed_length(_tolivart) << ']';
s.setcondition(cond,_strexpr);
}
// settaggio raggruppamenti codice sulla scheda
ragg_exprs(livart, livgiac);
_sudd_mag = sudd_mag; // E' una stampa suddvisa per magazzini?
if (sudd_mag)
{
_rmov_raggcond << "+CODMAG[1,3]";
_rmov_sortexp.add("CODMAG[1,3]");
if (sudd_dep)
{
_rmov_raggcond << "+CODMAG[4,5]";
_rmov_sortexp.add("CODMAG[4,5]");
}
}
TForm_subsection &s=(TForm_subsection &)find_field('B',odd_page,"GRUPPI_RMOVMAG");
s.setcondition(_rmov_raggcond,_strexpr);
TString cond;
cond << LF_MOVMAG << "->DATAREG";
_rmov_sortexp.add(cond);
_rmov_sortexp.add("NUMREG");
}
void TForm_schedemag::set_tiposcheda(const char * tipo)
{
if (tipo[0] == 'G')
_tiposcheda = s_giac;
else
if (tipo[0] == 'A')
_tiposcheda = s_acl;
else
if (tipo[0] == 'I')
_tiposcheda = s_incl;
else
if (*tipo=='P')
{
if (tipo[1]=='F')
_tiposcheda = s_prodf;
else
_tiposcheda = s_prodc;
}
else
if (tipo[0] == 'O')
{
if (tipo[1]=='F')
_tiposcheda = s_ordf;
else
_tiposcheda = s_ordc;
}
}
void TForm_schedemag::set_options(bool no_valori, bool no_ff, bool sintetica)
{
_no_valori = no_valori;
if (_no_valori)
{
((TForm_item &)find_field('H',odd_page, 8)).hide();
((TForm_item &)find_field('H',odd_page, 9)).hide();
((TForm_item &)find_field('B',odd_page, 104)).hide();
((TForm_item &)find_field('B',odd_page, 105)).hide();
((TForm_item &)find_field('B',odd_page, FF_VALORE_GART)).hide();
((TForm_item &)find_field('B',odd_page, FF_VALORE_MOV)).hide();
((TForm_item &)find_field('B',odd_page, 190)).hide();
if (name().left(7) == "mg3300a")
((TForm_item &)find_field('B',odd_page, FF_VALORE_GRMOV)).hide();
}
_no_ff = no_ff;
_sintetica = sintetica;
}
void TForm_schedemag::set_date_limite(const int anno, const TDate& d, const TDate& e)
{
TEsercizi_contabili ec;
_annoes = anno;
_anno_prec.format("%4d",ec.pred(anno));
_magazzino_chiuso = (ec.pred(anno) == 0) || !(ec.esercizio(atoi(_anno_prec)).chiusura_mag().empty());
_data_inizio = d;
_data_fine = e;
const TEsercizio& es = ec[_annoes];
if (!_data_inizio.ok())
{
_data_inizio = es.inizio();
}
if (!_data_fine.ok())
{
_data_fine = es.fine();
}
}
// mg3300 Stampa
// mg3300 Stampa
class TStampa_schede_mag : public TSkeleton_application
{
TStampemg_mask * _mask; // static so they are visible from filter function
TForm_schedemag *_form; // to be moved into TPrint_application
TCursor * _cur;
int _codicees;
bool _raggmag;
bool _reload;
protected:
TStampemg_mask & mask() { return *_mask;}
virtual bool create();
virtual bool destroy();
virtual void main_loop();
static bool negatives_only(const TRelation* rel);
static bool cau_filter(const TRelation* rel);
void setprint_perarticoli();
void setprint_permagazzini();
protected:
static bool handle_dadata(TMask_field& f, KEY k);
static bool handle_adata(TMask_field& f, KEY k);
public:
bool & reload() {return _reload;}
TTipo_saldomag tiposcheda() const {return _form->tiposcheda();} ;
TStampa_schede_mag() : _reload(false) {}
virtual ~TStampa_schede_mag() {}
};
TStampa_schede_mag& app() { return (TStampa_schede_mag&)main_app(); }
bool TStampa_schede_mag::negatives_only(const TRelation* rel)
{
const TString codart = rel->curr(LF_ANAMAG).get(ANAMAG_CODART);
const int anno = app().mask().get_int(F_ANNOES);
TArticolo_giacenza artgiac(codart);
const real giac = artgiac.giacenza_anno(NULL, NULL, anno);
return giac < ZERO;
}
bool TStampa_schede_mag::cau_filter(const TRelation* rel)
{
const TRectype& rmov = rel->curr(LF_RMOVMAG);
TString16 cau = rmov.get(RMOVMAG_CODCAUS);
if (cau.empty())
cau = cache().get(LF_MOVMAG, rmov.get(RMOVMAG_NUMREG), MOVMAG_CODCAUS);
return get_cau(cau).sgn(app().tiposcheda()) != 0;
}
void TStampa_schede_mag::setprint_permagazzini()
{
TRectype darec(LF_RMOVMAG),arec(LF_RMOVMAG);
TString cfilter;
const TMask & m = mask();
_form->set_tiposcheda(_mask->get(F_SCHEDA));
_cur = _form->cursor();
// filtering from/to MAGS
if (m.get(F_DAMAG).not_empty())
cfilter << "(CODMAG[1,3]>=" <<'"' << m.get(F_DAMAG)<< "\")&&" ;
if (m.get(F_AMAG).not_empty())
cfilter << "(CODMAG[1,3]<=" <<'"' << m.get(F_AMAG)<< "\")&&" ;
if (m.get(F_DADEP).not_empty())
cfilter << "(CODMAG[4,]>=" <<'"' << m.get(F_DADEP)<< "\")&&" ;
if (m.get(F_ADEP).not_empty())
cfilter << "(CODMAG[4,]<=" <<'"' << m.get(F_ADEP)<< "\")&&" ;
cfilter << "(" << LF_MOVMAG <<"->ANNOES==" <<'"' << m.get(F_ANNOES)<< "\")&&" ;
// filtering from/to DATA
if (m.get(F_ADATA).full())
{
TDate d1(m.get(F_ADATA));
cfilter << "(ANSI(110->DATAREG)<=" <<'"' << d1.string(ANSI) << "\")&&" ;
}
if (m.get(F_DADATA).full())
{
TDate d1(m.get(F_DADATA));
TString cond;
cond << "ANSI(" << LF_MOVMAG << "->DATAREG)>=\"" << d1.string(ANSI) << '"';
((TForm_subsection &)_form->find_field('B',odd_page,"MOVS_INTERESSATI")).setcondition(cond,_strexpr);
((TForm_subsection &)_form->find_field('B',odd_page,"H_MOVS_INTERESSATI")).setcondition(cond,_strexpr);
cond.cut(0) << "ANSI(" << LF_MOVMAG << "->DATAREG)<\"" << d1.string(ANSI) << '"';
((TForm_subsection &)_form->find_field('B',odd_page,"MOVS_PRECEDENTI")).setcondition(cond,_strexpr);
}
// Imposta i livelli di dettaglio della scheda
_form->setdett_permag(m.get_bool(F_DETTAGLIOMAG), m.get_bool(F_DETTAGLIODEP),
m.get_int(F_TOLIVELLOART), m.get_int(F_TOLIVELLOGIAC));
// filtering from/to ART
darec.put("CODART", m.get(F_DAART));
arec.put("CODART", m.get(F_AART));
// filtering ONLY NEGATIVES
if (m.get(F_FILTRO)[0]=='N')
_cur->set_filterfunction(negatives_only, true);
// prepare cursor to print....
((TSorted_cursor *)_cur)->change_order(_form->rmov_sortexp());
if (cfilter.not_empty())
cfilter.rtrim(2);
TLocalisamfile *mag = new TLocalisamfile(LF_MAG);
mag->setkey(2);
TString mag_joinexp;
mag_joinexp << "ANNOES==\"" << m.get(F_ANNOES) << "\"|CODMAG==CODMAG|CODART==CODART|LIVELLO==LIVGIAC";
_cur->relation()->replace(mag,1,mag_joinexp);
_cur->setfilter(cfilter,TRUE);
_cur->setregion(darec,arec,0x2);
}
// ORDINAMENTO per articoli
void TStampa_schede_mag::setprint_perarticoli()
{
TRectype darec(LF_ANAMAG),arec(LF_ANAMAG);
TRectype darecr(LF_RMOVMAG),arecr(LF_RMOVMAG);
TString cfilter,filter;
const TMask & m = mask();
_form->set_tiposcheda(m.get(F_SCHEDA));
char subordine =m.get(F_SUBORDINE)[0];
_cur = _form->cursor();
// filtering ANNOES
filter << '(' << LF_MOVMAG << "->ANNOES==" << m.get(F_ANNOES)<< ")&&" ;
// filtering from/to MAGS
if (m.get(F_DAMAG)[0])
filter << "(" << LF_RMOVMAG << "->CODMAG[1,3]>=" <<'"' << m.get(F_DAMAG)<< "\")&&" ;
if (m.get(F_AMAG)[0])
filter << "(" << LF_RMOVMAG << "->CODMAG[1,3]<=" <<'"' << m.get(F_AMAG)<< "\")&&" ;
if (m.get(F_DADEP).full())
filter << "(" << LF_RMOVMAG << "->CODMAG[4,]>=" <<'"' << m.get(F_DADEP)<< "\")&&" ;
if (m.get(F_ADEP).full())
filter << "(" << LF_RMOVMAG << "->CODMAG[4,]<=" <<'"' << m.get(F_ADEP)<< "\")&&" ;
// filtering from/to DATA
if (m.get(F_DADATA).full())
{
TDate d1(m.get(F_DADATA));
TString cond;
cond << "ANSI(" << LF_MOVMAG << "->DATAREG)>=\"" << d1.string(ANSI) << '"';
((TForm_subsection &)_form->find_field('B',odd_page,"MOVS_INTERESSATI")).setcondition(cond,_strexpr);
((TForm_subsection &)_form->find_field('B',odd_page,"H_MOVS_INTERESSATI")).setcondition(cond,_strexpr);
cond.cut(0) << "ANSI(" << LF_MOVMAG << "->DATAREG)<\"" << d1.string(ANSI) << '"';
((TForm_subsection &)_form->find_field('B',odd_page,"MOVS_PRECEDENTI")).setcondition(cond,_strexpr);
}
if (m.get(F_ADATA).not_empty())
{
TDate d1(m.get(F_ADATA));
filter << "(ANSI(110->DATAREG)<=" <<'"' << d1.string(ANSI) << "\")&&" ;
}
// filtering ONLY NEGATIVES
if (m.get(F_FILTRO)[0]=='N')
_cur->set_filterfunction(negatives_only);
// Imposta i livelli di dettaglio della scheda
int tolivelloart = m.get_int(F_TOLIVELLOART);
int tolivellogiac = m.get_int(F_TOLIVELLOGIAC);
TString sortexp;
int tilde = 0x2;
switch (subordine)
{
case 'C':
{
_cur->setkey(1); sortexp = ANAMAG_CODART;
darec.put(ANAMAG_CODART, m.get(F_DAART));
const TString& aart = m.get(F_AART);
arec.put(ANAMAG_CODART, aart);
if (aart.blank() || cache().get(LF_ANAMAG, aart).empty())
tilde = 0x0;
_form->setdett_perart(false, false, tolivelloart, tolivellogiac,
m.get_bool(F_SUDDIV_MAGAZZINI),
m.get_bool(F_SUDDIV_DEPOSITI));
}
break;
case 'D':
_cur->setkey(2); sortexp = ANAMAG_DESCR;
darec.put("DESCR", m.get(F_DADES));
arec.put("DESCR", m.get(F_ADES));
_form->setdett_perart(false , false, tolivelloart, tolivellogiac,
m.get_bool(F_SUDDIV_MAGAZZINI),
m.get_bool(F_SUDDIV_DEPOSITI));
break;
case 'M':
_cur->setkey(3); sortexp = ANAMAG_GRMERC;
darec.put("GRMERC", m.get(F_DACATMER));
arec.put("GRMERC", m.get(F_ACATMER));
if (m.get(F_AART).full())
cfilter << "(CODART<=" <<'"' << m.get(F_AART)<< TString(20,(char)127)<< "\")&&" ;
if (m.get(F_DAART).full())
cfilter << "(CODART>=" <<'"' << m.get(F_DAART) << "\")&&" ;
_form->setdett_perart(true, false, tolivelloart, tolivellogiac,
m.get_bool(F_SUDDIV_MAGAZZINI),
m.get_bool(F_SUDDIV_DEPOSITI));
break;
case 'P':
_cur->setkey(1); sortexp = ANAMAG_USER1;
darec.put("CODART", m.get(F_DAART));
arec.put("CODART", m.get(F_AART));
_form->setdett_perart( false, false, tolivelloart, tolivellogiac,
m.get_bool(F_SUDDIV_MAGAZZINI),
m.get_bool(F_SUDDIV_DEPOSITI));
if (m.get(F_DAUSR).full())
cfilter << "(USER1>=\"" << m.get(F_DAUSR) << "\")&&";
if (m.get(F_AUSR).full())
cfilter << "(USER1<=\"" << m.get(F_AUSR) << "~\")&&";
break;
default:
break;
}
_form->set_description_field(subordine == 'P' ? ANAMAG_USER1 : "");
// prepare cursor's relation....
TRelation *aux=new TRelation (LF_RMOVMAG);
aux->add(LF_MOVMAG,"NUMREG==NUMREG");
if (filter.right(2) == "&&")
filter.rtrim(2);
TSortedfile *rmovmag= new TSortedfile(LF_RMOVMAG,aux,_form->rmov_sortexp(),filter,0x2);
darecr.put(RMOVMAG_CODART,darec.get(ANAMAG_CODART));
arecr.put(RMOVMAG_CODART,arec.get(ANAMAG_CODART));
rmovmag->setregion(darecr,arecr,tilde);
if (tiposcheda() != s_giac)
rmovmag->cursor().set_filterfunction(cau_filter);
_cur->relation()->replace(rmovmag,1, _form->rmov_joinexp() );
TLocalisamfile *mag=new TLocalisamfile(LF_MAG);
mag->setkey(2);
TString mag_joinexp;
mag_joinexp << "ANNOES==\"" << m.get(F_ANNOES) << "\"|CODMAG==CODMAG|CODART==CODART|LIVELLO==LIVGIAC";
_cur->relation()->replace(mag,2,mag_joinexp);
if (cfilter.not_empty())
cfilter.rtrim(2);
_cur->setfilter(cfilter);
_cur->setregion(darec,arec,0x2);
((TSorted_cursor*)_cur)->change_order(sortexp);
}
void TStampa_schede_mag::main_loop()
{
TStampemg_mask & m = mask();
while (reload() || m.run() == K_ENTER)
{
reload() = false;
if (m.magazz_ini().gestmag(TRUE))
{
char dettaglio=m.get(F_ENABLER)[0];
if (dettaglio=='A' && m.get_int(F_TOLIVELLOART)==0)
m.set(F_TOLIVELLOART,livelli_articolo().last_level());
if (dettaglio=='G' && m.get_int(F_TOLIVELLOGIAC)==0)
m.set(F_TOLIVELLOGIAC,livelli_giacenza().last_level());
TString16 frmname;
const bool per_articoli = (*m.get(F_ORDINE) == 'A');
const bool sintetica = m.get_bool(F_SINTETICA);
if (per_articoli)
frmname = "mg3300a";
else
frmname = "mg3300b";
if (sintetica)
frmname << 's';
_form = new TForm_schedemag(frmname, "") ;
_form->set_options(m.get_bool(F_NO_VALORI), m.get_bool(F_NO_FF),
sintetica);
if (per_articoli)
setprint_perarticoli();
else
setprint_permagazzini();
_form->set_date_limite(m.get_int(F_ANNOES), m.get_date(F_DADATA), m.get_date(F_ADATA));
_form->print();
delete _form;
_form = NULL;
}
} // while true
return ;
}
bool TStampa_schede_mag::handle_dadata(TMask_field& f, KEY k)
{
if (!f.empty() && f.to_check(k)) // se f deve essere controllato (cio<69> se <20> cambiato e sono uscito da lui o dalla maschera)
{
const int annoes = f.mask().get_int(F_ANNOES);
TEsercizi_contabili ec;
const TEsercizio& es = ec[annoes];
TDate data(f.get());
if (data < es.inizio())
return f.error_box (FR("La data di inizio non puo' essere anteriore al %s"), es.inizio().string());
}
return TRUE;
}
bool TStampa_schede_mag::handle_adata(TMask_field& f, KEY k)
{
if (!f.empty() && f.to_check(k)) // se f deve essere controllato (cio<69> se <20> cambiato e sono uscito da lui o dalla maschera)
{
const int annoes = f.mask().get_int(F_ANNOES);
TEsercizi_contabili ec;
const TEsercizio& es = ec[annoes];
const TDate data(f.get());
if (data > es.fine())
return f.error_box (FR("La data di fine non puo' essere successiva al %s"), es.fine().string());
}
return true;
}
static bool linker(int n, const char* str)
{
if (n == 0)
{
TRectype art(LF_ANAMAG);
art.put(ANAMAG_CODART, str);
app().reload() = art.edit();
}
else
{
TRectype mov(LF_MOVMAG);
mov.put(MOVMAG_NUMREG, str);
app().reload() = mov.edit();
}
return false;
}
bool TStampa_schede_mag::create()
{
open_files(LF_TABCOM, LF_TAB, LF_RMOVMAG, LF_MOVMAG, LF_MAG, LF_ANAMAG, 0);
_mask = new TStampemg_mask("mg3300");
_mask->set_handler(F_DADATA,handle_dadata);
_mask->set_handler(F_ADATA,handle_adata);
TConfig prassid(CONFIG_DITTA, "ve"); // apre il file di configurazione della ditta corrente
if (prassid.get_bool("CHK_USER", "ve", 1))
{
const TString& user1 = prassid.get("PROMPT_USER", "ve", 1);
_mask->field(F_DAUSR).set_prompt(user1);
_mask->show(F_DAUSR); _mask->show(F_AUSR);
}
printer().links().add("Articolo |b|w"); // Crea il link blu alle anagrafiche
printer().links().add("Movimento |v|w"); // Crea il link viola ai movimenti
printer().setlinkhandler(linker);
return TSkeleton_application::create();
}
bool TStampa_schede_mag::destroy()
{
delete _mask;
return TSkeleton_application::destroy();
}
int mg3300(int argc, char* argv[])
{
TStampa_schede_mag a;// derivata da Application e con uso di form
a.run(argc,argv,TR("Stampa schede di magazzino"));
return 0;
}