campo-sirio/ps/ps1002300.cpp

192 lines
6.0 KiB
C++
Raw Normal View History

#include <applicat.h>
#include <automask.h>
#include <defmask.h>
#include <progind.h>
#include <relation.h>
#include <textset.h>
#include <rdoc.h>
#include "ps1002.h"
#include "ps1002300a.h"
/////////////////////////////////////
// Maschera
////////////////////////////////////
class TRileva_produzione_msk : public TAutomask
{
protected:
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
public:
bool elabora();
TRileva_produzione_msk();
};
bool TRileva_produzione_msk::on_field_event(TOperable_field& o, TField_event e, long jolly)
{
switch (o.dlg())
{
case DLG_ELABORA:
if (e == fe_button)
{
elabora();
return true;
}
break;
case F_DADATA:
case F_ADATA:
if (e == fe_close)
{
const TDate dadata = o.get();
}
break;
default: break;
}
return true;
}
bool TRileva_produzione_msk::elabora()
{
TString query;
query << "USE RDOC KEY 4";
query << "\nSELECT (DOC.CODNUM=#CODNUM)&&(BETWEEN(DOC.DATADOC,#DADATA,#ADATA))&&((CODCMS!=\"\")||(FASCMS!=\"\"))";
query << "\nJOIN DOC INTO PROVV==PROVV ANNO==ANNO CODNUM==CODNUM NDOC==NDOC";
query << "\nFROM DAPROVV=D DAANNO=#ANNO DACODNUM=BEM";
query << "\nTO DAPROVV=D DAANNO=#ANNO DACODNUM=BEM";
TISAM_recordset recset(query);
recset.set_var("#CODNUM", get(F_CODNUM));
recset.set_var("#DADATA", get_date(F_DADATA));
recset.set_var("#ADATA", get_date(F_ADATA));
const long anno = get_date(F_DADATA).year();
recset.set_var("#ANNO", anno);
const long items = recset.items();
const TDate dataprod = get_date(F_DATAPROD);
TProgind pi(items, TR("Scansione righe documento in corso..."), true, true);
TRectype& bolla_rec = recset.cursor()->curr(); //record corrente del recordset
TLocalisamfile rdoc(LF_RIGHEDOC); //file delle righe documento con le BEM da aggiornare
for (bool ok = recset.move_first(); ok; ok = recset.move_next())
{
if (!pi.addstatus(1))
break;
//prende la quantita' dalla riga della bolla
const real bolla_qta = bolla_rec.get_real(RDOC_QTA);
if (bolla_qta > ZERO)
{
#ifdef DBG
const TString& bolla_codnum = bolla_rec.get(RDOC_CODNUM);
const int bolla_anno = bolla_rec.get_int(RDOC_ANNO);
const long bolla_ndoc = bolla_rec.get_long(RDOC_NDOC);
const int bolla_nriga = bolla_rec.get_int(RDOC_NRIGA);
#endif
//campi che servono per raccatare la riga della BEM
const TString& bem_codnum = bolla_rec.get(RDOC_DACODNUM);
const long bem_anno = bolla_rec.get_int(RDOC_DAANNO);
const long bem_ndoc = bolla_rec.get_long(RDOC_DANDOC);
const long bem_idriga = bolla_rec.get_int(RDOC_DAIDRIGA);
//servono anche lavorazione e colore (almeno uno dei due c'e' in base alla query)
const TString& bolla_lav = bolla_rec.get(RDOC_CODCMS);
const TString& bolla_col = bolla_rec.get(RDOC_FASCMS);
//adesso prende la riga documento della BEM e aggiorna i valori se deve
//e' costretto ad usare una query e non una read() perche' IDRIGA non appartiene alle chiavi di RDOC
TString bem_query;
bem_query << "USE RDOC";
bem_query << "\nSELECT (IDRIGA=#IDRIGA)";
bem_query << "\nFROM CODNUM=BEM ANNO=#ANNO PROVV=D NDOC=#NDOC";
bem_query << "\nTO CODNUM=BEM ANNO=#ANNO PROVV=D NDOC=#NDOC";
TISAM_recordset bem_recset(bem_query);
bem_recset.set_var("#IDRIGA", bem_idriga);
bem_recset.set_var("#ANNO", bem_anno);
bem_recset.set_var("#NDOC", bem_ndoc);
const long bem_items = bem_recset.items();
if (bem_items > 1)
return error_box("C'e' piu' di una riga della BEM %ld con IDRIGA = %ld", bem_ndoc, bem_idriga);
/*TRectype& bem_rec = rdoc.curr();
const TString& bem_codnum = bolla_rec.get(RDOC_DACODNUM); //se non fosse BEM sarebbe un errore!!!
bem_rec.put(RDOC_CODNUM, bem_codnum);
const int bem_anno = bolla_rec.get_int(RDOC_DAANNO);
bem_rec.put(RDOC_ANNO, bem_anno);
bem_rec.put(RDOC_PROVV, 'D');
const long bem_ndoc = bolla_rec.get_long(RDOC_DANDOC);
bem_rec.put(RDOC_NDOC, bem_ndoc);
//occhio alla riga, raga! DAIDRIGA sulla rigabolla deve essere uguale a IDRIGA sulla rigabem, NON a NRIGA che <20> aleatorio!
const int bem_idriga = bolla_rec.get_int(RDOC_DAIDRIGA);
bem_rec.put(RDOC_IDRIGA, bem_idriga);*/
//if (bem_rec.read(rdoc) == NOERR)
//{
TRectype& bem_rec = bem_recset.cursor()->curr();
const real bem_old_lav_qta = bem_rec.get_real(RDOC_QTAGG2);
const real bem_old_col_qta = bem_rec.get_real(RDOC_QTAGG1);
//solo le BEM a quantita' lavorazione e/o colore nulle possono essere aggiornate (senno' ci verrebbe del casino)
if (bolla_lav.full() && bem_old_lav_qta == ZERO) //lavorazione
{
bem_rec.put(RDOC_CODCMS, bolla_lav);
bem_rec.put(RDOC_QTAGG2, bolla_qta);
bem_rec.put(RDOC_CODAGG2, dataprod);
}
if (bolla_col.full() && bem_old_col_qta == ZERO) //colore
{
bem_rec.put(RDOC_FASCMS, bolla_col);
bem_rec.put(RDOC_QTAGG1, bolla_qta);
bem_rec.put(RDOC_DATACONS, dataprod);
}
const int err = bem_rec.rewrite(rdoc);
if (err != NOERR)
return false;
//} //if(bem_rec.read(rdoc)...
} // if (bolla_qta > ZERO)...
} //for (bool ok = recset.move_first()...
return true;
}
TRileva_produzione_msk::TRileva_produzione_msk()
: TAutomask ("ps1002300a")
{}
/////////////////////////////////////
// Applicazione
////////////////////////////////////
class TRileva_produzione : public TSkeleton_application
{
protected:
virtual bool check_autorization() const { return false; }
virtual const char* extra_modules() const { return "ve"; }
virtual void main_loop();
virtual bool create();
};
void TRileva_produzione::main_loop()
{
TRileva_produzione_msk mask;
mask.run();
}
bool TRileva_produzione::create()
{
return TSkeleton_application::create();
}
int ps1002300 (int argc, char* argv[])
{
TRileva_produzione main_app;
main_app.run(argc, argv, TR("Rileva produzione da bolle"));
return true;
}