campo-sirio/ba/ba5.cpp

298 lines
6.6 KiB
C++
Executable File

#include <applicat.h>
#include <date.h>
#include <lffiles.h>
#include <mask.h>
#include <isam.h>
#include <sheet.h>
#include <utility.h>
#include <urldefid.h>
#include "ba4600.h"
///////////////////////////////////////////////////////////
// TSoci_sheet
///////////////////////////////////////////////////////////
const char* const PHYSICAL_HEAD = "Codice|Cognome@30|Nome@20";
const char* const JURASSIC_HEAD = "Codice|Ragione sociale@50";
class TSoci_sheet : public TArray_sheet
{
bool _physical;
protected:
const char* lastcode();
public:
TSoci_sheet(bool);
void add_socio(const TString& codice, const TString& ragione, int elem = -1);
};
TSoci_sheet::TSoci_sheet(bool fis)
: TArray_sheet(-1,-1, 0, 0, "Soci", fis ? PHYSICAL_HEAD : JURASSIC_HEAD),
_physical(fis)
{}
const char* TSoci_sheet::lastcode()
{
if (items() < 1) return "";
return data(items()-1).get(0);
}
void TSoci_sheet::add_socio(const TString& codice,
const TString& ragione,
int elem)
{
if (elem == -1 && codice == lastcode()) return;
TToken_string t(60);
t.add(codice);
if (_physical)
{
t.add(ragione.left(30));
t.add(ragione.mid(30));
} else t.add(ragione);
if (elem < 0) add(t);
else row(elem) = t;
}
///////////////////////////////////////////////////////////
// TQuery_socio
///////////////////////////////////////////////////////////
class TQuery_socio
{
TString _tipo; // tipo = F | G
int _anno; // anno
TString _carica; // codice carica
TString _qualifica; // richiesta qualifica
TString _q740; // quadro 740
TString _q750; // quadro 750
public:
TQuery_socio(const TMask* mask);
const TString& tipo() const { return _tipo; }
int test(const TRectype& rec) const;
};
TQuery_socio::TQuery_socio(const TMask* mask)
{
_tipo = mask->get(LST_SC1_TIPOASOC);
_anno = atoi(mask->get(FLD_SC1_ANNO));
_carica = mask->get(FLD_SC1_CODCAR);
_qualifica = mask->get(LST_SC1_RICQUAL);
_q740 = mask->get(LST_SC2_Q740);
_q750 = mask->get(LST_SC2_QUATTPREV);
}
int TQuery_socio::test(const TRectype& r) const
{
if (_tipo != r.get("TIPOASOC")) return 1;
if (_anno > 0 && _anno != r.get_int("ANNO")) return 2;
if (_carica.not_empty() && _carica != r.get("CODCAR")) return 3;
if (_qualifica.not_empty() && _qualifica != r.get("RICQUAL")) return 4;
if (_q740.not_empty() && _q740 != r.get("Q740")) return 5;
if (_q750.not_empty() && _q750 != r.get("QUATTPREV")) return 6;
return 0;
}
///////////////////////////////////////////////////////////
// TQuery_application
///////////////////////////////////////////////////////////
class TQuery_application : public TApplication
{
const TPrinter* _printer;
TLocalisamfile* _soci;
TLocalisamfile* _anag;
TLocalisamfile* _ditte;
TMask* _mask;
void create_files();
void create_masks();
void destroy_masks();
void destroy_files();
protected:
virtual bool create();
virtual bool destroy();
virtual bool menu(MENU_TAG m);
bool do_query();
public:
TQuery_application();
};
TQuery_application::TQuery_application() : _mask(NULL)
{}
void TQuery_application::create_files()
{
_soci = new TLocalisamfile(LF_SOCI); _soci->setkey(3);
_anag = new TLocalisamfile(LF_ANAG);
_ditte = new TLocalisamfile(LF_NDITTE);
}
void TQuery_application::destroy_files()
{
delete _ditte;
delete _anag;
delete _soci;
}
void TQuery_application::create_masks()
{
_mask = new TMask("ba5000");
}
void TQuery_application::destroy_masks()
{
delete _mask;
}
bool TQuery_application::create()
{
TApplication::create();
create_files();
create_masks();
dispatch_e_menu(MENU_ITEM(1));
return TRUE;
}
bool TQuery_application::destroy()
{
destroy_masks();
destroy_files();
return TApplication::destroy();
}
bool TQuery_application::menu(MENU_TAG m)
{
while (do_query());
return FALSE;
}
const char* head(const TRectype& r, const char* name,
const char* title)
{
if (title == NULL) title = name;
if (r.exist(name))
{
TString h(r.length(name));
h.spaces();
h.overwrite(title, 0);
strcpy(__tmp_string, h);
}
else strcpy(__tmp_string, title);
return __tmp_string;
}
bool TQuery_application::do_query()
{
if (_mask->run() != K_F9) return FALSE;
TQuery_socio query(_mask);
TSoci_sheet s(query.tipo() == "F"); // Create sheet
TRectype& soci = _soci->curr();
TRectype& anag = _anag->curr();
TRectype& ditte = _ditte->curr();
soci.zero();
_mask->autosave();
for (_soci->read(_isgteq); !_soci->eof(); _soci->next()) // Fill sheet
{
if (query.test(soci) == 0)
s.add_socio(soci.get("CODANAGRSO"), "");
}
TString ragsoc(80),
cur_codice(10);
for (int i = 0; i < s.items(); i++)
{
TToken_string& t = (TToken_string&) s.row(i);
t.restart();
cur_codice = t.get();
anag.zero();
anag.put("TIPOA", query.tipo());
anag.put("CODANAGR", cur_codice);
if (_anag->read() != NOERR) ragsoc = "Anagrafica assente";
else ragsoc = _anag->curr().get("RAGSOC");
s.add_socio(cur_codice, ragsoc, i);
}
if (s.items() == 0)
{
warning_box("Nessuna corrispondenza");
return TRUE;
}
while(s.run() == K_ENTER)
{
TToken_string& r = s.row();
r.restart();
TString codice(r.get());
TString nome(r.get());
TToken_string h(128);
h.add("Anno");
h.add(head(ditte, "CODDITTA", "Codice"));
h.add(head(ditte, "RAGSOC", "Ragione sociale"));
h.add("Carica|Qualifica|740|750");
h.add(head(soci, "PERCQUAZ", "% Quote"));
TArray_sheet d(-1,-1, 0, 0, nome, h);
soci.zero();
soci.put("TIPOASOC", query.tipo());
soci.put("CODANAGRSO", codice);
TToken_string row(128);
for (_soci->read(_isgteq); !_soci->eof(); _soci->next())
{
if (codice != soci.get("CODANAGRSO")) break;
if (query.test(soci) != 0) continue;
row = soci.get("ANNO");
ditte.zero();
row.add(soci.get("CODDITTA"));
ditte.put("CODDITTA", row.get(1));
if (_ditte->read() != NOERR)
row.add("Ditta assente");
else
row.add(ditte.get("RAGSOC"));
row.add(soci.get("CODCAR"));
row.add(soci.get("RICQUAL"));
row.add(soci.get("Q740"));
row.add(soci.get("QUATTPREV"));
row.add(soci.get("PERCQUAZ"));
d.add(row);
}
d.run();
}
return TRUE;
}
int main(int argc,char** argv)
{
TQuery_application qa;
qa.run(argc, argv, "Ricerca Soci");
return TRUE;
}