Files correlati : Ricompilazione Demo : [ ] Commento : aggiunto il controllo sul dninst git-svn-id: svn://10.65.10.50/trunk@19985 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			1194 lines
		
	
	
		
			40 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			1194 lines
		
	
	
		
			40 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
#include <applicat.h>
 | 
						|
#include <automask.h>
 | 
						|
#include <config.h>
 | 
						|
#include <defmask.h>
 | 
						|
#include <dongle.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;      //gestione unità di misura del listino padre
 | 
						|
  bool      _ask_save;    //chiede di salvare al cambio grmerc se effettuati cambiamenti nello sheet
 | 
						|
 | 
						|
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)
 | 
						|
  int crea_famiglia_listini(TToken_string& keys_listini) const;  //crea la famiglia padre+figli
 | 
						|
  void fill_multilistini_sheet();         //riempie lo sheet multilistino (on_field)
 | 
						|
  void update_sons_prices();              //aggiorna i prezzi dei listini figli (on_field)
 | 
						|
  int find_codart(TSheet_field& sf, const TString& codart, const TString& um) const;   //cerca l'articolo (on_field)
 | 
						|
  int find_or_add_codart(TSheet_field& sf, const TString& codart, const TString& um);  //cerca l'articolo nello sheet e lo aggiunge se non c'è (on_field)
 | 
						|
  bool one_checked() const;               //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)
 | 
						|
  void kill_priceless_articles(const TString& catven, const TString& codlist, int pos);
 | 
						|
  void save_listini();                    //salva tutte le righe listini (padre e figli) così come sono sullo sheet (on_field)
 | 
						|
 | 
						|
  real get_price(TSheet_field& sf, const int row, const short dlg_id) const;
 | 
						|
  real get_price(TMask_field& fld) const;
 | 
						|
  void set_price(TSheet_field& sf, const int row, const short dlg_id, real& price);
 | 
						|
  void set_price(TMask_field& fld, real& price);
 | 
						|
  bool arrotonda(const short dlg_id, real& price);
 | 
						|
  void get_correct_grmerc(TString& grmerc, const bool asterisk) const;
 | 
						|
 | 
						|
  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()
 | 
						|
{
 | 
						|
  get_correct_grmerc(_curr_grmerc, false);
 | 
						|
  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;
 | 
						|
  get_correct_grmerc(grmerc, false);
 | 
						|
  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
 | 
						|
 | 
						|
            //salva il valore dell'arrotondamento sulla testata del listino corrente dello sheet
 | 
						|
            TLocalisamfile condv(LF_CONDV);
 | 
						|
            condv.put(CONDV_TIPO, 'L');
 | 
						|
            condv.put(CONDV_CATVEN, sh_catven);
 | 
						|
            condv.put(CONDV_TIPOCF, "");
 | 
						|
            condv.put(CONDV_CODCF, "");
 | 
						|
            condv.put(CONDV_COD, sh_codlis);
 | 
						|
            int err = condv.read();
 | 
						|
            if (err == NOERR)
 | 
						|
            {
 | 
						|
              condv.put(CONDV_ARROTONDA, riga->get(3));
 | 
						|
              condv.rewrite();
 | 
						|
            }
 | 
						|
 | 
						|
            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
 | 
						|
 | 
						|
real TAggiorna_listini_edit_mask::get_price(TMask_field& fld) const
 | 
						|
{
 | 
						|
  TString16 str_prezzo = fld.get();
 | 
						|
  if (fld.dlg() == S2_PREZZO)
 | 
						|
  {
 | 
						|
    str_prezzo.strip(".");
 | 
						|
    str_prezzo.replace(',', '.');
 | 
						|
  }
 | 
						|
  return real(str_prezzo);
 | 
						|
}
 | 
						|
 | 
						|
//prende il prezzo del padre e sostituisce i '.' con le ','
 | 
						|
real TAggiorna_listini_edit_mask::get_price(TSheet_field& sf, const int row, const short dlg_id) const
 | 
						|
{
 | 
						|
  const int col = sf.cid2index(dlg_id);
 | 
						|
  TString16 str_prezzo = sf.cell(row, col);
 | 
						|
  if (dlg_id == S2_PREZZO)
 | 
						|
  {
 | 
						|
    str_prezzo.strip(".");
 | 
						|
    str_prezzo.replace(',', '.');
 | 
						|
  }
 | 
						|
  return real(str_prezzo);
 | 
						|
}
 | 
						|
 | 
						|
bool TAggiorna_listini_edit_mask::arrotonda(const short dlg_id, real& price)
 | 
						|
{
 | 
						|
  TString str_arr;
 | 
						|
  const bool is_father_list = dlg_id == S2_PREZZO;
 | 
						|
  if (is_father_list)
 | 
						|
  {
 | 
						|
    str_arr = get(F_ARROTONDA);
 | 
						|
  }
 | 
						|
  else
 | 
						|
  {
 | 
						|
    TSheet_field& figli = sfield(F_LISTINI_FIGLI);
 | 
						|
    str_arr = figli.cell(dlg_id - S2_LIST1, figli.cid2index(S1_ARROTONDA));
 | 
						|
  }
 | 
						|
  str_arr.replace(',', '.');
 | 
						|
  const real num_arr = abs(real(str_arr));
 | 
						|
  if (!num_arr.is_zero())
 | 
						|
  {
 | 
						|
    price /= num_arr;
 | 
						|
    switch (str_arr[0])
 | 
						|
    {
 | 
						|
    case '+': price.ceil();  break;
 | 
						|
    case '-': price.floor(); break;
 | 
						|
    default : price.round(); break;
 | 
						|
    }
 | 
						|
    price *= num_arr;
 | 
						|
  }
 | 
						|
  else  //se non specificato alcun arrotondamento usa quello standard dei prezzi
 | 
						|
  {
 | 
						|
    const TPrice p(price);
 | 
						|
    price = p.get_num();
 | 
						|
  }
 | 
						|
  return is_father_list;
 | 
						|
}
 | 
						|
 | 
						|
void TAggiorna_listini_edit_mask::set_price(TSheet_field& sf, const int row, const short dlg_id, real& price)
 | 
						|
{
 | 
						|
  const bool is_father_list = arrotonda(dlg_id, price);
 | 
						|
  const int prezzo_pos = sf.cid2index(dlg_id);
 | 
						|
 | 
						|
  if (is_father_list)
 | 
						|
    sf.row(row).add(price.stringa(0, TCurrency::get_firm_dec(true)), prezzo_pos);
 | 
						|
  else
 | 
						|
    sf.row(row).add(price.string(), prezzo_pos);
 | 
						|
}
 | 
						|
 | 
						|
void TAggiorna_listini_edit_mask::set_price(TMask_field& fld, real& price)
 | 
						|
{
 | 
						|
  const bool is_father_list = arrotonda(fld.dlg(), price);
 | 
						|
  if (is_father_list)
 | 
						|
    fld.set(price.stringa(0, TCurrency::get_firm_dec(true)));
 | 
						|
  else
 | 
						|
    fld.set(price.string());
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
//cerca nello sheet la coppia codart+um che gli viene passata restituendo la posizione della riga ALTA..
 | 
						|
//della coppia di righe sheet interessate (è la riga disabilitata);
 | 
						|
int TAggiorna_listini_edit_mask::find_codart(TSheet_field& sf, const TString& codart, const TString& codum) const
 | 
						|
{
 | 
						|
  //cerca la riga tra quelle esistenti
 | 
						|
  const int codart_pos = sf.cid2index(S2_CODRIGA);
 | 
						|
  const int codum_pos = codart_pos + 1;
 | 
						|
  const int sf_items = sf.items();
 | 
						|
  for (int i = 1; i < sf_items; i += 2)
 | 
						|
  {
 | 
						|
    const char* art = sf.cell(i, codart_pos);
 | 
						|
	if (codart == art)
 | 
						|
	{
 | 
						|
	  if (_ges_um)  // Controllo anche l'unita' di misura solo se necessario
 | 
						|
	  {
 | 
						|
        TString4 um = sf.cell(i - 1, codum_pos);
 | 
						|
        um.trim();
 | 
						|
		if (codum != um)
 | 
						|
          continue;
 | 
						|
	  }
 | 
						|
      return i - 1;
 | 
						|
	}
 | 
						|
  }
 | 
						|
  return -1;
 | 
						|
}
 | 
						|
 | 
						|
//cerca nello sheet la coppia codart+um che gli viene passata restituendo la posizione della riga ALTA..
 | 
						|
//della coppia di righe sheet interessate (è la riga disabilitata); se non trova la coppia articolo+um ..
 | 
						|
//..aggiunge la coppia di righe
 | 
						|
int TAggiorna_listini_edit_mask::find_or_add_codart(TSheet_field& sf, const TString& codart, const TString& codum)
 | 
						|
{
 | 
						|
  //cerca la riga nello sheet
 | 
						|
  int riga = find_codart(sf, codart, codum);
 | 
						|
 | 
						|
  if (riga < 0)
 | 
						|
  {
 | 
						|
    const int codart_pos = sf.cid2index(S2_CODRIGA);
 | 
						|
    const int codum_pos = codart_pos + 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);
 | 
						|
 | 
						|
    riga = sf.items() - 2;  //ritorna la penultima riga (riga alta)
 | 
						|
  }
 | 
						|
  return riga;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
int TAggiorna_listini_edit_mask::crea_famiglia_listini(TToken_string& keys_listini) const
 | 
						|
{
 | 
						|
  keys_listini.separator(';');
 | 
						|
  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);
 | 
						|
  }
 | 
						|
  return keys_listini.items();
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
void TAggiorna_listini_edit_mask::get_correct_grmerc(TString& grmerc, const bool asterisk) const
 | 
						|
{
 | 
						|
  grmerc.format("%-3s%-2s", (const char*)get(F_GRMERC),(const char*)get(F_SOTGRMERC));
 | 
						|
  grmerc.trim();
 | 
						|
  //se il grmerc non è completo (solo il primo carattere), ci vuole una ricerca tipo..
 | 
						|
  //..jolly; vale anche per il sottogrmerc (non pieno con i 3 caratteri)
 | 
						|
  if (asterisk && grmerc.len() < 5)
 | 
						|
    grmerc << "*";
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
//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, ';');
 | 
						|
  const int componenti_famiglia = crea_famiglia_listini(keys_listini);
 | 
						|
 | 
						|
  TString8 grmerc; get_correct_grmerc(grmerc, false);
 | 
						|
  TString msg;
 | 
						|
  msg << TR("Lettura listini ") << grmerc << "...";
 | 
						|
 | 
						|
  TProgind pi(keys_listini.items(), msg, true, true);
 | 
						|
  TSheet_field& sf_multilistini = sfield(F_MULTILISTINI);
 | 
						|
  sf_multilistini.destroy();
 | 
						|
 | 
						|
  const int prezzo_pos = sf_multilistini.cid2index(S2_PREZZO);
 | 
						|
  TToken_string key;
 | 
						|
 | 
						|
  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";   //occhio al '?' Serve per poter avere ricerche jolly
 | 
						|
    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;
 | 
						|
    get_correct_grmerc(grmerc, true);
 | 
						|
 | 
						|
    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();
 | 
						|
      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);
 | 
						|
      const int riga_bassa = riga_alta + 1;
 | 
						|
 | 
						|
      //mette il prezzo al posto giusto (padre e figlio)
 | 
						|
      if (pos <= 0) //padre
 | 
						|
      {
 | 
						|
        set_price(sf_multilistini, riga_bassa, S2_PREZZO, prezzo);
 | 
						|
        //il padre viene arrotondato al suo arrotondamento (se c'e')
 | 
						|
        //sf_multilistini.row(riga_bassa).add(prezzo.stringa(), prezzo_pos + pos);
 | 
						|
      }
 | 
						|
      else
 | 
						|
      {
 | 
						|
        //nella riga alta visualizza prezzo originale (no arrotondamento)
 | 
						|
        sf_multilistini.row(riga_alta).add(prezzo.string(), prezzo_pos + pos);
 | 
						|
        set_price(sf_multilistini, riga_bassa, S2_PREZZO + pos, prezzo);
 | 
						|
        real fath_prezzo = get_price(sf_multilistini, riga_bassa, S2_PREZZO);
 | 
						|
        //se il figlio ha un prezzo ma il padre no, ricalcola il valore dell'articolo nel padre usando il ricarico
 | 
						|
        if (fath_prezzo.is_zero())
 | 
						|
        {
 | 
						|
          TSheet_field& listini_figli = sfield(F_LISTINI_FIGLI);
 | 
						|
          const real ricarico = listini_figli.cell(pos - 1, listini_figli.cid2index(S1_RICARICO));
 | 
						|
          real prezzo_base(prezzo * CENTO / (CENTO + ricarico));
 | 
						|
          set_price(sf_multilistini, riga_bassa, S2_PREZZO, prezzo_base); 
 | 
						|
        }
 | 
						|
      }
 | 
						|
    } //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);
 | 
						|
 | 
						|
  FOR_EACH_SHEET_ROW(sf_figli, r, riga_figlio)
 | 
						|
  {
 | 
						|
    const real ricarico = riga_figlio->get(2);
 | 
						|
    FOR_EACH_SHEET_ROW(sf_listini, i, riga) if (riga->get_char(0) > ' ')    //è come dire checked (ignoranti!)
 | 
						|
    {
 | 
						|
      const real old_son_prezzo = get_price(sf_listini, i - 1, S2_LIST1 + r);
 | 
						|
      if (old_son_prezzo > ZERO)
 | 
						|
      {
 | 
						|
        const real fath_prezzo = get_price(sf_listini, i, S2_PREZZO);
 | 
						|
        real son_prezzo = fath_prezzo * (CENTO + ricarico) / CENTO;
 | 
						|
        set_price(sf_listini, i, S2_LIST1 + r, son_prezzo);
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
  sf_listini.force_update();
 | 
						|
}
 | 
						|
 | 
						|
//controlla sulla colonna delle spunte se almeno una è checkata
 | 
						|
bool TAggiorna_listini_edit_mask::one_checked() const
 | 
						|
{
 | 
						|
  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_filter;
 | 
						|
 | 
						|
  get_correct_grmerc(grmerc, false);
 | 
						|
  get_correct_grmerc(grmerc_filter, true);
 | 
						|
 | 
						|
  recset.set_var("#GRMERC", grmerc_filter);
 | 
						|
  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|Gr.Merc|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& grm = recset.get(ANAMAG_GRMERC).as_string();
 | 
						|
    row.add(grm);
 | 
						|
    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(S2_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)
 | 
						|
      {
 | 
						|
        const TPrice prezzo(real(riga->get(3)));
 | 
						|
        sf_listini.row(numriga + 1).add(prezzo.string(true), prezzo_pos);
 | 
						|
 | 
						|
        //aggiunge i prezzi sui listini figli (sia riga alta che riga bassa ricaricata)
 | 
						|
        TSheet_field& sf_listini_figli = sfield(F_LISTINI_FIGLI);
 | 
						|
        FOR_EACH_SHEET_ROW(sf_listini_figli, i, son)
 | 
						|
        {
 | 
						|
          sf_listini.row(numriga).add(prezzo.get_num().string(), prezzo_pos + i + 1);
 | 
						|
          const real ricarico = son->get(sf_listini_figli.cid2index(S1_RICARICO));
 | 
						|
          const TPrice son_prezzo = prezzo.get_num() * (CENTO + ricarico) / CENTO;
 | 
						|
          sf_listini.row(numriga + 1).add(son_prezzo.get_num().string(), prezzo_pos + i + 1);
 | 
						|
        }
 | 
						|
 | 
						|
        //aggiorna l'articolo in anagrafica con il grmerc se lui non ce l'ha
 | 
						|
        if (riga->get_char(4) <= ' ')
 | 
						|
        {
 | 
						|
          TLocalisamfile anamag(LF_ANAMAG);
 | 
						|
          anamag.put(ANAMAG_CODART, codart);
 | 
						|
          if (anamag.read() == NOERR)
 | 
						|
          {
 | 
						|
            anamag.put(ANAMAG_GRMERC, grmerc);
 | 
						|
            anamag.rewrite();
 | 
						|
          }
 | 
						|
        }
 | 
						|
      } //if(numriga>=0...
 | 
						|
    }
 | 
						|
    sf_listini.force_update();
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
void TAggiorna_listini_edit_mask::kill_priceless_articles(const TString& catven, const TString& codlist, int pos)
 | 
						|
{
 | 
						|
  TSheet_field& sf_listini = sfield(F_MULTILISTINI);
 | 
						|
 | 
						|
  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; get_correct_grmerc(grmerc, true);
 | 
						|
 | 
						|
	recset_rows.set_var("#GRMERC", grmerc);
 | 
						|
	recset_rows.set_var("#CATVEN", catven);
 | 
						|
	recset_rows.set_var("#COD", codlist);
 | 
						|
	const long recset_rows_items = recset_rows.items();
 | 
						|
 | 
						|
	TLocalisamfile& file = recset_rows.cursor()->file();
 | 
						|
 | 
						|
	//eliminatore di articoli cancellati dallo sheet
 | 
						|
	for (bool ok = recset_rows.move_first(); ok; ok = recset_rows.move_next())
 | 
						|
	{
 | 
						|
	  //prende codart e um dal record su file rcondv
 | 
						|
	  const TString& codart = recset_rows.get(RCONDV_CODRIGA).as_string();
 | 
						|
	  const TString& um = recset_rows.get(RCONDV_UM).as_string();
 | 
						|
	  //cerca sullo sheet la coppia codart+um
 | 
						|
	  const int riga_alta = find_codart(sf_listini, codart, um);
 | 
						|
	  const real prezzo = riga_alta >= 0 ? get_price(sf_listini, riga_alta + 1, S2_PREZZO + pos) : ZERO;
 | 
						|
	  //se non la trova o se il prezzo è 0 elimina la riga dal file
 | 
						|
	  if (prezzo.is_zero())
 | 
						|
	  {
 | 
						|
	    const int err = file.remove();
 | 
						|
  		if (err != NOERR)
 | 
						|
  		{
 | 
						|
  		  TString80 msg; 
 | 
						|
  		  msg.format(FR("Errore %d in cancellazione dell'articolo %s dal listino %s"), 
 | 
						|
  			            err, (const char*)codart, file.curr().build_key());
 | 
						|
  		  xvtil_popup_error(msg);
 | 
						|
  		}
 | 
						|
    }
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
//salva i listini così come li trova sulle righe dello sheet multilistini
 | 
						|
void TAggiorna_listini_edit_mask::save_listini()
 | 
						|
{
 | 
						|
  TSheet_field& sf_listini = sfield(F_MULTILISTINI);
 | 
						|
  const int prezzo_pos = sf_listini.cid2index(S2_PREZZO);
 | 
						|
 | 
						|
  TToken_string keys_listini;
 | 
						|
  const int num_listini_da_agg = crea_famiglia_listini(keys_listini);
 | 
						|
 | 
						|
  TString8 grmerc; get_correct_grmerc(grmerc, false);
 | 
						|
  TString msg;
 | 
						|
  msg << TR("Registrazione listini ") << grmerc << "...";
 | 
						|
  TProgind pi(num_listini_da_agg, msg, true, true);
 | 
						|
 | 
						|
  TToken_string key;
 | 
						|
 | 
						|
  //giro su tutti i listini che compaiono nello sheet; padre e figli
 | 
						|
  //prende le righe di un listino alla volta
 | 
						|
  FOR_EACH_TOKEN(keys_listini, tok)
 | 
						|
  {
 | 
						|
    if (!pi.addstatus(1))
 | 
						|
      break;
 | 
						|
 | 
						|
    key = tok;  //assegnamento necessario causa tipo (se usasse tok direttamente non funzionerebbe)
 | 
						|
    const int pos = keys_listini.get_pos(key);
 | 
						|
  	const TString4 catven = key.get(0);
 | 
						|
	  const TString4 codlist = key.get(1);
 | 
						|
    kill_priceless_articles(catven, codlist, pos);
 | 
						|
 | 
						|
    TLocalisamfile file(LF_RCONDV);
 | 
						|
    TRectype key_rec(LF_RCONDV);
 | 
						|
 | 
						|
    //alla fine della storia registra tutto lo sheet sul file
 | 
						|
    FOR_EACH_SHEET_ROW(sf_listini, r, riga) if ((r & 1) && (riga->get_char(0) > ' '))    //è come dire riga dispari e checked (ignoranti!)
 | 
						|
    {
 | 
						|
      const real prezzo = get_price(sf_listini, r, S2_PREZZO + pos);
 | 
						|
      if (prezzo > ZERO)
 | 
						|
      {
 | 
						|
        const TString codart = riga->get(1);
 | 
						|
        const TString4 um = _ges_um ? sf_listini.row(r - 1).get(2) : "";
 | 
						|
        //si costruisce un record con la chiave che trova sullo sheet in modo da poterlo cercare..
 | 
						|
        //..sul file rcondv
 | 
						|
        key_rec.zero();
 | 
						|
        key_rec.put(RCONDV_TIPO, "L");
 | 
						|
        key_rec.put(RCONDV_CATVEN, catven);
 | 
						|
        key_rec.put(RCONDV_COD, codlist);
 | 
						|
        key_rec.put(RCONDV_TIPORIGA, "A");
 | 
						|
        key_rec.put(RCONDV_CODRIGA, codart);
 | 
						|
        if (_ges_um)
 | 
						|
          key_rec.put(RCONDV_UM, um);
 | 
						|
 | 
						|
        //c'e' l'articolo nel listino?
 | 
						|
        file.curr() = key_rec;
 | 
						|
        int err = file.read();
 | 
						|
 | 
						|
        //alla fine della fiera deve salvare su file veramente!
 | 
						|
        //se è in inserimento deve fare un write, se in modifica la rewrite
 | 
						|
        if (err == NOERR) //lo trova già esistente -> aggiorna il prezzo
 | 
						|
        {
 | 
						|
          file.put(RCONDV_PREZZO, prezzo);
 | 
						|
          err = file.rewrite_write();
 | 
						|
        }
 | 
						|
        else  //non lo trova quindi lo aggiunge
 | 
						|
        {
 | 
						|
          if (err == _iskeynotfound)
 | 
						|
          {
 | 
						|
            file.curr() = key_rec;
 | 
						|
            file.put(RCONDV_PREZZO, prezzo);
 | 
						|
            err = file.write_rewrite();
 | 
						|
          }
 | 
						|
        } //if(err==NOERR..
 | 
						|
        if (err != NOERR)
 | 
						|
          error_box(FR("Errore %d durante l'aggiornamento dell'articolo %s nel listino %s"), 
 | 
						|
                    err, (const char*)codart, (const char*)codlist);
 | 
						|
      }
 | 
						|
    } //FOR_EACH_SHEET_ROW...
 | 
						|
  } //FOR_EACH_TOKEN...
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
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;
 | 
						|
      get_correct_grmerc(grmerc, false);
 | 
						|
      if (grmerc != _curr_grmerc && grmerc.full())
 | 
						|
      {
 | 
						|
        const TSheet_field& sf_listini = sfield(F_MULTILISTINI);
 | 
						|
        if (_ask_save && !sf_listini.empty())
 | 
						|
        {
 | 
						|
          if (yesno_box(FR("Registrare le modifiche effettuate a %s?"), (const char*)_curr_grmerc))
 | 
						|
          {
 | 
						|
            // Ripristina vecchio gruppo sulla maschera per salvarlo correttamente
 | 
						|
            set(F_GRMERC, _curr_grmerc.left(3));
 | 
						|
            set(F_SOTGRMERC, _curr_grmerc.mid(3));
 | 
						|
            save_listini();
 | 
						|
            // Mette nuovo gruppo sulla maschera per leggerlo correttamente
 | 
						|
            set(F_GRMERC, grmerc.left(3));
 | 
						|
            set(F_SOTGRMERC, grmerc.mid(3));
 | 
						|
          }
 | 
						|
        }
 | 
						|
        fill_ricarichi_children_list();
 | 
						|
        fill_multilistini_sheet();
 | 
						|
        _ask_save = false;
 | 
						|
      }
 | 
						|
    }
 | 
						|
    break;
 | 
						|
  case S2_PREZZO:
 | 
						|
    if (e == fe_modify && jolly == 2)
 | 
						|
    {
 | 
						|
      //se il prezzo viene messo a 0 nel listino padre, si prepara ad eliminare l'articolo..
 | 
						|
      //..come se fosse premuto DLG_USER (vedi DLG_USER qui sotto)
 | 
						|
      real father_price = get_price(o);
 | 
						|
      if (father_price.is_zero())
 | 
						|
      {
 | 
						|
        TMask& rowmask = o.mask();
 | 
						|
        rowmask.field(DLG_USER).on_hit();
 | 
						|
      }
 | 
						|
      else  //se invece viene cambiato il prezzo del padre ed i figli hanno tutti i prezzi nulli..
 | 
						|
        //..(articolo nuovo o resettato), sui prezzi figli viene messo il prezzo del padre
 | 
						|
      {
 | 
						|
        //per prima cosa sistema se stesso (è un padre ignobile!)
 | 
						|
        set_price(o, father_price);
 | 
						|
 | 
						|
        //poi i figli
 | 
						|
        TMask& rowmask = o.mask();  //serve la maschera di riga! (sennò funziona solo sullo sheet)
 | 
						|
        real somma_prezzi_figli = ZERO;
 | 
						|
        for (int i = S2_LIST1; i <= S2_LIST10; i++)
 | 
						|
          somma_prezzi_figli += rowmask.get_real(i);
 | 
						|
 | 
						|
        if (somma_prezzi_figli.is_zero())
 | 
						|
        {
 | 
						|
          TSheet_field& sf_listini = sfield(F_LISTINI_FIGLI);
 | 
						|
          const int col_ricarichi = sf_listini.cid2index(S1_RICARICO);
 | 
						|
 | 
						|
          for (short i = S2_LIST1; i <= S2_LIST10; i++)
 | 
						|
          {
 | 
						|
            TMask_field& campo = rowmask.efield(i);
 | 
						|
            //se il campo è visibile, allora il listino figlio è tra quelli attivi e lo aggiorna
 | 
						|
            if (campo.shown())
 | 
						|
            {
 | 
						|
              const real ricarico = sf_listini.cell(i - S2_LIST1, col_ricarichi);
 | 
						|
              real prezzo_figlio = father_price * (CENTO + ricarico) / CENTO;
 | 
						|
              set_price(rowmask.efield(i), prezzo_figlio);
 | 
						|
            }
 | 
						|
          }
 | 
						|
        }
 | 
						|
      }
 | 
						|
      _ask_save = true;
 | 
						|
    }
 | 
						|
    break;
 | 
						|
  case S2_LIST1:
 | 
						|
  case S2_LIST2:
 | 
						|
  case S2_LIST3:
 | 
						|
  case S2_LIST4:
 | 
						|
  case S2_LIST5:
 | 
						|
  case S2_LIST6:
 | 
						|
  case S2_LIST7:
 | 
						|
  case S2_LIST8:
 | 
						|
  case S2_LIST9:
 | 
						|
  case S2_LIST10:
 | 
						|
    if (e == fe_modify && jolly == 2)
 | 
						|
    {
 | 
						|
      real price = get_price(o);
 | 
						|
      set_price(o, price);
 | 
						|
      _ask_save = true;
 | 
						|
    }
 | 
						|
    break;
 | 
						|
  case DLG_USER:
 | 
						|
    if (e == fe_button)
 | 
						|
    {
 | 
						|
      if (yesno_box(TR("Si conferma l'eliminazione di questo articolo da tutti i listini collegati?")))
 | 
						|
      {
 | 
						|
        TSheet_field& sf_listini = sfield(F_MULTILISTINI);
 | 
						|
        const int selected_riga = sf_listini.selected();
 | 
						|
        TMask& rowmask = sf_listini.sheet_row_mask(selected_riga);
 | 
						|
        rowmask.reset(-1);           // Azzera tutto ma ...
 | 
						|
        rowmask.set(S2_CHECK, "X");  // ... forza spunta della riga
 | 
						|
      }
 | 
						|
    }
 | 
						|
    break;
 | 
						|
    //applica i cambiamenti dovuti ai ricarichi e salva questi ultimi in gmc
 | 
						|
  case DLG_APPLICA:
 | 
						|
    if (e == fe_button)
 | 
						|
    {
 | 
						|
      TSheet_field& sf_listini = sfield(F_MULTILISTINI);
 | 
						|
      if (!sf_listini.empty())
 | 
						|
      {
 | 
						|
        update_sons_prices();  
 | 
						|
        _ask_save = true;
 | 
						|
      }
 | 
						|
    }
 | 
						|
    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;
 | 
						|
  case DLG_SAVEREC:
 | 
						|
    if (e == fe_button)
 | 
						|
    {
 | 
						|
      save_children_list();
 | 
						|
      save_listini();
 | 
						|
    }
 | 
						|
    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();
 | 
						|
  /*dovrebbe nascondere la colonna catven se non la si usa, ma non funziona la chiamata a XI
 | 
						|
  const bool show_catven_column = ini_get_bool(CONFIG_DITTA, "ve", "GESLISCV");
 | 
						|
  if (!show_catven_column)
 | 
						|
    sf_righe.show_column(S1_CATVEN, false);*/
 | 
						|
 | 
						|
  //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& arrotonda = rec.get(CONDV_ARROTONDA);
 | 
						|
    const TString& deslis = rec.get(CONDV_DESCR);
 | 
						|
    row.add(catven);
 | 
						|
    row.add(codlis);
 | 
						|
    row.add("");
 | 
						|
    row.add(arrotonda);
 | 
						|
    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);
 | 
						|
  TMask& row_mask = sf_multilistini.sheet_row_mask(0);
 | 
						|
 | 
						|
  TSheet_field& sf_figli = sfield(F_LISTINI_FIGLI);
 | 
						|
  TString column_header;
 | 
						|
  int num_of_columns = 3;
 | 
						|
  //giro su tutte le righe dello sheet dei figli per avere intestazioni da mettere nei campi..
 | 
						|
  //..dello sheet multilistinico
 | 
						|
  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);
 | 
						|
 | 
						|
    //rinomina intestazione colonna dello sheet multilistinico
 | 
						|
    sf_multilistini.set_column_header(num_of_columns, column_header);
 | 
						|
    //sistema di conseguenza la maschera di riga
 | 
						|
    row_mask.efield(num_of_columns + 101).set_prompt(column_header);
 | 
						|
 | 
						|
    num_of_columns ++;
 | 
						|
  }
 | 
						|
  //cancella i figli in eccesso
 | 
						|
  for( ;sf_multilistini.exist_column(num_of_columns); num_of_columns++)
 | 
						|
  {
 | 
						|
    //colonne sheet
 | 
						|
    sf_multilistini.delete_column(num_of_columns);
 | 
						|
    //sistema di conseguenza la maschera di riga
 | 
						|
    row_mask.efield(num_of_columns + 101).hide();
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
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);
 | 
						|
 | 
						|
  _ask_save = false;
 | 
						|
 | 
						|
  //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
 | 
						|
{
 | 
						|
  TArray_sheet* _sheet;
 | 
						|
 | 
						|
protected:
 | 
						|
  virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
 | 
						|
 | 
						|
public:
 | 
						|
  TAggiorna_listini_query_mask();
 | 
						|
  virtual ~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_FATHCATVEN:
 | 
						|
    if (e == fe_button)
 | 
						|
    {
 | 
						|
      TArray_sheet sheet_catven(-1, -1, 78, 10, TR("Categorie di vendita"), HR("Codice|Descrizione@50"));
 | 
						|
      TString4 catven;
 | 
						|
      FOR_EACH_SHEET_ROW(*_sheet, t, riga)
 | 
						|
      {
 | 
						|
        const char* cv = riga->get(0);
 | 
						|
        if (catven != cv)
 | 
						|
        {
 | 
						|
          catven = cv;
 | 
						|
          TToken_string r;
 | 
						|
          r.add(catven);
 | 
						|
          r.add(cache().get("CVE", catven, "S0"));
 | 
						|
          sheet_catven.add(r);
 | 
						|
        }
 | 
						|
      }
 | 
						|
      if (sheet_catven.run() == K_ENTER)
 | 
						|
      {
 | 
						|
        TToken_string& r = sheet_catven.row(-1);
 | 
						|
        o.set(r.get(0));
 | 
						|
        e = fe_modify;
 | 
						|
      }
 | 
						|
    }
 | 
						|
    if ((e == fe_init || e == fe_modify) && !o.empty())
 | 
						|
      set(F_FATHDESVEN, cache().get("CVE", o.get(), "S0"));
 | 
						|
    break;
 | 
						|
  case F_FATHCODLIS:
 | 
						|
    if (e == fe_button)
 | 
						|
    {
 | 
						|
      if (_sheet->run() == K_ENTER)
 | 
						|
      {
 | 
						|
        //riempie la maschera di query 
 | 
						|
        TToken_string& row = _sheet->row(-1);
 | 
						|
        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);
 | 
						|
  //attenzione!!! il campo CATVEN è in chiave 1! per disabilitarlo ci vuole questo trucco!
 | 
						|
  if (!gesliscv)
 | 
						|
    efield(F_FATHCATVEN).reset_key(1);
 | 
						|
 | 
						|
  _sheet = new TArray_sheet(-1, -1, 78, 10, TR("Listini padri"), HR("Cat.Ven.|Codice|Descrizione@50"));
 | 
						|
  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)
 | 
						|
  //riempimento dello sheet
 | 
						|
  FOR_EACH_ASSOC_STRING(listini_padri, obj, key, descr)
 | 
						|
  {
 | 
						|
    TToken_string row;
 | 
						|
    row = key;
 | 
						|
    row.add(descr);
 | 
						|
    _sheet->add(row);
 | 
						|
  }
 | 
						|
 | 
						|
  if (_sheet->items() > 0)
 | 
						|
  {
 | 
						|
    _sheet->rows_array().sort();  //riordina le righe attualmente scombinate
 | 
						|
 | 
						|
    TToken_string& row = _sheet->row(0);
 | 
						|
    set(F_FATHCATVEN, row.get(0), true);
 | 
						|
    set(F_FATHCODLIS, row.get(1));
 | 
						|
    set(F_FATHDESLIS, row.get(2));
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
TAggiorna_listini_query_mask::~TAggiorna_listini_query_mask()
 | 
						|
{
 | 
						|
  delete _sheet;
 | 
						|
}
 | 
						|
 | 
						|
////////////////////////////////////////////////////////
 | 
						|
//	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()
 | 
						|
{
 | 
						|
  Tdninst dninst;
 | 
						|
  if (!dninst.can_I_run(true))
 | 
						|
    return error_box(TR("Programma non autorizzato!"));
 | 
						|
  return TSkeleton_application::create();
 | 
						|
}
 | 
						|
 | 
						|
int ve2700(int argc, char* argv[])
 | 
						|
{
 | 
						|
  TAggiorna_listini a;
 | 
						|
  a.run(argc, argv, TR("Sincronizzazione listini"));
 | 
						|
  return 0;
 | 
						|
} |