campo-sirio/ve/ve2700.cpp
luca 198208b90f Patch level :10.0
Files correlati     :
Ricompilazione Demo : [ ]
Commento            :
prosegue la sincronizzazione listini


git-svn-id: svn://10.65.10.50/trunk@19404 c028cbd2-c16b-5b4b-a496-9718f37d4682
2009-10-08 10:05:28 +00:00

707 lines
24 KiB
C++
Executable File

#include <applicat.h>
#include <automask.h>
#include <config.h>
#include <defmask.h>
#include <progind.h>
#include <recarray.h>
#include <recset.h>
#include <relapp.h>
#include <tabutil.h>
#include "../mg/anamag.h"
#include "../mg/umart.h"
#include "condv.h"
#include "rcondv.h"
#include "ve2.h"
#include "ve2700.h"
///////////////////////////////////////////////////////////////////////////////
// MASCHERA DI EDIT (aggiorna i listini figghi 'u patre!)
///////////////////////////////////////////////////////////////////////////////
class TAggiorna_listini_edit_mask : public TAutomask
{
TMask* _query_mask; //puntatore alla maschera di query
TString8 _curr_grmerc; //iniziale grmerc-sotgrmerc
bool _ges_um;
protected:
//Metodi dello sheet listini figli
void fill_children_list(); //riempie lo sheet dei listini figli (costruttore)
void fill_ricarichi_children_list(); //aggiunge il ricarico nello sheet dei listini figli (on_field)
void save_children_list(); //salva i ricarichi (modificabili) dello sheet dei figli (on_field)
//Metodi dello sheet aggiornamento multilistini
void set_header_multilistini_sheet(); //compila le intestazioni delle colonne dello sheet multilistino (costruttore)
void fill_multilistini_sheet(); //riempie lo sheet multilistino (on_field)
void update_sons_prices(); //aggiorna i prezzi dei listini figli (on_field)
int find_or_add_codart(TSheet_field& sf, const TString& codart, const TString& um); //cerca l'articolo nello sheet (on_field)
bool one_checked(); //controlla se nella colonna dei check ce ne è almeno 1 checkato (on_field)
void check_all(const bool checked); //checka-dechecka la colonna dei check (on_field)
void add_art(); //aggiunge un articolo ai listini (on_field)
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
public:
TAggiorna_listini_edit_mask(TMask* query_mask);
};
//METODI ON_FIELD
//---------------
// metodi per F_LISTINI_FIGLI
//metodo per riempire lo sheet dei listini figli con i ricarichi oggi tanto di moda
void TAggiorna_listini_edit_mask::fill_ricarichi_children_list()
{
_curr_grmerc.format("%-3s%-2s", (const char*)get(F_GRMERC),(const char*)get(F_SOTGRMERC));
const TRectype& rec_gmc = cache().get("GMC", _curr_grmerc);
TToken_string lista_listini(rec_gmc.get("S1"), ';');
//se trova qualcosa nella lista listini collegati al grmerc...
if (lista_listini.full())
{
lista_listini.trim();
//se la lista di listini riempie il campo S1, magari continua in S2...
if (lista_listini.len() == 70)
{
lista_listini.add(rec_gmc.get("S2"));
lista_listini.trim();
}
//cerca se i listini trovati in GMC ci sono anche nello sheet dei figli
TSheet_field& sf_righe = sfield(F_LISTINI_FIGLI);
const int righe_sheet = sf_righe.items();
FOR_EACH_STR_TOKEN(lista_listini, str)
{
//controlla se il listino in grmerc (chiave) esiste in una delle righe dello sheet dei figli
TToken_string chiave(str, SAFE_PIPE_CHR);
TString4 catven = chiave.get(0);
catven.trim();
TString4 codlis = chiave.get(1);
codlis.trim();
FOR_EACH_SHEET_ROW(sf_righe, i, row)
{
TString4 sh_catven = row->get(0);
sh_catven.trim();
TString4 sh_codlis = row->get(1);
sh_codlis.trim();
//se incredibilmente trova il listino di grmerc tra i figli prigionieri nello sheet setta il ricarico
if (catven == sh_catven && codlis == sh_codlis)
row->add(chiave.get(2), 2);
} //FOR_EACH_SHEETT_ROW(...
} //FOR_EACH_STR_TOKEN
sf_righe.force_update();
} //if(lista_listini.full...
}
//metodo per il salvataggio dei ricarichi sulla tabella GMC dei gruppi merceologici
void TAggiorna_listini_edit_mask::save_children_list()
{
TString8 grmerc;
grmerc.format("%-3s%-2s", (const char*)get(F_GRMERC),(const char*)get(F_SOTGRMERC));
if (grmerc.full())
{
//cerca sulla tabella GMC il record corrispondente all'attuale GMC
TTable tab_gmc("GMC");
tab_gmc.put("CODTAB", grmerc);
int err = tab_gmc.read();
if (err == NOERR)
{
//prende S1 e, se pieno, anche S2
TToken_string stringona(140, ';');
TString s = tab_gmc.get("S1");
if (s.full())
{
stringona.add(s);
s = tab_gmc.get("S2");
if (s.full())
stringona.add(s);
}
//mette tutte le token_stringhine catven|codlis|ricarico in uno string_array, in modo da tener traccia..
//..della loro posizione (ogni elemento dello string_array è una token_stringhina)
TString_array ricarichi;
FOR_EACH_STR_TOKEN(stringona, str)
ricarichi.add(str);
//giro su tutti gli elementi dell'array
FOR_EACH_ARRAY_ROW(ricarichi, i, row)
{
TToken_string chiave(*row, SAFE_PIPE_CHR); //separatore broken_pipe
TString4 catven = chiave.get(0);
catven.trim();
TString4 codlis = chiave.get(1);
codlis.trim();
//giro sulle righe dello sheet listini figli
TSheet_field& sf_righe = sfield(F_LISTINI_FIGLI);
FOR_EACH_SHEET_ROW_BACK(sf_righe, r, riga)
{
TString4 sh_catven = riga->get(0);
sh_catven.trim();
TString4 sh_codlis = riga->get(1);
sh_codlis.trim();
//se incredibilmente trova il listino dell'array tra i figli prigionieri nello sheet..
if (catven == sh_catven && codlis == sh_codlis)
{
const TString& ricarico = riga->get(2);
chiave.add(ricarico, 2); //setta il ricarico nella cella dello sheet
ricarichi.add(chiave, i); //lo aggiunge all'array dei ricarichi
break; //esce perchè non può fare altro
}
} //FOR_EACH_SHEET_ROW_BACK...
} //FOR_EACH_ARRAY_ROW
//adesso deve tornare a scrivere le nuove S1 ed S2 modificate
TToken_string s1(70, ';'), s2(70, ';');
FOR_EACH_ARRAY_ROW (ricarichi, r, riga)
{
TToken_string mini_string(*riga, SAFE_PIPE_CHR); //separatore broken_pipe !!!
if (s1.len() + mini_string.len() < 70)
s1.add(mini_string);
else
{
if (s2.len() + mini_string.len() < 70)
s2.add(mini_string);
}
} //FOR_EACH_ARRAY_ROW..
//finalmente scrive sulla tabella GMC
tab_gmc.put("S1", s1);
tab_gmc.put("S2", s2);
tab_gmc.rewrite();
} //if(err==NOERR)
} //if(grmerc.full())
}
//metodi F_MULTILISTINI
//restituisce la posizione della riga ALTA, quella disabilitata
int TAggiorna_listini_edit_mask::find_or_add_codart(TSheet_field& sf, const TString& codart, const TString& codum)
{
//cerca la riga tra quelle esistenti
const int codart_pos = sf.cid2index(F_CODRIGA);
const int codum_pos = codart_pos + 1;
for (int i = 1; i < sf.items(); i += 2)
{
const char* art = sf.cell(i, codart_pos);
TString4 um = sf.cell(i - 1, codum_pos);
um.trim();
if (codart == art && (!_ges_um || codum == um))
return i - 1;
}
//non trova la riga nel padre -> la aggiunge
TToken_string& row_alta = sf.row(-1);
sf.disable_cell(sf.items()-1, -1);
const TString& descr = cache().get(LF_ANAMAG, codart, ANAMAG_DESCR);
row_alta.add(descr, codart_pos);
if (_ges_um)
row_alta.add(codum, codum_pos);
TToken_string& row_bassa = sf.row(-1);
row_bassa.add("X");
row_bassa.add(codart, codart_pos);
return sf.items() - 2; //ritorna la penultima riga (riga alta)
}
//riempie lo sheet dei multilistini
void TAggiorna_listini_edit_mask::fill_multilistini_sheet()
{
//popola il double-deck sheet
//cerca tutte le righe che appartengono a padre e figli; se una riga appartiene ad un figlio e non al padre..
//..viene aggiunta al padre medesimo (i padri devono sapere tutto dei figli, sennò che genitori sono?)
//se invece la riga appartiene al padre e non a uno o più figli questi ultimi saranno lasciati nella..
//..loro ignoranza di tale riga (un padre qualche vantaggio dovrà pur averlo, no?)
TToken_string keys_listini(140, ';');
TToken_string key;
key.add(get(F_FATHCATVEN));
key.add(get(F_FATHCODLIS));
key.trim();
keys_listini.add(key);
TSheet_field& sf_figli = sfield(F_LISTINI_FIGLI);
FOR_EACH_SHEET_ROW(sf_figli, r, riga)
{
key.cut(0);
key.add(riga->get(0));
key.add(riga->get(1));
key.trim();
keys_listini.add(key);
}
TProgind pi(keys_listini.items(), TR("Creazione righe listini..."), true, true);
TSheet_field& sf_multilistini = sfield(F_MULTILISTINI);
sf_multilistini.destroy();
const int prezzo_pos = sf_multilistini.cid2index(F_PREZZO);
FOR_EACH_TOKEN(keys_listini, tok)
{
if (!pi.addstatus(1))
break;
key = tok;
TString query;
query << "USE RCONDV\n";
query << "SELECT ANAMAG.GRMERC=#GRMERC\n";
query << "JOIN ANAMAG INTO CODART==CODRIGA\n";
query << "FROM TIPO=L CATVEN=#CATVEN COD=#COD TIPORIGA=A\n";
query << "TO TIPO=L CATVEN=#CATVEN COD=#COD TIPORIGA=A\n";
TISAM_recordset recset_rows(query);
TString8 grmerc;
grmerc.format("%-3s%-2s", (const char*)get(F_GRMERC),(const char*)get(F_SOTGRMERC));
recset_rows.set_var("#GRMERC", grmerc);
recset_rows.set_var("#CATVEN", key.get(0));
recset_rows.set_var("#COD", key.get(1));
const long recset_rows_items = recset_rows.items();
//posizione dell'attuale prezzo
const int pos = keys_listini.get_pos(key);
//per ogni riga del recordset va ad aggiornare lo sheet sulla maschera (aggiunge la riga)
for (bool ok = recset_rows.move_first(); ok; ok = recset_rows.move_next())
{
//dati riga corrente
const TString& codart = recset_rows.get(RCONDV_CODRIGA).as_string();
const TString& um = recset_rows.get(RCONDV_UM).as_string();
const real prezzo = recset_rows.get(RCONDV_PREZZO).as_real();
//cerca se esiste o se deve aggiungerla: la find_cor_add_odart restituisce il numero della riga alta..
//..(descrizione/um) del codart in questione (che starà la riga sotto, ovvero riga_alta+1)
const int riga_alta = find_or_add_codart(sf_multilistini, codart, um);
//mette il prezzo al posto giusto (padre e figlio)
if (pos <= 0)
sf_multilistini.row(riga_alta + 1).add(prezzo.string(), prezzo_pos);
else
sf_multilistini.row(riga_alta).add(prezzo.string(), prezzo_pos + pos);
} //for(bool ok..
} //FOR_EACH_TOKEN..
//aggiorna i prezzi nuovi dei listini figli
update_sons_prices();
}
//aggiorna i prezzi dei listini figli
void TAggiorna_listini_edit_mask::update_sons_prices()
{
//per ogni articolo, per ogni listino figlio prende il ricarico nello sheet dei figli e lo moltiplica per il prezzo del padre
//PrezzoNuovoFiglio = Ricaricofiglio * PrezzoPadre (questo vale per ogni articolo)
TSheet_field& sf_figli = sfield(F_LISTINI_FIGLI);
TSheet_field& sf_listini = sfield(F_MULTILISTINI);
const int fath_prezzo_pos = sf_listini.cid2index(F_PREZZO);
FOR_EACH_SHEET_ROW(sf_figli, r, riga_figlio)
{
const real ricarico = riga_figlio->get(2);
const int son_prezzo_pos = fath_prezzo_pos + 1 + r;
FOR_EACH_SHEET_ROW(sf_listini, i, riga) if (riga->get_char(0) > ' ') //è come dire checked (ignoranti!)
{
const real old_son_prezzo = sf_listini.cell(i - 1, son_prezzo_pos);
if (old_son_prezzo > ZERO)
{
const real fath_prezzo = riga->get(fath_prezzo_pos);
const TPrice son_prezzo = fath_prezzo * (CENTO + ricarico) / CENTO;
riga->add(son_prezzo.get_num().string(), son_prezzo_pos);
}
}
}
sf_listini.force_update();
}
//controlla sulla colonna delle spunte se almeno una è checkata
bool TAggiorna_listini_edit_mask::one_checked()
{
TSheet_field& sf_listini = sfield(F_MULTILISTINI);
FOR_EACH_SHEET_ROW(sf_listini, i, riga)
{
if ((i & 1) && riga->get_char(0) > ' ')
return true;
}
return false;
}
//checka-dechecka la colonna di spunte dello sheet
void TAggiorna_listini_edit_mask::check_all(const bool checked)
{
TSheet_field& sf_listini = sfield(F_MULTILISTINI);
FOR_EACH_SHEET_ROW(sf_listini, i, riga) if (i & 1)
riga->add(checked ? "X" : "", 0);
sf_listini.force_update();
}
//aggiunge un articolo ai listini
void TAggiorna_listini_edit_mask::add_art()
{
//si possono aggiungere solo articoli con lo stesso GRMERC selezionato ma non ancora in listino padre, oppure..
//..articoli orfani di grmerc (che però saranno sconsigliati!)
//(per adesso solo con l'unità di misura principale;per aggiungere gli articoli con più unità di misura..
//..si rimanda al programma principale di gestione listini ve2500!!)
TString query;
query << "USE ANAMAG\n";
query << "SELECT ((GRMERC=#GRMERC)||(GRMERC=\"\"))&&(RCONDV.CODRIGA=\"\")\n";
query << "JOIN RCONDV INTO TIPO=\"L\" CATVEN=#CATVEN COD=#COD TIPORIGA=\"A\" CODRIGA=CODART\n";
query << "JOIN UMART INTO CODART=CODART\n";
TISAM_recordset recset(query);
TString8 grmerc;
grmerc.format("%-3s%-2s", (const char*)get(F_GRMERC),(const char*)get(F_SOTGRMERC));
recset.set_var("#GRMERC", grmerc);
recset.set_var("#CATVEN", get(F_FATHCATVEN));
recset.set_var("#COD", get(F_FATHCODLIS));
const int recset_items = recset.items();
//crea uno sheet volante con gli articoli aggiungibili
TArray_sheet sheet(-1, -1, 78, 20, TR("Articoli aggiungibili"), HR("@1|Codice@20|UM|Prezzo@8R|Descrizione@50"));
TProgind pi(recset_items, TR("Ricerca articoli aggiungibili..."), true, true);
for (bool ok = recset.move_first(); ok; ok = recset.move_next())
{
if (!pi.addstatus(1))
break;
TToken_string row;
//prechecka solo quelli con il corretto grmerc; gli articoli orfani no!
const TString& grmerc = recset.get(ANAMAG_GRMERC).as_string();
row.add(grmerc.full() ? "X" : "");
const TString codart = recset.get(ANAMAG_CODART).as_string();
row.add(codart);
const TString& um = recset.get("UMART.UM").as_string();
row.add(um);
const real prezzo = recset.get("UMART.PREZZO").as_real();
row.add(prezzo.is_zero() ? "" : prezzo.string());
const TString& descr = recset.get(ANAMAG_DESCR).as_string();
row.add(descr);
sheet.add(row);
}
sheet.rows_array().sort(false);
//adesso che ha proposto lo sheet con gli articoli aggiungibili, deve aggiungere effettivamente..
//..quelli checkati
if (sheet.run() == K_ENTER)
{
TSheet_field& sf_listini = sfield(F_MULTILISTINI);
const int prezzo_pos = sf_listini.cid2index(F_PREZZO);
TString80 codart;
TString4 um;
FOR_EACH_CHECKED_ROW(sheet, r, riga)
{
codart = riga->get(1);
um = riga->get(2); um.trim();
const int numriga = find_or_add_codart(sf_listini, codart, um);
if (numriga >= 0)
sf_listini.row(numriga + 1).add(riga->get(3), prezzo_pos);
}
sf_listini.force_update();
}
}
bool TAggiorna_listini_edit_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
{
switch(o.dlg())
{
case F_LISTINI_FIGLI:
if (e == se_query_add || e == se_query_del)
return false; // Rifiuta aggiunte e cancellazioni di figli
break;
case F_MULTILISTINI:
switch (e)
{
case se_query_add:
send_key(K_SPACE, DLG_NEWREC); // Ridirige l'aggiunta al bottone della toolbar
return false;
case se_query_del:
return false; // Rifiuta cancellazioni di articoli
default: break;
}
break;
case F_GRMERC:
case F_SOTGRMERC:
//una volta selezionati grmerc/sotgrmerc riempie la colonna ricarico dello sheet
if (e == fe_modify)
{
TString8 grmerc;
grmerc.format("%-3s%-2s", (const char*)get(F_GRMERC),(const char*)get(F_SOTGRMERC));
if (grmerc != _curr_grmerc)
{
fill_ricarichi_children_list();
fill_multilistini_sheet();
}
}
break;
//applica i cambiamenti dovuti ai ricarichi e salva questi ultimi in gmc
case DLG_APPLICA:
if (e == fe_button)
{
update_sons_prices();
save_children_list();
}
break;
case DLG_CHECKALL:
if (e == fe_button)
{
check_all(!one_checked());
}
break;
case DLG_NEWREC:
if (e == fe_button)
{
if (field(F_GRMERC).empty())
return error_box(TR("Per aggiungere articoli è necessario selezionare un gruppo merceologico!"));
add_art();
}
break;
default:
break;
}
return true;
}
//METODI COSTRUTTORE
//------------------
// metodi per F_LISTINI_FIGLI
//metodo per aggiungere i figli allo sheet dei medesimi
void TAggiorna_listini_edit_mask::fill_children_list()
{
//disabilita se necessario la colonna della categoria di vendita (lo sheet serve comunque dopo!)
TSheet_field& sf_righe = sfield(F_LISTINI_FIGLI);
sf_righe.destroy();
sf_righe.enable_column(F_CATVEN, ini_get_bool(CONFIG_DITTA, "ve", "GESLISCV"));
//aggiorna sheet con i listini figli
TString query;
query << "USE CONDV\n";
query << "SELECT (FATHCATVEN=#FATHCATVEN)&&(FATHCOD=#FATHCOD)\n";
query << "FROM TIPO=L\n";
query << "TO TIPO=L\n";
TISAM_recordset recset_figli(query);
recset_figli.set_var("#FATHCATVEN", get(F_FATHCATVEN));
recset_figli.set_var("#FATHCOD", get(F_FATHCODLIS));
const int recset_figli_items = recset_figli.items();
const TRectype& rec = recset_figli.cursor()->curr();
//per ogni riga del recordset va ad aggiornare lo sheet sulla maschera (aggiunge la riga)
for (bool ok = recset_figli.move_first(); ok; ok = recset_figli.move_next())
{
TToken_string& row = sf_righe.row(-1); //riga sheet da riempire
const TString& catven = rec.get(CONDV_CATVEN);
const TString& codlis = rec.get(CONDV_COD);
const TString& deslis = rec.get(CONDV_DESCR);
row.add(catven);
row.add(codlis);
row.add("");
row.add(deslis);
sf_righe.check_row(sf_righe.items()-1, 3);
}
sf_righe.force_update();
}
// metodi per F_MULTILISTINI
//metodo per riempire lo sheet con i dati da aggiornare
void TAggiorna_listini_edit_mask::set_header_multilistini_sheet()
{
//rinomina le colonne dello sheet di aggiornamento come il listino che rappresentano (fighissimo!)..
//..secondo la solita catven+codlis; fa sparire le colonne che non servono. Ricordiamo infatti che..
//...si posson avere al massimo 10 figli (controllo demografico sui listini)
TSheet_field& sf_multilistini = sfield(F_MULTILISTINI);
TSheet_field& sf_figli = sfield(F_LISTINI_FIGLI);
TString column_header;
int num_of_columns = 3;
FOR_EACH_SHEET_ROW(sf_figli, r, riga)
{
column_header.cut(0);
column_header << riga->get(0) << " ";
column_header.trim();
column_header << riga->get(1);
sf_multilistini.set_column_header(num_of_columns, column_header);
num_of_columns ++;
}
//cancella i figli in eccesso
for( ;sf_multilistini.exist_column(num_of_columns); num_of_columns++)
sf_multilistini.delete_column(num_of_columns);
}
TAggiorna_listini_edit_mask::TAggiorna_listini_edit_mask(TMask* query_mask)
: TAutomask("ve2700b"), _query_mask(query_mask)
{
//aggiorna campi listino padre
set(F_FATHCATVEN, _query_mask->get(F_FATHCATVEN));
set(F_FATHCODLIS, _query_mask->get(F_FATHCODLIS));
// Determina se vengono gestiti i listini con unità di misura
TToken_string chiave;
chiave.add("L");
chiave.add(get(F_FATHCATVEN));
chiave.add("");
chiave.add("");
chiave.add(get(F_FATHCODLIS));
const TRectype& rec_padre = cache().get(LF_CONDV, chiave);
_ges_um = rec_padre.get_bool(CONDV_GESTUM);
//popola lo sheet dei listini figli
fill_children_list();
//e poi setta le intestazioni dello sheet multilistini
set_header_multilistini_sheet();
}
///////////////////////////////////////////////////////////////////////////////
// MASCHERA DI QUERY (seleziona il listino padre tra i listini con paternità)
///////////////////////////////////////////////////////////////////////////////
class TAggiorna_listini_query_mask : public TAutomask
{
protected:
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
public:
TAggiorna_listini_query_mask();
};
bool TAggiorna_listini_query_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
{
switch(o.dlg())
{
case F_FATHCODLIS:
if (e == fe_button)
{
TString query;
query << "USE CONDV\n";
query << "SELECT (FATHCOD!='')&&(BETWEEN(FATHCATVEN,#CATVEN,#CATVEN))\n";
query << "FROM TIPO=L\n";
query << "TO TIPO=L\n";
//ottiene tutti i listini che hanno un padre
TISAM_recordset listini_figli(query);
listini_figli.set_var("#CATVEN", get(F_FATHCATVEN));
const int listini_figli_items = listini_figli.items();
//adesso deve crearsi la lista dei padri
TAssoc_array listini_padri;
for (bool ok = listini_figli.move_first(); ok; ok = listini_figli.move_next())
{
//quale è il padre del figlio?
TToken_string key;
key.add(listini_figli.get(CONDV_FATHCATVEN).as_string(), 0);
key.add(listini_figli.get(CONDV_FATHCOD).as_string(), 1);
//se non esiste già nella lista dei padri deve essere aggiunto!
if (!listini_padri.is_key(key))
{
//necessita della descrizione del padre
TToken_string chiave;
chiave.add("L");
chiave.add(key.get(0));
chiave.add("");
chiave.add("");
chiave.add(key.get(1));
const TString& descr_padre = cache().get(LF_CONDV, chiave, CONDV_DESCR);
listini_padri.add(key, descr_padre);
}
} //for(bool ok =...
//utilizzando l'assoc_array dei padri propone uno sheet di ricerca dei soli listini che hanno paternità
//maschera volante di ricerca (è una display)
TArray_sheet sheet(-1, -1, 78, 10, TR("Listini padri"), HR("Cat.Ven.|Codice|Descrizione@50"));
//riempimento dello sheet
FOR_EACH_ASSOC_STRING(listini_padri, obj, key, descr)
{
TToken_string row;
row = key;
row.add(descr);
sheet.add(row);
}
sheet.rows_array().sort(); //riordina le righe attualmente scombinate
if (sheet.run() == K_ENTER)
{
//riempie la maschera di query
TToken_string& row = sheet.row(sheet.selected());
set(F_FATHCATVEN, row.get(0), true);
set(F_FATHCODLIS, row.get(1));
set(F_FATHDESLIS, row.get(2));
send_key(K_SPACE, DLG_OK);
}
}
break;
case DLG_OK:
if (e == fe_button && efield(F_FATHCODLIS).check())
{
//lancia la maschera di edit
TAggiorna_listini_edit_mask edit_mask(this); //gli passa la maschera principale
edit_mask.run();
}
return false; // NON deve uscire dal main loop!
default:
break;
}
return true;
}
TAggiorna_listini_query_mask::TAggiorna_listini_query_mask() : TAutomask("ve2700a")
{
//in base alla cervellotica configurazione impostata dall'utonto abilita/disabilita campi
const bool gesliscv = ini_get_bool(CONFIG_DITTA, "ve", "GESLISCV");
enable(F_FATHCATVEN, gesliscv);
enable(F_FATHDESVEN, gesliscv);
//attenzione!!! il campo CATVEN è in chiave 1! per disabilitarlo ci vuole questo trucco!
if (!gesliscv)
efield(F_FATHCATVEN).reset_key(1);
}
////////////////////////////////////////////////////////
// APPLICAZIONE
////////////////////////////////////////////////////////
class TAggiorna_listini : public TSkeleton_application
{
protected:
virtual bool create();
public:
virtual void main_loop();
};
void TAggiorna_listini::main_loop()
{
TSheet_field::set_line_number_width(0);
TAggiorna_listini_query_mask mask;
while (mask.run() == K_ENTER);
}
bool TAggiorna_listini::create()
{
//controlla che solo il producer AGA possa usare questo programma
const int oem = ini_get_int(CONFIG_OEM, "MAIN", "OEM", -1);
if (oem != 0)
{
error_box(TR("Programma non autorizzato!"));
return false;
}
return TSkeleton_application::create();
}
int ve2700(int argc, char* argv[])
{
TAggiorna_listini a;
a.run(argc, argv, TR("Aggiornamneto listini multiplo"));
return 0;
}