Files correlati : Ricompilazione Demo : [ ] Commento : Riportata la versione aga 1.7 patch 413 git-svn-id: svn://10.65.10.50/trunk@10856 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			303 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			303 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
#include <applicat.h>
 | 
						|
#include <automask.h>
 | 
						|
#include <progind.h>
 | 
						|
#include <relation.h>
 | 
						|
 | 
						|
#include "ve5300.h"
 | 
						|
#include "velib.h"
 | 
						|
 | 
						|
///////////////////////////////////////////////////////////
 | 
						|
// TCopydoc mask
 | 
						|
///////////////////////////////////////////////////////////
 | 
						|
 | 
						|
class TCopydoc_mask : public TAutomask
 | 
						|
{
 | 
						|
protected:
 | 
						|
  virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
 | 
						|
 | 
						|
protected:  
 | 
						|
  int fill_sheet();
 | 
						|
 | 
						|
public:
 | 
						|
  long get_first_ndoc() const;
 | 
						|
  TCopydoc_mask() : TAutomask("ve5300a") { open(); }
 | 
						|
};
 | 
						|
 | 
						|
int TCopydoc_mask::fill_sheet()
 | 
						|
{
 | 
						|
  TSheet_field& sf = sfield(F_TIPI_DOC);
 | 
						|
  sf.destroy();
 | 
						|
 | 
						|
  TString16 n1 = get(F_FROM_NUM);
 | 
						|
  TString16 n2 = get(F_TO_NUM);
 | 
						|
  if (n1.empty()) n1 = n2;
 | 
						|
  if (n2.empty()) n2 = n1;
 | 
						|
 | 
						|
  if (n1.not_empty())
 | 
						|
  {
 | 
						|
    const TCodice_numerazione num1(n1);
 | 
						|
    TAssoc_array tipi;
 | 
						|
    int t;
 | 
						|
    for (t = 0; t < num1.ntipi_doc(); t++)
 | 
						|
    {
 | 
						|
      const TString& td = num1.tipo_doc(t);
 | 
						|
      tipi.add(td, NULL);
 | 
						|
    }
 | 
						|
 | 
						|
    const TCodice_numerazione num2(n2);
 | 
						|
    for (t = 0; t < num2.ntipi_doc(); t++)
 | 
						|
    {
 | 
						|
      const TString& td = num2.tipo_doc(t);
 | 
						|
      if (tipi.is_key(td))
 | 
						|
      {
 | 
						|
        sf.row(-1) << "X|" << td;
 | 
						|
        sf.check_row(sf.items()-1);
 | 
						|
      }
 | 
						|
    }
 | 
						|
    sf.force_update();
 | 
						|
  }
 | 
						|
 | 
						|
  return sf.items();
 | 
						|
}
 | 
						|
 | 
						|
long TCopydoc_mask::get_first_ndoc() const
 | 
						|
{
 | 
						|
  long n = get_long(F_TO_NDOC);
 | 
						|
  if (n <= 0)
 | 
						|
  {
 | 
						|
    TLocalisamfile doc(LF_DOC);
 | 
						|
    TRectype& curr = doc.curr();
 | 
						|
  
 | 
						|
    const TDate dd = get(F_TO_DATA);
 | 
						|
    const int anno = dd.year();
 | 
						|
    const char provv = get(F_TO_PROVV)[0];
 | 
						|
    const TString& codnum = get(F_TO_NUM);
 | 
						|
  
 | 
						|
    curr.put(DOC_PROVV, provv);
 | 
						|
    curr.put(DOC_ANNO, anno);
 | 
						|
    curr.put(DOC_CODNUM, codnum);
 | 
						|
    curr.put(DOC_NDOC, 9999999L);
 | 
						|
  
 | 
						|
    const int err = doc.read(_isgreat);      
 | 
						|
    if (err != _isemptyfile)
 | 
						|
    {
 | 
						|
      if (err == NOERR)
 | 
						|
        doc.prev();
 | 
						|
      if (curr.get_char(DOC_PROVV) == provv && 
 | 
						|
          curr.get_int(DOC_ANNO) == anno && 
 | 
						|
          curr.get(DOC_CODNUM) == codnum)
 | 
						|
         n = curr.get_long(DOC_NDOC);
 | 
						|
    }     
 | 
						|
    n++;
 | 
						|
  }  
 | 
						|
  return n;   
 | 
						|
}
 | 
						|
 | 
						|
bool TCopydoc_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
 | 
						|
{
 | 
						|
  switch (o.dlg())
 | 
						|
  {
 | 
						|
  case F_FROM_NUM:
 | 
						|
    if (e == fe_modify && !o.empty())
 | 
						|
    {
 | 
						|
      set(F_TO_NUM, o.get());
 | 
						|
      set(F_TO_DES, get(F_FROM_DES));
 | 
						|
    }
 | 
						|
    // Fall down
 | 
						|
  case F_TO_NUM:
 | 
						|
    if (e == fe_modify && !o.empty())
 | 
						|
    {
 | 
						|
      const int tot = fill_sheet();
 | 
						|
      if (tot == 0)
 | 
						|
        return error_box("Non ci sono tipi documento compatibili");
 | 
						|
    }
 | 
						|
    // Fall down
 | 
						|
  case F_FROM_FRNDOC:
 | 
						|
  case F_FROM_TONDOC:  
 | 
						|
    if (e == fe_modify || e == fe_init)
 | 
						|
    {
 | 
						|
      const long docfr = get_long(F_FROM_FRNDOC);
 | 
						|
      const long docto = get_long(F_FROM_TONDOC);
 | 
						|
      reset(F_TO_NDOC);
 | 
						|
      enable(F_TO_NDOC, docfr > 0 && docfr == docto);
 | 
						|
    }
 | 
						|
    break;
 | 
						|
  case F_TIPI_DOC:
 | 
						|
    if (e == fe_close)
 | 
						|
    {
 | 
						|
      TSheet_field& sf = (TSheet_field&)o;
 | 
						|
      int selected = 0;
 | 
						|
      FOR_EACH_SHEET_ROW(sf, r, row)
 | 
						|
        if (row->get_char(0) > ' ') selected++;
 | 
						|
      if (selected == 0)
 | 
						|
        return error_box("Non ci sono tipi documento selezionati");
 | 
						|
    }
 | 
						|
    break;
 | 
						|
  case F_TO_NDOC:
 | 
						|
    if ((e == fe_modify || e == fe_close) && !o.empty())
 | 
						|
    {
 | 
						|
      TLocalisamfile doc(LF_DOC);
 | 
						|
      doc.put(DOC_PROVV, get(F_TO_PROVV));
 | 
						|
      doc.put(DOC_ANNO, get_date(F_TO_DATA).year());
 | 
						|
      doc.put(DOC_CODNUM, get(F_TO_NUM));
 | 
						|
      doc.put(DOC_NDOC, o.get());
 | 
						|
      if (doc.read() == NOERR)
 | 
						|
        return error_box("Il documento di destinazione esiste gia'");
 | 
						|
    }
 | 
						|
    break;  
 | 
						|
  default:
 | 
						|
    break;
 | 
						|
  }
 | 
						|
  return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
///////////////////////////////////////////////////////////
 | 
						|
// Main program
 | 
						|
///////////////////////////////////////////////////////////
 | 
						|
 | 
						|
class TCopydoc_app : public TSkeleton_application
 | 
						|
{ 
 | 
						|
  bool _preserve_num;
 | 
						|
  
 | 
						|
protected:
 | 
						|
  bool replace(TRectype& rec, const char* field, const TString& oldstr, const TString& newstr) const;
 | 
						|
 | 
						|
public:
 | 
						|
  virtual void main_loop();
 | 
						|
};
 | 
						|
 | 
						|
bool TCopydoc_app::replace(TRectype& rec, const char* field, const TString& oldstr, const TString& newstr) const
 | 
						|
{
 | 
						|
  bool done = FALSE;
 | 
						|
  if (oldstr.not_empty())
 | 
						|
  {
 | 
						|
    TString str = rec.get(field);
 | 
						|
    int last = -1;
 | 
						|
    for (int start = str.find(oldstr); start > last; start = str.find(oldstr, last))
 | 
						|
    {
 | 
						|
      const TString aft = str.mid(start+oldstr.len());
 | 
						|
      str.cut(start);
 | 
						|
      str << newstr << aft;
 | 
						|
      last = start + newstr.len();
 | 
						|
    }
 | 
						|
    done = last >= 0;
 | 
						|
    if (done)
 | 
						|
    {
 | 
						|
      // Attenzione al campo DESCR che non e' un MEMO!
 | 
						|
      if (str.len() > 50 && strcmp(field, RDOC_DESCR) == 0)
 | 
						|
        str.cut(50);   
 | 
						|
      rec.put(field, str);
 | 
						|
    }
 | 
						|
  }
 | 
						|
  return done;
 | 
						|
}
 | 
						|
 | 
						|
void TCopydoc_app::main_loop()
 | 
						|
{
 | 
						|
  open_files(LF_TAB, LF_TABCOM, LF_DOC, LF_RIGHEDOC, LF_CONDV, LF_RCONDV, 
 | 
						|
             LF_ANAMAG, LF_SCONTI, LF_UMART, LF_CLIFO, LF_CFVEN, LF_INDSP, 
 | 
						|
             LF_OCCAS, LF_MOVMAG, LF_RMOVMAG, LF_SVRIEP, LF_AGENTI, LF_PERCPROV, 0);
 | 
						|
 | 
						|
  TCopydoc_mask m; 
 | 
						|
  while (m.run() == K_ENTER)
 | 
						|
  {
 | 
						|
    TRectype rec_from(LF_DOC);
 | 
						|
    rec_from.put(DOC_ANNO, m.get(F_FROM_ANNO));
 | 
						|
    rec_from.put(DOC_CODNUM, m.get(F_FROM_NUM));
 | 
						|
    rec_from.put(DOC_PROVV, m.get(F_FROM_PROVV));
 | 
						|
    rec_from.put(DOC_NDOC, m.get(F_FROM_FRNDOC));    
 | 
						|
    _preserve_num = m.get_bool(F_PRESERVE_NUM);
 | 
						|
 | 
						|
    TRectype rec_to(rec_from);
 | 
						|
    rec_to.put(DOC_NDOC, m.get(F_FROM_TONDOC));
 | 
						|
 | 
						|
    // Costruisce il filtro sui tipi documento selezionati
 | 
						|
    // Il pipe significa OR per le espressioni
 | 
						|
    TToken_string filtro(80, '|');
 | 
						|
    TSheet_field& sf = m.sfield(F_TIPI_DOC);
 | 
						|
    FOR_EACH_SHEET_ROW(sf, r, row)
 | 
						|
    {
 | 
						|
      if (row->get_char(0) > ' ')
 | 
						|
      {
 | 
						|
        filtro.add("(");
 | 
						|
        filtro << DOC_TIPODOC << "=\"" << row->get(1) << "\")";
 | 
						|
      }
 | 
						|
    }
 | 
						|
    // Se li ho selezionati tutti e' inutile filtrare
 | 
						|
    if (m.get(F_FROM_NUM) == m.get(F_TO_NUM) && 
 | 
						|
        sf.items() == filtro.items())
 | 
						|
      filtro.cut(0);
 | 
						|
 | 
						|
    TRelation rel(LF_DOC);
 | 
						|
    TCursor cur(&rel, filtro, 1, &rec_from, &rec_to);
 | 
						|
        
 | 
						|
    const long tot = cur.items();
 | 
						|
    if (tot > 0L)
 | 
						|
    {
 | 
						|
      if (yesno_box("Confermate la copia di %ld document%c?", 
 | 
						|
                    tot, (tot == 1L) ? 'o' : 'i'))
 | 
						|
      {
 | 
						|
        const TString& provv = m.get(F_TO_PROVV);
 | 
						|
        const TDate data = m.get(F_TO_DATA); 
 | 
						|
        TString16 anno; anno << data.year();
 | 
						|
        const TString& codnum = m.get(F_TO_NUM);     
 | 
						|
        long ndoc = m.get_first_ndoc();
 | 
						|
  
 | 
						|
        cur.freeze();
 | 
						|
        TProgind pi(tot, "Copia in corso...", FALSE, TRUE);
 | 
						|
        for (cur = 0; cur.pos() < tot; ++cur)
 | 
						|
        {
 | 
						|
          pi.addstatus(1);
 | 
						|
 | 
						|
          TDocumento olddoc(cur.curr()), newdoc;
 | 
						|
          // Rinumera documento principale
 | 
						|
          newdoc.put(DOC_PROVV, provv);
 | 
						|
          newdoc.put(DOC_ANNO, anno);
 | 
						|
          newdoc.put(DOC_CODNUM, codnum); 
 | 
						|
          if (_preserve_num)
 | 
						|
          {
 | 
						|
            const long ndoc_src = olddoc.get_long(DOC_NDOC);
 | 
						|
            newdoc.put(DOC_NDOC, ndoc_src);
 | 
						|
          }
 | 
						|
          else          
 | 
						|
            newdoc.put(DOC_NDOC, ndoc++);
 | 
						|
          newdoc.copy_contents(olddoc);
 | 
						|
          newdoc.put(DOC_DATADOC, data);
 | 
						|
 | 
						|
          const TString& oldstr = m.get(F_OLD_STR);
 | 
						|
          const TString& newstr = m.get(F_NEW_STR);
 | 
						|
          const real perc = m.get_real(F_PERC);
 | 
						|
          for (int i = newdoc.physical_rows(); i > 0; i--)
 | 
						|
          {
 | 
						|
            TRectype& r = newdoc[i];
 | 
						|
            if (oldstr.not_empty())
 | 
						|
            {
 | 
						|
              replace(r, RDOC_DESCR, oldstr, newstr);
 | 
						|
              if (r.get_bool(RDOC_DESCLUNGA))
 | 
						|
                replace(r, RDOC_DESCEST, oldstr, newstr);
 | 
						|
            }
 | 
						|
            if (!perc.is_zero())
 | 
						|
            {
 | 
						|
              real price = r.get_real(RDOC_PREZZO);
 | 
						|
              if (!price.is_zero())
 | 
						|
              {
 | 
						|
                price *= (100.0 + perc) / 100.0;
 | 
						|
                r.put(RDOC_PREZZO, price);
 | 
						|
              }
 | 
						|
            }
 | 
						|
          }
 | 
						|
          newdoc.write();
 | 
						|
        }
 | 
						|
      }
 | 
						|
    }
 | 
						|
    else
 | 
						|
      warning_box("Nessun documento soddisfa i vincoli indicati");
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
int ve5300(int argc, char* argv[])
 | 
						|
{
 | 
						|
  TCopydoc_app a;
 | 
						|
  a.run(argc, argv, "Copia documenti");
 | 
						|
  return 0;
 | 
						|
} |