Files correlati : Ricompilazione Demo : [ ] Commento :aggiunti files discolatio alla 32 bit git-svn-id: svn://10.65.10.50/trunk@11035 c028cbd2-c16b-5b4b-a496-9718f37d4682
303 lines
9.7 KiB
C++
Executable File
303 lines
9.7 KiB
C++
Executable File
#include <applicat.h>
|
|
#include <assoc.h>
|
|
#include <automask.h>
|
|
#include <form.h>
|
|
#include <printer.h>
|
|
#include <recarray.h>
|
|
#include <sort.h>
|
|
#include <strings.h>
|
|
#include <utility.h>
|
|
|
|
#include "..\mg\anamag.h"
|
|
#include "..\mg\mglib.h"
|
|
#include "..\mg\movmag.h"
|
|
#include "..\mg\rmovmag.h"
|
|
#include "dl0.h"
|
|
#include "dl0700a.h"
|
|
#include "dl0700.h"
|
|
|
|
//-----FORM--------------------------------------------------------------------------------------//
|
|
|
|
class TTopten_form : public TForm
|
|
{
|
|
|
|
public:
|
|
virtual bool validate(TForm_item &cf, TToken_string &s);
|
|
void set_testata() {set_header(1,TRUE);}
|
|
void set_pedata() {set_footer(1,FALSE); set_footer(1,TRUE);}
|
|
TPrint_section& get_line() {return section('B', odd_page);}
|
|
TTopten_form();
|
|
|
|
virtual ~TTopten_form();
|
|
};
|
|
|
|
TTopten_form::TTopten_form() :TForm ("dl0700a")
|
|
{
|
|
}
|
|
|
|
TTopten_form::~TTopten_form()
|
|
{
|
|
}
|
|
|
|
bool TTopten_form::validate(TForm_item &cf, TToken_string &s)
|
|
{
|
|
return TForm::validate(cf,s);
|
|
}
|
|
|
|
//-----AUTOMASK---------------------------------------------------------------------------------//
|
|
|
|
class TTopten_mask : public TAutomask
|
|
{
|
|
TRelation * _rel;
|
|
TCursor * _cur;
|
|
|
|
protected:
|
|
bool on_field_event(TOperable_field& o, TField_event e, long jolly);
|
|
public:
|
|
|
|
TTopten_mask();
|
|
|
|
virtual ~TTopten_mask(){};
|
|
};
|
|
|
|
TTopten_mask::TTopten_mask() :TAutomask ("dl0700a")
|
|
{
|
|
}
|
|
|
|
bool TTopten_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
|
|
{
|
|
switch (o.dlg())
|
|
{
|
|
case F_RIGHE:
|
|
if (e == fe_close)
|
|
{
|
|
TSheet_field& sheet = sfield(F_RIGHE);
|
|
FOR_EACH_SHEET_ROW (sheet, r, row) //scansione di tutte le righe dello sheet
|
|
{
|
|
TString8 supporto = row->get(F_SUPPORTO-FIRST_FIELD);
|
|
if (supporto.blank())
|
|
return error_box("Indicare il tipo supporto nella riga %d",r+1);
|
|
}
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
//-----SKELETON APPLICATION------------------------------------------------------------------------------------------//
|
|
|
|
class TTopten : public TSkeleton_application
|
|
{
|
|
TTopten_mask * _mask;
|
|
TTopten_form * _form;
|
|
|
|
protected:
|
|
virtual bool create();
|
|
virtual bool destroy();
|
|
virtual void main_loop();
|
|
|
|
void print_header();
|
|
void print_footer();
|
|
void print_line(const TString& r, const long j);
|
|
|
|
public:
|
|
TTopten() {}
|
|
};
|
|
|
|
|
|
bool TTopten::create()
|
|
{
|
|
open_files(LF_MOVMAG, LF_RMOVMAG, LF_ANAMAG, LF_UMART, LF_MAG, 0);
|
|
_mask = new TTopten_mask;
|
|
_form = new TTopten_form();
|
|
|
|
return TSkeleton_application::create();
|
|
}
|
|
|
|
bool TTopten::destroy()
|
|
{
|
|
delete _mask;
|
|
delete _form;
|
|
return TSkeleton_application::destroy();
|
|
}
|
|
|
|
|
|
void TTopten::print_header()
|
|
{
|
|
_form->set_testata();
|
|
}
|
|
|
|
void TTopten::print_footer()
|
|
{
|
|
_form->set_pedata();
|
|
}
|
|
|
|
|
|
void TTopten::print_line(const TString& result, const long j)
|
|
{
|
|
TString8 nriga; nriga.format("%4ld",j);
|
|
TString codart = result.left(20); //codice articolo
|
|
codart.trim();
|
|
TString supporto = result.mid(20,2); //tipo supporto
|
|
supporto.trim();
|
|
real venduto(result.mid(22, 20)); //quantita' venduta
|
|
real giacenza(result.mid(42, 20)); //giacenza
|
|
|
|
TString titolo = cache().get(LF_ANAMAG, codart, ANAMAG_DESCR); //titolo
|
|
TString artista = cache().get(LF_ANAMAG, codart, ANAMAG_USER2); //artista
|
|
TString genere = cache().get(LF_ANAMAG, codart, ANAMAG_GRMERC); //genere
|
|
|
|
TPrint_section& section = _form->get_line();
|
|
_form->find_field('B', odd_page, FF_B_POSIZIONE).set(nriga);
|
|
_form->find_field('B', odd_page, FF_B_CODART).set(codart);
|
|
_form->find_field('B', odd_page, FF_B_GIAC).set(giacenza.string());
|
|
_form->find_field('B', odd_page, FF_B_TITOLO).set(titolo);
|
|
_form->find_field('B', odd_page, FF_B_ARTISTA).set(artista);
|
|
_form->find_field('B', odd_page, FF_B_TOTVEND).set(venduto.string());
|
|
_form->find_field('B', odd_page, FF_B_GENERE).set(genere);
|
|
_form->find_field('B', odd_page, FF_B_SUPPORTO).set(supporto);
|
|
|
|
section.update();
|
|
for (word i = 0; i < section.height(); i++)
|
|
printer().print(section.row(i));
|
|
}
|
|
|
|
|
|
void TTopten::main_loop()
|
|
{
|
|
TSheet_field& sheet = _mask->sfield(F_RIGHE); //crea lo sheet non vuoto
|
|
sheet.row(0);
|
|
|
|
while (_mask->run() == K_ENTER)
|
|
{
|
|
TRelation rel(LF_MOVMAG); //relazione: file principale rmovmag
|
|
|
|
TDate dataini = _mask->get_date(F_DATAINI);
|
|
TDate datafine = _mask->get_date(F_DATAFINE);
|
|
|
|
TRectype darec(LF_MOVMAG), arec(LF_MOVMAG);
|
|
darec.put(MOVMAG_DATAREG, dataini);
|
|
arec.put(MOVMAG_DATAREG, datafine);
|
|
|
|
TCursor cursore (&rel, "", 3, &darec, &arec); //scandisce i movimenti con la chiave 2 e codreg
|
|
long nitems = cursore.items(); //incluso nell'intervallo date
|
|
cursore.freeze();
|
|
|
|
TRectype riga(LF_RMOVMAG);
|
|
TRecord_array righemov(111,RMOVMAG_NRIG); //clamoroso recordarray del file 111 (rmovmag)
|
|
|
|
FOR_EACH_SHEET_ROW (sheet, r, row) //scansione di tutte le righe dello sheet
|
|
{
|
|
TAssoc_array topten, topgiac; //assoc_array che conterranno tutti i record da sortare e stampare
|
|
const TString8 currsupporto = row->get(F_SUPPORTO-FIRST_FIELD);
|
|
const TString8 currgenere = row->get(F_GENERE-FIRST_FIELD);
|
|
const real currdaprezzo = row->get(F_DAPREZZO-FIRST_FIELD);
|
|
const real curraprezzo = row->get(F_APREZZO-FIRST_FIELD);
|
|
|
|
for (cursore=0;cursore.pos()<nitems;++cursore)
|
|
{
|
|
riga.put(RMOVMAG_NUMREG, cursore.curr().get(MOVMAG_NUMREG)); //per ogni movimento in testata
|
|
righemov.read(riga); //scandisce tutte le sue righemov
|
|
for (int i=1; i<=righemov.rows(); i++)
|
|
{
|
|
TRectype& rigai = righemov[i];
|
|
TString8 codcaus = rigai.get(RMOVMAG_CODCAUS);
|
|
if (codcaus.empty()) //se il codcaus della rigamov e' vuoto..
|
|
codcaus = cursore.curr().get(MOVMAG_CODCAUS); //..lo cerca in testata
|
|
|
|
const TRectype& cau = cache().get("%CAU", codcaus); //controlla se e' causale di vendita!
|
|
const int segno = atoi(cau.get("S2").mid(6, 2));
|
|
if (segno != 0) //se e' una causale di vendita..
|
|
{
|
|
TString codart = rigai.get(RMOVMAG_CODART); //prende il codart della riga in questione..
|
|
const TRectype& articolo = cache().get(LF_ANAMAG, codart);
|
|
|
|
const TString& strdate = articolo.get(ANAMAG_USER6); //controlla che la eventuale data "fuori catalogo"..
|
|
if (!real::is_null(strdate)) //se la data e' 00000000 la vuota (e' meglio)
|
|
{
|
|
const TDate oldfashioned = strdate; //..sia superiore a dataini o nulla
|
|
if (oldfashioned < dataini) //se non lo e' salta al prossimo articolo
|
|
continue;
|
|
}
|
|
|
|
const real prezzo = rigai.get(RMOVMAG_PREZZO); //controllo sui prezzi
|
|
if (prezzo < currdaprezzo)
|
|
continue;
|
|
if (prezzo > curraprezzo && curraprezzo > currdaprezzo)
|
|
continue;
|
|
|
|
const TString16 umart = rigai.get(RMOVMAG_UM); //..e sul supporto (um)
|
|
if (umart != currsupporto)
|
|
continue;
|
|
|
|
if (!currgenere.blank()) //..e sul genere
|
|
{
|
|
const TString8 genere = articolo.get(ANAMAG_GRMERC);
|
|
if (genere != currgenere)
|
|
continue;
|
|
}
|
|
|
|
codart.left_just(20); //riempie codart in modo che sia 20..
|
|
codart << umart.left(2); //..ed aggiunge il codice supporto alla stringa
|
|
real * venduto = (real *) topten.objptr(codart);
|
|
|
|
if (venduto == NULL)
|
|
{ //se e' un nuovo articolo..
|
|
venduto = new real;
|
|
topten.add(codart, venduto); //lo aggiunge all'assoc_array con chiave codart(codart+um!)
|
|
|
|
TArticolo_giacenza articolo(codart);
|
|
real giacenza = articolo.giacenza_anno("", "", datafine.year()); //anno di riferimento x la giacenza
|
|
topgiac.add(codart, giacenza);
|
|
}
|
|
*venduto += segno*rigai.get_real(RMOVMAG_QUANT); //quindi somma il venduto!
|
|
}
|
|
}
|
|
|
|
} //fine ciclo scansione movimenti di magazzino
|
|
|
|
// adesso si devono riordinare gli assoc_array in modo da avere i record in ordine di venduto decrescente
|
|
const int reclen = 62;
|
|
TSort s(reclen);
|
|
s.addsortkey(22, 20, 'd');
|
|
s.addsortkey(42, 20, 'd');
|
|
s.init();
|
|
|
|
FOR_EACH_ASSOC_OBJECT (topten, hobj, chiave, venduto)
|
|
{
|
|
TString80 sortrec = chiave;
|
|
sortrec << ((real *) venduto)->string(20); //ordinamento principale per venduto
|
|
|
|
real giacenza = (real&)topgiac[chiave]; //ordinamento secondario per giacenza
|
|
sortrec << giacenza.string(20);
|
|
|
|
s.sort(sortrec);
|
|
}
|
|
s.endsort();
|
|
|
|
//scatta la stampa!
|
|
TString80 result;
|
|
const long nlinesmax = row->get_long(F_VISUAL-FIRST_FIELD);
|
|
long nlines = 0;
|
|
printer().open();
|
|
print_header();
|
|
print_footer();
|
|
for ( result.strncpy(s.retrieve(),reclen); result.not_empty(); result.strncpy(s.retrieve(),reclen))
|
|
{
|
|
print_line(result, ++nlines);
|
|
if (nlinesmax > 0 && nlines >= nlinesmax)
|
|
break;
|
|
}
|
|
printer().close();
|
|
}
|
|
}
|
|
}
|
|
|
|
int dl0700(int argc, char* argv[])
|
|
{
|
|
TTopten a;
|
|
a.run(argc,argv,"Top Ten");
|
|
return 0;
|
|
} |