Patch level :10.0

Files correlati     :
Ricompilazione Demo : [ ]
Commento            :continuano le peripezie sulla gestione multilistini


git-svn-id: svn://10.65.10.50/trunk@19376 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
luca 2009-10-05 15:33:51 +00:00
parent 685c5e3ed1
commit c0240eae36
5 changed files with 367 additions and 107 deletions

View File

@ -295,9 +295,15 @@ int TVendite_tabapp::read(TMask& m)
}
listini.destroy();
//questo serve per settare il separatore in modo che non mandi in confusione l'editor degli archivi..
//..separator è definito nella maschera
TToken_string stringhina(16, listini.separator());
FOR_EACH_TOKEN(stringona, str)
{
listini.row(-1) = str;
stringhina = str;
if (stringhina.find('|') >= 0) //converte eventuali pipe standard in broken pipe
stringhina.replace('|', stringhina.separator());
listini.row(-1) = stringhina;
listini.check_row(listini.items() - 1);
}
listini.force_update();
@ -332,7 +338,7 @@ void TVendite_tabapp::write_gmc(const TMask& m, TRectype& curr)
TToken_string s1(70, ';'), s2(70, ';');
FOR_EACH_SHEET_ROW (listini, r, riga)
{
TToken_string mini_string(12, '|');
TToken_string mini_string(12, SAFE_PIPE_CHR); //separatore broken_pipe !!!
mini_string.add(riga->get(0)); //catven
mini_string.add(riga->get()); //codlis
mini_string.add(riga->get()); //ricarico

View File

@ -4,6 +4,7 @@
#include <recarray.h>
#include <recset.h>
#include <relapp.h>
#include <tabutil.h>
#include "condv.h"
#include "rcondv.h"
@ -19,14 +20,145 @@ class TAggiorna_listini_edit_mask : public TAutomask
TMask* _query_mask; //puntatore alla maschera di query
protected:
void fill_children_list();
void fill_ricarichi_children_list();
void save_children_list();
void fill_aggiorna_sheet();
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
public:
TAggiorna_listini_edit_mask(TMask* query_mask);
void aggiorna_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()
{
TString8 grmerc;
grmerc.format("%-3s%-2s", (const char*)get(F_GRMERC),(const char*)get(F_SOTGRMERC));
const TRectype& rec_gmc = cache().get("GMC", 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())
}
bool TAggiorna_listini_edit_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
{
switch(o.dlg())
@ -36,47 +168,15 @@ bool TAggiorna_listini_edit_mask::on_field_event(TOperable_field& o, TField_even
//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));
const TRectype& rec_gmc = cache().get("GMC", 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();
fill_ricarichi_children_list();
}
break;
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 = lista_listini.get();
TString4 catven = chiave.get(0);
catven.trim();
TString4 codlis = chiave.get(1);
codlis.trim();
for (int i = 0; i < righe_sheet; i++)
{
TToken_string& row = sf_righe.row(i);
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(int i...
} //FOR_EACH_STR_TOKEN
sf_righe.force_update();
} //if(lista_listini.full...
//applica i cambiamenti dovuti ai ricarichi e salva questi ultimi in gmc
case DLG_APPLICA:
if (e == fe_button)
{
save_children_list();
}
break;
default:
@ -85,15 +185,9 @@ bool TAggiorna_listini_edit_mask::on_field_event(TOperable_field& o, TField_even
return true;
}
TAggiorna_listini_edit_mask::TAggiorna_listini_edit_mask(TMask* query_mask)
: TAutomask("ve2700b"), _query_mask(query_mask)
//metodo per aggiungere i figli allo sheet dei medesimi
void TAggiorna_listini_edit_mask::fill_children_list()
{
//aggiorna campi listino padre
set(F_FATHCATVEN, _query_mask->get(F_FATHCATVEN));
set(F_FATHDESVEN, _query_mask->get(F_FATHDESVEN));
set(F_FATHCODLIS, _query_mask->get(F_FATHCODLIS));
set(F_FATHDESLIS, _query_mask->get(F_FATHDESLIS));
//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();
@ -130,10 +224,52 @@ TAggiorna_listini_edit_mask::TAggiorna_listini_edit_mask(TMask* query_mask)
sf_righe.force_update();
}
void TAggiorna_listini_edit_mask::aggiorna_listini_figli()
//metodo per riempire lo sheet con i dati da aggiornare
void TAggiorna_listini_edit_mask::fill_aggiorna_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 = 2;
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(r + 2, 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);
//popola il double-deck sheet
}
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_FATHDESVEN, _query_mask->get(F_FATHDESVEN));
set(F_FATHCODLIS, _query_mask->get(F_FATHCODLIS));
set(F_FATHDESLIS, _query_mask->get(F_FATHDESLIS));
//popola lo sheet dei listini figli
fill_children_list();
//e poi riempie lo sheet di aggiornamento dei figli
fill_aggiorna_sheet();
}
///////////////////////////////////////////////////////////////////////////////
// MASCHERA DI QUERY (seleziona il listino padre tra i listini con paternità)
///////////////////////////////////////////////////////////////////////////////
@ -207,8 +343,7 @@ bool TAggiorna_listini_query_mask::on_field_event(TOperable_field& o, TField_eve
//lancia la maschera di edit
TAggiorna_listini_edit_mask edit_mask(this); //gli passa la maschera principale
if (edit_mask.run() == K_ENTER)
edit_mask.aggiorna_listini_figli();
edit_mask.run();
}
}
break;

View File

@ -10,8 +10,11 @@
#define F_SOTGRMERC 206
#define F_DESGRMERC 207
#define F_LISTINI_FIGLI 208
#define DLG_CHECKALL 209
#define DLG_APPLICA 210
#define DLG_ADDART 211
//#define F_MULTILISTINI 280
#define F_MULTILISTINI 220
//primo sheet con i listini figli
#define F_CATVEN 101
@ -20,32 +23,15 @@
#define F_DESLIS 104
//multi-terribile sheet dei multi-listini
/*#define F_TIPORIGA 101
#define F_CODRIGA_A 102
#define F_DESRIGA_A 103
#define F_CODRIGA_G 202
#define F_DESRIGA_G 203
#define F_CODRIGA_S 302
#define F_DESRIGA_S 303
#define F_CODRIGA_R 402
#define F_DESRIGA_R 403
#define F_PREZZO 104
#define F_UM 105
#define F_OLDPRZ1 106
#define F_NEWPRZ1 107
#define F_OLDPRZ2 108
#define F_NEWPRZ2 109
#define F_OLDPRZ3 110
#define F_NEWPRZ3 111
#define F_OLDPRZ4 112
#define F_NEWPRZ4 113
#define F_OLDPRZ5 114
#define F_NEWPRZ5 115
#define F_OLDPRZ6 116
#define F_NEWPRZ6 117
#define F_OLDPRZ7 118
#define F_NEWPRZ7 119
#define F_OLDPRZ8 120
#define F_NEWPRZ8 121
#define F_OLDPRZ9 122
#define F_NEWPRZ9 123*/
#define F_CODRIGA 101
#define F_PREZZO 102
#define F_LIST1 103
#define F_LIST2 104
#define F_LIST3 105
#define F_LIST4 106
#define F_LIST5 107
#define F_LIST6 108
#define F_LIST7 109
#define F_LIST8 110
#define F_LIST9 111
#define F_LIST10 112

View File

@ -4,21 +4,40 @@ TOOLBAR "Toolbar" 0 0 0 2
BUTTON DLG_SAVEREC 2 2
BEGIN
PROMPT 10 -1 "~Salva"
PROMPT 1 1 "~Salva"
PICTURE TOOL_SAVEREC
END
BUTTON DLG_NULL 2 2
BEGIN
PROMPT 2 1 ""
PICTURE 0
END
BUTTON DLG_CHECKALL 2 2
BEGIN
PROMPT 3 1 "~Tutti"
PICTURE TOOL_MULTISEL
END
BUTTON DLG_APPLICA 2 2
BEGIN
PROMPT 4 1 "~Applica"
PICTURE TOOL_CONVERT
END
BUTTON DLG_ADDART 2 2
BEGIN
PROMPT 5 1 "A~ggiunge"
PICTURE TOOL_IMPORT
END
#include <cancelbar.h>
ENDPAGE
PAGE "Aggiornamento listini" 0 2 0 0
GROUPBOX DLG_NULL 78 4
BEGIN
PROMPT 0 0 "@bDati listino padre"
END
LIST DLG_NULL 1 7
BEGIN
PROMPT 100 100 ""
@ -30,31 +49,31 @@ END
STRING F_FATHCATVEN 2
BEGIN
PROMPT 1 1 "Cat. ven. "
PROMPT 0 0 "@bDati listino padre "
FLAGS "D"
END
STRING F_FATHDESVEN 50
STRING F_FATHDESVEN 10
BEGIN
PROMPT 18 1 ""
FLAGS "D"
PROMPT 1 0 ""
FLAGS "H"
END
STRING F_FATHCODLIS 3
BEGIN
PROMPT 1 2 "Listino "
PROMPT 23 0 ""
FLAGS "D"
END
STRING F_FATHDESLIS 50
STRING F_FATHDESLIS 50 48
BEGIN
PROMPT 18 2 ""
PROMPT 27 0 ""
FLAGS "D"
END
STRING F_GRMERC 3
BEGIN
PROMPT 1 4 "Gr. merc. "
PROMPT 0 1 "Gr. merc. "
FLAGS "U"
USE GMC SELECT CODTAB[4,5] == ""
INPUT CODTAB[1,3] F_GRMERC
@ -68,7 +87,7 @@ END
STRING F_SOTGRMERC 5
BEGIN
PROMPT 20 4 ""
PROMPT 19 1 ""
FLAGS "U"
USE GMC
COPY INPUT F_GRMERC
@ -82,9 +101,9 @@ BEGIN
GROUP 2
END
STRING F_DESGRMERC 50 45
STRING F_DESGRMERC 50 48
BEGIN
PROMPT 28 4 ""
PROMPT 27 1 ""
USE GMC KEY 2
INPUT S0 F_DESGRMERC
DISPLAY "Descrizione@50" S0
@ -97,24 +116,41 @@ END
TEXT DLG_NULL
BEGIN
PROMPT 1 5 "@bListini figli"
PROMPT 1 2 "@bListini figli"
END
SPREADSHEET F_LISTINI_FIGLI 78 4
BEGIN
PROMPT 0 6 "@bListini figli"
PROMPT 0 3 "Listini figli"
ITEM "Cat.Ven."
ITEM "Codice"
ITEM "Ricarico@8"
ITEM "Descrizione@50"
END
SPREADSHEET F_MULTILISTINI -1 -1
BEGIN
PROMPT 0 8 "Aggiornamento figli"
ITEM "Descrizione\nArticolo@30"
ITEM "U. M. \nPrezzo base@8"
ITEM "Figlio 1@8"
ITEM "Figlio 2@8"
ITEM "Figlio 3@8"
ITEM "Figlio 4@8"
ITEM "Figlio 5@8"
ITEM "Figlio 6@8"
ITEM "Figlio 7@8"
ITEM "Figlio 8@8"
ITEM "Figlio 9@8"
ITEM "Figlio 10@8"
END
ENDPAGE
ENDMASK
/////////////////////////////////////////
//maschera di riga
////////////////////////////////////////////
//maschera di riga sheet dei listini figli
TOOLBAR "topbar" 0 0 0 2
BUTTON DLG_OK 10 2
@ -146,8 +182,6 @@ BEGIN
DISPLAY "Cat." CODTAB
DISPLAY "Descrizione@50" S0
OUTPUT F_CATVEN CODTAB
//OUTPUT F_DESVEN S0
//CHECKTYPE FORCED
END
STRING F_CODLIS 3
@ -169,4 +203,102 @@ END
ENDPAGE
ENDMASK
///////////////////////////////////////////////
//maschera di riga sheet aggiornamento listini
TOOLBAR "topbar" 0 0 0 2
BUTTON DLG_OK 10 2
BEGIN
PROMPT -13 -1 ""
END
BUTTON DLG_DELREC 10 2
BEGIN
PROMPT -23 -1 ""
END
BUTTON DLG_CANCEL 10 2
BEGIN
PROMPT -33 -1 ""
END
ENDPAGE
PAGE "Riga aggiornamento listini" -1 -1 78 22
STRING F_CODRIGA 50 20
BEGIN
PROMPT 1 1 "Codice "
END
STRING F_PREZZO 8
BEGIN
PROMPT 1 2 "Prezzo "
END
CURRENCY F_LIST1 8
BEGIN
PROMPT 1 4 "List1 "
FLAGS "U"
END
CURRENCY F_LIST2 8
BEGIN
PROMPT 1 5 "List2 "
FLAGS "U"
END
CURRENCY F_LIST3 8
BEGIN
PROMPT 1 6 "List3 "
FLAGS "U"
END
CURRENCY F_LIST4 8
BEGIN
PROMPT 1 7 "List4 "
FLAGS "U"
END
CURRENCY F_LIST5 8
BEGIN
PROMPT 1 8 "List5 "
FLAGS "U"
END
CURRENCY F_LIST6 8
BEGIN
PROMPT 1 9 "List6 "
FLAGS "U"
END
CURRENCY F_LIST7 8
BEGIN
PROMPT 1 10 "List7 "
FLAGS "U"
END
CURRENCY F_LIST8 8
BEGIN
PROMPT 1 11 "List8 "
FLAGS "U"
END
CURRENCY F_LIST9 8
BEGIN
PROMPT 1 12 "List9 "
FLAGS "U"
END
CURRENCY F_LIST10 8
BEGIN
PROMPT 1 13 "List10 "
FLAGS "U"
END
ENDPAGE
ENDMASK

View File

@ -282,6 +282,7 @@ BEGIN
ITEM "Listino"
ITEM "Ricarico"
ITEM "Descrizione@50"
FLAGS "|"
END
ENDPAGE