Verificare ve6600.cpp git-svn-id: svn://10.65.10.50/trunk@12030 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			304 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			304 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_date(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_date(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;
 | |
| }
 |