From 1e9640d67717464ed5af7bb322da98ad5af15253 Mon Sep 17 00:00:00 2001
From: alex <alex@c028cbd2-c16b-5b4b-a496-9718f37d4682>
Date: Thu, 26 Feb 2009 23:32:16 +0000
Subject: [PATCH] Patch level         : 10.0 250 Files correlati     : ve0.exe
 Ricompilazione Demo : [ ] Commento            :

Selezione multipla articoli, spese, etc sui documenti.
Se aggiunge una riga vuota sul documento e si clicca sul numero di fianco e' possibili fare una selezione multipla che poi viene riportata sul documento (Rif. CRPA)


git-svn-id: svn://10.65.10.50/trunk@18365 c028cbd2-c16b-5b4b-a496-9718f37d4682
---
 ve/velib06.cpp  | 25 ++++++++++++++--
 ve/velib06a.cpp | 77 +++++++++++++++++++++++++++++++++++++++++++++----
 2 files changed, 94 insertions(+), 8 deletions(-)

diff --git a/ve/velib06.cpp b/ve/velib06.cpp
index bfd3cef41..d71940f35 100755
--- a/ve/velib06.cpp
+++ b/ve/velib06.cpp
@@ -1162,8 +1162,8 @@ TVariable_mask* TDocumento_mask::riga_mask(int numriga)
 				if (close_filter) filter << ')';
 				browse.set_filter(filter);
 			}
-			m->set_handler(DLG_USER, link_handler);
 		}    
+		m->set_handler(DLG_USER, link_handler);
 
     // Quasi qualsiasi cosa analitica va bene
 		const bool ca_active = _ges_ca && !(riga.is_descrizione() || riga.is_omaggio() || riga.is_sconto());
@@ -1460,8 +1460,6 @@ bool TDocumento_mask::ss_notify( TSheet_field& ss, int r, KEY key )
 			{	
 				m.update_giacenza();
 				set_curr_um(rdoc.get(RDOC_UMQTA));
-				const bool on = rdoc.get(RDOC_DACODNUM).not_empty();
-				ss.sheet_mask().enable(DLG_USER, on);
 			}
 
 			if (rdoc.get(RDOC_CODART).empty() && rdoc.get(RDOC_DESCR).empty())
@@ -3596,6 +3594,23 @@ void TDocumento_mask::save_father_rows()
 
 }
 
+static bool conf_num_handler(TMask_field& f, KEY key)
+{
+	if (key == K_TAB && f.to_check(key, true))
+	{
+		TMask & m  = f.mask();
+
+		__codnum = f.get();
+
+		TCursor * cur = m.efield(F_TIPODOC).browse()->cursor();
+		TCursor * descur = m.efield(F_DESTIPODOC).browse()->cursor();
+
+		cur->set_filterfunction(tip_filter);
+		descur->set_filterfunction(tip_filter);
+	}
+	return true;
+}
+
 bool TDocumento_mask::confirm_handler( TMask_field& f, KEY key )
 {
 	bool ok = true;
@@ -3622,8 +3637,11 @@ bool TDocumento_mask::confirm_handler( TMask_field& f, KEY key )
 
 		if (!ok)
 		{
+			TString saved_codnum = __codnum;
+
 			m.set(F_CODNUM, codnum);
 			m.enable(F_CODNUM, codnum.blank());
+			m.set_handler(F_CODNUM, ::conf_num_handler);
 			m.enable(F_DESNUM, codnum.blank());
 			m.set(F_TIPODOC, tipodoc);
 			m.enable(F_TIPODOC, tipodoc.blank());
@@ -3634,6 +3652,7 @@ bool TDocumento_mask::confirm_handler( TMask_field& f, KEY key )
 				codnum = m.get(F_CODNUM);
 				tipodoc = m.get(F_TIPODOC);
 			}
+			__codnum = saved_codnum;
 		}
 
 		ok = codnum.full() && tipodoc.full();
diff --git a/ve/velib06a.cpp b/ve/velib06a.cpp
index acd6c75ed..45bae40b7 100755
--- a/ve/velib06a.cpp
+++ b/ve/velib06a.cpp
@@ -2411,12 +2411,79 @@ bool link_handler( TMask_field& f, KEY key )
 {
 	if (key == K_SPACE)
 	{
-		const TSheet_field & sf = *f.mask().get_sheet();
+		TSheet_field & sf = *f.mask().get_sheet();
 		const TDocumento_mask & m = (const TDocumento_mask & )sf.mask();
-		const TDocumento & d = m.doc();
-		const int nrow = sf.selected() + 1;
-		const TRiga_documento & r = d[nrow];
-		r.edit(LF_DOC, "DAPROVV|DAANNO|DACODNUM|DANDOC");
+		TDocumento & d = (TDocumento &) m.doc();
+		int row = sf.selected();
+		const TRiga_documento & r = d[row + 1];
+		const TMask & row_mask = f.mask();
+
+		if (r.linked())
+			r.edit(LF_DOC, "DAPROVV|DAANNO|DACODNUM|DANDOC");
+		else
+			if (!row_mask.is_running() && row_mask.id2pos(FR_CODART) >= 0)
+			{
+				TBrowse * brw = row_mask.efield(FR_CODART).browse();
+
+				if (row_mask.get(FR_CODART).empty() && brw)
+				{                
+					TCursor& cur = *brw->cursor();
+					TToken_string siblings;
+			  
+					TToken_string head(brw->head());
+					head.insert("@1|", 0); 
+					TToken_string items(brw->items());
+					items.insert(" |", 0); 
+			    
+					cur = 0L;
+					siblings.add(FR_CODART);
+
+					TBrowse_sheet sht(&cur, items, "Selezione Multipla", head, 0, row_mask.efield(FR_CODART), siblings);
+
+					if (sht.run() == K_ENTER && sht.one_checked())
+					{
+						const int items_selected = sht.checked();
+						const long totit = cur.items();
+						if (items_selected * d.physical_rows() < 950)
+						{
+							int processed = 0L;
+							TToken_string out_id(brw->get_output_fields());
+							TToken_string out_fnames(brw->get_output_field_names());
+							const TString4 tipo(row_mask.get(FR_TIPORIGA));
+
+							cur.freeze(TRUE);
+							for (cur = 0L; cur.pos() < totit; ++cur)
+								if (sht.checked(cur.pos()))
+								{
+									if (++processed < items_selected)
+										sf.insert(row, false); // call notify ?
+									d.insert_row(row + 1);
+									d[row + 1].put(RDOC_TIPORIGA, tipo);
+									TToken_string & shrow = sf.row(row);
+									shrow.add(tipo, sf.cid2index(FR_TIPORIGA));
+									shrow.add("", sf.cid2index(FR_CHECKED));
+
+									TMask & m = sf.sheet_row_mask(row);
+
+									m.set(FR_TIPORIGA, tipo);
+									out_fnames.restart();
+									for (short id = out_id.get_int(0); id > 0; id = out_id.get_int())
+									{
+										const TString16 fn(out_fnames.get());
+										const TFieldref fr(fn, 0);
+										m.set(id, fr.read(cur.curr()));
+										shrow.add(m.get(id), sf.cid2index(id));
+									}
+									sf.check_row(row, 0x2);
+									d[row + 1].autosave(sf);
+									row++;
+								}
+							cur.freeze(FALSE);
+							sf.force_update();
+						}
+					} 
+				}
+			}
 	}
 	return true;
 }