campo-sirio/ba/ba7300.cpp
guy a58110735b Patch level : 2.0 490
Files correlati     : ba1.exe
Ricompilazione Demo : [ ]
Commento            :

AO20049
Utilizzando una schedina EUTRON una volta aperto l'installer di Campo non
vengono riportati automaticamente i moduli attivati su tale schedina.

AO20050
Una volta installato Campo con una schedina EUTRON e finita la conversione
(anche uscendo da Campo e riavviando il PC), per i moduli installati non
vengono abilitate le rispettive voci nei sottomenù (quindi ad es.
Contabilità Generale, Documenti di Vendita, ecc…)

ATTENZIONE: Ovvia conseguenza del AO20049

AO20051
Utilizzando una schedina HARDLOCK se vado su Installazione Moduli va
automaticamente su Attivazione Moduli e restituisce il messaggio
"Il contratto 2001 è stato attivato automaticamente", una volta dato
l'OK ritorna su Installazione Moduli e presenta l'elenco corretto dei
moduli da installare, solo che una volta lanciata l'installazione per ogni
modulo restituisce un altro messaggio "Per installare la versione 20020200
del modulo 'xx' occorre il contratto di assistenza per l'anno 2002"
nonostante la schedina in questione è stata abilitata all'assistenza 2003
(infatti a seguito di questo riporta sulla schedina l'assistenza 2001).
Non si riesce pertanto ad installare i moduli, questo è dovuto al fatto
che nella cartella di Campo viene riportato anche il file dninst.zip
sul quale probabilmente c'era il numero di schedina che ho usato per
fare la prova (HARDLOCK 05714).

AO20052
Per provare a risolvere il problema della segnalazione precedente (AO20051)
si è provato a cancellare il file dninst.zip dalla cartella di Campo,
solo che una volta avviato Campo viene restituito il messaggio
"Impossibile trovare il file dninst.zip" seguito da un errore fatale su BA1;
in tutte le prove successive però si è notato che il file dninst.zip
veniva rigenerato ogni volta.

AO20054
Provato a fare un'installazione in rete utilizzando come server il PC usato
per l'installazione Standard con schedina EUTRON, come per l'installazione
standard prendendo dal server i programmi non ha riportato selezionati i
moduli attivi su questa seconda schedina, il problema è pertanto uguale a
quello della segnalazione AO20049 e AO20050.

ATTENZIONE: Segnalazione intrinsecamente superflua.
Quando la chiavetta non viene riconosciuta come valida,
e' MOLTO probabile che lo risulti su tutti i computer (server e non).

AO20055
Ho provato l'installazione in rete con programmi e dati sul server,
una volta finita non si riesce ad entrare in Campo perché sembra che invece
di fare riferimento al Campo.ini che ha in locale fa riferimento al Campo.ini
sul server.

AO20056
Ho provato a fare un'installazione di una postazione con server di chiavi,
non appena arriva all'installazione del server di chiavi restituisce
il messaggio: "Errore fatale! .\Si è verificato un errore copiando e
decomprimendo il file \", quindi l'installazione va in errore.

ATTENZIONE: Eliminato ogni riferimento a Frontend.exe.
D'ora in poi usare il server Authoriz.exe

AO20057
Ho provato a fare un'installazione di una postazione con Master Server,
l'installazione prosegue normalmente (fatte eccezione per le segnalazioni
precedenti) ma non crea il file Lerch.exe sotto la cartella Servers di Campo,
quindi quando cerca di avviare il programma dall'esecuzione automatica non
trova il file.


git-svn-id: svn://10.65.10.50/trunk@11214 c028cbd2-c16b-5b4b-a496-9718f37d4682
2003-06-05 13:39:12 +00:00

723 lines
17 KiB
C++
Executable File
Raw Blame History

#include <applicat.h>
#include <automask.h>
#include <execp.h>
#include <prefix.h>
#include <postman.h>
#include <progind.h>
#include <recarray.h>
#include <relation.h>
#include <sheet.h>
#include <utility.h>
#include <direct.h>
#include "ba7300.h"
class TFile_selector : public TAutomask
{
TArray_sheet* _sht;
protected:
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
public:
TFile_selector();
virtual ~TFile_selector();
};
bool TFile_selector::on_field_event(TOperable_field& o, TField_event e, long jolly)
{
switch (o.dlg())
{
case F_FILE:
if (e == fe_button)
{
const int nfile = atoi(o.get());
FOR_EACH_SHEET_ROW_BACK((*_sht), i, row)
{
if (row->get_int(0) == nfile)
{
_sht->select(i);
break;
}
}
switch (_sht->run())
{
case K_ENTER:
{
TToken_string& row = _sht->row(-1);
set(o.dlg(), row.get(0));
e = fe_modify;
}
break;
default:
break;
}
}
if (e == fe_modify)
{
const TPrefix& pref = prefix();
const int total = pref.items();
const int nfile = atoi(o.get());
FOR_EACH_SHEET_ROW_BACK((*_sht), i, row)
{
if (row->get_int(0) == nfile)
{
set(o.dlg()+1, row->get(1));
break;
}
}
TList_field& lb = (TList_field&)field(F_KEY);
if (i < 0)
{
lb.replace_items("", "");
return error_box("Inserire un numero di file valido");
}
TLocalisamfile f(nfile);
const RecDes& rd = *f.curr().rec_des();
TToken_string codes, items;
for (i = 1; i <= rd.NKeys; i++)
{
codes.add(i);
items.add("Chiave "); items << i;
}
lb.replace_items(codes, items);
lb.set("1");
}
break;
case F_KEY:
if (e == fe_modify)
{
const int nkey = atoi(o.get());
const int nfile = get_int(F_FILE);
if (nfile >= LF_USER && nkey > 0)
{
TLocalisamfile f(nfile);
const RecDes& rd = *f.curr().rec_des();
const KeyDes& kd = rd.Ky[nkey-1];
TToken_string str("", '+');
for (int i = 0; i < kd.NkFields; i++)
{
const int nf = kd.FieldSeq[i] % MaxFields;
const RecFieldDes& rf = rd.Fd[nf];
str.add(rf.Name);
}
set(o.dlg()+1, str);
}
}
break;
default:
break;
}
return TRUE;
}
static int find_edit_apps(TConfig& cfg, void* jolly)
{
TBit_array& ba = *(TBit_array*)jolly;
TAssoc_array& ass = cfg.list_variables();
FOR_EACH_ASSOC_STRING(ass, obj, key, val)
{
if (strncmp(key, "Edit_", 5) == 0)
{
const int nfile = atoi(key+5);
ba.set(nfile);
}
}
return 0;
}
TFile_selector::TFile_selector() : TAutomask("ba7300a")
{
TIndwin iw(0, "Inizializzazione Editors...", FALSE, FALSE);
_sht = new TArray_sheet(-1,-1,-6,-6,"Selezione archivio", "Numero@6R|Descrizione@50|Editor|E-Mail");
const TPrefix& pref = prefix();
const int total = pref.items();
TString app, mail;
TBit_array edit_apps, mail_apps;
TConfig ini("install.ini", "Main");
ini.for_each_paragraph(find_edit_apps, &edit_apps);
TConfig inidit(CONFIG_DITTA, "MailTransactions");
TAuto_token_string filter;
for (int f = 0; inidit.exist("Filter", f); f++)
{
filter = inidit.get("Filter", NULL, f);
const int num = filter.get_int(1);
mail_apps.set(num);
}
for (int i = LF_USER; i < total; i++)
{
const bool can_edit = edit_apps[i];
const bool can_mail = mail_apps[i];
if (can_edit || can_mail)
{
app.cut(0);
if (can_edit && i > LF_TAB)
{
TLocalisamfile f(i);
f.get_relapp(app);
}
mail = can_mail ? "X" : "";
TToken_string* row = new TToken_string;
*row << i;
row->add(pref.description(*row));
row->add(app);
row->add(mail);
_sht->rows_array().add(row);
}
}
}
TFile_selector::~TFile_selector()
{
delete _sht;
}
///////////////////////////////////////////////////////////
// TBrowser_sheet
///////////////////////////////////////////////////////////
class TBrowser_sheet : public TCursor_sheet
{
public:
TBrowser_sheet(TCursor* c, const char* f, const char* t, const char* h);
};
TBrowser_sheet::TBrowser_sheet(TCursor* c, const char* f, const char* t, const char* h)
: TCursor_sheet(c, f, t, h, 0x3, 1)
{
TToken_string tag = "Selezione";
add_tag_buttons(tag);
}
///////////////////////////////////////////////////////////
// TRecord_selector
///////////////////////////////////////////////////////////
class TRecord_selector : public TAutomask
{
TRelation* _relation;
TCursor* _cursor;
TToken_string _fields, _head;
protected:
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
bool add_special_field(short id, const RecFieldDes& rf, int x, int y);
void add_browse_field(const RecFieldDes& rf);
int create_fields(const char* title, const RecDes& rd, int nkey, short id, int starty);
public:
TCursor& cursor() { return *_cursor; }
TToken_string& fields() { return _fields; }
TRecord_selector(const TFile_selector& fm);
virtual ~TRecord_selector();
};
bool TRecord_selector::on_field_event(TOperable_field& o, TField_event e, long jolly)
{
if (o.dlg() >= 201 && e == fe_button)
{
const char* title = _cursor->file().description();
TBrowser_sheet cs(_cursor, _fields, title, _head);
const short first_id = o.dlg() >= 301 ? 301 : 201;
TRectype& rec = _cursor->curr();
rec.zero();
if (_fields.not_empty())
{
short id = first_id;
FOR_EACH_TOKEN(_fields, tok)
{
if (id2pos(id) > 0)
rec.put(tok, get(id++));
else
break;
}
const TRecnotype pos = _cursor->read();
cs.select(pos);
}
const KEY k = cs.run();
switch (k)
{
case K_ENTER:
{
short id = first_id;
FOR_EACH_TOKEN(_fields, tok)
{
if (id2pos(id) > 0)
set(id++, rec.get(tok));
else
break;
}
}
break;
case K_INS:
{
TString str;
if (_cursor->file().get_relapp(str))
{
TExternal_app app(str);
app.run();
}
else
error_box("Il file non <20> associato ad un editor");
}
break;
case K_CTRL+'G':
{
const char* const inifile = "trans.ini";
TConfig ini(inifile, "Transaction");
ini.remove_all();
ini.set("Action", "Modify");
TString str; str << _cursor->file().num();
ini.set_paragraph(str);
ini.remove_all();
TToken_string row = cs.row(-1);
TString16 field;
for (int i = 0; ; i++)
{
_fields.get(i, field);
if (field.not_empty())
ini.set(field, row.get(i));
else
break;
}
ini.set_paragraph("Transaction"); // Forza il flush
if (_cursor->file().get_relapp(str))
{
str << " /i" << inifile;
TExternal_app app(str);
app.run();
}
else
error_box("Il file non <20> associato ad un editor");
}
break;
default:
break;
}
}
return TRUE;
}
bool TRecord_selector::add_special_field(short id, const RecFieldDes& rf, int x, int y)
{
TString16 prompt = rf.Name;
prompt.lower();
prompt[0] = toupper(prompt[0]);
prompt.left_just(14);
const logicnum = get_int(F_FILE);
if (logicnum == LF_DOC && strcmp(rf.Name, "PROVV") == 0)
{
add_list(id, 0, prompt, x, y, 12, "", "D|P", "Definitivo|Provvisiorio");
return TRUE;
}
if (strcmp(rf.Name, "TIPOCF") == 0)
{
add_list(id, 0, prompt, x, y, 9, "", "C|F", "Cliente|Fornitore");
return TRUE;
}
return FALSE;
}
int TRecord_selector::create_fields(const char* title, const RecDes& rd, int nkey, short id, int starty)
{
TString prompt;
int i;
int x = 2;
const KeyDes& kd = rd.Ky[nkey];
const int nf = kd.NkFields;
int rows = 1;
for (i = 0; i < nf; i++)
{
const int nf = kd.FieldSeq[i] % MaxFields;
const RecFieldDes& rf = rd.Fd[nf];
if (x + rf.Len + 16 > 76)
{
x = 2;
rows++;
}
x += (rf.Len+16) > 38 ? 76 : 38;
}
add_groupbox(-1, 0, title, 1, starty, 80, rows+2);
int y = starty+1;
x = 2;
for (i = 0; i < nf; i++)
{
const int nf = kd.FieldSeq[i] % MaxFields;
const RecFieldDes& rf = rd.Fd[nf];
prompt = rf.Name;
prompt.lower();
prompt[0] = toupper(prompt[0]);
prompt.left_just(14);
if (x + rf.Len + 16 > 76)
{
x = 2;
y++;
}
switch (rf.TypeF)
{
case _intfld:
case _longfld:
case _realfld:
case _wordfld:
add_number(id+i, 0, prompt, x, y, rf.Len, "BU");
break;
case _intzerofld:
case _longzerofld:
add_number(id+i, 0, prompt, x, y, rf.Len, "BUZ");
break;
case _datefld:
add_date(id+i, 0, prompt, x, y, "B");
break;
case _boolfld:
add_boolean(id+i, 0, prompt, x, y);
break;
case _alfafld:
case _charfld:
default:
if (!add_special_field(id+i, rf, x, y))
add_string(id+i, 0, prompt, x, y, rf.Len, "BU");
break;
}
x += (rf.Len+16) > 38 ? 76 : 38;
}
return y+1;
}
void TRecord_selector::add_browse_field(const RecFieldDes& rf)
{
if (_fields.get_pos(rf.Name) < 0)
{
TString16 prompt = rf.Name;
_fields.add(prompt);
prompt.lower();
prompt[0] = toupper(prompt[0]);
const int len = min(rf.Len, 50);
if (len > prompt.len())
prompt << '@' << len;
_head.add(prompt);
}
}
TRecord_selector::TRecord_selector(const TFile_selector& fm) : TAutomask("ba7300a")
{
for (short id = F_FILE; id <= F_SENDMAIL; id++)
{
set(id, fm.get(id));
if (id < F_SENDMAIL)
field(id).disable();
}
const int logicnum = get_int(F_FILE);
const int nkey = get_int(F_KEY)-1;
_relation = new TRelation(logicnum);
_cursor = new TCursor(_relation, "", nkey+1);
const RecDes& rd = *_relation->curr().rec_des();
const KeyDes& kd = rd.Ky[nkey];
int i;
for (i = 0; i < kd.NkFields; i++)
{
const int nf = kd.FieldSeq[i] % MaxFields;
const RecFieldDes& rf = rd.Fd[nf];
add_browse_field(rf);
}
for (int k = 0; k < rd.NKeys; k++) if (k != nkey)
{
const KeyDes& kd = rd.Ky[k];
for (i = 0; i < kd.NkFields; i++)
{
const int nf = kd.FieldSeq[i] % MaxFields;
const RecFieldDes& rf = rd.Fd[nf];
add_browse_field(rf);
}
}
for (i = 0; i < rd.NFields && _head.items() < 6; i++)
{
const RecFieldDes& rf = rd.Fd[i];
add_browse_field(rf);
}
int y = 5;
y = create_fields("@bDal record", rd, nkey, 201, y);
create_fields("@bAl record", rd, nkey, 301, y+1);
set_handlers();
}
TRecord_selector::~TRecord_selector()
{
delete _cursor;
delete _relation;
}
///////////////////////////////////////////////////////////
// MailFlood app
///////////////////////////////////////////////////////////
class TMail_flood_app : public TSkeleton_application
{
virtual void main_loop();
protected:
void send_records(TCursor& cur);
void send_mails(TCursor& cur);
void fill_rows(const TRectype& parent, int logicnum, TConfig& ini) const;
public:
void fill_key(const TRectype& curr, TConfig& ini) const;
void fill_transaction(const TRectype& curr, TConfig& ini) const;
void send_selected(TRecord_selector& m);
};
inline TMail_flood_app& app() { return (TMail_flood_app&)main_app(); }
///////////////////////////////////////////////////////////
// Main
///////////////////////////////////////////////////////////
void TMail_flood_app::fill_key(const TRectype& curr, TConfig& ini) const
{
TString16 para; para << curr.num();
ini.set_paragraph(para);
ini.remove_all();
const RecDes& rd = *curr.rec_des();
const KeyDes& kd = rd.Ky[0];
for (int i = 0; i < kd.NkFields; i++)
{
const int nf = kd.FieldSeq[i] % MaxFields;
const RecFieldDes& rf = rd.Fd[nf];
const char* field = rf.Name;
ini.set(field, curr.get(field));
}
}
void TMail_flood_app::send_records(TCursor& cur)
{
TFilename dir; dir.tempdir();
dir.add("transpos");
::mkdir(dir);
const TRectype& curr = cur.curr();
cur.freeze();
const long items = cur.items();
TProgind pi(items, "Generazione transazioni...", FALSE, TRUE);
TString16 para; para << curr.num(); // Paragrafo con i campi
TFilename ininame;
for (cur = 0; cur.pos() < items; ++cur)
{
pi.addstatus(1);
ininame = dir;
ininame << SLASH << "tr" << cur.pos() << ".ini";
TConfig ini(ininame, "Transaction");
ini.set("Action", "Link");
ini.set("Mode", "A");
fill_key(curr, ini);
}
TString appname;
if (cur.file().get_relapp(appname))
{
appname << " /i" << dir << SLASH << "tr*.ini";
TExternal_app app(appname);
app.run();
}
for (long i = 0; i < items; i++)
{
ininame = dir;
ininame << SLASH << "tr" << i << ".ini";
::remove(ininame);
}
::rmdir(dir);
}
void TMail_flood_app::fill_rows(const TRectype& parent, int logicnum, TConfig& ini) const
{
TLocalisamfile rowsfile(logicnum); // Carico tracciato record!
TRectype& rec = rowsfile.curr();
TString16 numfield;
const RecDes& rd = *rec.rec_des();
const KeyDes& kd = rd.Ky[0];
for (int i = 0; i < kd.NkFields; i++)
{
const int nf = kd.FieldSeq[i] % MaxFields;
const RecFieldDes& rf = rd.Fd[nf];
const char* field = rf.Name;
if (i < kd.NkFields-1)
rec.put(field, parent.get(field)); // Copia nella riga la chiave 1 della testata
else
numfield = field; // Memorizza campo numeratore
}
TRecord_array arr(rec, numfield);
for (int r = arr.first_row(); r > 0 && r <= arr.rows(); r = arr.succ_row(r))
{
const TRectype& row = arr[r];
TString16 para; para << row.num() << ',' << r;
ini.set_paragraph(para);
for (int i = row.items()-1; i >= 0; i--)
{
const char* name = row.fieldname(i);
if (strcmp(name, "G1") != 0)
{
TFieldref fr(name, 0);
fr.write(ini, para, row.get(name));
}
}
}
}
void TMail_flood_app::fill_transaction(const TRectype& rec, TConfig& ini) const
{
TString16 para; para << rec.num();
ini.set_paragraph(para);
for (int i = rec.items()-1; i >= 0; i--)
{
const char* name = rec.fieldname(i);
TFieldref fr(name, 0);
fr.write(ini, para, rec.get(name));
}
switch (rec.num())
{
case LF_ANAMAG:
fill_rows(rec, LF_UMART, ini);
break;
case LF_DIST:
fill_rows(rec, LF_RDIST, ini);
break;
case LF_DOC:
fill_rows(rec, LF_RIGHEDOC, ini);
break;
case LF_MOV:
fill_rows(rec, LF_RMOV, ini);
fill_rows(rec, LF_RMOVIVA, ini);
break;
default: break;
};
}
void TMail_flood_app::send_mails(TCursor& cur)
{
const TRectype& rec = cur.curr();
TFilename ininame; ininame.tempdir();
ininame.add("trans.ini");
cur.freeze();
const long items = cur.items();
TProgind pi(items, "Spedizione transazioni...", TRUE, TRUE);
const long ditta = main_app().get_firm();
for (cur = 0; cur.pos() < items; ++cur)
{
pi.addstatus(1);
if (pi.iscancelled())
break;
const bool ok = ::can_dispatch_transaction(rec);
if (ok)
{
TConfig ini(ininame, "Transaction");
ini.set("Action", "Modify");
ini.set("Firm", ditta);
ini.set("Mode", "A");
fill_transaction(rec, ini);
}
if (ok)
{
::dispatch_transaction(rec, ininame);
::remove(ininame);
}
}
}
void TMail_flood_app::send_selected(TRecord_selector& m)
{
TCursor cur = m.cursor();
TRectype recfrom = cur.curr();
TRectype recto = cur.curr();
recfrom.zero();
recto.zero();
for (int i = 0; ; i++)
{
if (m.id2pos(201+i) < 0)
break;
const char* field = m.fields().get(i);
recfrom.put(field, m.get(201+i));
recto.put(field, m.get(301+i));
}
cur.setregion(recfrom, recto);
const long items = cur.items();
if (items > 0)
{
if (yesno_box("Confermare l'invio di %ld transazioni", items))
{
if (m.get_bool(F_SENDMAIL))
send_mails(cur);
else
send_records(cur);
}
}
else
warning_box("Nessun record da inviare");
}
void TMail_flood_app::main_loop()
{
TFile_selector fm;
while (fm.run() == K_ENTER)
{
TRecord_selector rm(fm);
while (rm.run() == K_ENTER)
send_selected(rm);
}
}
int ba7300(int argc, char* argv[])
{
TMail_flood_app ma;
ma.run(argc, argv, "Sincronicity");
return 0;
}