From 974b558363ccf6b7ae4f71a36e619d8fb3480879 Mon Sep 17 00:00:00 2001 From: alex Date: Fri, 18 Jun 1999 15:35:05 +0000 Subject: [PATCH] Patch level : xx.414 Files correlati : Ricompilazione Demo : [ ] Commento : Riportata 01.04 patch 414 git-svn-id: svn://10.65.10.50/trunk@8260 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- ba/ba0.cpp | 46 +- ba/ba1400a.uml | 2 + ba/ba2.cpp | 2 + ba/ba2.h | 1 + ba/ba2.url | 47 + ba/ba2600.cpp | 3469 ++++++++++++++++++++++++++++++++++++++++++ ba/ba2600.h | 889 +++++++++++ ba/ba2600a.h | 14 + ba/ba2600b.h | 25 + ba/ba2600d.uml | 230 +++ ba/ba2600e.uml | 222 +++ ba/ba2600g.uml | 259 ++++ ba/ba2600k.uml | 192 +++ ba/ba2600l.uml | 31 + ba/ba2600m.uml | 183 +++ ba/ba2600n.uml | 191 +++ ba/ba2600o.uml | 233 +++ ba/ba2600p.uml | 184 +++ ba/ba2600r.uml | 240 +++ ba/ba2600s.uml | 133 ++ ba/ba2600t.uml | 107 ++ ba/ba2600x.uml | 237 +++ ba/ba2600y.uml | 234 +++ ba/ba2600z.uml | 177 +++ cg/cg2100b.uml | 2 +- cg/cg2100s.uml | 2 +- cg/cg2104.cpp | 13 +- cg/cg2105.cpp | 10 - cg/cg3200.cpp | 55 +- cg/cg3200.h | 2 +- cg/cg3200a.uml | 11 +- cg/cg4.cpp | 2 + cg/cg4.h | 1 + cg/cg4500.cpp | 40 +- cg/cg4501.cpp | 27 +- cg/cg4501.h | 23 +- cg/cg4600.cpp | 33 + cg/cg4a00.cpp | 515 +++++++ cg/cg4a00a.h | 22 + cg/cg4a00a.uml | 208 +++ cg/cgpagame.cpp | 3 +- cg/cgpagame.h | 3 + cg/cgprassi.men | 1 + cg/cgsaldac.cpp | 2 +- db/db0500.cpp | 10 +- db/db0500b.uml | 17 +- db/dblib.cpp | 24 +- ef/ef0100.cpp | 3 + ef/ef0300.cpp | 32 +- ef/ef0300a.uml | 4 +- ef/ef0301.cpp | 22 +- ef/ef0301.h | 8 +- ef/ef0500.cpp | 31 +- ef/ef0600.cpp | 48 +- ef/ef0800.cpp | 48 +- ef/f31.dir | 2 +- ef/f31.trr | 3 +- include/csort.c | 9 +- include/currency.cpp | 61 +- include/currency.h | 13 +- include/effetti.h | 1 + include/filetext.cpp | 45 +- include/isam.cpp | 6 +- include/mov.h | 1 + include/os_win16.cpp | 6 +- include/partite.h | 1 + include/postman.cpp | 2 +- include/relapp.cpp | 24 +- include/relation.cpp | 151 +- include/relation.h | 11 +- include/sheet.cpp | 10 +- include/utility.cpp | 109 +- mg/anamag.h | 11 + mg/batbcau.h | 5 +- mg/batbcau.uml | 48 +- mg/f111.dir | 2 +- mg/f111.trr | 4 +- mg/mg1100.cpp | 15 +- mg/mg4200.cpp | 36 +- mg/mglib.h | 5 +- mg/mglib02.cpp | 52 +- mg/mglib02a.cpp | 89 +- mg/rmovmag.h | 4 +- mr/mr2.cpp | 4 +- mr/mr2.h | 1 + mr/mr2.url | 27 +- mr/mr2100.cpp | 325 ++-- mr/mr2100.h | 29 +- mr/mr2100a.h | 26 +- mr/mr2100a.uml | 270 ++-- mr/mr2200.cpp | 1264 ++++++++------- mr/mr2200.h | 451 ++---- mr/mr2200a.h | 94 +- mr/mr2200a.uml | 793 +++++----- mr/mr2201.cpp | 618 +++++--- mr/mr2201.h | 440 ++++++ mr/mr2300.cpp | 42 + mr/mr2300a.uml | 1 + mr/mr2url.h | 2 + mr/mrplib.cpp | 27 +- mr/mrplib.h | 2 + mr/mrprassi.men | 13 +- mr/mrtbimp.h | 4 + mr/mrtbimp.uml | 65 +- mr/mrtblnp.h | 4 + mr/mrtblnp.uml | 65 +- sc/sc0100p.h | 34 +- sc/sc0100p.uml | 77 +- sc/sc0101.cpp | 8 +- sv/sv1100.cpp | 20 +- sv/sv1100a.h | 1 + sv/sv1100a.uml | 38 +- sv/sv1200.cpp | 264 ++-- sv/sv1200a.h | 9 +- sv/sv1200a.uml | 27 +- ve/bolacq.src | 2 +- ve/bollac.src | 2 +- ve/bollaf.src | 2 +- ve/fatacq.src | 2 +- ve/fatturaa.src | 2 +- ve/fatturac.src | 13 +- ve/listadoc.frm | 17 +- ve/ordbon.src | 2 +- ve/ordinec.src | 2 +- ve/ordinef.src | 2 +- ve/ordp.src | 245 +++ ve/sconti.cpp | 6 +- ve/ve0100.cpp | 49 +- ve/ve0100.h | 3 +- ve/ve1100.cpp | 38 +- ve/ve2400.uml | 12 +- ve/ve5200.cpp | 1 + ve/ve5200.uml | 4 +- ve/ve6100.cpp | 82 +- ve/ve6300.cpp | 81 +- ve/veacc.frm | 1132 +++++++++----- ve/vebol.frm | 442 ++++-- ve/vefat.frm | 560 ++++--- ve/velib.h | 23 +- ve/velib02.cpp | 29 +- ve/velib03.cpp | 247 +-- ve/velib04.cpp | 3 + ve/velib04a.cpp | 4 +- ve/velib04b.cpp | 300 +++- ve/velib04c.cpp | 132 +- ve/velib05.cpp | 2 +- ve/velib06.cpp | 22 +- ve/velib06a.cpp | 107 +- ve/verig.h | 4 +- ve/verig.uml | 6 +- ve/verig01.uml | 4 + 151 files changed, 14405 insertions(+), 3520 deletions(-) create mode 100755 ba/ba2600.cpp create mode 100755 ba/ba2600.h create mode 100755 ba/ba2600a.h create mode 100755 ba/ba2600b.h create mode 100755 ba/ba2600d.uml create mode 100755 ba/ba2600e.uml create mode 100755 ba/ba2600g.uml create mode 100755 ba/ba2600k.uml create mode 100755 ba/ba2600l.uml create mode 100755 ba/ba2600m.uml create mode 100755 ba/ba2600n.uml create mode 100755 ba/ba2600o.uml create mode 100755 ba/ba2600p.uml create mode 100755 ba/ba2600r.uml create mode 100755 ba/ba2600s.uml create mode 100755 ba/ba2600t.uml create mode 100755 ba/ba2600x.uml create mode 100755 ba/ba2600y.uml create mode 100755 ba/ba2600z.uml create mode 100755 cg/cg4a00.cpp create mode 100755 cg/cg4a00a.h create mode 100755 cg/cg4a00a.uml create mode 100755 mr/mr2201.h create mode 100755 mr/mr2300.cpp create mode 100755 mr/mr2300a.uml create mode 100755 ve/ordp.src diff --git a/ba/ba0.cpp b/ba/ba0.cpp index e1904a11e..d88de426a 100755 --- a/ba/ba0.cpp +++ b/ba/ba0.cpp @@ -17,6 +17,10 @@ #include +#include +#include +#include + #include "ba0.h" #include "ba0100a.h" #include "ba0400a.h" @@ -1133,6 +1137,7 @@ protected: void manage_preferred(); bool test_programs(); + bool test_network(); public: void reload_images() { _menu.reload_images(); } @@ -1454,6 +1459,42 @@ static int get_module_version(TConfig& cfg, void* jolly) return FALSE; } +bool TMenu_application::test_network() +{ + word winver = LOWORD(GetVersion()); + if (LOBYTE(winver)==3 && HIBYTE(winver)==95) + { + char * VREDIRNAME = "vredir.vxd"; + DWORD handle; + BYTE infoBuffer[512]; + + DWORD dwSize = GetFileVersionInfoSize(VREDIRNAME,&handle); + if (dwSize) + { + GetFileVersionInfo(VREDIRNAME,handle,dwSize,infoBuffer); + long *language; + void * lpBuffer; + char szName[128]; + UINT Size; + if (VerQueryValue(infoBuffer, "\\VarFileInfo\\Translation", (void **)&language, &Size) && Size!=0) + { + sprintf(szName, "\\StringFileInfo\\%04x%04x\\FileVersion",LOWORD(*language), HIWORD(*language)); + if (VerQueryValue(infoBuffer, szName, &lpBuffer, &Size) && Size!=0) + { + TToken_string v((const char *)lpBuffer,'.'); + int subver=atoi(v.get(2)); + if (subver >=1111 && subver <=1115) + return error_box("La versione %s del driver di rete '%s' contiene un bug riconosciuto da Microsoft. Consultare la documentazione sul sito AGA per eliminare questo inconveniente.",(const char *)lpBuffer, VREDIRNAME); + else + return TRUE; + } + } + } + message_box("Non riesco a determinare la versione del driver di rete '%s'",VREDIRNAME); + } + return TRUE; +} + bool TMenu_application::test_programs() { TToken_string dangerous; @@ -1492,7 +1533,7 @@ bool TMenu_application::test_programs() const int p1 = mytok ? mytok->get_int() : 0; const TString16 v2 = histok ? histok->get(0) : ""; const int p2 = histok ? histok->get_int() : 0; - if (compare_version(v1, p1, v2, p2) < 0) + if (!v1.blank() && compare_version(v1, p1, v2, p2) < 0) { dangerous.add(code); const TString& name = scan.token().mid(3); @@ -1519,6 +1560,9 @@ bool TMenu_application::create() { TApplication::create(); + if (!test_network()) + return FALSE; + #ifdef _DEMO_ { TMask w("Attenzione", 1, 78, 14); diff --git a/ba/ba1400a.uml b/ba/ba1400a.uml index 17c88f9b5..360e655f2 100755 --- a/ba/ba1400a.uml +++ b/ba/ba1400a.uml @@ -98,6 +98,7 @@ END BOOLEAN F_NOWRITE BEGIN PROMPT 32 -7 "Disabilita registrazioni nell'intero modulo" + GROUP G_SUPERUSER END SPREADSHEET F_PROPERTIES @@ -107,6 +108,7 @@ BEGIN ITEM "Uso" ITEM "Azione" ITEM "Espressione" + GROUP G_SUPERUSER END ENDPAGE diff --git a/ba/ba2.cpp b/ba/ba2.cpp index aa974d958..c0d01ed49 100755 --- a/ba/ba2.cpp +++ b/ba/ba2.cpp @@ -19,6 +19,8 @@ int main(int argc, char** argv) ba2400(argc, argv) ; break; case 4: ba2500(argc, argv) ; break; + case 5: + ba2600(argc, argv) ; break; default: ba2100(argc, argv); break; } diff --git a/ba/ba2.h b/ba/ba2.h index d29bb021a..d4f6cb442 100755 --- a/ba/ba2.h +++ b/ba/ba2.h @@ -6,6 +6,7 @@ int ba2200(int argc, char* argv[]); int ba2300(int argc, char* argv[]); int ba2400(int argc, char* argv[]); int ba2500(int argc, char* argv[]); +int ba2600(int argc, char* argv[]); #endif // __BA2_H diff --git a/ba/ba2.url b/ba/ba2.url index d5d571522..d1a078bdb 100755 --- a/ba/ba2.url +++ b/ba/ba2.url @@ -63,3 +63,50 @@ MENU BAR_ITEM(1) ITEM MENU_ITEM(53) "~Primo" ITEM MENU_ITEM(54) "~Ultimo" + MENUBAR MENU_BAR(5) + + MENU MENU_BAR(5) + SUBMENU BAR_ITEM(51) "~File" + SUBMENU BAR_ITEM(52) "~Modifica" + SUBMENU BAR_ITEM(53) "~Aggiungi" + SUBMENU BAR_ITEM(54) "~Visualizza" + SUBMENU BAR_ITEM(55) "~Test" + + MENU BAR_ITEM(51) + ITEM MENU_ITEM(11) "~Nuovo" + ITEM MENU_ITEM(12) "~Apri" + ITEM MENU_ITEM(13) "~Salva" + ITEM MENU_ITEM(14) "Salva ~con nome" + SEPARATOR + ITEM M_FILE_ABOUT+1 "~Informazioni" + ITEM M_FILE_QUIT "Fin~e" + + MENU BAR_ITEM(52) + ITEM MENU_ITEM(21) "~Copia-Incolla" + ITEM MENU_ITEM(22) "Ca~ncella CANC" + ITEM MENU_ITEM(23) "S~posta in.. F2" + + MENU BAR_ITEM(53) + ITEM MENU_ITEM(31) "~Button" + ITEM MENU_ITEM(32) "~CheckBox" + ITEM MENU_ITEM(33) "Currenc~y" + ITEM MENU_ITEM(34) "~Date" + ITEM MENU_ITEM(35) "Grou~pBox" + ITEM MENU_ITEM(36) "~List" + ITEM MENU_ITEM(37) "~Memo" + ITEM MENU_ITEM(38) "~Number" + ITEM MENU_ITEM(39) "~RadioButton" + ITEM MENU_ITEM(310) "~SpreadSheet" + ITEM MENU_ITEM(311) "S~tringa" + ITEM MENU_ITEM(312) "Te~xt" + ITEM MENU_ITEM(313) "~Zoom" + + MENU BAR_ITEM(54) + ITEM MENU_ITEM(41) "~Controlli presenti F3" + ITEM MENU_ITEM(42) "~Maschera di sheet F4" + ITEM MENU_ITEM(43) "Co~ntrolli-maschera sheet F5" + + MENU BAR_ITEM(55) + ITEM MENU_ITEM(51) "~Compilazione" + ITEM MENU_ITEM(52) "~Esecuzione" + diff --git a/ba/ba2600.cpp b/ba/ba2600.cpp new file mode 100755 index 000000000..bf70d3cde --- /dev/null +++ b/ba/ba2600.cpp @@ -0,0 +1,3469 @@ +//EDITOR DI MASCHERE + +#include "ba2600.h" + +//Costruttore della classe TEditMask_window: gestisce la maschera +TEditMask_window::TEditMask_window(short x,short y,short dx,short dy, + const char*title,long flags, WIN_TYPE wt) +{ + create(x,y,dx,dy,title,flags,wt); + _controllo=NULL; + _controls=NULL; + _pixmap=TRUE; + set_font(); + _sheet=NULL; + _total_page=_page=1; + _name.add("Maschera",0); + _name.add("Maschera",1); + _type_vz="a"; _coordx=x; + _coordy=y; _alt=dy; + _lung=dx; + _tool=FALSE; + _mode=TRUE; + _y_tool=19; + _rt.left=_rt.right=_rt.bottom=0; + _rt.top=_y_tool*ROWY; + _rct_sel.left=_rct_sel.top=_rct_sel.bottom=_rct_sel.right=0; + _nsheet=0; +} + +//Permette il ridimensionamento +RCT& TEditMask_window::resize_rect(short x, short y, short dx, short dy, + WIN_TYPE wt, bool intool) const +{ + static RCT r; + + if (_tool) // Mask with Toolbar + { + if (y >= 0) + { +/* Scommentare quando verranno inseriti i tab buttons + if (_total_page>1) + y++; +*/ + } + if (x > 0 || (wt != WO_TE && x == 0)) + { + RCT pc; xvt_vobj_get_client_rect(win(), &pc); + const int width = pc.right; + const int tot = 80*CHARX; + if (width > tot) x += (width-tot) / (2*CHARX); + } + } + wt = WC_EDIT; + + r.left = (x+1)*CHARX; + r.top = y*ROWY; + r.right = dx*CHARX; + r.bottom = (CHARY << 1) - BASEY; + + if (y >= 0 && _tool && intool) + r.top += ROWY*_y_tool; + + if (dy > 1) + r.bottom += ROWY*(dy-1); + + if (x < 0 || y < 0 || dx <= 0 || dy <= 0) + { + RCT pc; + xvt_vobj_get_client_rect(win(), &pc); + const short MAXX = pc.right; + const short MAXY = (_tool && !intool) ? ROWY*_y_tool : pc.bottom; + + if (x < 0) + { + x = -x; + if (wt != WC_EDIT && x == 1) x = 11; + if (x > 10) + { + const int num = x/10 -1; + const int tot = x%10; + const int spc = (MAXX - tot*r.right) / (tot+1); + r.left = spc + num*(spc+r.right); + } + else + r.left = MAXX - r.right - x*CHARX; + } + + if (y < 0) + { + y = -y; + if (wt != WC_EDIT && y == 1) y = 11; + if (y > 10) + { + const int num = y/10 -1; + const int tot = y%10; + const int spc = (MAXY - tot*r.bottom) / (tot+1); + r.top = spc + num*(spc+r.bottom); + } + else + r.top = MAXY - r.bottom - (y-1)*ROWY; + } + + if (dx <= 0) r.right = MAXX + dx*CHARX; + else r.right += r.left; + if (dy <= 0) r.bottom = MAXY + dy*ROWY; + else r.bottom += r.top; + } + else + { + r.right += r.left; + r.bottom += r.top; + } + return r; +} + +//Costruttore della classe TEditMask_control che gestisce i controlli +TEditMask_control::TEditMask_control(TEditMask_window* parent) +{ + + _intool=FALSE; + _parent=parent; + _pag=parent->page(); + _left=_top=1; + _latox=15; + _latoy=1; + resize_rect(); + _id="DLG_USER"; + _type_field="control"; + _selected=FALSE; + _focus=0; +} + +//Costruttore della classe TEditMask_control per definirne la copia +TEditMask_control::TEditMask_control(const TEditMask_control& ctl) +{ + _intool=ctl._intool; + _parent=ctl._parent; + _focus=ctl._focus; + _pag=ctl._pag; _rct=ctl._rct; + _left=ctl._left; _top=ctl._top; + _prompt=ctl._prompt; _id=ctl._id; + _latox=ctl._latox; _latoy=ctl._latoy; + _field=ctl._field; _key=ctl._key; + _warning=ctl._warning; _check=ctl._check; + _flag=ctl._flag; _group=ctl._group; + _message=ctl._message; + _selected=ctl._selected; + _type_field=ctl._type_field; +} + +//Permette il riordino dei controlli in base alla priorità del focus +static int compare(const TObject** o1,const TObject** o2) +{ + if (o1 == o2) + return 0; + + TEditMask_control* s1 = (TEditMask_control*)*o1; + TEditMask_control* s2 = (TEditMask_control*)*o2; + return (s1->get_focus() - s2->get_focus()); +} + +//Ricerca durante la lettura la maschera corrispondente allo spread numero i +TEditMask_control* TEditMask_window::find_sheet(int i) +{ + for(int j=0; j<_controls.items(); j++) + { + TEditMask_control& sh=(TEditMask_control& )_controls[j]; + if (sh.get_idsheet()==i) + return &sh; + } + return NULL; +} + +//Definisce la presenza di pagine prive di controlli +int TEditMask_window::page_null(int page) +{ + bool cont=FALSE; + + for(int i=0; i<_controls.items(); i++) + { + TEditMask_control& down=(TEditMask_control& )_controls[i]; + if (down.page()==page) + { + cont=TRUE; + break; + } + } + return cont; +} + +//Salva su file la scrittura delle pagine +void TEditMask_window::save_page(ostream& out) +{ + RCT r={_rt.top,0,_rt.bottom,_rt.right}; + + _controls.sort(compare);//ordinamento secondo la priorità focus + + for(int k=1;k<=_total_page ;k++) + { + if(page_null(k)) + { + out<<"PAGE \""<< _name[k] <<"\" "<< _coordx <<" " <<_coordy; + out<<" " <<_lung <<" " <<_alt << "\n\n"; + for(int i=0; i<_controls.items(); i++) + { + TEditMask_control& up=(TEditMask_control& )_controls[i]; + if(up.page()==k) { + PNT p={up.rectangle().top,up.rectangle().left}; + if(up.type()=="BUTTON ") + { + TString tipo=up.ident(); + if(tipo=="DLG_OK" || tipo=="DLG_CANCEL" ||\ + tipo=="DLG_DELREC" ||tipo=="DLG_QUIT" || tipo=="DLG_PRINT" ||\ + tipo=="DLG_SELECT") up.set_prompt(""); + } + if(xvt_rect_has_point(&r,p) != 0) ; + else out<<_controls[i]; + } + } + out<<"ENDPAGE\n\n"; + } + } + out<<"\nENDMASK\n\n"; + +} + +//Creazione del file .uml +void TEditMask_window::create_file() +{ + _file.lower(); + _file.ext("uml"); + ofstream file(_file); + RCT r={_rt.top,0,_rt.bottom,_rt.right}; + _file.ext("h"); + + file<<"#include \"" << _file<<"\"\n\n"; + _file.ext("uml"); + int k=101; + + + if(_tool) + { + file<<"TOOLBAR \"TOOLBAR\" 0 "<<_y_tool<<" 0 0\n\n"; + for(int i=0; i<_controls.items(); i++) + { //i controlli della toolbar + TEditMask_control& up=(TEditMask_control& )_controls[i]; + PNT p={up.rectangle().top,up.rectangle().left}; + if(up.type()=="BUTTON ") + { + TString tipo=up.ident(); + if(tipo=="DLG_OK" || tipo=="DLG_CANCEL" ||\ + tipo=="DLG_DELREC" ||tipo=="DLG_QUIT" || tipo=="DLG_PRINT" ||\ + tipo=="DLG_SELECT") up.set_prompt(""); + } + if(xvt_rect_has_point(&r,p) != 0) + file<<_controls[i]; + } + file<<"ENDPAGE\n\n"; + } + save_page(file); //controlli della finestra principale + + for(int i=0; i<_controls.items(); i++) //controlli dello spread + { + TEditMask_control& up=(TEditMask_control& )_controls[i]; + if(up.figlio()!=NULL) + up.figlio()->save_page(file); + } + + file.close(); +} + +//Creazione del file .h +void TEditMask_window::create_fileh() +{ + TFilename header(_file); + header.lower(); + header.ext("h"); + ofstream fileh(header); + int k=101; + + for(int i=0; i<_controls.items(); i++) + { + TEditMask_control& up=(TEditMask_control& )_controls[i]; + if(up.ident()!=("DLG_NULL")) + { + fileh<<"#define "< +RCT& TEditMask_control::resize_rect(short x, short y, short dx, short dy, WIN_TYPE wt,bool intool)const +{ + return _parent->resize_rect(x,y,dx,dy,wt,intool); +} + +//Ridimensiona come sopra +void TEditMask_control::resize_rect() +{ + set_dim(_latox,_latoy); +} + +//Definisce il padre +TEditMask_window& TEditMask_control::padre() const +{ + CHECK(_parent,"Campo senza maschera"); + return *_parent; +} + +//Setta il prompt +const TString& TEditMask_control::set_prompt(const TString& prompt) +{ + return _prompt=(prompt); +} + +//Setta il tipo di controllo +const TString& TEditMask_control::set_type(const TString& fld) +{ + return _type_field=(fld); +} + +//Setta l'identificativo +const TString& TEditMask_control::set_id(const TString& id) +{ + return _id=(id); +} + +//Setta il campo FLAGS +const TString& TEditMask_control::set_flag(const TString& fl) +{ + return _flag=(fl); +} + +//Setta il campo GROUP +const TString& TEditMask_control::set_group(const TString& gr) +{ + return _group=(gr); +} + +//Setta il campo CHECKTYPE +const TString& TEditMask_control::set_check(const TString& ck) +{ + return _check=(ck); +} + +//Setta il flag relativo alla selezione +bool TEditMask_control::set_selected(bool sl) +{ + _selected=sl; + return _selected; +} + +//Disegna linee +void TEditMask_control::line(short x0,short y0,short x1,short y1) const +{ + PNT f = {y0,x0}; + PNT t = {y1,x1}; + + xvt_dwin_draw_set_pos(maschera(), f); + xvt_dwin_draw_line(maschera(), t); +} + +//Scrive il prompt sul controllo +void TEditMask_control::frase(short x, short y) const +{ + padre().stringat(x, y,_prompt); +} + +//Setta i campi comuni sulla maschera di supporto +void TEditMask_control::set_field(TMask& mask) +{ + mask.set(F_PROMPT,_prompt); + mask.set(F_PAGE,_pag); + mask.set(F_FOCUS,_focus); + mask.set(F_IDENT,_id); + mask.set(F_LEFT,_left); + mask.set(F_UPPER,_top); + mask.set(F_INTOOL,_intool ? "X" : " "); +} + +//Legge i MESSAGE dalla maschera di supporto +void TEditMask_control::get_message(TSheet_field& sp) +{ + _message=sp.rows_array(); +} + +//Setta i MESSAGE sulla maschera di supporto +void TEditMask_control::set_message(TSheet_field& sp) +{ + sp.rows_array()=_message; +} + +//Stampa su file.uml i MESSAGE +void TEditMask_control::print_message(ostream& out)const +{ + TToken_string mes; + + for(int i=0;i<_message.items();i++) + { + mes=_message.row(i); + if(!mes.blank()) + { + mes.replace('^','|'); + out<<" MESSAGE "<< mes <<"\n"; + } + } +} + +//Setta i campi opzionali comuni sulla maschera di supporto +void TEditMask_control::set_option(TMask& mask) +{ + mask.set(F_FLAG,_flag); + mask.set(F_GROUP,_group); + mask.set(F_WARNING,_warning); + mask.set(F_CHECK,_check); + mask.set(F_KEY,_key); + mask.set(F_FIELD,_field); +} + +//Legge i campi comuni dalla maschera di supporto +void TEditMask_control::get_field(TMask& mask) +{ + _prompt=mask.get(F_PROMPT); + _focus=mask.get_int(F_FOCUS); + _left=mask.get_int(F_LEFT); + _top=mask.get_int(F_UPPER); + _pag=mask.get_int(F_PAGE); + _id=mask.get(F_IDENT); + _intool=mask.get_bool(F_INTOOL); + + _pag=_parent->max_page(_pag); +} + +//Setta le dimensioni del controllo +void TEditMask_control::set_dim(int ln, int lg) +{ + _latox=ln; _latoy=lg; + _rct=resize_rect(_left,_top,_latox,_latoy,WO_TE,_intool); +} + +//Setta le coordinate del controllo +void TEditMask_control::set_crd(int x, int y) +{ + _left=x; _top=y; +} + +//Legge dalla maschera di supporto i campi comuni opzionali +void TEditMask_control::get_option(TMask& mask) +{ + _flag=mask.get(F_FLAG); + _group=mask.get(F_GROUP); + _warning=mask.get(F_WARNING); + _check=mask.get(F_CHECK); + _key=mask.get(F_KEY); + _field=mask.get(F_FIELD); +} + +//Stampa su file .uml il controllo(i campi comuni e particolari) +void TEditMask_control::print_on(ostream& out) const +{ + char c; + + out<<" BEGIN"<<"\n" ; + out<<" PROMPT " << _left << " " <<_top<<" \""; + + out<<_prompt; + for(int i=off(); i > 0; i--) + out << ' '; + out<<"\"\n"; + + if(_flag.not_empty()) + { + for(int j=0;j<_flag.len();j++) + { + c=toupper(_flag.operator[](j)); + if(c==' ') ; + else out<<" FLAGS "<<"\""<< c <<"\"\n"; + } + } + + print_message(out); + + if(_group.not_empty()) + out<<" GROUP "<<_group<<"\n"; + + if(_field.not_empty()) + { + out<<" FIELD "; + for(int f=0;f<_field.len();f++) + { + c=toupper(_field.operator[](f)); + out<= 0 && !isalpha(prt[i]) && !ispunct(prt[i]); i--) + off++; + return _offset=off; +} + +//Legge da file .uml solo il browse +void TEditMask_string::read_use(TScanner& scanner,const TString& tok) +{ + if(tok=="USE" || tok=="JOIN" || tok=="INPUT" ||\ + tok=="OUTPUT" || tok=="DISPLAY" || tok=="COPY") + { + _use <<(tok); + _use <<(' '); + _use <<(scanner.line()); + _use <<('\n'); + } +} + +//Legge da file .uml il controllo +void TEditMask_string::read_from(TScanner& scanner, bool intool) +{ + TString tok; + + set_id(scanner.pop()); + read_lngz(scanner); + tok=scanner.pop(); + while(tok!="END") + { + read_field(scanner,tok, intool); + read_use(scanner,tok); + if(tok=="ADD") + { + tok=scanner.pop(); + tok=scanner.pop(); + _addr=(tok); + } + tok=scanner.pop(); + } + tok=prt(); read_off(tok); tok.rtrim(); set_prompt(tok); + set_dim(_lungvd+prompt_len()+off(),1); +} + +/////////////////////////////////////////////////////////// +// TeditMask_number :controllo tipo NUMBER +/////////////////////////////////////////////////////////// + +//Costruttore del controllo NUMBER +TEditMask_number::TEditMask_number(TEditMask_window* parent) + :TEditMask_string(parent) +{ + _latox=10; + _decimals=0; + set_prompt("Number"); + set_type("NUMBER "); + set_id("F_NUMBER"); + set_dim(_latox + prompt_len() + off(),1); + +} + +//Costruttore copia del controllo +TEditMask_number::TEditMask_number(const TEditMask_number& ctl) + :TEditMask_string(ctl) +{ + _latox=ctl._latox; + _decimals=ctl._decimals; + _picture=ctl._picture; + set_prompt(ctl.prt()); + set_type(ctl.type()); + set_id(ctl.ident()); + set_dim(_latox + prompt_len() + off(),1); + +} + +//Setta i decimali +void TEditMask_number::set_decimal(int d) +{ + _decimals=d; +} + +//Gestisce la maschera di supporto +KEY TEditMask_number::main_loop() +{ + TMask _mask("ba2600r"); + TSheet_field& s=_mask.sfield(F_MESSAGE); + + _mask.set(F_LONGEFF,_latox); + _mask.set(F_PICTURE,_picture); + _mask.set(F_DECIMAL,_decimals); + set_field(_mask); + set_option(_mask); + set_message(s); + set_bwoff(_mask); + KEY k = _mask.run(); + if (k == K_ENTER) + { + get_message(s); + get_field(_mask); + get_option(_mask); + get_bwoff(_mask); + _latox=_mask.get_int(F_LONGEFF); + _picture=_mask.get(F_PICTURE); + _decimals=_mask.get_int(F_DECIMAL); + set_dim(_latox + prompt_len() + off(),1); + } + return k; +} + +//Stampa su file .uml il controllo +void TEditMask_number::print_on(ostream& out) const +{ + if(_decimals<=0) + out<set_prompt("Conferma"); + btn_ok->set_id("DLG_OK"); + btn_ok->set_crd(-13,-1); + btn_ok->set_dim(10+2,2); + + TEditMask_control* btn_cancel=_sheetmask.addbutton(); + btn_cancel->set_prompt("Annulla"); + btn_cancel->set_id("DLG_CANCEL"); + btn_cancel->set_crd(-23,-1); + btn_cancel->set_dim(10+2,2); + + + TEditMask_control* btn_del=_sheetmask.addbutton(); + btn_del->set_prompt("Elimina"); + btn_del->set_id("DLG_DELREC"); + btn_del->set_crd(-33,-1); + btn_del->set_dim(10+2,2); + + xvt_app_get_default_ctools(&t); //per eliminare la modalità M_XOR + xvt_dwin_set_draw_ctools(maschera(),&t); +} + +//Fa l'update del controllo +void TEditMask_sheet::update()const +{ + RCT r=rectangle(); + int longe=r.right-(r.left+3*CHARX); + int large=r.bottom-(r.top+ROWY); + int latolong=longe/6; + + RCT rt={r.top,r.left,r.top+ROWY,r.right-10}; //orizzontale + RCT rc={r.top,r.left,r.top+ROWY+3*CHARY,r.left+3*CHARX};//verticale + RCT rg={r.top,r.left,r.bottom,r.right}; + RCT rn={r.top+ROWY,r.left+3*CHARX,r.top+ROWY+3*CHARY,r.right-10}; + + padre().set_brush(TOOL_BACK_COLOR); + xvt_dwin_draw_rect(maschera(),&rg); + + padre().set_brush(NORMAL_BACK_COLOR); + xvt_dwin_draw_rect(maschera(),&rn); + + padre().set_brush(BTN_BACK_COLOR); + xvt_dwin_draw_rect(maschera(),&rc); + xvt_dwin_draw_rect(maschera(),&rt); + padre().hide_brush(); + + padre().set_pen(BTN_LIGHT_COLOR,2); + line(r.left+2,r.top+2,r.right-12,r.top+2); + line(r.left+2,r.top+2,r.left+2,r.top+ROWY+3*CHARY); + line(r.left+3*CHARX+2,r.top+2,r.left+3*CHARX+2,r.top+ROWY-2);//primo pezz..verticale + line(r.left+2,r.top+ROWY+2,r.left+3*CHARX,r.top+ROWY+2); //primo pezz..orizz. + for (int i=2;i<6;i+=2) //verticali + line(r.left+3*CHARX+i*latolong+2,r.top+2,r.left+3*CHARX+i*latolong+2,r.top+ROWY-2); + for (int s=1;s<3;s++) //orizz. + line(r.left+2,r.top+ROWY+2+s*CHARY,r.left+3*CHARX-2,r.top+ROWY+s*CHARY+2); + + padre().set_pen(BTN_DARK_COLOR,2); + line(r.left+2,r.top+ROWY-2,r.right-10,r.top+ROWY-2);//orizz. + line(r.left+3*CHARX,r.top,r.left+3*CHARX,r.top+ROWY+3*CHARY); //verticale + line(r.right-12,r.top+1,r.right-12,r.top+ROWY); + for (int f=2;f<6;f+=2) //righe verticali + line(r.left+3*CHARX+f*latolong,r.top+2,r.left+3*CHARX+f*latolong,r.top+ROWY-2); + for (int h=1;h<4;h++) //righe orizzontali + line(r.left+2,r.top+ROWY+h*CHARY,r.left+3*CHARX-2,r.top+ROWY+h*CHARY); + + padre().set_pen(COLOR_BLACK,2); + line(r.left+2,r.top+ROWY,r.right-12,r.top+ROWY);//orizz. + line(r.right-12,r.top+1,r.right-12,r.top+ROWY); + + padre().set_pen(COLOR_BLACK,1); + for (int j=2;j<6;j+=2) //verticali + line(r.left+3*CHARX+j*latolong,r.top+ROWY,r.left+3*CHARX+j*latolong,r.top+ROWY+3*CHARY); + for (int y=1;y<3;y++) //orizzontali + line(r.left+3*CHARX,r.top+ROWY+y*CHARY,r.right-10,r.top+ROWY+y*CHARY); + padre().stringat(r.left+2*CHARX,r.top+ROWY,"1"); + padre().stringat(r.left+2*CHARX,r.top+2*CHARY+CHARX,"2"); + padre().stringat(r.left+2*CHARX,r.top+3*CHARY+CHARX,"3"); + +} + +//Setta sulla maschera di supporto solo _item e browse +void TEditMask_sheet::set_itbr(TMask& m,TSheet_field& sp) +{ + sp.rows_array()=_item; + m.set(F_USE,_browse); +} + +//Legge dalla maschera di supporto solo _item e browse +void TEditMask_sheet::getitbr(TMask& m,TSheet_field& sp) +{ + _item=sp.rows_array(); + _browse=m.get(F_USE); +} + +//Gestisce la maschera di supporto +KEY TEditMask_sheet::main_loop() +{ + TToken_string spr, sd; + TMask _mask("ba2600d"); + TSheet_field& s=_mask.sfield(F_ITEM); + + set_field(_mask); + set_option(_mask); + _mask.set(F_LONGEFF,_latox); + _mask.set(F_LARGE,_latoy); + set_itbr(_mask,s); + KEY k= _mask.run(); + if(k==K_ENTER) + { + get_field(_mask); + get_option(_mask); + getitbr(_mask,s); + _latox=_mask.get_int(F_LONGEFF); + _latoy=_mask.get_int(F_LARGE); + set_dim(_latox,_latoy); + } + return k; +} + +//Stampa su file .uml solo _item +void TEditMask_sheet::print_item(ostream& out)const +{ + TString message,desc; + + for(int i=0;i<_item.items();i++) + { + TToken_string& it=(TToken_string&)_item.row(i); + desc=it.get(0); + if(!desc.blank()) + { + out<<" ITEM \""<= 0; i--) + { + TEditMask_control& down=(TEditMask_control& )_controls[i]; + if (_page==down.page() && down.contains(pnt)) + { + down.set_selected(TRUE); + return &down; + } + } + return NULL; +} + +//Ritorna TRUE se esistono controlli selezionati +bool TEditMask_window::search(RCT* rct) +{ + bool sel=FALSE; + + for(int i=_controls.items()-1; i >= 0; i--) + { + TEditMask_control& down=(TEditMask_control& )_controls[i]; + PNT p={down.rectangle().top,down.rectangle().left}; + bool selected=xvt_rect_has_point(rct,p) != 0; + + if (selected && _page==down.page()) + { + down.set_selected(TRUE); + sel=TRUE; + selected=FALSE; + } + } + return sel; +} + +//Ridisegna il controllo spostato +bool TEditMask_control::redesign(int dx, int dy) +{ + PNT dev; dev.h = _rct.left; dev.v = _rct.top; + PNT log = padre().logic(dev, _intool); + + _left = log.h + dx / CHARX; + if (_left < 0) _left = 0; + if (_left > 78) _left = 78; + + _top = log.v + dy / ROWY; + if (_top < 0) _top = 0; + if (_top > 19) _top = 19; + + resize_rect(); + + return TRUE; +} + +//Ridisegna il rettangolo di selezione +bool TEditMask_window::redesign(RCT* rct, int dx, int dy) +{ + int height = xvt_rect_get_height(rct); + int width = xvt_rect_get_width(rct); + bool intool; + PNT dev; dev.h = rct->left; dev.v = rct->top; + PNT log = logic(dev, intool); + + int x = log.h + dx/CHARX; + if (x < 0) x = 0; + if (x > 78) x = 78; + + int y = log.v + dy/ROWY; + if (y < 0) y = 0; + if (y > 19) y = 19; + + *rct = resize_rect(x,y,1,1,WO_TE,intool); + rct->right = rct->left +width; + rct->bottom=rct->top + height; + + return TRUE; +} + +//Permette di spostare uno o più controlli selezionati +void TEditMask_window::move(RCT* rct,PNT pntinz, PNT pntfin) +{ + int dx=(pntfin.h-pntinz.h); //trasla lungo x + int dy=(pntfin.v-pntinz.v); //trasla lungo y + + if(pntfin.h/CHARX==pntinz.h/CHARX && pntfin.v/ROWY==pntinz.v/ROWY) ; + else + { + redesign(rct,dx,dy); + for(int i=0; i<_controls.items(); i++) + { + TEditMask_control& down=(TEditMask_control& )_controls[i]; + if (down.get_selected()) + down.redesign(dx,dy); + } + } +} + +//Distrugge il controllo con tasto ELIMINA di maschera di supporto +void TEditMask_window::destroy_control(TEditMask_control* c) +{ + for(int i=_controls.last(); i >= 0; i--) + { + if (_controls.objptr(i) == c) + { + _controls.destroy(i, TRUE); + break; + } + } + _controllo=NULL; +} + +//Controllo sull'ordine delle pagine +int TEditMask_window::max_page(int pag) +{ + if(pag>_total_page) + { + int diff=pag-_total_page; + if(diff==1) _total_page=pag; + else + { + error_box("Non esagerare, va avanti una pagina per volta! Ti aiuto io... "); + _total_page+=1; + pag=_total_page; + } + _name.add("Maschera",pag); + _name.pack(); + } + return pag; +} + +//Copia i controlli selezionati +void TEditMask_window::copy_crt_sel() +{ + int items=_controls.items(); + PNT inz={_rct_sel.top,_rct_sel.left}; + PNT fin={1*ROWY,1*CHARX}; + + for(int i=items-1; i>=0; i--) + { + TEditMask_control& down=(TEditMask_control& )_controls[i]; + if (down.get_selected()) + { + down.set_selected(FALSE); + int j=_controls.add(down); + TEditMask_control& gr=(TEditMask_control& )_controls[j]; + gr.set_selected(TRUE); + } + } + move(&_rct_sel,inz,fin); + force_update(); +} + +//Cancella i controlli selezionati +void TEditMask_window::erase_crt_sel() +{ + for(int i=_controls.last(); i >= 0; i--) + { + TEditMask_control& down=(TEditMask_control& )_controls[i]; + if (down.get_selected()) + _controls.destroy(i, TRUE); + } + _controllo=NULL; + inizialition(); + xvt_win_set_cursor(win(), CURSOR_ARROW); + force_update(); +} + +//Muove nella pagina richiesta(se permessa)i controlli selezionati +void TEditMask_window::move_crt_sel() +{ + int pag; + TMask m("ba2600l"); + + KEY k=m.run(); + if(k==K_ENTER) + { + if(xvt_rect_is_empty(&_rct_sel)) + warning_box("Pensi di avere selezionato qualcosa??"); + else + { + pag=m.get_int(101); + + if(pag==0) + { + warning_box("La pagina 0 non esiste! "\ + "Lascio tutto ancora nella stessa pagina."); + pag=_page; + } + else + { + pag=max_page(pag); + + for(int i=0; i<_controls.items(); i++) + { + TEditMask_control& down=(TEditMask_control& )_controls[i]; + if (down.get_selected()) + down.set_page(pag); + } + } + } + } +} + +//Disegna una linea sulla "maschera" +void TEditMask_window::line(short x0,short y0,short x1,short y1) const +{ + PNT f = {y0,x0}; + PNT t = {y1,x1}; + + xvt_dwin_draw_set_pos(win(), f); + xvt_dwin_draw_line(win(), t); +} + +//Gestisce l'evento legato ad E_CHAR +void TEditMask_window::o_key(KEY key) +{ + switch(key) + { + case K_NEXT: + if(_page==_total_page) ; + else + _page+=1; + update(); + break; + case K_PREV: + if(_page!=1 && _page>1) + _page-=1; + update(); + break; + case K_DEL: + erase_crt_sel(); + break; + case K_F6: + copy_crt_sel(); + break; + case K_F2: + { + move_crt_sel(); + force_update(); + } + break; + case K_F3: + { + vision_ctrl(); + } + break; + case K_F4: + { + vision_spread(); + } + break; + case K_F5: + { + vision_sp_ctl(); + } + break; + default: + break; + } +} + +//Deseleziona i controlli selezionati +void TEditMask_window::deselection() +{ + for(int i=0; i<_controls.items(); i++) + { + TEditMask_control& down=(TEditMask_control& )_controls[i]; + down.set_selected(FALSE); + } + xvt_win_set_cursor(win(), CURSOR_ARROW); +} + +//Controlla l'appartenenza di un punto al rettangolo di selezione +bool TEditMask_window::selection(RCT* rct,PNT pnt) +{ + return (xvt_rect_has_point(rct,pnt) != 0); +} + +//Crea il rettangolo di selezione +void TEditMask_window::rubber_rect(WINDOW win, RCT*rctp,PNT p) +{ + RCT rct; + DRAW_CTOOLS t; + + xvt_app_get_default_ctools(&t); + t.pen.color=COLOR_BLACK; + t.brush.color=MASK_BACK_COLOR; + t.pen.pat=PAT_RUBBER; + t.brush.pat=PAT_HOLLOW; + t.mode=M_XOR; + xvt_dwin_set_draw_ctools(win,&t); + normalize_rect(&rct,rctp); + xvt_dwin_draw_rect(win,&rct); +} + +//Normalizza un rettangolo +void TEditMask_window::normalize_rect(RCT *norm_rctp, RCT*rctp) +{ + xvt_rect_set(norm_rctp, min(rctp->left, rctp->right), + min(rctp->top, rctp->bottom),max(rctp->left, rctp->right), + max(rctp->top, rctp->bottom)); +} + +//Gestisce la selezione +void TEditMask_window::selected_crt(WINDOW win, EVENT* ep) +{ + static PNT last_pnt,posinz,posfin; + static bool first_move,down=FALSE,sel=FALSE; + static bool is_rect=FALSE; + + switch(ep->type) { + case E_MOUSE_DOWN: + if(ep->v.mouse.button==0) //solo con il tasto sinistro + { + down=TRUE; + last_pnt=posinz=ep->v.mouse.where; //punto iniziale + if(xvt_rect_is_empty(&_rct_sel)) //fase primordiale + { + _controllo=search(posinz); + if(_controllo) { + _rct_sel=_controllo->rectangle(); //diventa il controllo stesso + _controllo->set_selected(TRUE); + is_rect=TRUE; + } + } + if(selection(&_rct_sel,last_pnt)) + { + is_rect=TRUE; + sel=TRUE; + } + else + { + is_rect=FALSE; + deselection(); //deseleziono i controlli + _rct_sel.left=ep->v.mouse.where.h; //si definisce la posizione iniziale + _rct_sel.top=ep->v.mouse.where.v; + first_move=TRUE; //per dire se esiste un rubber rect + } + xvt_win_trap_pointer(win); //arresta tutti gli altri possibili eventi + } + break; + case E_MOUSE_MOVE: + last_pnt=ep->v.mouse.where; + if(!down) //non ho premuto down percio' non disegno + { + bool in_rct = selection(&_rct_sel,last_pnt); + xvt_win_set_cursor(win, in_rct ? CURSOR_PLUS : CURSOR_ARROW); + is_rect = in_rct; + return ; + } + if(!selection(&_rct_sel,last_pnt)) + { + if(!is_rect) { + if(!first_move) + rubber_rect(win,&_rct_sel,last_pnt); //cancella il vecchio rettangolo + first_move=FALSE; //risetto solamente + _rct_sel.right=ep->v.mouse.where.h; //disegno il nuovo rettangolo->rinnova sempre + _rct_sel.bottom=ep->v.mouse.where.v; //le coordinate finali per disegnarlo mentre si muove il mouse + rubber_rect(win,&_rct_sel,last_pnt); + } + } + break; + case E_MOUSE_UP: + DRAW_CTOOLS t; + posfin=ep->v.mouse.where; + if(sel) + { + move(&_rct_sel,posinz,posfin); + force_update(); + sel=FALSE; + } + else + { + if(posinz.h==posfin.h && posinz.v==posfin.v) + inizialition(); + if(!first_move) + rubber_rect(win,&_rct_sel,last_pnt); //cancella il rubber rettangolo + if(!xvt_rect_is_empty(&_rct_sel)) + { + if(!search(&_rct_sel)) + { + inizialition(); + deselection(); + } + else is_rect=TRUE; + } + xvt_win_set_cursor(win, CURSOR_ARROW); + xvt_win_release_pointer(); //rilascia gli eventi + } + down=FALSE; + xvt_app_get_default_ctools(&t); //per eliminare la modalità M_XOR + xvt_dwin_set_draw_ctools(win,&t); + break; + } +} + +//Converte da pixel a caratteri +PNT& TEditMask_window::logic(const PNT& p, bool& intool) +{ + RCT r; PNT pnt; + const int MAXX=640; + + xvt_vobj_get_client_rect(win(), &r); //client_area + const int width = r.right; + + int x = p.h; + if (width > MAXX) + { + const int dim = (width - MAXX) / 2; + x -= dim; + } + + pnt.h = x < 2*CHARX ? 0 : x/CHARX-1; + pnt.v = p.v/ROWY; + +/* Scommentare quando verranno inseriti i tab buttons + if (_tool && _total_page > 1) + { + if (pnt.v > 0) + pnt.v--; + } +*/ + + if (_tool && pnt.v > _y_tool) + { + pnt.v -= _y_tool; + intool = TRUE; + } + else + intool = FALSE; + + return pnt; +} + +//Gestisce gli eventi +void TEditMask_window::handler(WINDOW win, EVENT *ep) +{ + static bool down=FALSE; + + switch (ep->type) + { + case E_MOUSE_DOWN: + { + _controllo=search(ep->v.mouse.where); + if(_controllo && _controllo->type()=="SPREADSHEET ") + { + _controllo->set_hismask(TRUE); + _idsheet=_controllo->get_idsheet(); + } + if(ep->v.mouse.button==1) + { + if (_controllo) + { + KEY k = _controllo->main_loop(); + if (k == K_DEL) + destroy_control(_controllo); + } + else + main_loop(); + update(); + break; + } + } + case E_MOUSE_UP: + case E_MOUSE_MOVE: + { + TString80 s; + const PNT& p = ep->v.mouse.where; + bool intool; + const PNT pnt=logic(p, intool); + s.format("Coordinate:%3d,%3d", pnt.h , pnt.v); + xvt_statbar_set(s); + if(win) + selected_crt(win,ep); + } + break; + case E_CHAR: + { + TString16 p; + o_key(e_char_to_key(ep)); + p.format("Pag.%d",_page); + xvt_statbar_set(p); + set_caption(_name.row(_page)); + } + break; + default: + break; + } + TWindow::handler(win, ep); +} + +//Aggiunge un controllo tipo STRING +TEditMask_control* TEditMask_window::addstring() +{ + TEditMask_string* c=new TEditMask_string(this); + _controls.add(c); + c->update(); + return c; +} + +//Aggiunge un controllo tipo NUMBER +TEditMask_control* TEditMask_window::addnumber() +{ + TEditMask_number* c=new TEditMask_number(this); + _controls.add(c); + c->update(); + return c; +} + +//Aggiunge un controllo tipo CURRENCY +TEditMask_control* TEditMask_window::addcurrency() +{ + TEditMask_currency* c=new TEditMask_currency(this); + _controls.add(c); + c->update(); + return c; +} + +//Aggiunge un controllo tipo DATE +TEditMask_control* TEditMask_window::adddate() +{ + TEditMask_date* c=new TEditMask_date(this); + _controls.add(c); + c->update(); + return c; +} + +//Aggiunge un controllo tipo BOOLEAN +TEditMask_control* TEditMask_window::addboolean() +{ + TEditMask_boolean* c=new TEditMask_boolean(this); + _controls.add(c); + c->update(); + return c; +} + +//Aggiunge un controllo tipo TEXT +TEditMask_control* TEditMask_window::addtext() +{ + TEditMask_text* c=new TEditMask_text(this); + _controls.add(c); + c->update(); + return c; +} + +//Aggiunge un controllo tipo BUTTON +TEditMask_control* TEditMask_window::addbutton() +{ + TEditMask_button* c=new TEditMask_button(this); + _controls.add(c); + c->update(); + return c; +} + +//Aggiunge un controllo tipo GROUP +TEditMask_control* TEditMask_window::addgroup() +{ + TEditMask_group* c=new TEditMask_group(this); + _controls.add(c); + c->update(); + return c; +} + +//Aggiunge un controllo tipo RADIOBUTTON +TEditMask_control* TEditMask_window::addradio() +{ + TEditMask_radio* c=new TEditMask_radio(this); + _controls.add(c); + c->update(); + return c; +} + +//Aggiunge un controllo tipo MEMO +TEditMask_control* TEditMask_window::addmemo() +{ + TEditMask_memo* c=new TEditMask_memo(this); + _controls.add(c); + c->update(); + return c; +} + +//Aggiunge un controllo tipo ZOOM +TEditMask_control* TEditMask_window::addzoom() +{ + TEditMask_zoom* c=new TEditMask_zoom(this); + _controls.add(c); + c->update(); + return c; +} + +//Aggiunge un controllo tipo SPREADSHEET +TEditMask_control* TEditMask_window::addsheet() +{ + TEditMask_sheet* c=new TEditMask_sheet(this); + _controls.add(c); + c->update(); + return c; +} + +//Aggiunge un controllo tipo LISTBOX +TEditMask_control* TEditMask_window::addlist() +{ + TEditMask_list* c=new TEditMask_list(this); + _controls.add(c); + c->update(); + return c; +} + +//Aggiunge un controllo generico(esplicitato da m) +void TEditMask_window::add_control(MENU_TAG m) +{ + TEditMask_control* ctl=NULL; + TEditMask_window* w=this; + bool is_sheet = get_sheet() != NULL; + + for(int i=0;i<_controls.items() ;i++) + { + TEditMask_control& sp = (TEditMask_control&)_controls[i]; + if(sp.type()=="SPREADSHEET " && _page==sp.page() && sp.get_hismask()) + { + w =find_sheet(_idsheet)->figlio(); + is_sheet= TRUE; + w->set_focus(); + sp.set_hismask(FALSE); + break; + } + else w = this; + } + + switch(m) + { + case MENU_ITEM(31): w->addbutton(); break; + case MENU_ITEM(32): w->addboolean(); break; + case MENU_ITEM(33): w->addcurrency(); break; + case MENU_ITEM(34): w->adddate(); break; + case MENU_ITEM(35): w->addgroup(); break; + case MENU_ITEM(36): w->addlist(); break; + case MENU_ITEM(37): w->addmemo(); break; + case MENU_ITEM(38): w->addnumber(); break; + case MENU_ITEM(39): w->addradio(); break; + case MENU_ITEM(311): w->addstring(); break; + case MENU_ITEM(312): w->addtext(); break; + case MENU_ITEM(313): w->addzoom(); break; + case MENU_ITEM(310): + if (!is_sheet) { + ctl = w->addsheet(); + _nsheet++; + ctl->set_idsheet(_nsheet); + } + break; + default: + break; + } +} + +//Setta la "maschera" a seconda della presenza o no della tool +void TEditMask_window::set_toolbar(bool tb) +{ + TToken_string& it=(TToken_string&)_name.row(_page); + + if (tb != _tool || !tb) + { + xvt_vobj_destroy(win()); + do_events(); + _tool = tb; + + if (tb) + create(0,0,0,0,it,0,W_PLAIN); + else + { + create(_coordx,_coordy,_lung,_alt,it,WSF_SIZE,W_DOC); + } + open(); + set_font(); + for(int i=0; i<_controls.items(); i++) + { + TEditMask_control& up=(TEditMask_control& )_controls[i]; + up.resize_rect(); + up.update(); + } + } +} + +//Fa l'update della "maschera" +void TEditMask_window::update() +{ + RCT r={_rt.top,0,_rt.bottom,_rt.right}; + + xvt_dwin_clear(win(), MASK_BACK_COLOR); + + if(_tool) { + set_pen(MASK_LIGHT_COLOR); + set_brush(MASK_BACK_COLOR); + _rt=::resize_rect(0,_y_tool,0,0,W_DOC,win()); + line(0,_rt.top,_rt.right,_rt.top); + set_pen(TOOL_BACK_COLOR); + line(0,_rt.top-2,_rt.right-2,_rt.top-2); + set_pen(COLOR_BLACK); + line(0,_rt.top-1,_rt.right-1,_rt.top-1); + hide_brush(); + } + + for(int i=0; i<_controls.items(); i++) + { + _controls.pack(); + TEditMask_control& up=(TEditMask_control& )_controls[i]; + PNT p={up.rectangle().top,up.rectangle().left}; + if(up.page()==_page && up.flag_crt()!=1) + up.update(); + if(xvt_rect_has_point(&r,p) != 0) + up.update(); + } +} + +//Setta i campi della maschera di supporto della "maschera" +void TEditMask_window::set_mask(TMask& m) +{ + + m.set(F_PAG,_page); + m.set(F_TOOL,_tool ? "X" : " "); + m.set(F_TYPE,_type_vz); + m.set(F_X,_coordx); + m.set(F_Y,_coordy); + m.set(F_LG,_alt); + m.set(F_LN,_lung); + m.set(F_TOTALP,_total_page); + m.set(F_TOOLY,_y_tool); +} + +//Legge dalla maschera di supporto i campi +void TEditMask_window::get_mask(TMask& m) +{ + _type_vz=m.get(F_TYPE); + _coordx=m.get_int(F_X); + _coordy=m.get_int(F_Y); + _alt=m.get_int(F_LG); + _lung=m.get_int(F_LN); + _y_tool=m.get_int(F_TOOLY); + + if(_type_vz==("a")) + _coordx=_coordy=-1; + + set_toolbar(m.get_bool(F_TOOL)); +} + +//Legge da file .uml solo i controlli +void TEditMask_window::read_control(TScanner& scanner,const TString& k, bool intool) //aggiunge i controlli +{ + TEditMask_control* ctl=NULL; + + if (k == "ST") ctl = addstring(); + if (k == "NU") ctl = addnumber(); + if (k == "CU") ctl = addcurrency(); + if (k == "DA") ctl = adddate(); + if (k == "BO") ctl = addboolean(); + if (k == "TE") ctl = addtext(); + if (k == "BU") ctl = addbutton(); + if (k == "LI") ctl = addlist(); + if (k == "ME") ctl = addmemo(); + if (k == "ZO") ctl = addzoom(); + if (k == "GR") ctl = addgroup(); + if (k == "SP") + { + ctl = addsheet(); + _nsheet++; + ctl->set_idsheet(_nsheet); + } + if (k == "RA") ctl = addradio(); + + if(ctl) ctl->read_from(scanner, intool); + /* else + warning_box("Ce sta' un campo un po' strano.. AGGIORNAMI!! "); */ +} + +//Legge da file .uml solo le proprietà della pagina +void TEditMask_window::read_page(TScanner& scanner, int pg,bool tool) +{ + if(!tool) + _name.add("Maschera",0); + _page=_total_page=pg; + _name.add(scanner.string(),_page); + set_caption(_name.row(_page)); + _coordx=scanner.integer(); _coordy=scanner.integer(); + _lung=scanner.integer(); _alt=scanner.integer(); + if(!tool) set_toolbar(FALSE); +} + +//Legge da file .uml solo la toolbar +bool TEditMask_window::read_tool(TScanner& scanner) +{ + TString s; + + _name.add(scanner.string(),0); + set_toolbar(TRUE); + scanner.rectangle(_rt); + _y_tool=_rt.top; + s=scanner.pop(); + while(s!="ENDPAGE") + { + read_control(scanner,scanner.key(), TRUE); + s=scanner.pop(); + } + + return TRUE; +} + +//Gestisce la lettura da file .uml della "maschera" +void TEditMask_window::restore_mask(const char* filename) +{ + int pg=0,sh=0; + TString in; + bool tool=FALSE, endpage=FALSE; + _file=filename; + _file.lower(); + TScanner scanner(_file); + TEditMask_window* w=this; + + in=scanner.pop(); + + if(scanner.ok()) + { + while(!scanner.eof()) + { + for(int i=-1; i<_nsheet; i++) + { + if(_nsheet!=0) + { + pg=0; sh++; + tool=FALSE; + in=scanner.pop(); + w=find_sheet(sh)->figlio(); + } + while (in!="ENDMASK") + { + while(in!="ENDPAGE") + { + if(in =="TOOLBAR") + { + tool=w->read_tool(scanner); + in=scanner.pop(); + } + if(in =="PAGE") + { + pg++; w->read_page(scanner,pg,tool); + in=scanner.pop(); + while(in!="ENDPAGE") + { + w->read_control(scanner,scanner.key()); + in=scanner.pop(); + } + endpage=TRUE; + } + if(!endpage) in=scanner.pop(); + } + in=scanner.pop(); + } + } + in=scanner.pop(); + } + } + endpage=tool=FALSE; +} + +//Salva come.. la "maschera" su file .uml +void TEditMask_window::save_as_mask() +{ + FILE_SPEC fs; memset(&fs, 0, sizeof(FILE_SPEC)); + strcpy(fs.type,"UML"); + strcpy(fs.creator, "ba2"); + xvt_fsys_get_default_dir(&fs.dir); + + if (xvt_dm_post_file_save(&fs, "Salva con nome:")== FL_OK) + { + xvt_fsys_set_dir(&fs.dir); + _file=fs.name; + create_file(); + create_fileh(); + } else return; +} + +//Risalva la "maschera" su file .uml +void TEditMask_window::save_mask() +{ + create_file(); + create_fileh(); +} + +//Visualizza i controlli della "maschera" dello spreadsheet corrente +void TEditMask_window::vision_sp_ctl() +{ + TEditMask_window* w=this; + for(int i=0;i<_controls.items() ;i++) + { + TEditMask_control& sp = (TEditMask_control&)_controls[i]; + if(sp.type()=="SPREADSHEET " && _page==sp.page()) + { + w =sp.figlio(); + w->vision_ctrl(); + } + } +} + +//Visualizza la "maschera" relativa allo spreadsheet corrente +void TEditMask_window::vision_spread() +{ + TEditMask_window* w=this; + for(int i=0;i<_controls.items() ;i++) + { + TEditMask_control& sp = (TEditMask_control&)_controls[i]; + if(sp.type()=="SPREADSHEET " && _page==sp.page()) + { + w =sp.figlio(); + w->set_focus(); + } + } +} + +//Visualizza tutti i controlli presenti nella pagina corrente +void TEditMask_window::vision_ctrl() +{ + TArray_sheet elenco(-1,-1,76,20,"Elenco dei controlli","Tipo@15|Identificativo@15|Prompt@25|Pagina@8|Flags@10", 0x4); + + for(int i=0;i<_controls.items() ;i++) + { + TEditMask_control& e = (TEditMask_control&)_controls[i]; + if(_page==e.page()) + { + TToken_string* ts = new TToken_string(80); + ts->add(e.type()); + ts->add(e.ident()); + ts->add(e.prt()); + ts->add(e.page()); + ts->add(e.flag()); + elenco.add(ts); + } + } + KEY k = elenco.run(); + if (k == K_ENTER || k == K_DEL) + { + TEditMask_control& e = (TEditMask_control&)_controls[(int)elenco.selected()]; + if (k == K_ENTER) + k = e.main_loop(); + if (k == K_DEL) + destroy_control(&e); + force_update(); + } +} + +//Gestisce la maschera di supporto della "maschera" +KEY TEditMask_window::main_loop() +{ + TMask _mask("ba2600s"); + TString name; + + set_mask(_mask); + for(int k=0;k<=_total_page;k++) + if(_page==k) + _mask.set(F_PRT,_name.row(k)); + + KEY key=_mask.run(); + + if(key==K_ENTER) { + + _page=_mask.get_int(F_PAG); + max_page(_page); + _name.add(_mask.get(F_PRT),_page); + _name.pack(); + get_mask(_mask); + } + + return key; +} + + +//////////////////////////////////////////////////////////////////////// +// TMaskEditor_application :classe per la gestione dell'applicazione +//////////////////////////////////////////////////////////////////////// + +//Richiama +bool TMaskEditor_application::create() +{ + return TApplication::create(); +} + +//Richiama +bool TMaskEditor_application::destroy() +{ + destroy_window(); + return TApplication::destroy(); +} + +//Distrugge la finestra("maschera") presente +void TMaskEditor_application::destroy_window() +{ + if(_window) + { + do_events(); + delete _window; + _window=NULL; + } +} + +//Crea una nuova finestra("maschera") +void TMaskEditor_application::new_mask() +{ + destroy_window(); + + _window = new TEditMask_window(-1,-1,78,20,"Maschera", WSF_SIZE,W_DOC); + _window->open(); + _dirty = TRUE; + +} + +//Apre una "maschera" +void TMaskEditor_application::open_mask() +{ + + TFilename in; + + if (_dirty && !_save && yesno_box("Salvare la maschera corrente?") == K_YES) + save_as_mask(); + + _dirty = _save = FALSE; + destroy_window(); + + FILE_SPEC fs; + memset(&fs, 0, sizeof(FILE_SPEC)); + strcpy(fs.type, "UML"); + strcpy(fs.name, ""); + strcpy(fs.creator, "ba2"); + xvt_fsys_get_default_dir(&fs.dir); + if (xvt_dm_post_file_open(&fs, "Apri file:") == FL_OK) //apre solo virtualmente + { + xvt_fsys_set_dir(&fs.dir); + in=fs.name; + in.lower(); + } + else return; + + if(!in.exist()) { + xvt_dm_post_error("Il file non può essere aperto... non esiste!"); + return; + } + else + { + destroy_window(); + _window = new TEditMask_window(-1,-1,68,16,"Maschera", WSF_SIZE,W_DOC); + _save=TRUE; + _window->set_mod(FALSE); + _window->open(); + _window->restore_mask(fs.name); + _window->force_update(); + } +} + +//Risalva la "maschera" +void TMaskEditor_application::save_mask() +{ + _window->save_mask(); +} + +//Salva come.. la "maschera" +void TMaskEditor_application::save_as_mask() +{ + _save=TRUE; + _window->save_as_mask(); +} + +//Aggiunge un controllo scelto da menu +void TMaskEditor_application::add_control(MENU_TAG m) +{ + _window->set_mod(TRUE); + _window->add_control(m); +} + +//Copia i controlli selezionati +void TMaskEditor_application::copy_crt_sel() +{ + _window->copy_crt_sel(); +} + +//Cancella i controlli selezionati +void TMaskEditor_application::erase_crt_sel() +{ + _window->erase_crt_sel(); +} + +//Sposta in un'altra pagina i controlli selezionati +void TMaskEditor_application::move_crt_sel() +{ + _window->move_crt_sel(); +} + +//Permette di compilare la "maschera" creata +void TMaskEditor_application::build() +{ + TString app; + if(!_window->filename().empty()) + { + app<<"mskcomp.bat " << _window->filename(); + TExternal_app compile(app); + compile.run(); + } + else + save_as_mask(); +} + +void TMaskEditor_application::execute() +{ + TString app; + if(!_window->filename().empty()) + { + TFilename name=_window->filename(); + name.ext(""); + app<<"ba3 -3 " << name; + TExternal_app exe(app); + exe.run(); + } + else + save_as_mask(); +} + +//Visualizza i controlli presenti nella pagina corrente +void TMaskEditor_application::vision_ctrl() +{ + _window->vision_ctrl(); +} + +//Visualizza la "maschera" dello spreadsheet corrente +void TMaskEditor_application::vision_spread() +{ + _window->vision_spread(); +} + +//Visualizza i controllo della "maschera" dello spreadsheet corrente +void TMaskEditor_application::vision_sp_ctl() +{ + _window->vision_sp_ctl(); +} + +//Gestisce le scelte da menu +bool TMaskEditor_application::menu(MENU_TAG m) +{ + switch (m) + { + case MENU_ITEM(11): // Nuovo... + { + _save=FALSE; + new_mask(); + } + break; + case MENU_ITEM(12): // Apri... + open_mask(); + break; + case MENU_ITEM(13): // Salva... + if(_window) + { + _window->deselection(); + _window->inizialition(); + if(_save) + save_mask(); + else save_as_mask(); + } + break; + case MENU_ITEM(14): // Salva con nome + if(_window) + { + _window->deselection(); + _window->inizialition(); + save_as_mask(); + } + break; + case MENU_ITEM(21): // Copia i controlli selezionati + if(_window) + copy_crt_sel(); + break; + case MENU_ITEM(22): // Elimina i controlli selezionati + if(_window) + erase_crt_sel(); + break; + case MENU_ITEM(23): // Sposta i controlli selezionati in un'altra pagina + if(_window) + move_crt_sel(); + break; + //Aggiunge controlli alla maschera + case MENU_ITEM(31): //bottone + case MENU_ITEM(32): //checkbox + case MENU_ITEM(33): //currency + case MENU_ITEM(34): //data + case MENU_ITEM(35): //group + case MENU_ITEM(36): //lista + case MENU_ITEM(37): //memo + case MENU_ITEM(38): //radio_bottoni + case MENU_ITEM(39): //number + case MENU_ITEM(310): //spreadsheet + case MENU_ITEM(311): //stringa + case MENU_ITEM(312): //text + case MENU_ITEM(313): //zoom + if(_window) + { + _window->deselection(); + _window->inizialition(); + add_control(m); + } + break; + case MENU_ITEM(41): // Visualizza controlli di pag. + if(_window) + { + _window->deselection(); + _window->inizialition(); + vision_ctrl(); + } + break; + case MENU_ITEM(42): // Visualizza mask di spread + if(_window) + { + _window->deselection(); + _window->inizialition(); + vision_spread(); + } + break; + case MENU_ITEM(43): // Visualizza controlli di mask di spread + if(_window) + { + _window->deselection(); + _window->inizialition(); + vision_sp_ctl(); + } + break; + case MENU_ITEM(51): // Fa la compilazione della maschera + if(_window) + { + _window->deselection(); + _window->inizialition(); + build(); + } + break; + case MENU_ITEM(52): // Fa l'esecuzione della maschera + if(_window) + { + _window->deselection(); + _window->inizialition(); + execute(); + } + break; + default: + break; + } + return TRUE; +} + +//int main(int argc, char* argv[]) +int ba2600(int argc, char* argv[]) +{ + TMaskEditor_application a; + a.run(argc, argv, "Editor di maschere"); + return 0; +} diff --git a/ba/ba2600.h b/ba/ba2600.h new file mode 100755 index 000000000..3d2b66423 --- /dev/null +++ b/ba/ba2600.h @@ -0,0 +1,889 @@ +//EDITOR DI MASCHERE: applicazione di supporto alla creazione di maschere + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +//inclusione degli identificatori delle maschere di supporto +#include "ba2600b.h" //per i controlli +#include "ba2600a.h" //per la maschera + +class TEditMask_control; +class TEditMask_sheet; + +//-------------------------------------------------------------------- +// Classe TEditMask_window: classe per la definizione della "maschera" +//-------------------------------------------------------------------- +class TEditMask_window : public TWindow +{ + // @cmember:(INTERNAL) Array di controlli + TArray _controls; + // @cmember:(INTERNAL) Puntatore alla classe di definizione dei controlli + TEditMask_control* _controllo; + // @cmember:(INTERNAL) Puntatore alla classe di definizione del controllo spreadsheet + TEditMask_sheet* _sheet; + // @cmember:(INTERNAL) Nomi delle pagine della "maschera" + TString_array _name; + // @cmember:(INTERNAL) Presenza(TRUE) della toolbar + bool _tool; + // @cmember:(INTERNAL) Modalità di lettura(FALSE) o creazione(TRUE) della "maschera" + bool _mode; + // @cmember:(INTERNAL) Definizione del tipo di visualizzazione ("a"->centrata|"b"->personalizzata) + TString _type_vz; + // @cmember:(INTERNAL) Pagina della "maschera" + int _page; + // @cmember:(INTERNAL) Coordinata X + int _coordx; + // @cmember:(INTERNAL) Coordinata Y + int _coordy; + // @cmember:(INTERNAL) Dimensione: altezza + int _alt; + // @cmember:(INTERNAL) Dimensione :lunghezza + int _lung; + // @cmember:(INTERNAL) Coordinata Y della toolbar + int _y_tool; + // @cmember:(INTERNAL) Totale pagine + int _total_page; + // @cmember:(INTERNAL) Numero degli sheet presenti(settaggio nella lettura) + int _nsheet; + // @cmember:(INTERNAL) Identificativo dello sheet in considerazione + int _idsheet; + // @cmember:(INTERNAL) Rettangolo di definizione della toolbar + RCT _rt; + // @cmember:(INTERNAL) Rettangolo di definizione della selezione + RCT _rct_sel; + // @cmember:(INTERNAL) File .uml + TFilename _file; + +protected: + + // @cmember Permette(in una maschera di supporto) il settaggio e la lettura + // dei campi di definizione della "maschera" + KEY main_loop(); + +public: + // @cmember Aggiunge un controllo di tipo m all'array _controls + void add_control(MENU_TAG m); + // @cmember Aggiunge un controllo di tipo string + TEditMask_control* addstring(); + // @cmember Aggiunge un controllo di tipo number + TEditMask_control* addnumber(); + // @cmember Aggiunge un controllo di tipo currency + TEditMask_control* addcurrency(); + // @cmember Aggiunge un controllo di tipo button + TEditMask_control* addbutton(); + // @cmember Aggiunge un controllo di tipo date + TEditMask_control* adddate(); + // @cmember Aggiunge un controllo di tipo boolean + TEditMask_control* addboolean(); + // @cmember Aggiunge un controllo di tipo text + TEditMask_control* addtext(); + // @cmember Aggiunge un controllo di tipo groupbox + TEditMask_control* addgroup(); + // @cmember Aggiunge un controllo di tipo radiobutton + TEditMask_control* addradio(); + // @cmember Aggiunge un controllo di tipo memo + TEditMask_control* addmemo(); + // @cmember Aggiunge un controllo di tipo zoom + TEditMask_control* addzoom(); + // @cmember Aggiunge un controllo di tipo spreadsheet + TEditMask_control* addsheet(); + // @cmember Aggiunge un controllo di tipo list + TEditMask_control* addlist(); + // @cmember Fa una copia dei controlli selezionati + void copy_crt_sel(); + // @cmember Distrugge un controllo con "Elimina" della maschera di supporto + void destroy_control(TEditMask_control* c); + // @cmember Cancella i controlli selezionati + void erase_crt_sel(); + // @cmember Sposta i controlli selezionati nella pagina richiesta + void move_crt_sel(); + // @cmember Ritorna la pagina corrente + int page() { return _page;} + // @cmember Setta il punatatore alla classe del controllo spreadsheet + void set_sheet(TEditMask_sheet* s) { _sheet=s;} + // @cmember Ritorna il puntatore alla classe del controllo spreadsheet + TEditMask_sheet* get_sheet() { return _sheet;} + // @cmember Apri file: ritorna lo spreadsheet corrispondente alla sua maschera + TEditMask_control* find_sheet(int i); + // @cmember Ridisegna il rettangolo di selezione per permettere lo spostamento + bool redesign(RCT* rct,int dx,int dy); + // @cmember Ritorna il controllo avente il punto pnt + TEditMask_control* search(const PNT& pnt); + // @cmember Torna TRUE se sono stati trovati dei controlli selezionati + bool search(RCT* rct); + // @cmember Sposta il o i controllo/i selezionati + void move(RCT* rct,PNT pntinz, PNT pntfin); + // @cmember Deseleziona i controlli selezionati + void deselection(); + // @cmember Inizializza il rettangolo di selezione + void inizialition(); + // @cmember Disegna una linea nella "maschera" + void line(short x0, short y0, short x1, short y1) const; + // @cmember Converte le coordinate da pixel a caratteri + PNT& logic(const PNT& p, bool& intool); + // @cmember Controlla le pagine(devono essere inserite in ordine crescente +1) + int max_page(int pag); + // @cmember Normalizza rettangoli + void normalize_rect(RCT *norm_rctp, RCT*rctp); + // @cmember Risponde all'evento E_CHAR + void o_key(KEY key); + // @cmember Visualizza i controlli presenti nella pagina corrente + void vision_ctrl(); + // @cmember Visualizza la "maschera" relativa allo spreadsheet corrente + void vision_spread(); + // @cmember Visualizza i controlli della "maschera" relativa allo spread corrente + void vision_sp_ctl(); + // @cmember Aggiunge un controllo del tipo string + RCT& resize_rect(short x, short y, short dx, short dy, + WIN_TYPE wt = WO_TE, bool intool = FALSE) const; //ridimensiona controlli + // @cmember Definisce il rettangolo di selezione + void rubber_rect(WINDOW win, RCT*rctp,PNT p); + // @cmember Crea il rettangolo di selezione in risposta agli eventi del mouse + void selected_crt(WINDOW win, EVENT* ep); + // @cmember Definisce l' appartenenza di un punto al rettangolo di selezione + bool selection(RCT* rct,PNT pnt); + // @cmember Setta la modalità della "maschera" + void set_mod(bool m) { _mode=m; } + // @cmember Ritorna la modalità della "maschera" per evitare controlli impropri + bool get_mod() { return _mode; } + // @cmember Ritorna il nome del file + TFilename filename() { return _file; } + // @cmember Salva il file .uml richiama + void create_file(); + // @cmember Salva il file .h + void create_fileh(); + // @cmember Controlla la "maschera" in fase di salvataggio(non sono salvate pagine prive di controlli) + int page_null(int page); + // @cmember Salva la disposizione della "maschera" per il file .uml + void save_page(ostream& out); + // @cmember Apre un file .uml e ricrea la "maschera" + void restore_mask(const char* filename); + // @cmember Legge da file le proprietà delle singole pagine + void read_page(TScanner& scanner, int pg, bool tool); + // @cmember Legge da file le proprietà della toolbar + bool read_tool(TScanner& scanner); + // @cmember Legge da file i controlli presenti in ogni singola pagina + void read_control(TScanner& scanner,const TString& k, bool intool=FALSE); + // @cmember Legge le proprietà della "maschera" da quella di supporto + void get_mask(TMask& m); + // @cmember Gestisce gli eventi + virtual void handler(WINDOW win, EVENT* ep); + // @cmember Setta (con i valori salvati precedentemente) la maschera di supporto + void set_mask(TMask& m); + // @cmember Gestisce la scelta da menu : salva come + void save_as_mask(); + // @cmember Gestisce la scelta da menu : salva + void save_mask(); + // @cmember Crea la "maschera" con o senza toolbar + void set_toolbar(bool tb); + // @cmember Fa l'update della "maschera" + virtual void update(); + // @cmember Costruttore + TEditMask_window(short x,short y,short dx,short dy, + const char*title,long flags, WIN_TYPE wt); + // @cmember Distruttore + ~TEditMask_window() {} + +}; + +//------------------------------------------------------------------------ +// Classe TEditMask_control: definizione della classe base dei controlli +//------------------------------------------------------------------------ +class TEditMask_control : public TObject +{ + // @cmember:(INTERNAL) Puntatore alla classe di definizione della "maschera" + TEditMask_window* _parent; + // @cmember:(INTERNAL) Rettangolo del controllo + RCT _rct; + // @cmember:(INTERNAL) Definizione della selezione di un controllo + bool _selected; + // @cmember:(INTERNAL) Controllo in toolbar + bool _intool; + // @cmember:(INTERNAL) Coordinata X + int _left; + // @cmember:(INTERNAL) Coordinata Y + int _top; + // @cmember:(INTERNAL) Dimensione : lunghezza + int _latox; + // @cmember:(INTERNAL) Dimensione : altezza + int _latoy; + // @cmember:(INTERNAL) Pagina di appartenenza + int _pag; + // @cmember:(INTERNAL) Definizione della priorità del focus sul controllo + int _focus; + // @cmember:(INTERNAL) Campo KEY + TString _key; + // @cmember:(INTERNAL) Tipo di controllo + TString _type_field; + // @cmember:(INTERNAL) Campo FIELD + TString _field; + // @cmember:(INTERNAL) Campo PROMPT + TString _prompt; + // @cmember:(INTERNAL) Identificativo del controllo + TString _id; + // @cmember:(INTERNAL) Campo WARNING + TString _warning; + // @cmember:(INTERNAL) Campo CHECKTYPE + TString _check; + // @cmember:(INTERNAL) Campo FLAGS + TString _flag; + // @cmember:(INTERNAL) Campo GROUP + TString _group; + // @cmember:(INTERNAL) Campo MESSAGE + TString_array _message; + +public: + + // @cmember Setta il campo: CHECKTYPE + const TString& set_check(const TString& ck); + // @cmember Setta le coordinate del controllo + void set_crd(int x, int y); + // @cmember Setta le dimensioni dei controlli + void set_dim(int ln, int lg); + // @cmember Setta i campi principali(_prompt,_pag,_focus,_id,_left,_top) della maschera di supporto + void set_field(TMask& mask); + // @cmember Setta il campo FLAGS + const TString& set_flag(const TString& fl); + // @cmember Setta la priorità del focus + void set_focus(int f) { _focus=f; } + // @cmember Setta il campo GROUP + const TString& set_group(const TString& gr); + // @cmember Setta il numero di riconoscimento degli spreadsheet + virtual void set_idsheet(int n) { } + // @cmember Setta una proprietà degli spreadsheet + virtual void set_hismask(bool b) { } + // @cmember Setta l'identificativo + const TString& set_id(const TString& id); + // @cmember Setta il campo MESSAGE + void set_message(TSheet_field& sp); + // @cmember Setta i campi opzionali(_flag,_group,_warning,_check,_key,_field) della maschera di supporto + void set_option(TMask& mask); + // @cmember Setta la pagina di appartenenza del controllo + void set_page(int p) { _pag=p; } + // @cmember Setta il campo PROMPT + const TString& set_prompt(const TString& prompt); + // @cmember Setta la selezione dei controlli + bool set_selected(bool sl); + // @cmember Setta il tipo di controllo + const TString& set_type(const TString& fld); + // @cmember Ritorna il numero di identificazione dello spreadsheet + virtual int get_idsheet() { return -1;} + // @cmember Ritorna una proprietà dello spreadsheet + virtual bool get_hismask() {return -1; } + // @cmember Legge i campi principali dalla maschera di supporto + void get_field(TMask& mask); + // @cmember Ritorna la priorità del focus + int get_focus() { return _focus; } + // @cmember Legge dalla maschera di supporto il campo MESSAGE + void get_message(TSheet_field& sp); + // @cmember Legge i campi opzionali dalla maschera di supporto + void get_option(TMask& mask); + // @cmember Verifica se un controllo è stato selezionato + bool get_selected() { return _selected; } + // @cmember Stampa su file .uml il campo MESSAGE + void print_message(ostream& out)const; + // @cmember Stampa il file .uml + virtual void print_on(ostream& out) const; + // @cmember Legge il file .uml + virtual void read_from(TScanner& scanner,bool intool) {}; + // @cmember Legge le proprietà comuni(principali e opzionali) da file .uml + void read_field(TScanner& scanner,const TString& tok, bool intool); + // @cmember Intercetta un punto + bool contains(const PNT pnt); + // @cmember Scrive il prompt sul controllo + void frase(short x, short y) const; + // @cmember Nasconde o disabilita un controllo + int flag_crt() const; + // @cmember Disegna una linea sulla "maschera" + void line(short x0, short y0, short x1, short y1) const; + // @cmember Ritorna l'offset(nullo per campi non editabili) + virtual int off()const { return 0; } + // @cmember Ridisegna il controllo per permettere lo spostamento + bool redesign(int dx, int dy); + // @cmember Ridimensiona i controlli richiama + void resize_rect(); + // @cmember Ridimensiona i controlli + RCT& resize_rect(short x, short y, short dx, short dy, WIN_TYPE wt,bool intool=FALSE)const; + // @cmember Ritorna il prompt del controllo + const TString& prt()const { return _prompt; } + // @cmember Ritorna l'identificativo + const TString& ident()const { return _id; } + // @cmember Ritorna il tipo del controllo + const TString& type()const { return _type_field; } + // @cmember Ritorna il campo FLAGS + const TString& flag()const { return _flag; } //ritorna il flags + // @cmember Ritorna la lunghezza del prompt + int prompt_len()const { return _prompt.len();} + // @cmember Ritorna la pagina corrente del controllo + int page() { return _pag;} + // @cmember Ritorna il campo MESSAGE + const TString_array& message()const { return _message;} //ritorna message + // @cmember Definisce la finestra figlio (non NULL solo per spreadsheet) + virtual TEditMask_window* figlio() { return NULL; } + // @cmember Setta,apre,legge la maschera di supporto + virtual KEY main_loop() { return 0;} + // @cmember Definisce il parent + TEditMask_window& padre()const; + // @cmember Definisce la finestra ("maschera") + WINDOW maschera() const { return _parent->win(); } + // @cmember Ritorna il rettangolo del controllo + RCT rectangle()const { return _rct; } + // @cmember Fa l'update del controllo + virtual void update() const {} + // @cmember Duplica il controllo o controlli selezionati + virtual TObject* dup()const { return new TEditMask_control(*this);} + // @cmember Costruttore + TEditMask_control(TEditMask_window* parent); + // @cmember Costruttore. Copia tutte le caratteristiche del controllo + TEditMask_control(const TEditMask_control& ctl); + // @cmember Distruttore + virtual ~TEditMask_control() {} +}; + +//------------------------------------------------------------------------ +// Classe TEditMask_string: definizione della classe per il controllo +// di tipo STRING +//------------------------------------------------------------------------ +class TEditMask_string: public TEditMask_control +{ + // @cmember:(INTERNAL) Lunghezza effettiva del controllo + int _lungsz; + // @cmember:(INTERNAL) Lunghezza a video del controllo + int _lungvd; + // @cmember:(INTERNAL) Offset: spazi terminali del prompt + int _offset; + // @cmember:(INTERNAL) Lunghezza di supporto + int _lngspt; + // @cmember:(INTERNAL) Browse(use,input,join,output,diplay,copy) + TString _use; + // @cmember:(INTERNAL) Add Run + TString _addr; + +public: + // @cmember Ritorna la lunghezza a video + int dim_video()const { return _lungvd;} + // @cmember Controlla la lunghezza in caso di valoti nulli + void error_lung(int lsz, int lvd); + // @cmember Setta i campi relativi ad _use ed _offset sulla maschera di supporto + void set_bwoff(TMask& m); + // @cmember Legge i campi _use e _offset dalla maschera di supporto + void get_bwoff(TMask& m); + // @cmember Legge dalla maschera di supporto le lunghezze + void get_lngz(TMask& m); + // @cmember Setta le lunghezze sulla maschera di supporto + void set_lngz(TMask& m); + // @cmember Setta l'offset + void set_offset(int d); + // @cmember Ritorna l'offset + virtual int off()const { return _offset;} + // @member Fa l'update del controllo + virtual void update() const; + // @member Legge il file .uml + virtual void read_from(TScanner& scanner,bool intool); + // @member Legge da file le lunghezze + void read_lngz(TScanner& scanner); + // @member Legge da file l'offset + int read_off(const TString& prt); + // @member Legge da file la combinazione del browse(use,input,join,output,display,copy) + void read_use(TScanner& scanner,const TString& tok); + // @member Stampa su file la lunghezza + void print_lngz(ostream& out) const; + // @member Stampa su file il browse + void print_use(ostream& out)const; + // @member Stampa il file .uml + virtual void print_on(ostream& out) const; + // @member Setta,apre,legge i campi della maschera di supporto + virtual KEY main_loop(); + // @member Duplica il controllo + virtual TObject* dup()const { return new TEditMask_string(*this);} + // @member Costruttore + TEditMask_string(TEditMask_window* parent); + // @member Costruttore.Copia tutte le caratteristiche del controllo + TEditMask_string(const TEditMask_string& ctl); + // @member Distruttore + virtual ~TEditMask_string() {} +}; + +//------------------------------------------------------------------------ +// Classe TEditMask_number: definizione della classe per il controllo +// di tipo NUMBER +//------------------------------------------------------------------------ +class TEditMask_number: public TEditMask_string +{ + // @cmember:(INTERNAL) Numero di decimali + int _decimals; + // @cmember:(INTERNAL) Lunghezza + int _latox; + // @cmember:(INTERNAL) Campo PICTURE + TString _picture; + +public: + + // @member Setta i decimali + void set_decimal(int d); + // @member Setta il campo PICTURE + const TString& set_picture(const TString& pic); + // @member Legge il file.uml + virtual void read_from(TScanner& scanner, bool intool); + // @member Stampa il file .uml + virtual void print_on(ostream& out) const; + // @member Setta,apre,legge la maschera di supporto + virtual KEY main_loop(); + // @member Duplica il controllo + virtual TObject* dup()const { return new TEditMask_number(*this);}//per duplicare + // @member Costruttore + TEditMask_number(TEditMask_window* parent) ; + // @member Costruttore. Copia tutte le proprietà del controllo + TEditMask_number(const TEditMask_number& ctl); + // @member Distruttore + virtual ~TEditMask_number() {} +}; + +//------------------------------------------------------------------------ +// Classe TEditMask_currency: definizione della classe per il controllo +// di tipo CURRENCY +//------------------------------------------------------------------------ +class TEditMask_currency: public TEditMask_number +{ + // @cmember:(INTERNAL) Dimensione : lunghezza + int _latox; + // @cmember:(INTERNAL) Campo PICTURE + TString _picture; + +public: + + // @member Legge il file .uml + virtual void read_from(TScanner& scanner,bool intool); + // @member Setta,apre,legge la maschera di supporto + virtual KEY main_loop(); + // @member Duplica il controllo + virtual TObject* dup()const { return new TEditMask_currency(*this);}//per duplicare + // @member Costruttore + TEditMask_currency(TEditMask_window* parent) ; + // @member Costruttore. Copia tutte le caratteristiche del controllo + TEditMask_currency(const TEditMask_currency& ctl); + // @member Distruttore + virtual ~TEditMask_currency() {} +}; + +//------------------------------------------------------------------------ +// Classe TEditMask_date: definizione della classe per il controllo +// di tipo DATE +//------------------------------------------------------------------------ +class TEditMask_date: public TEditMask_string +{ +public: + + // @member Legge il file .uml + virtual void read_from(TScanner& scanner,bool intool); + // @member Stampa il file .uml + virtual void print_on(ostream& out) const; + // @member Setta.apre,legge la maschera di supporto + virtual KEY main_loop(); + // @member Duplica il controllo + virtual TObject* dup()const { return new TEditMask_date(*this);}//per duplicare + // @member Costruttore + TEditMask_date(TEditMask_window* parent); + // @member Costruttore. Copia tutte le caratteristiche del controllo + TEditMask_date(const TEditMask_date& ctl); + // @member Distruttore + virtual ~TEditMask_date() {} +}; + +//------------------------------------------------------------------------ +// Classe TEditMask_boolean: definizione della classe per il controllo +// di tipo BOOLEAN +//------------------------------------------------------------------------ +class TEditMask_boolean: public TEditMask_control +{ + +public: + + // @member Duplica il controllo + virtual TObject* dup()const { return new TEditMask_boolean(*this);}//per duplicare + // @member Legge il file .uml + virtual void read_from(TScanner& scanner,bool intool); + // @member Stampa il file .uml + virtual void print_on(ostream& out) const; + // @member Setta,apre,legge la maschera di supporto + virtual KEY main_loop(); + // @member Fa l'update del controllo + virtual void update()const; + // @member Costruttore + TEditMask_boolean(TEditMask_window* parent); + // @member Costruttore. Copia tutte le caratteristiche del controllo + TEditMask_boolean(const TEditMask_boolean& ctl); + // @member Distruttore + virtual ~TEditMask_boolean() {} +}; + +//------------------------------------------------------------------------ +// Classe TEditMask_text: definizione della classe per il controllo +// di tipo TEXT +//------------------------------------------------------------------------ +class TEditMask_text: public TEditMask_string +{ + // @cmember:(INTERNAL) Campo FLAGS + TString _flag; + // @cmember:(INTERNAL) Campo GROUP + TString _group; + +public: + + // @member Duplica il controllo + virtual TObject* dup()const { return new TEditMask_text(*this);} + // @member Legge il file .uml + virtual void read_from(TScanner& scanner,bool intool); + // @member Stampa il file .uml + virtual void print_on(ostream& out) const; + // @member Setta,apre,legge la maschera di supporto + virtual KEY main_loop(); + // @member Fa l'update del controllo + virtual void update() const; + // @member Costruttore + TEditMask_text(TEditMask_window* parent); + // @member Costruttore. Copia tutte le caratteristiche del controllo + TEditMask_text(const TEditMask_text& ctl); + // @member Distruttore + virtual ~TEditMask_text() {} +}; + +//------------------------------------------------------------------------ +// Classe TEditMask_button: definizione della classe per il controllo +// di tipo BUTTON +//------------------------------------------------------------------------ +class TEditMask_button: public TEditMask_control +{ + // @cmember:(INTERNAL) Dimensione : lunghezza + int _latox; + // @cmember:(INTERNAL) Dimensione : altezza + int _latoy; + +public: + + // @member Duplica il controllo + virtual TObject* dup()const { return new TEditMask_button(*this);}//per duplicare + // @member Definisce il tipo standard del controllo + void type_button(const TString& id,const TString& pr); + // @member Stampa il file .uml + virtual void print_on(ostream& out) const; + // @member Legge il file .uml + virtual void read_from(TScanner& scanner,bool intool); + // @member Setta,apre,legge la maschera di supporto + virtual KEY main_loop(); + // @member Fa l'update del controllo + virtual void update()const; + // @member Costruttore + TEditMask_button(TEditMask_window* parent); + // @member Costruttore. Copia tutte le caratteristiche del controllo + TEditMask_button(const TEditMask_button& ctl); + // @member Distruttore + virtual ~TEditMask_button() {} +}; + +//------------------------------------------------------------------------ +// Classe TEditMask_group: definizione della classe per il controllo +// di tipo GROUP +//------------------------------------------------------------------------ +class TEditMask_group: public TEditMask_control +{ + // @cmember:(INTERNAL) Dimensione : lunghezza + int _latox; + // @cmember:(INTERNAL) Dimensione : altezza + int _latoy; + +public: + + // @member Duplica il controllo + virtual TObject* dup()const { return new TEditMask_group(*this);} + // @member Verifica la presenza del flags "R" + bool fl_crt()const ; + // @member Stampa il file .uml + virtual void print_on(ostream& out) const; + // @member Legge il file .uml + virtual void read_from(TScanner& scanner,bool intool); + // @member Setta,apre,legge la maschera di supporto + virtual KEY main_loop(); + // @member Fa l'update del controllo + virtual void update() const; + // @member Costruttore + TEditMask_group(TEditMask_window* parent); + // @member Costruttore. Copia tutte le caratteristiche del controllo + TEditMask_group(const TEditMask_group& ctl); + // @member Distruttore + virtual ~TEditMask_group() {} +}; + +//------------------------------------------------------------------------ +// Classe TEditMask_list: definizione della classe per il controllo +// di tipo LIST +//------------------------------------------------------------------------ +class TEditMask_list: public TEditMask_string +{ + + // @cmember:(INTERNAL) Offset + int _offset; + // @cmember:(INTERNAL) Item + TString_array _item; + // @cmember:(INTERNAL) Numero degli item + int _num_item; + +public: + + // @member Duplica il controllo + virtual TObject* dup()const { return new TEditMask_list(*this);} + // @member Legge dalla maschera di supporto il campo ITEM + void get_item(TSheet_field& sp); + // @member Setta sulla maschera di supporto il campo ITEM + void set_item(TSheet_field& sp); + // @member Stampa il campo ITEM su file .uml + void print_item(ostream& out)const; + // @member Stampa il file .uml + virtual void print_on(ostream& out) const; + // @member Legge il file .uml + virtual void read_from(TScanner& scanner,bool intool); + // @member Legge da file il campo item + TString& read_item(TScanner& scanner,TString& tok); + // @member Setta,apre,legge la maschera di supporto + virtual KEY main_loop(); + // @member Fa l'update del controllo + virtual void update() const; + // @member Disegna parte del controllo(freccia) + void image()const; + // @member Ritorna il numero degli item + int n_item()const { return _num_item;} + // @member Ritorna _item + const TString_array& item()const { return _item;} + // @member Costruttore + TEditMask_list(TEditMask_window* parent); + // @member Costruttore. Copia tutte le caratteristiche del controllo + TEditMask_list(const TEditMask_list& ctl); + // @member Distruttore + virtual ~TEditMask_list() {} +}; + +//------------------------------------------------------------------------ +// Classe TEditMask_radio: definizione della classe per il controllo +// di tipo RADIOBUTTON +//------------------------------------------------------------------------ +class TEditMask_radio: public TEditMask_list +{ + // @cmember:(INTERNAL) Dimensione : lunghezza + int _latox; + // @cmember:(INTERNAL) Dimensione : altezza + int _latoy; + +public: + + // @member Duplica il controllo + virtual TObject* dup()const { return new TEditMask_radio(*this);} + // @member Legge il file .uml + virtual void read_from(TScanner& scanner,bool intool); + // @member Stampa il file .uml + virtual void print_on(ostream& out) const; + // @member Setta,apre,legge la maschera di supporto + virtual KEY main_loop(); + // @member Fa l'update del controllo + virtual void update()const; + // @member Costruttore + TEditMask_radio(TEditMask_window* parent); + // @member Costruttore. Copia tutte le caratteristiche del controllo + TEditMask_radio(const TEditMask_radio& ctl); + // @member Distruttore + virtual ~TEditMask_radio() {} +}; + +//------------------------------------------------------------------------ +// Classe TEditMask_memo: definizione della classe per il controllo +// di tipo MEMO +//------------------------------------------------------------------------ +class TEditMask_memo: public TEditMask_control +{ + // @cmember:(INTERNAL) Dimensione : lunghezza + int _latox; + // @cmember:(INTERNAL) Dimensione : altezza + int _latoy; + +public: + + // @member Duplica il controllo + virtual TObject* dup()const { return new TEditMask_memo(*this);}//per duplicare + // @member Legge il file .uml + virtual void read_from(TScanner& scanner,bool intool); + // @member Stampa il file .uml + virtual void print_on(ostream& out)const; + // @member Setta,apre,legge la maschera di supporto + virtual KEY main_loop(); + // @member Fa l'update del controllo + virtual void update()const; + // @member Costruttore + TEditMask_memo(TEditMask_window* parent); + // @member Costruttore. Copia tutte le caratteristiche del controllo + TEditMask_memo(const TEditMask_memo& ctl); + // @member Distruttore + virtual ~TEditMask_memo() {} +}; + +//------------------------------------------------------------------------ +// Classe TEditMask_sheet: definizione della classe per il controllo +// di tipo SPREADSHEET +//------------------------------------------------------------------------ +class TEditMask_sheet: public TEditMask_control +{ + // @cmember:(INTERNAL) Dimensione : lunghezza + int _latox; + // @cmember:(INTERNAL) Dimensione : altezza + int _latoy; + // @cmember:(INTERNAL) Numero degli item + int _num_item; + // @cmember:(INTERNAL) Identificativo di maschera + int _idsheet; + // @cmember:(INTERNAL) Campo ITEM + TString_array _item; + // @cmember:(INTERNAL) Browse(use,input,join,output,display,copy) + TString _browse; + // @cmember:(INTERNAL) "Maschera" legata allo spreadsheet + TEditMask_window _sheetmask; + // @cmember:(INTERNAL) Permette di aggiungere campi alla "maschera" dello spread + bool _is_mask; + +public: + + // @member Ritorna la "maschera" figlio + virtual TEditMask_window* figlio() { return &_sheetmask; } + // @member Duplica il controllo + virtual TObject* dup()const { return new TEditMask_sheet(*this);} + // @member Setta l'identificativo di maschera + void set_idsheet(int n) { _idsheet=n; } + // @member Ritorna l'identificativo di maschera + int get_idsheet() { return _idsheet; } + // @member Setta la possibiltà di aggiungere controlli alla sua "maschera" + void set_hismask(bool b) { _is_mask=b; } + // @member Ritorna _is_mask + bool get_hismask() { return _is_mask; } + // @member Crea i buttons(conferma,annulla,elimina) per la sua maschera + void window_sheet(); + // @member Setta sulla maschera di supporto i campi ITEM e il browse + void set_itbr(TMask& m,TSheet_field& sp); + // @member Legge dalla maschera di supporto i campi ITEM e browse + void getitbr(TMask& m,TSheet_field& sp); + // @member Stampa su file.uml il browse(use,input,join,output,display,copy) + void print_browse(ostream& out)const; + // @member Stampa su file.uml il campo ITEM + void print_item(ostream& out)const; + // @member Stampa il file .uml + virtual void print_on(ostream& out)const; + // @member Legge da file il campo _item + TString& read_item(TScanner& scanner,TString& tok); + // @member Legge da file il campo relativo a browse + void read_browse(TScanner& scanner,const TString& tok); + // @member Legge il file .uml + virtual void read_from(TScanner& scanner,bool intool); + // @member Setta,apre,legge la maschera di supporto + virtual KEY main_loop(); + // @member Fa l'update del controllo + virtual void update() const; + // @member Costruttore + TEditMask_sheet(TEditMask_window* parent); + // @member Costruttore. Copia tutte le caratteristiche del controllo + TEditMask_sheet(const TEditMask_sheet& ctl); + // @member Distruttore + virtual ~TEditMask_sheet() {} +}; + +//------------------------------------------------------------------------ +// Classe TEditMask_zoom: definizione della classe per il controllo +// di tipo ZOOM +//------------------------------------------------------------------------ +class TEditMask_zoom: public TEditMask_list +{ + // @cmember:(INTERNAL) Dimensione : lunghezza + int _latox; + // @cmember:(INTERNAL) Offset + int _offset; + +public: + + // @member Duplica il controllo + virtual TObject* dup()const { return new TEditMask_zoom(*this);} + // @member Legge il file .uml + virtual void read_from(TScanner& scanner,bool intool); + // @member Stampa il file .uml + virtual void print_on(ostream& out) const; + // @member Setta,apre,legge la maschera di supporto + virtual KEY main_loop(); + // @member Costruttore + TEditMask_zoom(TEditMask_window* parent); + // @member Costruttore. Copia tutte le caratteristiche del controllo + TEditMask_zoom(const TEditMask_zoom& ctl); + // @member Distruttore + virtual ~TEditMask_zoom() {} +}; + + +//------------------------------------------------------------------------- +// CLASSE TEDITMASK_APPLICATION: classe per l'esecuzione dell'applicazione +//------------------------------------------------------------------------- +class TMaskEditor_application : public TApplication +{ + // @cmember:(INTERNAL) Puntatore alla finestra("maschera")corrente + TEditMask_window * _window; + // @cmember:(INTERNAL) Esistenza di una finestra + bool _dirty; + // @cmember:(INTERNAL) Se la "maschera" è stata salvata + bool _save; + +protected: + // @cmember Richiama + virtual bool create(); + // @cmember Richiama + virtual bool destroy(); + // @cmember Gestisce le scelte da menu + virtual bool menu(MENU_TAG); + +public: + + // @cmember Visualizza la maschera dello spreadsheet della pagina corrente + void vision_spread(); + // @cmember Visualizza i controlli della pagina corrente + void vision_ctrl(); + // @cmember Visualizza i controlli della maschera dello spreadsheet corrente + void vision_sp_ctl(); + // @cmember Distrugge la "maschera" + void destroy_window(); + // @cmember Crea una nuova "maschera" + void new_mask(); + // @cmember Apre una "maschera" già predefinita + void open_mask(); + // @cmember Salva come..la "maschera" su file .uml + void save_as_mask(); + // @cmember Risalva la "maschera" su file .uml + void save_mask(); + // @cmember Aggiunge un controllo + void add_control(MENU_TAG m); + // @cmember Copia i controlli selezionati + void copy_crt_sel(); + // @cmember Cancella i controlli selezionati + void erase_crt_sel(); + // @cmember Sposta in un'altra pagina i controlli selezionati + void move_crt_sel(); + // @cmember Permette di compilare la "maschera" creata con l'applicazione + void build(); + // @cmember Permette di eseguire la "maschera" creata con l'applicazione + void execute(); + // @cmember Costruttore + TMaskEditor_application() { _window = NULL; _dirty = FALSE; _save=FALSE; } + // @cmember Distruttore + virtual ~TMaskEditor_application() {} +}; diff --git a/ba/ba2600a.h b/ba/ba2600a.h new file mode 100755 index 000000000..874bc21e0 --- /dev/null +++ b/ba/ba2600a.h @@ -0,0 +1,14 @@ +#define F_PRT 101 +#define F_Y 102 +#define F_LN 103 +#define F_X 104 +#define F_LG 105 +#define F_PAG 106 +#define F_TOTALP 107 +#define F_TYPE 108 +#define F_TOOL 109 +#define F_TOOLX 110 +#define F_TOOLY 111 +#define F_TOOLH 112 +#define F_TOOLW 113 +#define F_NAME 114 diff --git a/ba/ba2600b.h b/ba/ba2600b.h new file mode 100755 index 000000000..14c1bfccd --- /dev/null +++ b/ba/ba2600b.h @@ -0,0 +1,25 @@ +#define F_PROMPT 101 +#define F_UPPER 102 +#define F_LONGEFF 103 +#define F_FIELD 104 +#define F_FLAG 105 +#define F_REAL 106 +#define F_DECIMAL 107 +#define F_PICTURE 108 +#define F_LEFT 109 +#define F_OFFSET 110 +#define F_LARGE 111 +#define F_PAGE 112 +#define F_GROUP 113 +#define F_CHECK 114 +#define F_WARNING 115 +#define F_MESSAGE 116 +#define F_ADDR 117 +#define F_KEY 118 +#define F_USE 119 +#define F_IDENT 120 +#define F_ITEM 121 +#define F_LONGEVD 122 +#define F_VAR 123 +#define F_FOCUS 124 +#define F_INTOOL 125 diff --git a/ba/ba2600d.uml b/ba/ba2600d.uml new file mode 100755 index 000000000..9fe2832f8 --- /dev/null +++ b/ba/ba2600d.uml @@ -0,0 +1,230 @@ +#include "ba2600b.h" + +TOOLBAR "" 0 20 0 0 + +BUTTON DLG_OK 10 2 + BEGIN + PROMPT -13 -1 "" + END + +BUTTON DLG_CANCEL 10 2 + BEGIN + PROMPT -23 -1 "" + END + +BUTTON DLG_DELREC 10 2 + BEGIN + PROMPT -33 -1 "" + END + +ENDPAGE + +PAGE "Spreadsheet" -1 -1 78 20 + +TEXT DLG_NULL + BEGIN + PROMPT 3 1 "E' possibile personalizzare la struttura del campo spreadsheet" + END + +GROUPBOX DLG_NULL -1 7 + BEGIN + PROMPT 2 2 "" + GROUP 1 + END + +STRING F_PROMPT 60 25 + BEGIN + PROMPT 3 4 "Prompt: " + GROUP 1 + END + +NUMBER F_OFFSET 5 + BEGIN + PROMPT 48 4 "Offset: " + FLAGS "H" + END + +NUMBER F_LEFT 5 + BEGIN + PROMPT 3 6 "Coordinata X: " + GROUP 1 + END + +NUMBER F_UPPER 5 + BEGIN + PROMPT 42 6 "Coordinata Y: " + GROUP 1 + END + +GROUPBOX DLG_NULL -1 7 + BEGIN + PROMPT 2 8 "" + GROUP 2 + END + +STRING F_IDENT 20 + BEGIN + PROMPT 3 10 "Identificativo: " + GROUP 2 + END + +NUMBER F_LONGEFF 5 + BEGIN + PROMPT 3 12 "Lunghezza: " + GROUP 2 + END + +NUMBER F_LARGE 5 + BEGIN + PROMPT 40 12 "Altezza: " + GROUP 2 + END + +NUMBER F_PAGE 5 + BEGIN + PROMPT 3 15 "Numero della pagina: " + END + +NUMBER F_FOCUS 5 + BEGIN + PROMPT 40 15 "Priorita' focus: " + END + +BOOLEAN F_INTOOL + BEGIN + PROMPT 3 17 "Si vuole il controllo nella toolbar" + END + +ENDPAGE + +PAGE "Item" -1 -1 78 20 + +TEXT DLG_NULL + BEGIN + PROMPT 3 2 "Digitare gli item che si vogliono." + END + +SPREADSHEET F_ITEM 0 -3 + BEGIN + PROMPT 1 4 "" + ITEM "ITEM@80" + END + +ENDPAGE + +PAGE "Opzioni" -1 -1 78 20 + +TEXT DLG_NULL + BEGIN + PROMPT 3 1 "Scelta delle opzioni" + END + +GROUPBOX DLG_NULL -1 6 + BEGIN + PROMPT 2 2 "" + GROUP 1 + END + +STRING F_FLAG 15 + BEGIN + PROMPT 3 4 "Flags: " + GROUP 1 + END + +STRING F_GROUP 25 15 + BEGIN + PROMPT 45 4 "Gruppi: " + GROUP 1 + END + +STRING F_FIELD 25 + BEGIN + PROMPT 3 6 "Field: " + GROUP 1 + END + +STRING F_KEY 15 + BEGIN + PROMPT 45 6 "Key: " + GROUP 1 + END + +GROUPBOX DLG_NULL -1 5 + BEGIN + PROMPT 2 7 "" + GROUP 2 + END + +TEXT DLG_NULL + BEGIN + PROMPT 3 9 "Warning: " + GROUP 2 + END + +STRING F_WARNING 55 + BEGIN + PROMPT 3 10 "" + GROUP 2 + END + +STRING F_CHECK 15 + BEGIN + PROMPT 3 12 "" + FLAGS "H" + END + +STRING F_MESSAGE 10 + BEGIN + PROMPT 3 15 "" + FLAGS "H" + END + +ENDPAGE + +PAGE "Browse" -1 -1 78 20 + +TEXT DLG_NULL + BEGIN + PROMPT 3 1 "Occorre definire le istruzioni per permettere il browse." + END + +TEXT DLG_NULL + BEGIN + PROMPT 3 2 "Per gli intervalli occorre andare a capo." + END + +MEMO F_USE 0 -3 + BEGIN + PROMPT 1 3 "" + END + +ENDPAGE + +ENDMASK + +PAGE "Item" -1 -1 78 20 + +STRING 101 7 + BEGIN + PROMPT 3 6 "Item:" + CHECKTYPE REQUIRED + END + +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 + +ENDMASK diff --git a/ba/ba2600e.uml b/ba/ba2600e.uml new file mode 100755 index 000000000..468634830 --- /dev/null +++ b/ba/ba2600e.uml @@ -0,0 +1,222 @@ +#include "ba2600b.h" + +TOOLBAR "" 0 20 0 0 + +BUTTON DLG_OK 10 2 + BEGIN + PROMPT -13 -1 "" + END + +BUTTON DLG_CANCEL 10 2 + BEGIN + PROMPT -23 -1 "" + END + +BUTTON DLG_DELREC 10 2 + BEGIN + PROMPT -33 -1 "" + END + +ENDPAGE + +PAGE "Date" -1 -1 78 20 + +TEXT DLG_NULL + BEGIN + PROMPT 3 1 "E' possibile personalizzare la struttura del campo date" + END + +GROUPBOX DLG_NULL -1 7 + BEGIN + PROMPT 2 2 "" + GROUP 1 + END + +STRING F_PROMPT 60 25 + BEGIN + PROMPT 3 4 "Prompt: " + GROUP 1 + END + +NUMBER F_OFFSET 5 + BEGIN + PROMPT 48 4 "Offset: " + GROUP 1 + END + +NUMBER F_LEFT 5 + BEGIN + PROMPT 3 6 "Coordinata X: " + GROUP 1 + END + +NUMBER F_UPPER 5 + BEGIN + PROMPT 42 6 "Coordinata Y: " + GROUP 1 + END + +GROUPBOX DLG_NULL -1 4 + BEGIN + PROMPT 2 8 "" + GROUP 2 + END + +STRING F_IDENT 20 + BEGIN + PROMPT 3 10 "Identificativo: " + GROUP 2 + END + +NUMBER F_PAGE 5 + BEGIN + PROMPT 3 13 "Numero della pagina: " + END + +NUMBER F_FOCUS 5 + BEGIN + PROMPT 40 13 "Priorita' focus: " + END + +BOOLEAN F_INTOOL + BEGIN + PROMPT 3 15 "Si vuole il controllo nella toolbar" + END + +ENDPAGE + +PAGE "Opzioni" -1 -1 78 20 + +TEXT DLG_NULL + BEGIN + PROMPT 3 1 "Scelta delle opzioni" + END + +GROUPBOX DLG_NULL -1 6 + BEGIN + PROMPT 2 2 "" + GROUP 1 + END + +STRING F_FLAG 15 + BEGIN + PROMPT 3 4 "Flags: " + GROUP 1 + END + +STRING F_GROUP 25 15 + BEGIN + PROMPT 45 4 "Gruppi: " + GROUP 1 + END + +STRING F_FIELD 25 + BEGIN + PROMPT 3 6 "Field: " + GROUP 1 + END + +STRING F_KEY 5 + BEGIN + PROMPT 45 6 "Key: " + GROUP 1 + END + +GROUPBOX DLG_NULL -1 7 + BEGIN + PROMPT 2 7 "" + GROUP 2 + END + +TEXT DLG_NULL + BEGIN + PROMPT 3 9 "Warning: " + GROUP 2 + END + +STRING F_WARNING 55 + BEGIN + PROMPT 3 10 "" + GROUP 2 + END + +TEXT DLG_NULL + BEGIN + PROMPT 3 11 "Checktype: " + GROUP 2 + END + +LIST F_CHECK 15 + BEGIN + PROMPT 3 12 "" + ITEM "a| " + ITEM "b|NORMAL" + ITEM "c|REQUIRED" + ITEM "d|SEARCH" + ITEM "e|FORCED" + GROUP 2 + END + +ENDPAGE + +PAGE "Message" -1 -1 78 20 + +TEXT DLG_NULL + BEGIN + PROMPT 3 1 "Ogni riga verra' considerata un messaggio a se' stante." + END + +SPREADSHEET F_MESSAGE 0 -3 + BEGIN + PROMPT 1 3 "" + ITEM "MESSAGE@76" + END + +ENDPAGE + +PAGE "Browse" -1 -1 78 20 + +TEXT DLG_NULL + BEGIN + PROMPT 3 1 "Occorre definire le istruzioni per permettere il browse." + END + +TEXT DLG_NULL + BEGIN + PROMPT 3 2 "Per gli intervalli occorre andare a capo." + END + +MEMO F_USE 0 -3 + BEGIN + PROMPT 1 3 "" + END + +ENDPAGE + +ENDMASK + +PAGE "Messaggi" -1 -1 78 20 + +STRING 101 50 + BEGIN + PROMPT 4 4 "Messaggi:" + END + +BUTTON DLG_OK 10 2 + BEGIN + PROMPT -13 -1 "" + END + +BUTTON DLG_CANCEL 10 2 + BEGIN + PROMPT -23 -1 "" + END + +BUTTON DLG_DELREC 10 2 + BEGIN + PROMPT -33 -1 "" + END + +ENDPAGE + +ENDMASK diff --git a/ba/ba2600g.uml b/ba/ba2600g.uml new file mode 100755 index 000000000..b968a8401 --- /dev/null +++ b/ba/ba2600g.uml @@ -0,0 +1,259 @@ +#include "ba2600b.h" + +TOOLBAR "" 0 20 0 0 + +BUTTON DLG_OK 10 2 + BEGIN + PROMPT -13 -1 "" + END + +BUTTON DLG_CANCEL 10 2 + BEGIN + PROMPT -23 -1 "" + END + +BUTTON DLG_DELREC 10 2 + BEGIN + PROMPT -33 -1 "" + END + +ENDPAGE + +PAGE "String" -1 -1 78 20 + +TEXT DLG_NULL + BEGIN + PROMPT 3 1 "E' possibile personalizzare la struttura del campo stringa" + END + +GROUPBOX DLG_NULL -1 7 + BEGIN + PROMPT 2 2 "" + GROUP 1 + END + +STRING F_PROMPT 60 25 + BEGIN + PROMPT 3 4 "Prompt: " + GROUP 1 + END + +NUMBER F_OFFSET 5 + BEGIN + PROMPT 48 4 "Offset: " + GROUP 1 + END + +NUMBER F_LEFT 5 + BEGIN + PROMPT 3 6 "Coordinata X: " + GROUP 1 + END + +NUMBER F_UPPER 5 + BEGIN + PROMPT 42 6 "Coordinata Y: " + GROUP 1 + END + +GROUPBOX DLG_NULL -1 7 + BEGIN + PROMPT 2 8 "" + GROUP 2 + END + +STRING F_IDENT 20 + BEGIN + PROMPT 3 10 "Identificativo: " + GROUP 2 + END + +NUMBER F_LONGEFF 5 + BEGIN + PROMPT 3 12 "Lunghezza-size: " + GROUP 2 + END + +NUMBER F_LONGEVD 5 + BEGIN + PROMPT 42 12 "Lunghezza-video: " + GROUP 2 + END + +NUMBER F_PAGE 5 + BEGIN + PROMPT 3 15 "Numero della pagina: " + END + +NUMBER F_FOCUS 5 + BEGIN + PROMPT 40 15 "Priorita' focus: " + END + +BOOLEAN F_INTOOL + BEGIN + PROMPT 3 17 "Si vuole il controllo nella toolbar" + END + +ENDPAGE + +PAGE "Opzioni" -1 -1 78 20 + +TEXT DLG_NULL + BEGIN + PROMPT 3 1 "Scelta delle opzioni" + END + +GROUPBOX DLG_NULL -1 8 + BEGIN + PROMPT 2 2 "" + GROUP 1 + END + +STRING F_FLAG 15 + BEGIN + PROMPT 3 4 "Flags: " + GROUP 1 + END + +STRING F_GROUP 25 15 + BEGIN + PROMPT 45 4 "Gruppi: " + GROUP 1 + END + +STRING F_FIELD 25 + BEGIN + PROMPT 3 6 "Field: " + GROUP 1 + END + +STRING F_KEY 15 + BEGIN + PROMPT 45 6 "Key: " + GROUP 1 + END + +STRING F_ADDR 20 + BEGIN + PROMPT 3 8 "Add RUN: " + GROUP 1 + END + +GROUPBOX DLG_NULL -1 7 + BEGIN + PROMPT 2 9 "" + GROUP 2 + END + +TEXT DLG_NULL + BEGIN + PROMPT 3 11 "Warning: " + GROUP 2 + END + +STRING F_WARNING 55 + BEGIN + PROMPT 3 12 "" + GROUP 2 + END + +TEXT DLG_NULL + BEGIN + PROMPT 3 13 "Checktype: " + GROUP 2 + END + +LIST F_CHECK 15 + BEGIN + PROMPT 3 14 "" + ITEM "a| " + ITEM "b|NORMAL" + ITEM "c|REQUIRED" + ITEM "d|SEARCH" + ITEM "e|FORCED" + GROUP 2 + END + +ENDPAGE + +PAGE "Message" -1 -1 78 20 + +TEXT DLG_NULL + BEGIN + PROMPT 3 1 "Ogni riga verra' considerata un messaggio a se' stante." + END + +SPREADSHEET F_MESSAGE 0 -3 + BEGIN + PROMPT 1 3 "" + ITEM "MESSAGE@80" + END + +ENDPAGE + +PAGE "Browse" -1 -1 78 20 + +TEXT DLG_NULL + BEGIN + PROMPT 3 1 "Occorre definire le istruzioni per permettere il browse." + END + +TEXT DLG_NULL + BEGIN + PROMPT 3 2 "Per gli intervalli occorre andare a capo." + END + +MEMO F_USE 0 -3 + BEGIN + PROMPT 1 3 "" + END + +ENDPAGE + +PAGE "Varie" -1 -1 78 20 + +TEXT DLG_NULL + BEGIN + PROMPT 9 1 "Per ulteriori comandi futuri." + END + +TEXT DLG_NULL + BEGIN + PROMPT 9 2 "Per gli intervalli occorre andare a capo." + END + +MEMO F_VAR 0 -3 + BEGIN + PROMPT 1 3 "" + END + +ENDPAGE + +ENDMASK + +PAGE "Messaggi" -1 -1 78 20 + +BUTTON DLG_OK 10 2 + BEGIN + PROMPT -13 -1 "" + END + +BUTTON DLG_CANCEL 10 2 + BEGIN + PROMPT -23 -1 "" + END + +BUTTON DLG_DELREC 10 2 + BEGIN + PROMPT -33 -1 "" + END + +STRING 101 50 + BEGIN + PROMPT 4 4 "Messaggi:" + END + +ENDPAGE + +ENDMASK diff --git a/ba/ba2600k.uml b/ba/ba2600k.uml new file mode 100755 index 000000000..bb1ae3a09 --- /dev/null +++ b/ba/ba2600k.uml @@ -0,0 +1,192 @@ +#include "ba2600b.h" + +TOOLBAR "" 0 20 0 0 + +BUTTON DLG_OK 10 2 + BEGIN + PROMPT -13 -1 "" + END + +BUTTON DLG_CANCEL 10 2 + BEGIN + PROMPT -23 -1 "" + END + +BUTTON DLG_DELREC 10 2 + BEGIN + PROMPT -33 -1 "" + END + +ENDPAGE + +PAGE "Check Box" -1 -1 78 20 + +TEXT DLG_NULL + BEGIN + PROMPT 3 1 "E' possibile personalizzare la struttura del campo check box" + END + +GROUPBOX DLG_NULL -1 7 + BEGIN + PROMPT 2 2 "" + GROUP 1 + END + +STRING F_PROMPT 30 + BEGIN + PROMPT 3 4 "Prompt: " + GROUP 1 + END + +NUMBER F_OFFSET 5 + BEGIN + PROMPT 48 4 "Offset: " + FLAGS "H" + END + +NUMBER F_LEFT 5 + BEGIN + PROMPT 3 6 "Coordinata X: " + GROUP 1 + END + +NUMBER F_UPPER 5 + BEGIN + PROMPT 42 6 "Coordinata Y: " + GROUP 1 + END + +GROUPBOX DLG_NULL -1 4 + BEGIN + PROMPT 2 8 "" + GROUP 2 + END + +STRING F_IDENT 20 + BEGIN + PROMPT 3 10 "Identificativo: " + GROUP 2 + END + +NUMBER F_PAGE 5 + BEGIN + PROMPT 3 13 "Numero della pagina: " + END + +NUMBER F_FOCUS 5 + BEGIN + PROMPT 40 13 "Priorita' focus: " + END + +BOOLEAN F_INTOOL + BEGIN + PROMPT 3 15 "Si vuole il controllo nella toolbar" + END + +ENDPAGE + +PAGE "Opzioni" -1 -1 78 20 + +TEXT DLG_NULL + BEGIN + PROMPT 3 1 "Scelta delle opzioni" + END + +GROUPBOX DLG_NULL -1 6 + BEGIN + PROMPT 2 2 "" + GROUP 1 + END + +STRING F_FLAG 15 + BEGIN + PROMPT 3 4 "Flags: " + GROUP 1 + END + +STRING F_GROUP 25 15 + BEGIN + PROMPT 45 4 "Gruppi: " + GROUP 1 + END + +STRING F_FIELD 25 + BEGIN + PROMPT 3 6 "Field: " + GROUP 1 + END + +STRING F_KEY 15 + BEGIN + PROMPT 45 6 "Key: " + GROUP 1 + END + +GROUPBOX DLG_NULL -1 5 + BEGIN + PROMPT 2 7 "" + GROUP 2 + END + +TEXT DLG_NULL + BEGIN + PROMPT 3 9 "Warning: " + GROUP 2 + END + +STRING F_WARNING 55 + BEGIN + PROMPT 3 10 "" + GROUP 2 + END + +LIST F_CHECK 15 + BEGIN + PROMPT 3 12 "" + FLAGS "H" + END + +ENDPAGE + +PAGE "Message" -1 -1 78 20 + +TEXT DLG_NULL + BEGIN + PROMPT 3 1 "Ogni riga verra' considerata un messaggio a se' stante." + END + +SPREADSHEET F_MESSAGE 0 -3 + BEGIN + PROMPT 1 3 "" + ITEM "MESSAGE@78" + END + +ENDPAGE + +ENDMASK + +PAGE "Messaggi" -1 -1 78 20 + +STRING 101 50 + BEGIN + PROMPT 4 4 "Messaggi:" + END + +BUTTON DLG_OK 10 2 + BEGIN + PROMPT -13 -1 "" + END + +BUTTON DLG_CANCEL 10 2 + BEGIN + PROMPT -23 -1 "" + END + +BUTTON DLG_DELREC 10 2 + BEGIN + PROMPT -33 -1 "" + END + +ENDPAGE + +ENDMASK diff --git a/ba/ba2600l.uml b/ba/ba2600l.uml new file mode 100755 index 000000000..9b63f6923 --- /dev/null +++ b/ba/ba2600l.uml @@ -0,0 +1,31 @@ +PAGE "Sposta in.." -1 -1 60 10 + +BUTTON DLG_OK 10 2 + BEGIN + PROMPT -12 -1 "" + END + +BUTTON DLG_CANCEL 10 2 + BEGIN + PROMPT -22 -1 "" + END + +TEXT DLG_NULL + BEGIN + PROMPT 2 2 "Digita in quale pagina vorresti spostare " + END + +TEXT DLG_NULL + BEGIN + PROMPT 2 3 "i controlli selezionati " + END + +NUMBER 101 5 + BEGIN + PROMPT 2 5 "Pagina: " + END + +ENDPAGE + +ENDMASK + diff --git a/ba/ba2600m.uml b/ba/ba2600m.uml new file mode 100755 index 000000000..c14061c32 --- /dev/null +++ b/ba/ba2600m.uml @@ -0,0 +1,183 @@ +#include "ba2600b.h" + +TOOLBAR "" 0 20 0 0 + +BUTTON DLG_OK 10 2 + BEGIN + PROMPT -13 -1 "" + END + +BUTTON DLG_CANCEL 10 2 + BEGIN + PROMPT -23 -1 "" + END + +BUTTON DLG_DELREC 10 2 + BEGIN + PROMPT -33 -1 "" + END + +ENDPAGE + +PAGE "Memo" -1 -1 78 20 + +TEXT DLG_NULL + BEGIN + PROMPT 3 1 "E' possibile personalizzare la struttura del campo memo" + END + +GROUPBOX DLG_NULL -1 7 + BEGIN + PROMPT 2 2 "" + GROUP 1 + END + +STRING F_PROMPT 80 25 + BEGIN + PROMPT 3 4 "Prompt: " + GROUP 1 + END + +NUMBER F_OFFSET 5 + BEGIN + PROMPT 48 4 "Offset: " + FLAGS "H" + END + +NUMBER F_LEFT 5 + BEGIN + PROMPT 3 6 "Coordinata X: " + GROUP 1 + END + +NUMBER F_UPPER 5 + BEGIN + PROMPT 42 6 "Coordinata Y: " + GROUP 1 + END + +GROUPBOX DLG_NULL -1 7 + BEGIN + PROMPT 2 8 "" + GROUP 2 + END + +STRING F_IDENT 20 + BEGIN + PROMPT 3 10 "Identificativo: " + GROUP 2 + END + +NUMBER F_LONGEFF 5 + BEGIN + PROMPT 3 12 "Lunghezza: " + GROUP 2 + END + +NUMBER F_LARGE 5 + BEGIN + PROMPT 40 12 "Altezza: " + GROUP 2 + END + +NUMBER F_PAGE 5 + BEGIN + PROMPT 3 15 "Numero della pagina: " + END + +NUMBER F_FOCUS 5 + BEGIN + PROMPT 40 15 "Priorita' focus: " + END + +BOOLEAN F_INTOOL + BEGIN + PROMPT 3 17 "Si vuole il controllo nella toolbar" + END + +ENDPAGE + +PAGE "Opzioni" -1 -1 78 20 + +TEXT DLG_NULL + BEGIN + PROMPT 3 1 "Scelta delle opzioni" + END + +STRING F_FLAG 15 + BEGIN + PROMPT 3 3 "Flags: " + END + +STRING F_GROUP 25 15 + BEGIN + PROMPT 45 3 "Gruppi: " + END + +TEXT DLG_NULL + BEGIN + PROMPT 3 6 "Ogni riga verra' considerata un messaggio a se' stante." + END + +SPREADSHEET F_MESSAGE 0 -3 + BEGIN + PROMPT 1 7 "" + ITEM "MESSAGE@80" + END + +STRING F_FIELD 25 + BEGIN + PROMPT 3 6 "Field: " + FLAGS "H" + END + +NUMBER F_KEY 5 + BEGIN + PROMPT 45 6 "Key: " + FLAGS "H" + END + +STRING F_WARNING 55 + BEGIN + PROMPT 3 10 "" + FLAGS "H" + END + +LIST F_CHECK 15 + BEGIN + PROMPT 3 12 "" + FLAGS "H" + END + +ENDPAGE + +ENDMASK + +PAGE "Messaggi" -1 -1 78 20 + +STRING 101 50 + BEGIN + PROMPT 4 4 "Messaggi:" + END + +BUTTON DLG_OK 10 2 + BEGIN + PROMPT -13 -1 "" + END + +BUTTON DLG_CANCEL 10 2 + BEGIN + PROMPT -23 -1 "" + END + +BUTTON DLG_DELREC 10 2 + BEGIN + PROMPT -33 -1 "" + END + +ENDPAGE + +ENDMASK + + + diff --git a/ba/ba2600n.uml b/ba/ba2600n.uml new file mode 100755 index 000000000..028d609a5 --- /dev/null +++ b/ba/ba2600n.uml @@ -0,0 +1,191 @@ +#include "ba2600b.h" + +TOOLBAR "" 0 20 0 0 + +BUTTON DLG_OK 10 2 + BEGIN + PROMPT -13 -1 "" + END + +BUTTON DLG_CANCEL 10 2 + BEGIN + PROMPT -23 -1 "" + END + +BUTTON DLG_DELREC 10 2 + BEGIN + PROMPT -33 -1 "" + END + +ENDPAGE + +PAGE "Button" -1 -1 78 20 + +TEXT DLG_NULL + BEGIN + PROMPT 3 1 "E' possibile personalizzare la struttura del campo button" + END + +GROUPBOX DLG_NULL -1 7 + BEGIN + PROMPT 2 2 "" + GROUP 1 + END + +STRING F_PROMPT 25 + BEGIN + PROMPT 3 4 "Prompt: " + GROUP 1 + END + +NUMBER F_OFFSET 5 + BEGIN + PROMPT 48 4 "Offset: " + FLAGS "H" + END + +NUMBER F_LEFT 5 + BEGIN + PROMPT 3 6 "Coordinata X: " + GROUP 1 + END + +NUMBER F_UPPER 5 + BEGIN + PROMPT 42 6 "Coordinata Y: " + GROUP 1 + END + +GROUPBOX DLG_NULL -1 7 + BEGIN + PROMPT 2 8 "" + GROUP 2 + END + +STRING F_IDENT 20 + BEGIN + PROMPT 3 10 "Identificativo: " + GROUP 2 + END + +NUMBER F_LONGEFF 5 + BEGIN + PROMPT 3 12 "Lunghezza: " + GROUP 2 + END + +NUMBER F_LARGE 5 + BEGIN + PROMPT 40 12 "Altezza: " + GROUP 2 + END + +NUMBER F_PAGE 5 + BEGIN + PROMPT 3 15 "Numero della pagina: " + END + +NUMBER F_FOCUS 5 + BEGIN + PROMPT 40 15 "Priorita' focus: " + END + +BOOLEAN F_INTOOL + BEGIN + PROMPT 3 17 "Si vuole il controllo nella toolbar" + END + +ENDPAGE + +PAGE "Opzioni" -1 -1 78 20 + +TEXT DLG_NULL + BEGIN + PROMPT 3 1 "Scelta delle opzioni" + END + +GROUPBOX DLG_NULL -1 3 + BEGIN + PROMPT 2 2 "" + GROUP 1 + END + +STRING F_FLAG 15 + BEGIN + PROMPT 3 3 "Flags: " + GROUP 1 + END + +STRING F_GROUP 25 15 + BEGIN + PROMPT 45 3 "Gruppi: " + GROUP 1 + END + +TEXT DLG_NULL + BEGIN + PROMPT 3 6 "Ogni riga verra' considerata un messaggio a se' stante." + END + +SPREADSHEET F_MESSAGE 0 -3 + BEGIN + PROMPT 1 7 "" + ITEM "MESSAGE@85" + END + +STRING F_FIELD 25 + BEGIN + PROMPT 3 6 "Field: " + FLAGS "H" + END + +NUMBER F_KEY 5 + BEGIN + PROMPT 45 6 "Key: " + FLAGS "H" + END + +STRING F_WARNING 55 + BEGIN + PROMPT 3 10 "" + FLAGS "H" + END + +LIST F_CHECK 15 + BEGIN + PROMPT 3 12 "" + FLAGS "H" + END + +ENDPAGE + +ENDMASK + +PAGE "Messaggi" -1 -1 78 20 + +STRING 101 50 + BEGIN + PROMPT 4 4 "Messaggi:" + END + +BUTTON DLG_OK 10 2 + BEGIN + PROMPT -13 -1 "" + END + +BUTTON DLG_CANCEL 10 2 + BEGIN + PROMPT -23 -1 "" + END + +BUTTON DLG_DELREC 10 2 + BEGIN + PROMPT -33 -1 "" + END + +ENDPAGE + +ENDMASK + + + diff --git a/ba/ba2600o.uml b/ba/ba2600o.uml new file mode 100755 index 000000000..3f5a86e26 --- /dev/null +++ b/ba/ba2600o.uml @@ -0,0 +1,233 @@ +#include "ba2600b.h" + +TOOLBAR "" 0 20 0 0 + +BUTTON DLG_OK 10 2 + BEGIN + PROMPT -13 -1 "" + END + +BUTTON DLG_CANCEL 10 2 + BEGIN + PROMPT -23 -1 "" + END + +BUTTON DLG_DELREC 10 2 + BEGIN + PROMPT -33 -1 "" + END + +ENDPAGE + +PAGE "Radio" -1 -1 78 20 + +TEXT DLG_NULL + BEGIN + PROMPT 3 1 "E' possibile personalizzare la struttura del campo radio button" + END + +GROUPBOX DLG_NULL -1 7 + BEGIN + PROMPT 2 2 "" + GROUP 1 + END + +STRING F_PROMPT 60 25 + BEGIN + PROMPT 3 4 "Prompt: " + GROUP 1 + END + +NUMBER F_OFFSET 5 + BEGIN + PROMPT 48 4 "Offset: " + FLAGS "H" + END + +NUMBER F_LEFT 5 + BEGIN + PROMPT 3 6 "Coordinata X: " + GROUP 1 + END + +NUMBER F_UPPER 5 + BEGIN + PROMPT 42 6 "Coordinata Y: " + GROUP 1 + END + +GROUPBOX DLG_NULL -1 7 + BEGIN + PROMPT 2 8 "" + GROUP 2 + END + +STRING F_IDENT 20 + BEGIN + PROMPT 3 10 "Identificativo: " + GROUP 2 + END + +NUMBER F_LONGEFF 5 + BEGIN + PROMPT 3 12 "Lunghezza: " + GROUP 2 + END + +NUMBER F_PAGE 5 + BEGIN + PROMPT 3 15 "Numero della pagina: " + END + +NUMBER F_FOCUS 5 + BEGIN + PROMPT 40 15 "Priorita' focus: " + END + +BOOLEAN F_INTOOL + BEGIN + PROMPT 3 17 "Si vuole il controllo nella toolbar" + END + +ENDPAGE + +PAGE "Opzioni" -1 -1 78 20 + +TEXT DLG_NULL + BEGIN + PROMPT 3 1 "Scelta delle opzioni" + END + +GROUPBOX DLG_NULL -1 6 + BEGIN + PROMPT 2 2 "" + GROUP 1 + END + +STRING F_FLAG 15 + BEGIN + PROMPT 3 4 "Flags: " + GROUP 1 + END + +STRING F_GROUP 25 15 + BEGIN + PROMPT 45 4 "Gruppi: " + GROUP 1 + END + +STRING F_FIELD 25 + BEGIN + PROMPT 3 6 "Field: " + GROUP 1 + END + +STRING F_KEY 15 + BEGIN + PROMPT 45 6 "Key: " + GROUP 1 + END + +GROUPBOX DLG_NULL -1 7 + BEGIN + PROMPT 2 7 "" + GROUP 2 + END + +TEXT DLG_NULL + BEGIN + PROMPT 3 9 "Warning: " + GROUP 2 + END + +STRING F_WARNING 55 + BEGIN + PROMPT 3 10 "" + GROUP 2 + END + +TEXT DLG_NULL + BEGIN + PROMPT 3 11 "Checktype: " + GROUP 2 + END + +LIST F_CHECK 15 + BEGIN + PROMPT 3 12 "" + ITEM "a| " + ITEM "b|NORMAL" + ITEM "c|REQUIRED" + ITEM "d|SEARCH" + ITEM "e|FORCED" + GROUP 2 + END + +STRING F_MESSAGE 10 + BEGIN + PROMPT 3 15 "" + FLAGS "H" + END + +ENDPAGE + +PAGE "Item/Msg" -1 -1 78 20 + +TEXT DLG_NULL + BEGIN + PROMPT 3 1 "Digitare i vari item che si vogliono con relativi messaggi." + END + +SPREADSHEET F_ITEM 0 -3 + BEGIN + PROMPT 1 3 "" + ITEM "CODICE" + ITEM "DESCRIZIONE@24" + ITEM "MESSAGE@50" + END + +ENDPAGE + +ENDMASK + +PAGE "Item/Msg" -1 -1 78 20 + +STRING 101 7 + BEGIN + PROMPT 3 3 "Codice:" + CHECKTYPE REQUIRED + END + +STRING 102 24 + BEGIN + PROMPT 3 6 "Descrizione:" + CHECKTYPE REQUIRED + END + +STRING 103 40 + BEGIN + PROMPT 3 9 "Messaggio:" + END + +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 + +ENDMASK + + + + diff --git a/ba/ba2600p.uml b/ba/ba2600p.uml new file mode 100755 index 000000000..02aacc74f --- /dev/null +++ b/ba/ba2600p.uml @@ -0,0 +1,184 @@ +#include "ba2600b.h" + +TOOLBAR "" 0 20 0 0 + +BUTTON DLG_OK 10 2 + BEGIN + PROMPT -13 -1 "" + END + +BUTTON DLG_CANCEL 10 2 + BEGIN + PROMPT -23 -1 "" + END + +BUTTON DLG_DELREC 10 2 + BEGIN + PROMPT -33 -1 "" + END + +ENDPAGE + +PAGE "Groupbox" -1 -1 78 20 + +TEXT DLG_NULL + BEGIN + PROMPT 3 1 "E' possibile personalizzare la struttura del campo groupbox" + END + +GROUPBOX DLG_NULL -1 7 + BEGIN + PROMPT 2 2 "" + GROUP 1 + END + +STRING F_PROMPT 80 30 + BEGIN + PROMPT 3 4 "Prompt: " + GROUP 1 + END + +NUMBER F_OFFSET 5 + BEGIN + PROMPT 48 4 "Offset: " + FLAGS "H" + END + +NUMBER F_LEFT 5 + BEGIN + PROMPT 3 6 "Coordinata X: " + GROUP 1 + END + +NUMBER F_UPPER 5 + BEGIN + PROMPT 42 6 "Coordinata Y: " + GROUP 1 + END + +GROUPBOX DLG_NULL -1 7 + BEGIN + PROMPT 2 8 "" + GROUP 2 + END + +STRING F_IDENT 20 + BEGIN + PROMPT 3 10 "Identificativo: " + GROUP 2 + END + +NUMBER F_LONGEFF 5 + BEGIN + PROMPT 3 12 "Lunghezza: " + GROUP 2 + END + +NUMBER F_LARGE 5 + BEGIN + PROMPT 40 12 "Altezza: " + GROUP 2 + END + +NUMBER F_PAGE 5 + BEGIN + PROMPT 3 15 "Numero della pagina: " + END + +NUMBER F_FOCUS 5 + BEGIN + PROMPT 40 15 "Priorita' focus: " + FLAGS "H" + END + +BOOLEAN F_INTOOL + BEGIN + PROMPT 3 17 "Si vuole il controllo nella toolbar" + END + +ENDPAGE + +PAGE "Opzioni" -1 -1 78 20 + +TEXT DLG_NULL + BEGIN + PROMPT 3 1 "Scelta delle opzioni" + END + +STRING F_FLAG 15 + BEGIN + PROMPT 3 3 "Flags: " + END + +STRING F_GROUP 25 15 + BEGIN + PROMPT 45 3 "Gruppi: " + END + +TEXT DLG_NULL + BEGIN + PROMPT 3 6 "Ogni riga verra' considerata un messaggio a se' stante." + END + +SPREADSHEET F_MESSAGE 0 -3 + BEGIN + PROMPT 1 7 "" + ITEM "MESSAGE@80" + END + +STRING F_FIELD 25 + BEGIN + PROMPT 3 6 "Field: " + FLAGS "H" + END + +NUMBER F_KEY 5 + BEGIN + PROMPT 45 6 "Key: " + FLAGS "H" + END + +STRING F_WARNING 55 + BEGIN + PROMPT 3 10 "" + FLAGS "H" + END + +LIST F_CHECK 15 + BEGIN + PROMPT 3 12 "" + FLAGS "H" + END + +ENDPAGE + +ENDMASK + +PAGE "Messaggi" -1 -1 78 20 + +STRING 101 50 + BEGIN + PROMPT 4 4 "Messaggi:" + END + +BUTTON DLG_OK 10 2 + BEGIN + PROMPT -13 -1 "" + END + +BUTTON DLG_CANCEL 10 2 + BEGIN + PROMPT -23 -1 "" + END + +BUTTON DLG_DELREC 10 2 + BEGIN + PROMPT -33 -1 "" + END + +ENDPAGE + +ENDMASK + + + diff --git a/ba/ba2600r.uml b/ba/ba2600r.uml new file mode 100755 index 000000000..cc75b9bdc --- /dev/null +++ b/ba/ba2600r.uml @@ -0,0 +1,240 @@ +#include "ba2600b.h" + +TOOLBAR "" 0 20 0 0 + +BUTTON DLG_OK 10 2 + BEGIN + PROMPT -13 -1 "" + END + +BUTTON DLG_CANCEL 10 2 + BEGIN + PROMPT -23 -1 "" + END + +BUTTON DLG_DELREC 10 2 + BEGIN + PROMPT -33 -1 "" + END + +ENDPAGE + +PAGE "Number" -1 -1 78 20 + +TEXT DLG_NULL + BEGIN + PROMPT 3 1 "E' possibile personalizzare la struttura del campo number" + END + +GROUPBOX DLG_NULL -1 6 + BEGIN + PROMPT 2 2 "" + GROUP 1 + END + +STRING F_PROMPT 60 25 + BEGIN + PROMPT 3 4 "Prompt: " + GROUP 1 + END + +NUMBER F_OFFSET 5 + BEGIN + PROMPT 48 4 "Offset: " + GROUP 1 + END + +NUMBER F_LEFT 5 + BEGIN + PROMPT 3 6 "Coordinata X: " + GROUP 1 + END + +NUMBER F_UPPER 5 + BEGIN + PROMPT 42 6 "Coordinata Y: " + GROUP 1 + END + +GROUPBOX DLG_NULL -1 8 + BEGIN + PROMPT 2 7 "" + GROUP 2 + END + +NUMBER F_DECIMAL 5 + BEGIN + PROMPT 3 9 "N. decimali " + GROUP 2 + END + +STRING F_PICTURE 30 + BEGIN + PROMPT 3 11 "Picture: " + GROUP 2 + END + +STRING F_IDENT 20 + BEGIN + PROMPT 3 13 "Identificativo: " + GROUP 2 + END + +NUMBER F_LONGEFF 5 + BEGIN + PROMPT 45 9 "Lunghezza: " + GROUP 2 + END + +NUMBER F_PAGE 5 + BEGIN + PROMPT 3 15 "Numero della pagina: " + END + +NUMBER F_FOCUS 5 + BEGIN + PROMPT 40 15 "Priorita' focus: " + END + +BOOLEAN F_INTOOL + BEGIN + PROMPT 3 17 "Si vuole il controllo nella toolbar" + END + +ENDPAGE + +PAGE "Opzioni" -1 -1 78 20 + +TEXT DLG_NULL + BEGIN + PROMPT 3 1 "Scelta delle opzioni" + END + +GROUPBOX DLG_NULL -1 7 + BEGIN + PROMPT 2 2 "" + GROUP 1 + END + +STRING F_FLAG 15 + BEGIN + PROMPT 3 4 "Flags: " + GROUP 1 + END + +STRING F_GROUP 25 15 + BEGIN + PROMPT 45 4 "Gruppi: " + GROUP 1 + END + +STRING F_FIELD 25 + BEGIN + PROMPT 3 6 "Field: " + GROUP 1 + END + +STRING F_KEY 15 + BEGIN + PROMPT 45 6 "Key: " + GROUP 1 + END + +GROUPBOX DLG_NULL -1 8 + BEGIN + PROMPT 2 9 "" + GROUP 2 + END + +TEXT DLG_NULL + BEGIN + PROMPT 3 11 "Warning: " + GROUP 2 + END + +STRING F_WARNING 55 + BEGIN + PROMPT 3 12 "" + GROUP 2 + END + +TEXT DLG_NULL + BEGIN + PROMPT 3 13 "Checktype: " + GROUP 2 + END + +LIST F_CHECK 15 + BEGIN + PROMPT 3 14 "" + ITEM "a| " + ITEM "b|NORMAL" + ITEM "c|REQUIRED" + ITEM "d|SEARCH" + ITEM "e|FORCED" + GROUP 2 + END + +ENDPAGE + +PAGE "Message" -1 -1 78 20 + +TEXT DLG_NULL + BEGIN + PROMPT 3 1 "Ogni riga verra' considerata un messaggio a se' stante." + END + +SPREADSHEET F_MESSAGE 0 -3 + BEGIN + PROMPT 1 3 "" + ITEM "MESSAGE@80" + END + +ENDPAGE + +PAGE "Browse" -1 -1 78 20 + +TEXT DLG_NULL + BEGIN + PROMPT 3 1 "Occorre definire le istruzioni per permettere il browse." + END + +TEXT DLG_NULL + BEGIN + PROMPT 3 2 "Per gli intervalli occorre andare a capo." + END + +MEMO F_USE 0 -3 + BEGIN + PROMPT 1 3 "" + END + +ENDPAGE + +ENDMASK + +PAGE "Messaggi" -1 -1 78 20 + +STRING 101 50 + BEGIN + PROMPT 4 4 "Messaggi:" + END + +BUTTON DLG_OK 10 2 + BEGIN + PROMPT -13 -1 "" + END + +BUTTON DLG_CANCEL 10 2 + BEGIN + PROMPT -23 -1 "" + END + +BUTTON DLG_DELREC 10 2 + BEGIN + PROMPT -33 -1 "" + END + +ENDPAGE + +ENDMASK diff --git a/ba/ba2600s.uml b/ba/ba2600s.uml new file mode 100755 index 000000000..0f46f19ee --- /dev/null +++ b/ba/ba2600s.uml @@ -0,0 +1,133 @@ +#include "ba2600a.h" + +TOOLBAR "" 0 20 0 0 + +BUTTON DLG_OK 10 2 + BEGIN + PROMPT -13 -1 "" + END + +BUTTON DLG_CANCEL 10 2 + BEGIN + PROMPT -23 -1 "" + END + +BUTTON DLG_DELREC 10 2 + BEGIN + PROMPT -33 -1 "" + END + +ENDPAGE + +PAGE "Maschera" -1 -1 78 20 + +TEXT DLG_NULL + BEGIN + PROMPT 3 1 "E' possibile personalizzare la struttura della maschera" + END + +GROUPBOX DLG_NULL -1 8 + BEGIN + PROMPT 2 2 "" + GROUP 1 + END + +TEXT DLG_NULL + BEGIN + PROMPT 3 3 "Titolo della pagina:" + GROUP 1 + END + +STRING F_PRT 25 15 + BEGIN + PROMPT 3 4 "" + GROUP 1 + END + +TEXT DLG_NULL + BEGIN + PROMPT 40 3 "Numero pagina:" + GROUP 1 + END + +NUMBER F_PAG 10 + BEGIN + PROMPT 40 4 "" + GROUP 1 + END + +TEXT DLG_NULL + BEGIN + PROMPT 3 6 "Totale pagine:" + GROUP 1 + END + +NUMBER F_TOTALP 10 + BEGIN + PROMPT 3 7 "" + FLAGS "D" + GROUP 1 + END + +TEXT DLG_NULL + BEGIN + PROMPT 3 10 "Tipo di visualizzazione: " + END + +GROUPBOX DLG_NULL 27 6 + BEGIN + PROMPT 40 10 "" + GROUP 2 + END + +RADIOBUTTON F_TYPE 25 + BEGIN + PROMPT 3 10 "" + ITEM "a|Centrato " + MESSAGE SHOW,2@ + MESSAGE DISABLE,F_X|DISABLE,F_Y + ITEM "b|Personalizzato " + MESSAGE SHOW,2@ + MESSAGE ENABLE,F_X|ENABLE,F_Y + END + +NUMBER F_X 10 + BEGIN + PROMPT 41 11 "Coordinata X:" + GROUP 2 + END + +NUMBER F_Y 10 + BEGIN + PROMPT 41 12 "Coordinata Y:" + GROUP 2 + END + +NUMBER F_LG 10 + BEGIN + PROMPT 41 13 "Altezza: " + GROUP 2 + END + +NUMBER F_LN 10 + BEGIN + PROMPT 41 14 "Lunghezza: " + GROUP 2 + END + +BOOLEAN F_TOOL + BEGIN + PROMPT 3 17 "Con la presenza della toolbar la visualizzazione sara' a pieno schermo" + MESSAGE TRUE ENABLE,F_TOOLY + MESSAGE FALSE DISABLE,F_TOOLY + END + +NUMBER F_TOOLY 10 + BEGIN + PROMPT 3 19 "Coordinata Y:" + END + +ENDPAGE + +ENDMASK + diff --git a/ba/ba2600t.uml b/ba/ba2600t.uml new file mode 100755 index 000000000..1f6cc24b0 --- /dev/null +++ b/ba/ba2600t.uml @@ -0,0 +1,107 @@ +#include "ba2600b.h" + +TOOLBAR "" 0 20 0 0 + +BUTTON DLG_OK 10 2 + BEGIN + PROMPT -13 -1 "" + END + +BUTTON DLG_CANCEL 10 2 + BEGIN + PROMPT -23 -1 "" + END + +BUTTON DLG_DELREC 10 2 + BEGIN + PROMPT -33 -1 "" + END + +ENDPAGE + +PAGE "Text" -1 -1 78 20 + +TEXT DLG_NULL + BEGIN + PROMPT 3 1 "E' possibile personalizzare la struttura del campo testo" + END + +GROUPBOX DLG_NULL -1 5 + BEGIN + PROMPT 2 2 "" + GROUP 1 + END + +STRING F_PROMPT 80 55 + BEGIN + PROMPT 3 3 "Prompt: " + GROUP 1 + END + +NUMBER F_OFFSET 5 + BEGIN + PROMPT 3 4 "Offset: " + FLAGS "H" + END + +NUMBER F_LEFT 5 + BEGIN + PROMPT 3 5 "Coordinata X: " + GROUP 1 + END + +NUMBER F_UPPER 5 + BEGIN + PROMPT 42 5 "Coordinata Y: " + GROUP 1 + END + +GROUPBOX DLG_NULL -1 3 + BEGIN + PROMPT 2 6 "" + GROUP 2 + END + +STRING F_IDENT 20 + BEGIN + PROMPT 3 7 "Identificativo: " + GROUP 2 + END + +GROUPBOX DLG_NULL -1 3 + BEGIN + PROMPT 2 8 "" + GROUP 3 + END + +STRING F_FLAG 15 + BEGIN + PROMPT 3 9 "Flags: " + GROUP 3 + END + +STRING F_GROUP 25 15 + BEGIN + PROMPT 45 9 "Gruppi: " + GROUP 3 + END + +NUMBER F_PAGE 5 + BEGIN + PROMPT 3 12 "Numero della pagina: " + END + +NUMBER F_FOCUS 5 + BEGIN + PROMPT 40 12 "Priorita' focus: " + FLAGS "H" + END + +BOOLEAN F_INTOOL + BEGIN + PROMPT 3 14 "Si vuole il controllo nella toolbar" + END + +ENDPAGE + +ENDMASK diff --git a/ba/ba2600x.uml b/ba/ba2600x.uml new file mode 100755 index 000000000..a91daf811 --- /dev/null +++ b/ba/ba2600x.uml @@ -0,0 +1,237 @@ +#include "ba2600b.h" + +TOOLBAR "" 0 20 0 0 + +BUTTON DLG_OK 10 2 + BEGIN + PROMPT -13 -1 "" + END + +BUTTON DLG_CANCEL 10 2 + BEGIN + PROMPT -23 -1 "" + END + +BUTTON DLG_DELREC 10 2 + BEGIN + PROMPT -33 -1 "" + END + +ENDPAGE + +PAGE "List" -1 -1 78 20 + +TEXT DLG_NULL + BEGIN + PROMPT 3 1 "E' possibile personalizzare la struttura del campo listbox" + END + +GROUPBOX DLG_NULL -1 7 + BEGIN + PROMPT 2 2 "" + GROUP 1 + END + +STRING F_PROMPT 60 25 + BEGIN + PROMPT 3 4 "Prompt: " + GROUP 1 + END + +NUMBER F_OFFSET 5 + BEGIN + PROMPT 48 4 "Offset: " + GROUP 1 + END + +NUMBER F_LEFT 5 + BEGIN + PROMPT 3 6 "Coordinata X: " + GROUP 1 + END + +NUMBER F_UPPER 5 + BEGIN + PROMPT 42 6 "Coordinata Y: " + GROUP 1 + END + +GROUPBOX DLG_NULL -1 7 + BEGIN + PROMPT 2 8 "" + GROUP 2 + END + +STRING F_IDENT 20 + BEGIN + PROMPT 3 10 "Identificativo: " + GROUP 2 + END + +NUMBER F_LONGEFF 5 + BEGIN + PROMPT 3 12 "Lunghezza: " + GROUP 2 + END + +NUMBER F_LONGEVD 5 + BEGIN + PROMPT 42 12 "Lunghezza-video: " + GROUP 2 + END + +NUMBER F_PAGE 5 + BEGIN + PROMPT 3 15 "Numero della pagina: " + END + +NUMBER F_FOCUS 5 + BEGIN + PROMPT 40 15 "Priorita' focus: " + END + +BOOLEAN F_INTOOL + BEGIN + PROMPT 3 17 "Si vuole il controllo nella toolbar" + END + +ENDPAGE + +PAGE "Opzioni" -1 -1 78 20 + +TEXT DLG_NULL + BEGIN + PROMPT 3 1 "Scelta delle opzioni" + END + +GROUPBOX DLG_NULL -1 6 + BEGIN + PROMPT 2 2 "" + GROUP 1 + END + +STRING F_FLAG 15 + BEGIN + PROMPT 3 4 "Flags: " + GROUP 1 + END + +STRING F_GROUP 25 15 + BEGIN + PROMPT 45 4 "Gruppi: " + GROUP 1 + END + +STRING F_FIELD 25 + BEGIN + PROMPT 3 6 "Field: " + GROUP 1 + END + +STRING F_KEY 15 + BEGIN + PROMPT 45 6 "Key: " + GROUP 1 + END + +GROUPBOX DLG_NULL -1 7 + BEGIN + PROMPT 2 7 "" + GROUP 2 + END + +TEXT DLG_NULL + BEGIN + PROMPT 3 9 "Warning: " + GROUP 2 + END + +STRING F_WARNING 55 + BEGIN + PROMPT 3 10 "" + GROUP 2 + END + +TEXT DLG_NULL + BEGIN + PROMPT 3 11 "Checktype: " + GROUP 2 + END + +LIST F_CHECK 15 + BEGIN + PROMPT 3 12 "" + ITEM "a| " + ITEM "b|NORMAL" + ITEM "c|REQUIRED" + ITEM "d|SEARCH" + ITEM "e|FORCED" + GROUP 2 + END + +STRING F_MESSAGE 10 + BEGIN + PROMPT 3 15 "" + FLAGS "H" + END + +ENDPAGE + +PAGE "Item/Msg" -1 -1 78 20 + +TEXT DLG_NULL + BEGIN + PROMPT 3 2 "Scrivere gli item con i relativi messaggi." + END + +SPREADSHEET F_ITEM 0 -3 + BEGIN + PROMPT 1 4 "" + ITEM "CODICE" + ITEM "DESCRIZIONE@24" + ITEM "MESSAGE@50" + END + +ENDPAGE + +ENDMASK + +PAGE "Item/Msg" -1 -1 78 20 + +STRING 101 7 + BEGIN + PROMPT 3 3 "Codice:" + CHECKTYPE REQUIRED + END + +STRING 102 24 + BEGIN + PROMPT 3 6 "Descrizione:" + CHECKTYPE REQUIRED + END + +STRING 103 40 + BEGIN + PROMPT 3 9 "Messaggio:" + END + +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 + +ENDMASK + + diff --git a/ba/ba2600y.uml b/ba/ba2600y.uml new file mode 100755 index 000000000..a1688cc79 --- /dev/null +++ b/ba/ba2600y.uml @@ -0,0 +1,234 @@ +#include "ba2600b.h" + +TOOLBAR "" 0 20 0 0 + +BUTTON DLG_OK 10 2 + BEGIN + PROMPT -13 -1 "" + END + +BUTTON DLG_CANCEL 10 2 + BEGIN + PROMPT -23 -1 "" + END + +BUTTON DLG_DELREC 10 2 + BEGIN + PROMPT -33 -1 "" + END + +ENDPAGE + +PAGE "Currency" -1 -1 78 20 + +TEXT DLG_NULL + BEGIN + PROMPT 3 1 "E' possibile personalizzare la struttura del campo currency" + END + +GROUPBOX DLG_NULL -1 6 + BEGIN + PROMPT 2 2 "" + GROUP 1 + END + +STRING F_PROMPT 60 25 + BEGIN + PROMPT 3 4 "Prompt: " + GROUP 1 + END + +NUMBER F_OFFSET 5 + BEGIN + PROMPT 48 4 "Offset: " + GROUP 1 + END + +NUMBER F_LEFT 5 + BEGIN + PROMPT 3 6 "Coordinata X: " + GROUP 1 + END + +NUMBER F_UPPER 5 + BEGIN + PROMPT 42 6 "Coordinata Y: " + GROUP 1 + END + +GROUPBOX DLG_NULL -1 6 + BEGIN + PROMPT 2 7 "" + GROUP 2 + END + +STRING F_PICTURE 20 + BEGIN + PROMPT 3 9 "Picture: " + GROUP 2 + END + +STRING F_IDENT 20 + BEGIN + PROMPT 3 11 "Identificativo: " + GROUP 2 + END + +NUMBER F_LONGEFF 5 + BEGIN + PROMPT 45 9 "Lunghezza: " + GROUP 2 + END + +NUMBER F_PAGE 5 + BEGIN + PROMPT 3 13 "Numero della pagina: " + END + +NUMBER F_FOCUS 5 + BEGIN + PROMPT 40 13 "Priorita' focus: " + END + +BOOLEAN F_INTOOL + BEGIN + PROMPT 3 15 "Si vuole il controllo nella toolbar" + END + +ENDPAGE + +PAGE "Opzioni" -1 -1 78 20 + +TEXT DLG_NULL + BEGIN + PROMPT 3 1 "Scelta delle opzioni" + END + +GROUPBOX DLG_NULL -1 7 + BEGIN + PROMPT 2 2 "" + GROUP 1 + END + +STRING F_FLAG 15 + BEGIN + PROMPT 3 4 "Flags: " + GROUP 1 + END + +STRING F_GROUP 25 15 + BEGIN + PROMPT 45 4 "Gruppi: " + GROUP 1 + END + +STRING F_FIELD 25 + BEGIN + PROMPT 3 6 "Field: " + GROUP 1 + END + +STRING F_KEY 15 + BEGIN + PROMPT 45 6 "Key: " + GROUP 1 + END + +GROUPBOX DLG_NULL -1 8 + BEGIN + PROMPT 2 9 "" + GROUP 2 + END + +TEXT DLG_NULL + BEGIN + PROMPT 3 11 "Warning: " + GROUP 2 + END + +STRING F_WARNING 55 + BEGIN + PROMPT 3 12 "" + GROUP 2 + END + +TEXT DLG_NULL + BEGIN + PROMPT 3 13 "Checktype: " + GROUP 2 + END + +LIST F_CHECK 15 + BEGIN + PROMPT 3 14 "" + ITEM "a| " + ITEM "b|NORMAL" + ITEM "c|REQUIRED" + ITEM "d|SEARCH" + ITEM "e|FORCED" + GROUP 2 + END + +ENDPAGE + +PAGE "Message" -1 -1 78 20 + +TEXT DLG_NULL + BEGIN + PROMPT 3 1 "Ogni riga verra' considerata un messaggio a se' stante." + END + +SPREADSHEET F_MESSAGE 0 -3 + BEGIN + PROMPT 1 3 "" + ITEM "MESSAGE@80" + END + +ENDPAGE + +PAGE "Browse" -1 -1 78 20 + +TEXT DLG_NULL + BEGIN + PROMPT 3 1 "Occorre definire le istruzioni per permettere il browse." + END + +TEXT DLG_NULL + BEGIN + PROMPT 3 2 "Per gli intervalli occorre andare a capo." + END + +MEMO F_USE 0 -3 + BEGIN + PROMPT 1 3 "" + END + +ENDPAGE + +ENDMASK + +PAGE "Messaggi" -1 -1 78 20 + +STRING 101 50 + BEGIN + PROMPT 4 4 "Messaggi:" + END + +BUTTON DLG_OK 10 2 + BEGIN + PROMPT -13 -1 "" + END + +BUTTON DLG_CANCEL 10 2 + BEGIN + PROMPT -23 -1 "" + END + +BUTTON DLG_DELREC 10 2 + BEGIN + PROMPT -33 -1 "" + END + +ENDPAGE + +ENDMASK diff --git a/ba/ba2600z.uml b/ba/ba2600z.uml new file mode 100755 index 000000000..4068fcae6 --- /dev/null +++ b/ba/ba2600z.uml @@ -0,0 +1,177 @@ +#include "ba2600b.h" + +TOOLBAR "" 0 20 0 0 + +BUTTON DLG_OK 10 2 + BEGIN + PROMPT -13 -1 "" + END + +BUTTON DLG_CANCEL 10 2 + BEGIN + PROMPT -23 -1 "" + END + +BUTTON DLG_DELREC 10 2 + BEGIN + PROMPT -33 -1 "" + END + +ENDPAGE + +PAGE "Zoom" -1 -1 78 20 + +TEXT DLG_NULL + BEGIN + PROMPT 3 1 "E' possibile personalizzare la struttura del campo zoom" + END + +GROUPBOX DLG_NULL -1 7 + BEGIN + PROMPT 2 2 "" + GROUP 1 + END + +STRING F_PROMPT 60 25 + BEGIN + PROMPT 3 4 "Prompt: " + GROUP 1 + END + +NUMBER F_OFFSET 5 + BEGIN + PROMPT 48 4 "Offset: " + GROUP 1 + END + +NUMBER F_LEFT 5 + BEGIN + PROMPT 3 6 "Coordinata X: " + GROUP 1 + END + +NUMBER F_UPPER 5 + BEGIN + PROMPT 42 6 "Coordinata Y: " + GROUP 1 + END + +GROUPBOX DLG_NULL -1 7 + BEGIN + PROMPT 2 8 "" + GROUP 2 + END + +STRING F_IDENT 20 + BEGIN + PROMPT 3 10 "Identificativo: " + GROUP 2 + END + +NUMBER F_LONGEFF 5 + BEGIN + PROMPT 3 12 "Lunghezza: " + GROUP 2 + END + +NUMBER F_PAGE 5 + BEGIN + PROMPT 3 15 "Numero della pagina: " + END + +NUMBER F_FOCUS 5 + BEGIN + PROMPT 40 15 "Priorita' focus: " + END + +BOOLEAN F_INTOOL + BEGIN + PROMPT 3 17 "Si vuole il controllo nella toolbar" + END + +ENDPAGE + +PAGE "Opzioni" -1 -1 78 20 + +TEXT DLG_NULL + BEGIN + PROMPT 3 1 "Scelta delle opzioni" + END + +STRING F_FLAG 15 + BEGIN + PROMPT 3 3 "Flags: " + END + +STRING F_GROUP 25 15 + BEGIN + PROMPT 45 3 "Gruppi: " + END + +TEXT DLG_NULL + BEGIN + PROMPT 3 6 "Ogni riga verra' considerata un messaggio a se' stante." + END + +SPREADSHEET F_MESSAGE 0 -3 + BEGIN + PROMPT 1 7 "" + ITEM "MESSAGE@80" + END + +STRING F_FIELD 25 + BEGIN + PROMPT 3 6 "Field: " + FLAGS "H" + END + +STRING F_KEY 15 + BEGIN + PROMPT 45 6 "Key: " + FLAGS "H" + END + +STRING F_WARNING 55 + BEGIN + PROMPT 3 10 "" + FLAGS "H" + END + +LIST F_CHECK 15 + BEGIN + PROMPT 3 12 "" + FLAGS "H" + END + +ENDPAGE + +ENDMASK + +PAGE "Messaggi" -1 -1 78 20 + +STRING 101 50 + BEGIN + PROMPT 4 4 "Messaggi:" + END + +BUTTON DLG_OK 10 2 + BEGIN + PROMPT -13 -1 "" + END + +BUTTON DLG_CANCEL 10 2 + BEGIN + PROMPT -23 -1 "" + END + +BUTTON DLG_DELREC 10 2 + BEGIN + PROMPT -33 -1 "" + END + +ENDPAGE + +ENDMASK + + + diff --git a/cg/cg2100b.uml b/cg/cg2100b.uml index e4fb7aac2..aaca2532a 100755 --- a/cg/cg2100b.uml +++ b/cg/cg2100b.uml @@ -204,7 +204,7 @@ END NUMBER SK_CAMBIO 15 5 BEGIN - PROMPT 54 11 "Cambio " + PROMPT 52 11 "Cambio " FIELD CAMBIO FLAGS "RU" GROUP 3 5 diff --git a/cg/cg2100s.uml b/cg/cg2100s.uml index 52c0f6d61..e5ded79ab 100755 --- a/cg/cg2100s.uml +++ b/cg/cg2100s.uml @@ -205,7 +205,7 @@ BEGIN OUTPUT S_CONTO CONTO OUTPUT S_SOTTOCONTO SOTTOCONTO OUTPUT S_DESCRCONTO DESCR - CHECKTYPE NORMAL + CHECKTYPE REQUIRED WARNING "Contropartita assente" GROUP 2 END diff --git a/cg/cg2104.cpp b/cg/cg2104.cpp index 3399baa26..5328a97a8 100755 --- a/cg/cg2104.cpp +++ b/cg/cg2104.cpp @@ -471,11 +471,14 @@ bool TPrimanota_application::valuta_handler(TMask_field& f, KEY key) } } - TEdit_field& vi = m.efield(F_VALUTAINTRA); - if (vi.active() && vi.empty()) - { - m.set(F_VALUTAINTRA, val); - m.set(F_CAMBIOINTRA, m.get(SK_CAMBIO), TRUE); + if (m.id2pos(F_VALUTAINTRA) >= 0) + { + TEdit_field& vi = m.efield(F_VALUTAINTRA); + if (vi.active() && vi.empty()) + { + m.set(F_VALUTAINTRA, val); + m.set(F_CAMBIOINTRA, m.get(SK_CAMBIO), TRUE); + } } } } diff --git a/cg/cg2105.cpp b/cg/cg2105.cpp index 94dead9da..4306c8209 100755 --- a/cg/cg2105.cpp +++ b/cg/cg2105.cpp @@ -117,7 +117,6 @@ protected: static bool descr_handler(TMask_field& f, KEY k); void gioca_cambi(int force = 0x0); - static bool sottoconto_handler(TMask_field& f, KEY k); #ifdef __EXTRA__ static bool datareg_handler(TMask_field& f, KEY k); static bool datadoc_handler(TMask_field& f, KEY k); @@ -151,7 +150,6 @@ TPay_mask::TPay_mask(const TGame_mask& parent, int mod) { set_mode(mod); enable(DLG_DELREC, edit_mode()); - set_handler(S_SOTTOCONTO, sottoconto_handler); #ifdef __EXTRA__ xvt_statbar_set(mod == MODE_MOD ? "Modifica" : "Inserimento", TRUE); @@ -506,14 +504,6 @@ bool TPay_mask::saldo_handler(TMask_field& f, KEY k) return TRUE; } -bool TPay_mask::sottoconto_handler(TMask_field& f, KEY k) -{ - bool ok = TRUE; - if (k == K_ENTER && f.mask().insert_mode() && f.get().empty()) - ok = f.error_box("Contropartita obbligatoria"); - return ok; -} - bool TPay_mask::datapag_handler(TMask_field& f, KEY k) { if (f.to_check(k)) diff --git a/cg/cg3200.cpp b/cg/cg3200.cpp index 3f095e68f..c51e43dff 100755 --- a/cg/cg3200.cpp +++ b/cg/cg3200.cpp @@ -21,6 +21,48 @@ #include "cglib02.h" #include "cglib03.h" +class TMastrini_record : public TRectype +{ + TBill _bill; + +protected: + virtual const TString& get_str(const char* fieldname) const; + virtual int length(const char* fieldname) const; + virtual TFieldtypes type(const char* fieldname) const; + +public: + TMastrini_record() : TRectype(LF_SALDI) { } + virtual ~TMastrini_record() { } +}; + +const TString& TMastrini_record::get_str(const char* fieldname) const +{ + if (stricmp(fieldname, "DESCR") == 0) + { + int g = atoi(TRectype::get_str("GRUPPO")); + int c = atoi(TRectype::get_str("CONTO")); + long s = atol(TRectype::get_str("SOTTOCONTO")); + ((TBill&)_bill).set(g, c, s); + const TString& descr = _bill.descrizione(); + return descr; + } + return TRectype::get_str(fieldname); +} + +int TMastrini_record::length(const char* fieldname) const +{ + if (stricmp(fieldname, "DESCR") == 0) + return 50; + return TRectype::length(fieldname); +} + +TFieldtypes TMastrini_record::type(const char* fieldname) const +{ + if (stricmp(fieldname, "DESCR") == 0) + return _alfafld; + return TRectype::type(fieldname); +} + class TMastrini_application : public TPrintapp { static bool data_inizio (TMask_field& f, KEY k); @@ -50,7 +92,7 @@ class TMastrini_application : public TPrintapp TDate _data_ini,_data_fine,_data_finese,_data_finesesucc,_ultima_data_reg; TDate _datareg,_datadoc,_data_inizioese,_datareg_stampa,_inizioes; - int _cur1,_gruppo,_conto,_numcarat,_stampanum,_numivd,_annoiva; + int _cur1,_cur2,_gruppo,_conto,_numcarat,_stampanum,_numivd,_annoiva; int _numrig,_natdoc,_tipo,_tipostampa,_g_prec,_c_prec,_numrivd_int; real _progredare,_progreavere,_totprogre_dare_al,_totprogre_avere_al; real _totprogre_dare,_totprogre_avere,_importo; @@ -2464,7 +2506,11 @@ bool TMastrini_application::set_print(int) reset_files(); //resetta l'albero di stampa add_file(LF_SALDI); add_file(LF_RMOV,LF_SALDI); - select_cursor(_cur1); + + if (_msk->get_bool(F_SORTDESC)) + select_cursor(_cur2); + else + select_cursor(_cur1); TRectype da(LF_SALDI), a(LF_SALDI); da.put(SLD_GRUPPO,gruppoini); @@ -3956,7 +4002,8 @@ bool TMastrini_application::user_create() { TToken_string exp; - _rel = new TRelation (LF_SALDI); + _rel = new TRelation(LF_SALDI); + _rel->lfile().set_curr(new TMastrini_record); exp.add("GRUPPO=GRUPPO"); exp.add("CONTO=CONTO"); @@ -3964,6 +4011,8 @@ bool TMastrini_application::user_create() _rel->add(LF_RMOV,exp,2,LF_SALDI); _cur1=add_cursor(new TCursor(_rel,"FLSCA=\" \"",2)); + _cur2=add_cursor(new TSorted_cursor(_rel,"DESCR","FLSCA=\" \"",2)); + _nditte = new TLocalisamfile (LF_NDITTE); _unloc = new TLocalisamfile (LF_UNLOC); _comuni = new TLocalisamfile (LF_COMUNI); diff --git a/cg/cg3200.h b/cg/cg3200.h index 5bcd421c1..6e3e908f1 100755 --- a/cg/cg3200.h +++ b/cg/cg3200.h @@ -39,7 +39,7 @@ #define F_SEPARATOR 117 #define F_VALUTA 118 #define F_DESVALUTA 119 - +#define F_SORTDESC 120 #define F_MEMORIZZA 500 #define F_NUMCARAT 501 #define F_NUMMAST 502 diff --git a/cg/cg3200a.uml b/cg/cg3200a.uml index 5918416bf..e6825ca70 100755 --- a/cg/cg3200a.uml +++ b/cg/cg3200a.uml @@ -163,9 +163,9 @@ BEGIN DISPLAY "Conto" CONTO DISPLAY "Sottoconto" SOTTOCONTO DISPLAY "Descrizione@50" DESCR - OUTPUT F_SOTTOCINI_CONTO SOTTOCONTO OUTPUT F_GRUPPOINI GRUPPO OUTPUT F_CONTOINI_CONTO CONTO + OUTPUT F_SOTTOCINI_CONTO SOTTOCONTO OUTPUT F_DESCRINI_CONTO DESCR CHECKTYPE NORMAL GROUP 1 9 @@ -337,9 +337,9 @@ BEGIN DISPLAY "Conto" CONTO DISPLAY "Sottoconto" SOTTOCONTO DISPLAY "Descrizione@50" DESCR - OUTPUT F_SOTTOCFINE_CONTO SOTTOCONTO OUTPUT F_GRUPPOFINE GRUPPO OUTPUT F_CONTOFINE_CONTO CONTO + OUTPUT F_SOTTOCFINE_CONTO SOTTOCONTO OUTPUT F_DESCRFINE_CONTO DESCR CHECKTYPE NORMAL WARNING "Sottoconto inesistente o mancante" @@ -351,7 +351,7 @@ BEGIN PROMPT 4 9 "Descrizione " USE LF_PCON KEY 2 CHECKTYPE NORMAL - INPUT DESCR F_DESCRINI_CONTO + INPUT DESCR F_DESCRFINE_CONTO DISPLAY "Descrizione@50" DESCR DISPLAY "Gruppo" GRUPPO DISPLAY "Conto" CONTO @@ -454,6 +454,11 @@ BEGIN PROMPT 4 13 "Stampa movimenti provvisori" END +BOOLEAN F_SORTDESC +BEGIN + PROMPT 44 13 "Stampa ordinata per descrizione" +END + BOOLEAN F_SEPARATOR BEGIN PROMPT 4 14 "Non stampare il separatore delle migliaia" diff --git a/cg/cg4.cpp b/cg/cg4.cpp index 891e5e8b7..8406f019d 100755 --- a/cg/cg4.cpp +++ b/cg/cg4.cpp @@ -30,6 +30,8 @@ int main(int argc,char** argv) cg4800(argc,argv); break; // Creazione versamenti per acconto case 8: cg4900(argc,argv); break; // Visualizzazione liquidazione acconti + case 9: + cg4a00(argc,argv); break; // Gestione Autotrasportatori default: error_box(usage, argv[0]); } diff --git a/cg/cg4.h b/cg/cg4.h index 5c8e806b9..33bb31dda 100755 --- a/cg/cg4.h +++ b/cg/cg4.h @@ -14,6 +14,7 @@ int cg4600(int argc, char* argv[]); int cg4700(int argc, char* argv[]); int cg4800(int argc, char* argv[]); int cg4900(int argc, char* argv[]); +int cg4a00(int argc, char* argv[]); #ifdef __MAIN__ #define extern diff --git a/cg/cg4500.cpp b/cg/cg4500.cpp index e497da826..de8fba076 100755 --- a/cg/cg4500.cpp +++ b/cg/cg4500.cpp @@ -1,8 +1,7 @@ -// Apertura nuovo esercizio #include "cg4501.h" #include "cg4500a.h" -class TAp_eser : public TApplication +class TAp_eser : public TSkeleton_application { TTable* _esc, * _reg; int _anno, _newanno; @@ -17,7 +16,7 @@ protected: public: virtual bool create(); virtual bool destroy(); - virtual bool menu(MENU_TAG m); + virtual void main_loop(); bool set(); bool apertura_es(); @@ -59,18 +58,14 @@ public: bool TAp_eser::mask_newanno (TMask_field& f, KEY k) { - TTable TabEs("ESC"); - TString codtab; - if ( (k == K_ENTER) && f.to_check(k) ) { int newanno = f.mask().get_int(F_NUOVOANNO); int anno = f.mask().get_int(F_ANNO); - TabEs.zero(); - codtab.format ("%04d", newanno); + TString16 codtab; codtab.format ("%04d", newanno); + TTable TabEs("ESC"); TabEs.put ("CODTAB", codtab); - TabEs.read(); - if ( TabEs.good() ) + if (TabEs.read() != NOERR) { f.warning_box ("Il codice inserito e' gia' presente nella tabella degli esercizi!"); return FALSE; @@ -96,14 +91,11 @@ bool TAp_eser::mask_dataini (TMask_field& f, KEY k) bool TAp_eser::create() { - _esc = new TTable("ESC"); - _reg = new TTable("REG"); + _esc = new TTable("ESC"); + _reg = new TTable("REG"); enable_menu_item(M_FILE_NEW, FALSE); - - dispatch_e_menu (BAR_ITEM(1)); - - return TRUE; + return TSkeleton_application::create(); } bool TAp_eser::destroy() @@ -114,13 +106,16 @@ bool TAp_eser::destroy() return TRUE; } -bool TAp_eser::menu(MENU_TAG m) +void TAp_eser::main_loop() { TTable TabEs ("ESC"); TMask msk ("cg4500a"); if (TabEs.last() != NOERR) - return error_box("Non e' ancora stato aperto alcun esercizio!"); + { + error_box("Non e' ancora stato aperto alcun esercizio!"); + return; + } TabEs.first(); TRecnotype rn = TabEs.recno(); int anno = TabEs.get_int ("CODTAB"); @@ -160,7 +155,6 @@ bool TAp_eser::menu(MENU_TAG m) apertura_es(); } - return FALSE; } bool TAp_eser::apertura_es() @@ -175,7 +169,7 @@ bool TAp_eser::apertura_es() //viene aggiornata la tabella dei registri. Se esisteva gia' un record relativo al nuovo esercizio, viene cancellato. //In ogni caso ne viene creato uno nuovo relativo al nuovo esercizio. TabReg.zero(); - annonew = format ("%04d", _datafin.year()); + annonew.format("%04d", _datafin.year()); TabReg.put ("CODTAB", annonew); TRectype r (TabReg.curr()); @@ -193,7 +187,7 @@ bool TAp_eser::apertura_es() TabReg.zero(); TRectype nuovo (TabReg.curr()); - anno = format ("%04d", _datafip.year()); + anno.format ("%04d", _datafip.year()); TabReg.put ("CODTAB", anno); TRectype rec (TabReg.curr()); @@ -212,7 +206,7 @@ bool TAp_eser::apertura_es() ok = TRUE; nuovo = TabReg.curr(); TString16 cod; - annonew = format ("%04d", _datafin.year()); + annonew.format ("%04d", _datafin.year()); cod << annonew << cod_reg; nuovo.put("CODTAB", cod); nuovo.put("D0", data); @@ -231,7 +225,7 @@ bool TAp_eser::apertura_es() if (check_esercizio(annonew, _dataini, _datafin)) { TabEs.zero(); - annonew = format ("%04d", _newanno); + annonew.format ("%04d", _newanno); TabEs.put ("CODTAB", annonew); TabEs.put ("D0", _dataini); TabEs.put ("D1", _datafin); diff --git a/cg/cg4501.cpp b/cg/cg4501.cpp index 752bc68e5..010674dbc 100755 --- a/cg/cg4501.cpp +++ b/cg/cg4501.cpp @@ -1,8 +1,8 @@ -//Apertura nuovo esercizio IVA -#include "nditte.h" #include "cg4501.h" #include "cg4500b.h" +#include "nditte.h" + bool TAp_iva::mask_annoiva (TMask_field& f, KEY k) { if ( (k == K_ENTER) && f.to_check(k) ) @@ -28,10 +28,7 @@ bool TAp_iva::create() _lbu = new TTable("%LBU"); enable_menu_item(M_FILE_NEW, FALSE); - - dispatch_e_menu (BAR_ITEM(1)); - - return TRUE; + return TSkeleton_application::create(); } bool TAp_iva::destroy() @@ -50,28 +47,31 @@ bool TAp_iva::apertura_iva() TTable TabLia ("%LIA"); TTable TabLbu ("%LBU"); TLocalisamfile nditte (LF_NDITTE); - TString annoiva (4); + TString annoiva (4), codlia(10); TDate data; bool ok = FALSE; int annop = atoi(_annop); - annoiva = format("%04d", _annoiva); + annoiva.format("%04d", _annoiva); //viene aggiornata la tabella LIA (liquidazione iva annuale) TabLia.zero(); - TabLia.put ("CODTAB", format("%05ld%04d", get_firm(), _annoiva)); + codlia.format("%05ld%04d", get_firm(), _annoiva); + TabLia.put ("CODTAB", codlia); if (TabLia.read() == NOERR) TabLia.remove(); TabLia.zero(); - TRectype newrec (TabLia.curr()); - TabLia.put ("CODTAB", format("%05ld%04d", get_firm(), annop)); + TRectype newrec (TabLia.curr()); + codlia.format("%05ld%04d", get_firm(), annop); + TabLia.put ("CODTAB", codlia); if (TabLia.read() == NOERR) { ok = TRUE; newrec = TabLia.curr(); - newrec.put("CODTAB", format("%05ld%04d", get_firm(), _annoiva)); + codlia.format("%05ld%04d", get_firm(), _annoiva); + newrec.put("CODTAB", codlia); newrec.put("S7", _frequenza); newrec.put("B2", _is_minagr); newrec.zero("R0"); @@ -216,7 +216,7 @@ bool TAp_iva::apertura_iva() return TRUE; } -bool TAp_iva::menu(MENU_TAG m) +void TAp_iva::main_loop() { TTable TabLia ("%LIA"); TLocalisamfile nditte (LF_NDITTE); @@ -268,5 +268,4 @@ bool TAp_iva::menu(MENU_TAG m) apertura_iva(); } - return FALSE; } \ No newline at end of file diff --git a/cg/cg4501.h b/cg/cg4501.h index 65217b686..e49e81837 100755 --- a/cg/cg4501.h +++ b/cg/cg4501.h @@ -1,12 +1,16 @@ -#include -#include -#include -#include -#include -#include -#include +#ifndef __APPLICAT_H +#include +#endif -class TAp_iva : public TApplication +#ifndef __MASK_H +#include +#endif + +#ifndef __TABUTIL_H +#include +#endif + +class TAp_iva : public TSkeleton_application { TTable* _reg, * _lia, * _lbu; TLocalisamfile* _nditte; @@ -22,10 +26,11 @@ protected: public: virtual bool create(); virtual bool destroy(); - virtual bool menu(MENU_TAG m); + virtual void main_loop(); bool setta(); bool apertura_iva(); TAp_iva() {} + virtual ~TAp_iva() {} }; \ No newline at end of file diff --git a/cg/cg4600.cpp b/cg/cg4600.cpp index d825962f2..9c4ad9e73 100755 --- a/cg/cg4600.cpp +++ b/cg/cg4600.cpp @@ -913,6 +913,7 @@ void TApertura_chiusura::costi() rmov.put(RMV_NUMREG, _numreg); rmov.put(RMV_NUMRIG, numrig); rmov.put(RMV_TIPOC, tmcf); + _tcproper.put(rmov, TRUE); // Contropartita TBill tc(g,c,s); _sld->aggiorna(tc,TImporto(sez_rmov,_saldo)); //l'oggetto TSaldo_agg @@ -1066,6 +1067,7 @@ void TApertura_chiusura::ricavi() rmov.put(RMV_NUMREG, _numreg); rmov.put(RMV_NUMRIG, numrig); rmov.put(RMV_TIPOC, tmcf); + _tcproper.put(rmov, TRUE); // Contropartita TBill tc(g,c,s); _sld->aggiorna(tc,TImporto(sez_rmov,_saldo)); //l'oggetto TSaldo_agg @@ -1102,10 +1104,13 @@ void TApertura_chiusura::chiusura_conto_economico() TRectype& rmov1 = _pn->cg(j); long numrig = 1; rmov_proper(_annoesch,numrig,_dataregch,rmov1,_tcproper,_totale_saldo,TRUE); + _tcperde.put(rmov1, TRUE); // Contropartita + numrig++; j++; TRectype& rmov2 = _pn->cg(j); rmov_proper(_annoesch,numrig,_dataregch,rmov2,_tcperde,_totale_saldo,FALSE); + _tcproper.put(rmov2, TRUE); // Contropartita _pn->write(); _pn->destroy_rows(_numreg); //Azzero l'oggetto pn. @@ -1123,10 +1128,13 @@ void TApertura_chiusura::chiusura_conto_economico() TRectype& rmov3 = _pn->cg(j); numrig = 1; rmov_proper(_annoesch,numrig,_dataregch,rmov3,_tcperde,_totale_saldo,TRUE); + _tcperdp.put(rmov3, TRUE); // Contropartita + numrig++; j++; TRectype& rmov4 = _pn->cg(j); rmov_proper(_annoesch,numrig,_dataregch,rmov4,_tcperdp,_totale_saldo,FALSE); + _tcperde.put(rmov4, TRUE); // Contropartita _pn->write(); _pn->destroy_rows(_numreg); //Azzero l'oggetto pn. @@ -1146,10 +1154,13 @@ void TApertura_chiusura::chiusura_conto_economico() TRectype& rmov1 = _pn->cg(j); long numrig = 1; rmov_proper(_annoesch,numrig,_dataregch,rmov1,_tcutile,_totale_saldo,FALSE); + _tcproper.put(rmov1, TRUE); // Contropartita + numrig++; j++; TRectype& rmov2 = _pn->cg(j); rmov_proper(_annoesch,numrig,_dataregch,rmov2,_tcproper,_totale_saldo,TRUE); + _tcutile.put(rmov2, TRUE); // Contropartita _pn ->write(); _pn->destroy_rows(_numreg); //Azzero l'oggetto pn. @@ -1166,10 +1177,13 @@ void TApertura_chiusura::chiusura_conto_economico() TRectype& rmov3 = _pn->cg(j); numrig = 1; rmov_proper(_annoesch,numrig,_dataregch,rmov3,_tcutilp,_totale_saldo,FALSE); + _tcutile.put(rmov3, TRUE); // Contropartita + numrig++; j++; TRectype& rmov4 = _pn->cg(j); rmov_proper(_annoesch,numrig,_dataregch,rmov4,_tcutile,_totale_saldo,TRUE); + _tcutilp.put(rmov4, TRUE); // Contropartita _pn ->write(); _pn->destroy_rows(_numreg); //Azzero l'oggetto pn. @@ -1310,6 +1324,7 @@ void TApertura_chiusura::chiudi_attivita() rmov.put(RMV_NUMREG, _numreg); rmov.put(RMV_NUMRIG, numrig); rmov.put(RMV_TIPOC, tmcf); + _tcbilch.put(rmov, TRUE); // Contropartita TBill tc(g,c,s); _sld->aggiorna(tc,TImporto(sez_rmov,_saldo)); //l'oggetto TSaldo_agg @@ -1463,6 +1478,7 @@ void TApertura_chiusura::chiudi_passivita() rmov.put(RMV_NUMREG, _numreg); rmov.put(RMV_NUMRIG, numrig); rmov.put(RMV_TIPOC, tmcf); + _tcbilch.put(rmov, TRUE); // Contropartita TBill tc(g,c,s); _sld->aggiorna(tc,TImporto(sez_rmov,_saldo)); //l'oggetto TSaldo_agg @@ -1616,6 +1632,7 @@ void TApertura_chiusura::chiudi_conti_ordine() rmov.put(RMV_NUMREG, _numreg); rmov.put(RMV_NUMRIG, numrig); rmov.put(RMV_TIPOC, tmcf); + _tcbilch.put(rmov, TRUE); // Contropartita TBill tc(g,c,s); _sld->aggiorna(tc,TImporto(sez_rmov,_saldo)); //l'oggetto TSaldo_agg @@ -1651,10 +1668,13 @@ void TApertura_chiusura::chiusura_conto_patrimoniale() TRectype& rmov1 = _pn->cg(j); numrig = 1; rmov_proper(_annoesch,numrig,_dataregch,rmov1,_tcutilp,_totale_saldo,FALSE); + _tcbilch.put(rmov1, TRUE); // Contropartita + numrig++; j++; TRectype& rmov2 = _pn->cg(j); rmov_proper(_annoesch,numrig,_dataregch,rmov2,_tcbilch,_totale_saldo,TRUE); + _tcutilp.put(rmov2, TRUE); // Contropartita _pn->write(); _pn->destroy_rows(_numreg); //Azzero l'oggetto pn. @@ -1674,10 +1694,13 @@ else TRectype& rmov1 = _pn->cg(j); numrig = 1; rmov_proper(_annoesch,numrig,_dataregch,rmov1,_tcbilch,_totale_saldo,TRUE); + _tcperdp.put(rmov1, TRUE); // Contropartita + numrig++; j++; TRectype& rmov2 = _pn->cg(j); rmov_proper(_annoesch,numrig,_dataregch,rmov2,_tcperdp,_totale_saldo,FALSE); + _tcbilch.put(rmov2, TRUE); // Contropartita _pn ->write(); _pn->destroy_rows(_numreg); //Azzero l'oggetto pn. @@ -1814,6 +1837,8 @@ void TApertura_chiusura::apri_attivita() rmov.put(RMV_NUMREG, _numreg); rmov.put(RMV_NUMRIG, numrig); rmov.put(RMV_TIPOC, tmcf); + _tcbilap.put(rmov, TRUE); // Contropartita + TBill tc(g,c,s); _sld->aggiorna(tc,TImporto(sezione,_saldo)); //l'oggetto TSaldo_agg @@ -1961,6 +1986,7 @@ void TApertura_chiusura::apri_passivita() rmov.put(RMV_NUMREG, _numreg); rmov.put(RMV_NUMRIG, numrig); rmov.put(RMV_TIPOC, tmcf); + _tcbilap.put(rmov, TRUE); // Contropartita TBill tc(g,c,s); _sld->aggiorna(tc,TImporto(sezione,_saldo)); //l'oggetto TSaldo_agg @@ -2108,6 +2134,7 @@ void TApertura_chiusura::apri_conti_ordine() rmov.put(RMV_NUMREG, _numreg); rmov.put(RMV_NUMRIG, numrig); rmov.put(RMV_TIPOC, tmcf); + _tcbilap.put(rmov, TRUE); // Contropartita TBill tc(g,c,s); _sld->aggiorna(tc,TImporto(sezione,_saldo)); //l'oggetto TSaldo_agg @@ -2143,10 +2170,13 @@ void TApertura_chiusura::apertura_capitale_netto() TRectype& rmov1 = _pn->cg(j); numrig = 1; rmov_proper(_annoesap,numrig,_dataregap,rmov1,_tcbilap,_capitale_netto,TRUE); + _tcperdp.put(rmov1, TRUE); // Contropartita + numrig++; j++; TRectype& rmov2 = _pn->cg(j); rmov_proper(_annoesap,numrig,_dataregap,rmov2,_tcperdp,_capitale_netto,FALSE); + _tcbilap.put(rmov2, TRUE); // Contropartita _pn->write(); _pn->destroy_rows(_numreg); //Azzero l'oggetto pn. @@ -2165,10 +2195,13 @@ void TApertura_chiusura::apertura_capitale_netto() TRectype& rmov1 = _pn->cg(j); numrig = 1; rmov_proper(_annoesap,numrig,_dataregap,rmov1,_tcbilap,_capitale_netto,TRUE); + _tcutilp.put(rmov1, TRUE); // Contropartita + numrig++; j++; TRectype& rmov2 = _pn->cg(j); rmov_proper(_annoesap,numrig,_dataregap,rmov2,_tcutilp,_capitale_netto,FALSE); + _tcbilap.put(rmov2, TRUE); // Contropartita _pn->write(); _pn->destroy_rows(_numreg); //Azzero l'oggetto pn. diff --git a/cg/cg4a00.cpp b/cg/cg4a00.cpp new file mode 100755 index 000000000..9d7fa1d8c --- /dev/null +++ b/cg/cg4a00.cpp @@ -0,0 +1,515 @@ +// Programma di gestione autotrasportatori. +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "cg2101.h" +#include "cg2103.h" +#include "cg4a00a.h" + +static int __anno; + +bool cau_filter1 (const TRelation *r) +{ + bool rt = FALSE; + const TRectype& rec = r->curr(LF_CAUSALI); + + if (rec.get(CAU_TIPODOC) == "ST") // Solo i tipi documento STorno + { + TTable& reg = (TTable&) r->lfile("REG"); + TString16 cod; + + cod << __anno; + cod << rec.get(CAU_REG); + reg.put("CODTAB", cod); + if (reg.read() == NOERR ) + { + const int i9 = reg.get_int("I9"); + const bool b1 = reg.get_bool("B1"); + if (i9 == 1 || i9 == 0 && b1) // Il registro deve avere la X di sospensione NORMALE + { + TLocalisamfile& rcau = r->lfile(LF_RCAUSALI); // La riga 1 (gia' posizionata nella relazione) deve essere di tipo cliente + if (rcau.get(RCA_TIPOCF) == "C") + rt = TRUE; + } + } + } + + return rt; +} + +bool cau_filter2 (const TRelation *r) +{ + bool rt = FALSE; + const TRectype& rec = r->curr(LF_CAUSALI); + + if (rec.get(CAU_TIPODOC) == "FV") // Solo i tipi documento Fatture Vendita + { + TTable& reg = (TTable&) r->lfile("REG"); + TString16 cod; + + cod << __anno; + cod << rec.get(CAU_REG); + reg.put("CODTAB", cod); + if (reg.read() == NOERR ) + rt = ! reg.get_bool("B1"); + } + + return rt; +} + +class TGestAutoTrasp_mask : public TAutomask +{ + TAssoc_array _caudef; + TCursor *_cur; + TRelation *_rel; + TTable *_reg; + +protected: + void fill_sheet(const short id); + const long get_last_nreg(); + const long get_last_nprot(); + void swap_sign(TMovimentoPN&); + +public: + virtual bool on_key(KEY k); + virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); + void write_movs(); + TGestAutoTrasp_mask(); + virtual ~TGestAutoTrasp_mask(); +}; + +TGestAutoTrasp_mask::TGestAutoTrasp_mask() : TAutomask("cg4a00a") +{ + _rel = new TRelation(LF_MOV); + _cur = NULL; + _reg = new TTable("REG"); +} + +TGestAutoTrasp_mask::~TGestAutoTrasp_mask() +{ + if (_cur) + delete _cur; + delete _rel; + delete _reg; +} + +bool TGestAutoTrasp_mask::on_key(KEY k) +{ + if (k == K_SHIFT + K_F12) + { + // Abilita la cella del numero prot. registro corrispondente alla riga + // corrente dello spreadsheet + if (focus_field().dlg() == F_SHEET_CAUSALI) + { + TSheet_field& sf = sfield(F_SHEET_CAUSALI); + const int rs = sf.selected(); + sf.enable_column(F_NUMPROT - F_CAUMOV); + + const int items = sf.items(); + for (int i=0; icurr(); + const TRecnotype items = _cur->items(); + TProgind* pi = NULL; + + if (items > 10) + pi = new TProgind(items, "Selezione movimenti...", FALSE, TRUE); + + TLocalisamfile causali(LF_CAUSALI); + + // Azzera lo sheet + TSheet_field& sf = sfield(F_SHEET_CAUSALI); + TString_array& sa = sf.rows_array(); + sa.destroy(); + + //azzera l'array + _caudef.destroy(); + for (*_cur = 0L; _cur->pos() < items; ++(*_cur)) + { + if (pi) + pi->addstatus(1L); + caus = rc.get(MOV_CODCAUS); + if (!_caudef.is_key(caus)) // Se non è stata ancora aggiunta questa causale... + { + TToken_string* tt = new TToken_string; + + tt->add(caus, 0); + _caudef.add(caus, new TString16); + causali.put(CAU_CODCAUS, caus); + + const bool ok = causali.read() == NOERR; + tt->add(ok ? causali.get(CAU_DESCR) : "** Non presente **", 1); + tt->add(ok ? causali.get(CAU_TIPODOC) : "**", 2); + + sa.add(tt); + } + } + + if (pi) + delete pi; + + sf.force_update(); // Aggiorna lo sheet + + if (items == 0) + { + warning_box("Non vi sono operazioni da effettuare nell'intervallo specificato."); + set_focus_field(id); + } + } +} + +bool TGestAutoTrasp_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + switch (o.dlg()) + { + case F_DADATA: + if (e == fe_modify || e == fe_init) + { + + __anno = e == fe_modify ? atoi(o.get().right(4)) : 0; + set(F_ANNO, __anno); + + TCursor* cur1 = efield(F_CAUS).browse()->cursor(); + + cur1->set_filterfunction(cau_filter1, TRUE); + + TCursor* cur2 = sfield(F_SHEET_CAUSALI).sheet_mask().efield(F_CAUDEF).browse()->cursor(); + + cur2->set_filterfunction(cau_filter2, TRUE); + + if (e == fe_modify) + fill_sheet(o.dlg()); + } + break; + case F_ADATA: + case F_CODREG: + if (e == fe_modify) + fill_sheet(o.dlg()); + break; + case F_SHEET_CAUSALI: + if (e == se_query_add) + return FALSE; + else + if (e == fe_close) // Controllo sulla presenza dei codici causale nello spreadsheet + { + TSheet_field& sf = sfield(F_SHEET_CAUSALI); + TString16 c; + bool error = FALSE; + + for (int i=0; i < sf.items(); i++) + { + TToken_string& tt = sf.row(i); + c = tt.get(F_CAUDEF - F_CAUMOV); + if (c.empty()) + { + error = TRUE; + break; + } + } + + if (sf.items() == 0) + error = TRUE; + + if (error) + if (sf.items() == 0) + error_box("E' necessario indicare tutte le causali definitive per ogni causale del movimento in sospensione."); + else + error_box("Non vi sono movimenti in sospensione da stornare nel periodo indicato."); + + return !error; + } + break; + case F_NUMPROT: + case F_CAUDEF: + if (e == fe_modify) + { + + TString16 cod; + cod << __anno; + cod << o.mask().get(F_CAUDEFREG); + _reg->put("CODTAB", cod); + if (_reg->read() == NOERR) + { + if (o.dlg() == F_NUMPROT) + { + _reg->put("I5", o.mask().get_long(F_NUMPROT)); + _reg->rewrite(); + + TSheet_field& sf = sfield(F_SHEET_CAUSALI); + + const int rs = sf.selected(); + sf.enable_column(F_NUMPROT - F_CAUMOV, FALSE); + sf.force_update(rs); + } + + o.mask().set(F_NUMPROT, _reg->get_long("I5")); + } + } + break; + default: + break; + } + return TRUE; +} + +const long TGestAutoTrasp_mask::get_last_nreg() +{ + TLocalisamfile& mov = _rel->lfile(); + long nr = 1L; + + if (!mov.empty()) + { + mov.last(); + nr = mov.get_long(MOV_NUMREG) + 1L; + } + return nr; +} + +const long TGestAutoTrasp_mask::get_last_nprot() +{ + long rt = 0l; + TString16 cod; + cod << __anno; + cod << get(F_CODREG); + _reg->put("CODTAB", cod); + if (_reg->read() == NOERR) + rt = _reg->get_long("I5"); + return rt; +} + +void TGestAutoTrasp_mask::swap_sign(TMovimentoPN& m) +{ + // Scambia il segno sulla testata + TRectype& h = m.curr(); + real r; + + r = ZERO - h.get_real(MOV_TOTDOC); + h.put(MOV_TOTDOC, r); + r = ZERO - h.get_real(MOV_TOTDOCVAL); + h.put(MOV_TOTDOCVAL, r); + + // e su tutte le righe iva + const int items = m.iva_items(); + for (int i=0; iitems(); + TRectype& curr_rec = _cur->curr(); + TMovimentoPN mpn_sosp; // Movimento di prima nota in sospensione + TMovimentoPN mpn_storno; // Movimento di prima nota di storno sul reg. sospensione + TMovimentoPN mpn_definitivo; // Movimento di prima nota solo IVA sul registro definitivo + TRectype& mpn_sosp_rec = mpn_sosp.curr(); + TRectype& mpn_storno_rec = mpn_storno.curr(); + TRectype& mpn_definitivo_rec = mpn_definitivo.curr(); + + _cur->freeze(); + + TProgind pi(cur_items, "Creazione movimenti...", FALSE, TRUE); + int err = NOERR; + int movs = 0; + + // Scorre i movimenti selezionati sul registro in sospensione + for (*_cur = 0L; _cur->pos() < cur_items && err == NOERR; ++(*_cur)) + { + pi.addstatus(1L); + mpn_sosp_rec = curr_rec; + if (mpn_sosp.read(_isequal) == NOERR) + { + // Il prossimo numero di registrazione è... + long nr = get_last_nreg(); + + long nsosp = mpn_sosp_rec.get_long(MOV_NUMREG); + + // Azzera le righe dei movimenti da scrivere + mpn_storno.destroy_rows(nr); + mpn_definitivo.destroy_rows(nr+1); + + // Sistema il movimento definitivo + TCausale def_caus((TString&)_caudef[mpn_sosp_rec.get(MOV_CODCAUS)], __anno); + mpn_definitivo_rec = mpn_sosp_rec; + mpn_definitivo_rec.put(MOV_NUMREG, nr+1); + mpn_definitivo_rec.put(MOV_PROTIVA, def_caus.reg().protocol()+1); + mpn_definitivo_rec.put(MOV_DATAREG, dataop); + mpn_definitivo_rec.put(MOV_DATACOMP, dataop); + mpn_definitivo_rec.put(MOV_CODCAUS, def_caus.codice()); + mpn_definitivo_rec.put(MOV_REG, def_caus.reg().name()); + mpn_definitivo_rec.put(MOV_TIPODOC, def_caus.tipo_doc()); + + // Flag operazione stampata in definitiva, solo per quelli in sospensione ed il movimento di storno, + // il movimento definitivo non va flaggato. + mpn_sosp_rec.put(MOV_STAMPATO, TRUE); + mpn_sosp_rec.put(MOV_REGST, TRUE); + + // Sistema il movimento di storno a partire da quello in sospensione + TCausale storno_caus(get(F_CAUS), __anno); // Forse è ridondante ma serve per tener aggiornato il nr. protocollo + mpn_storno_rec = mpn_sosp_rec; + mpn_storno_rec.put(MOV_NUMREG, nr); + mpn_storno_rec.put(MOV_PROTIVA, storno_caus.reg().protocol()+1); + mpn_storno_rec.put(MOV_DATAREG, dataop); + mpn_storno_rec.put(MOV_DATACOMP, dataop); + mpn_storno_rec.put(MOV_CODCAUS, storno_caus.codice()); + mpn_storno_rec.put(MOV_REG, storno_caus.reg().name()); + mpn_storno_rec.put(MOV_TIPODOC, storno_caus.tipo_doc()); + + // Aggiunge le righe IVA + const int iva_items = mpn_sosp.iva_items(); + for (int j=0; jfreeze(FALSE); + + message_box("Totale movimenti generati: %d", movs); +} + +class TGestAutoTrasp_app : public TSkeleton_application +{ + TGestAutoTrasp_mask * _msk; + +protected: + virtual bool create(); + virtual bool destroy(); + virtual void main_loop(); +public: + TGestAutoTrasp_app () {}; + virtual ~TGestAutoTrasp_app () {}; +}; + +bool TGestAutoTrasp_app::create() +{ + _msk = new TGestAutoTrasp_mask(); + open_files(LF_MOV, LF_ATTIV, 0); + return TSkeleton_application::create(); +} + +bool TGestAutoTrasp_app::destroy() +{ + delete _msk; + return TSkeleton_application::destroy(); +} + +void TGestAutoTrasp_app::main_loop() +{ + while (_msk->run() != K_QUIT) + { + if (yesno_box("Procedo con la creazione dei movimenti?")) + { + _msk->write_movs(); + _msk->reset(); + } + } +} + +int cg4a00(int argc, char* argv[]) +{ + TGestAutoTrasp_app app; + app.run(argc, argv, "Gestione Autotrasportatori"); + return 0; +} diff --git a/cg/cg4a00a.h b/cg/cg4a00a.h new file mode 100755 index 000000000..011a4bd97 --- /dev/null +++ b/cg/cg4a00a.h @@ -0,0 +1,22 @@ + +#define F_CODDITTA 201 +#define F_RAGSOC 202 +#define F_DADATA 203 +#define F_ADATA 204 +#define F_ANNO 205 +#define F_CODREG 206 +#define F_DESREG 207 +#define F_DATAOP 208 +#define F_CAUS 209 +#define F_DESCRCAUS 210 + +#define F_SHEET_CAUSALI 200 + +#define F_CAUMOV 101 +#define F_DESCAUMOV 102 +#define F_TIPODOC 103 +#define F_CAUDEF 104 +#define F_DESCAUDEF 105 +#define F_CAUDEFREG 106 +#define F_NUMPROT 107 + diff --git a/cg/cg4a00a.uml b/cg/cg4a00a.uml new file mode 100755 index 000000000..3b25cbe7d --- /dev/null +++ b/cg/cg4a00a.uml @@ -0,0 +1,208 @@ +#include "cg4a00a.h" + +TOOLBAR "" 0 20 0 3 + +BUTTON DLG_OK 10 2 +BEGIN + PROMPT -12 -1 "" +END + +BUTTON DLG_QUIT 10 2 +BEGIN + PROMPT -22 -1 "" +END + +ENDPAGE + +PAGE "Gestione Autotrasportatori" -1 -1 78 14 + +GROUPBOX DLG_NULL 76 3 +BEGIN + PROMPT 1 1 "@bDitta" +END + +NUMBER F_CODDITTA 5 +BEGIN + PROMPT 3 2 "Codice " + FLAGS "FRD" + USE LF_NDITTE + CHECKTYPE NORMAL + INPUT CODDITTA F_CODDITTA + OUTPUT F_RAGSOC RAGSOC +END + +STRING F_RAGSOC 50 +BEGIN + PROMPT 17 2 "Ragione " + FLAGS "D" +END + +GROUPBOX DLG_NULL 76 4 +BEGIN + PROMPT 1 4 "Selezione movimenti" +END + +DATE F_DADATA +BEGIN + PROMPT 2 5 "Dal " + CHECKTYPE REQUIRED +END + +DATE F_ADATA +BEGIN + PROMPT 37 5 "Al " + VALIDATE DATE_CMP_FUNC >= F_DADATA + CHECKTYPE REQUIRED + WARNING "La data finale deve essere maggiore di quella iniziale" +END + +NUMBER F_ANNO 4 +BEGIN + PROMPT 1 1 "" + FLAGS "H" +END + +STRING F_CODREG 3 +BEGIN + PROMPT 2 6 "Codice registro " + USE REG SELECT ((B1=="X")&&((I9==1)||(I9==0))) + INPUT CODTAB[1,4] F_ANNO + INPUT CODTAB[5,7] F_CODREG + DISPLAY "Anno " CODTAB[1,4] + DISPLAY "Codice " CODTAB[5,7] + DISPLAY "Descrizione @40" S0 + OUTPUT F_CODREG CODTAB[5,7] + OUTPUT F_DESREG S0 + FLAGS "U" + CHECKTYPE REQUIRED +END + +STRING F_DESREG 50 30 +BEGIN + PROMPT 40 6 "" + FLAGS "D" +END + +GROUPBOX DLG_NULL 76 4 +BEGIN + PROMPT 1 8 "Generazione movimenti" +END + +DATE F_DATAOP +BEGIN + PROMPT 2 9 "Data operazione " + VALIDATE DATE_CMP_FUNC >= F_DADATA + CHECKTYPE REQUIRED + WARNING "La data operazione deve essere maggiore di quella iniziale" +END + +STRING F_CAUS 3 +BEGIN + PROMPT 2 10 "Causale di storno " + FLAGS "UZ" + USE LF_CAUSALI + JOIN REG INTO CODTAB==TIPODOC + JOIN LF_RCAUSALI INTO CODCAUS==CODCAUS NRIGA=="1" + INPUT CODCAUS F_CAUS + DISPLAY "Codice" CODCAUS + DISPLAY "Descrizione@50" DESCR + DISPLAY "Tipo" TIPODOC + DISPLAY "Registro" REG + OUTPUT F_CAUS CODCAUS + OUTPUT F_DESCRCAUS DESCR + CHECKTYPE REQUIRED + WARNING "Causale indicata non completa od errata" +END + +STRING F_DESCRCAUS 50 40 +BEGIN + PROMPT 35 10 "" + FLAGS "D" +END + +SPREADSHEET F_SHEET_CAUSALI 78 +BEGIN +PROMPT 1 12 "Selezione causali" + ITEM "C.sos." + ITEM "Descrizione@15" + ITEM "T.D." + ITEM "C.def." + ITEM "Descrizione@15" + ITEM "C.Reg." + ITEM "Nr.\nProt." +END + +ENDPAGE +ENDMASK + +PAGE "" -1 -1 65 16 + +STRING F_CAUMOV 3 +BEGIN + PROMPT 1 1 "Causale mov. in sosp. " + FLAGS "D" +END + +STRING F_DESCAUMOV 50 15 +BEGIN + PROMPT 1 2 "Descrizione " + FLAGS "D" +END + +STRING F_TIPODOC 2 +BEGIN + PROMPT 1 3 "Tipo documento " + FLAGS "D" +END + +STRING F_CAUDEF 3 +BEGIN + PROMPT 1 4 "Caus. mov. definitivo " + FLAGS "UZ" + USE LF_CAUSALI + JOIN REG INTO CODTAB==TIPODOC + INPUT CODCAUS F_CAUDEF + DISPLAY "Codice" CODCAUS + DISPLAY "Descrizione@50" DESCR + DISPLAY "Tipo" TIPODOC + DISPLAY "Registro" REG + OUTPUT F_CAUDEF CODCAUS + OUTPUT F_DESCAUDEF DESCR[1,15] + OUTPUT F_CAUDEFREG REG + CHECKTYPE NORMAL + WARNING "La causale definitiva è obbligatoria" +END + +STRING F_DESCAUDEF 15 +BEGIN + PROMPT 1 5 "Descrizione " + FLAGS "D" +END + +STRING F_CAUDEFREG 3 +BEGIN + PROMPT 1 6 "Cod. registro " + FLAGS "D" +END + +NUMBER F_NUMPROT 7 +BEGIN + PROMPT 1 7 "Ultimo nr. protocollo " + FLAGS "D" +END + +BUTTON DLG_OK 9 2 +BEGIN + PROMPT -12 -1 "" +END + +BUTTON DLG_CANCEL 9 2 +BEGIN + PROMPT -22 -1 "" +END + + +ENDPAGE + +ENDMASK + diff --git a/cg/cgpagame.cpp b/cg/cgpagame.cpp index d381396d6..654166d05 100755 --- a/cg/cgpagame.cpp +++ b/cg/cgpagame.cpp @@ -1666,8 +1666,7 @@ void TPagamento::set_rate_auto() set_imprata(0, importo_rata(0,v) + importo_da_non_dividere(v), v); } - // risistema rate per scadenze fisse - adjust_fixed_scad(); + // adjust_fixed_scad(); // Gia' fatto dalla set_inizio } const real& TPagamento::importo_da_dividere(bool v) const diff --git a/cg/cgpagame.h b/cg/cgpagame.h index bf4ec9546..2383596ae 100755 --- a/cg/cgpagame.h +++ b/cg/cgpagame.h @@ -166,6 +166,9 @@ public: void set_numero_rate(int n, int sscad = -1, int rdiff = 1); void set_inizio(const TDate& d, bool rispetta_date = FALSE); // resetta tutto + const TDate& get_inizio() const { return _inizio; } + const TDate& get_datadoc() const { return _datadoc; } + void set_datadoc(const TDate & d) { _datadoc = d;} void set_inizio_scadenza(char v) { _inscad = v; } void set_code(const char* c) { _code = c; } diff --git a/cg/cgprassi.men b/cg/cgprassi.men index dae5c40f0..76b190304 100755 --- a/cg/cgprassi.men +++ b/cg/cgprassi.men @@ -110,6 +110,7 @@ Item_05 = "Stampa registri", "cg4 -3", "F" Item_06 = "Liste fatture", [PRASSICG_026] Item_07 = "Gestione acconti IVA", [PRASSICG_027] Item_08 = "Gestione versamenti IVA", [PRASSICG_022] +Item_09 = "Gestione autotrasportatori", "cg4 -9", "F" [PRASSICG_011] Caption = "Tabelle ministeriali" diff --git a/cg/cgsaldac.cpp b/cg/cgsaldac.cpp index fb90bdc3d..f0bafe075 100755 --- a/cg/cgsaldac.cpp +++ b/cg/cgsaldac.cpp @@ -1140,7 +1140,7 @@ bool TPartita::write(bool re) const { chiusa(TRUE); // Aggiorna flag di chiusura (non si sa mai) - if (conto().tipo() > ' ') + if (conto().tipo() > ' ' && conto().gruppo() > 0) { // Aggiunge conti cliente/fornitore mancanti for (int r = last(); r > 0; r = pred(r)) diff --git a/db/db0500.cpp b/db/db0500.cpp index ad54a47d0..ec6322f38 100755 --- a/db/db0500.cpp +++ b/db/db0500.cpp @@ -135,6 +135,8 @@ void TQuery_mask::restart_tree() _tree.restart(); while (!_tree.is_leaf()) { + if (_tree.is_cyclic()) + break; _tree.expand(); _tree.goto_firstson(); if (_tree.has_rbrother()) @@ -317,7 +319,7 @@ bool TQuery_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) if (m.get_bool(F_GHOST)) fi << 'G'; _tree.goto_root(); - _tree.explode(a.rows_array(), mb, gr, md, fi, sk, lq); + _tree.explode(a.rows_array(), mb, gr, md, fi, sk); a.run(); } } @@ -719,6 +721,7 @@ bool TDistinta_mask::on_field_event(TOperable_field& o, TField_event e, long jol if (code.not_empty()) { const char type = _tree.get_type(code); + bool is_virtual=type == 'V'; switch(type) { case 'A': @@ -747,6 +750,7 @@ bool TDistinta_mask::on_field_event(TOperable_field& o, TField_event e, long jol break; default: set(F_TIPO, "V", TRUE); + // le distinte virtuali non possono essere master break; } load_um(); @@ -906,9 +910,9 @@ void TDistinta_app::init_insert_mode(TMask &m) TSheet_field &f= (TSheet_field &)m.field(F_UNITA); if (f.items() == 0) f.row(0) = " |1"; // aggiunge una riga allo sheet + m.set(F_MASTER,"X"); } - bool TDistinta_app::changing_mask(int mode) { bool was_query = _mode == MODE_QUERY || _mode == MODE_QUERYINS; @@ -952,7 +956,7 @@ int TDistinta_app::read(TMask& m) memo.get(i, row); int equal = row.find('='); if (equal > 0) - row[equal] = '|'; + row[equal] = SAFE_PIPE_CHR; } } diff --git a/db/db0500b.uml b/db/db0500b.uml index c626bbd49..4b3b08928 100755 --- a/db/db0500b.uml +++ b/db/db0500b.uml @@ -70,19 +70,19 @@ LIST F_TIPO 1 12 BEGIN PROMPT 54 2 "Tipo " ITEM "A|Articolo" - MESSAGE "",F_VIRTUALE + MESSAGE "",F_VIRTUALE|ENABLE,F_MASTER|ENABLE,F_ARTACQ|ENABLE,F_ARTPROD ITEM "L|Lavorazione" - MESSAGE "",F_VIRTUALE + MESSAGE "",F_VIRTUALE|CLEAR,F_MASTER|CLEAR,F_ARTACQ|CLEAR,F_ARTPROD ITEM "V|Virtuale" - MESSAGE "X",F_VIRTUALE + MESSAGE "X",F_VIRTUALE|CLEAR,F_MASTER|CLEAR,F_ARTACQ|ENABLE,F_ARTPROD FLAGS "DG" END BOOLEAN F_VIRTUALE BEGIN PROMPT 50 50 "Virtuale" - MESSAGE FALSE DISABLE,1@|ENABLE,F_ARTACQ - MESSAGE TRUE ENABLE,1@|CLEAR,F_ARTACQ + MESSAGE FALSE DISABLE,1@ + MESSAGE TRUE ENABLE,1@ FLAGS "DG" FIELD VIRTUALE END @@ -255,9 +255,10 @@ END SPREADSHEET F_PARAMS BEGIN + FLAGS "|" PROMPT 0 10 "" ITEM "Variabile@20" - ITEM "Valore@70" + ITEM "Valore@120" END ENDPAGE @@ -561,7 +562,7 @@ ENDPAGE ENDMASK -PAGE "Variabili" -1 -1 64 5 +PAGE "Variabili" -1 -1 70 5 STRING FV_PARAM 20 BEGIN @@ -576,7 +577,7 @@ BEGIN FLAGS "U" END -STRING FV_VALUE 70 50 +STRING FV_VALUE 120 55 BEGIN PROMPT 1 2 "Valore " END diff --git a/db/dblib.cpp b/db/dblib.cpp index 4f30713e3..7ea1ba525 100755 --- a/db/dblib.cpp +++ b/db/dblib.cpp @@ -299,6 +299,7 @@ void TLavorazione::get_linee() esse[1]=s; _linee << get(esse); } + _linee.replace(SAFE_PIPE_CHR,'|'); } void TLavorazione::put_linee() @@ -311,6 +312,7 @@ void TLavorazione::put_linee() if (s > '3') len=20; esse[1]=s; str=_linee.mid(from,len); + str.replace('|',SAFE_PIPE_CHR); put(esse, str); from+=len; } @@ -414,6 +416,7 @@ TLavorazione::TLavorazione(const char* cod) if (cod && *cod) { TTable lav("LAV"); + put("COD", "LAV"); put("CODTAB", cod); read(lav); } else @@ -1184,12 +1187,12 @@ TObject * TDistinta_tree::get_global(const char* name, word classname) return NULL; if (classname==CLASS_STRING ) { - if (((TString *)val)->blank()) + if (!val || ((TString *)val)->blank()) val = global_default_str(name); } else { - if (((real *)val)->is_zero()) + if (!val || ((real *)val)->is_zero()) val = global_default_real(name); } return val; @@ -1508,7 +1511,19 @@ TDistinta_tree::~TDistinta_tree() TRiga_esplosione *TDistinta_tree::first_critical_labor(TArray & labors, TExplosion_grouping raggum) { - return first_labor(labors,raggum); + TRiga_esplosione *l=first_labor(labors, raggum); + while (l) + { + TLavorazione labor(l->articolo()); + for (int lnp=0 ; lnp < labor.linee();lnp++) + { + if (!cache().get("LNP",labor.cod_linea(lnp)).get_bool("B9")) + // escluso dal CRP + return l; + } + l=(TRiga_esplosione *)labors.succ_item(); + } + return NULL; } TRiga_esplosione *TDistinta_tree::next_critical_labor(TArray & labors) @@ -1519,7 +1534,6 @@ TRiga_esplosione *TDistinta_tree::next_critical_labor(TArray & labors) TRiga_esplosione *TDistinta_tree::first_labor(TArray & labors, TExplosion_grouping raggum) { - static TLavorazione *curr_labor=NULL; explode(labors,FALSE,raggum, 1,"L"); TRiga_esplosione *l=(TRiga_esplosione *)labors.first_item(); return l; @@ -1527,6 +1541,8 @@ TRiga_esplosione *TDistinta_tree::first_labor(TArray & labors, TExplosion_groupi TRiga_esplosione *TDistinta_tree::next_labor(TArray & labors) { + if (labors.items()==0) + return NULL; TRiga_esplosione *l=(TRiga_esplosione *)labors.succ_item(); return l; } diff --git a/ef/ef0100.cpp b/ef/ef0100.cpp index 6dfc64bf6..83eacb221 100755 --- a/ef/ef0100.cpp +++ b/ef/ef0100.cpp @@ -399,6 +399,8 @@ bool TVariazione_effetti::contab_handler(TMask_field& f, KEY k) TMask &m = f.mask(); const bool da_contab = f.get().empty(); TSheet_field& sf = (TSheet_field&)m.field(F_SHEET_RIGHE); + +/* Cavolata di dimensioni bibliche o cosa? if (da_contab) { for (int i = sf.items() - 1; i >= 0; i--) @@ -407,6 +409,7 @@ bool TVariazione_effetti::contab_handler(TMask_field& f, KEY k) row.add(" ", sf.cid2index(F_NUMRIGA)); } } +*/ sf.enable_column(F_ANNO, da_contab); sf.enable_column(F_NUMPART, da_contab); if (f.focusdirty()) diff --git a/ef/ef0300.cpp b/ef/ef0300.cpp index c28c3993d..25f00982d 100755 --- a/ef/ef0300.cpp +++ b/ef/ef0300.cpp @@ -58,7 +58,8 @@ protected: bool user_create(); bool user_destroy(); void aggiorna(); - TToken_string* common_f(const TMask& m); + TToken_string* common_f(const TMask& m, TToken_string& datidist); + public: virtual TRelation* get_relation() const {return _rel;} TVariazione_distinte() {}; @@ -157,7 +158,6 @@ void TVariazione_distinte::aggiorna() TEffetto* effetto = new TEffetto(rec); TArray& righedist = _distinta->righe(); - righedist.add(effetto); } } @@ -165,7 +165,7 @@ void TVariazione_distinte::aggiorna() // Metodo che permette di prendere i dati dalla maschera e metterli in // una TToken_string che servirà per passarli alla write della distinta -TToken_string* TVariazione_distinte::common_f(const TMask& m) +TToken_string* TVariazione_distinte::common_f(const TMask& m, TToken_string& datidist) { char tipodist = m.get(F_TIPODIST)[0];// prendo i dati long ndist = m.get_long(F_NUMBER); // identificatvi della @@ -173,13 +173,13 @@ TToken_string* TVariazione_distinte::common_f(const TMask& m) long codabi = m.get_long(F_CODABIP); // dalla maschera long codcab = m.get_long(F_CODCABP); m.autosave(*_rel); - TToken_string * datidist= new TToken_string; // creo la token string - datidist->add(tipodist); // inserisco i dati nella - datidist->add(ndist); // token string - datidist->add(datadist); - datidist->add(codabi); - datidist->add(codcab); - return datidist; + + datidist.add(tipodist); // inserisco i dati nella + datidist.add(ndist); // token string + datidist.add(datadist); + datidist.add(codabi); + datidist.add(codcab); + return &datidist; } // carica nella maschera i dati dai files @@ -327,8 +327,10 @@ int TVariazione_distinte::rewrite(const TMask& m) } //resetto l'array che contiene gli effetti nella distinta int err = _distinta->reset(); - aggiorna(); - err = _distinta->rewrite(common_f(m)); + aggiorna(); + + TToken_string datidist; + err = _distinta->rewrite(common_f(m, datidist)); if (err == NOERR) { // riposiziono la relazione _rel->lfile().setkey(4); @@ -348,8 +350,10 @@ int TVariazione_distinte::write(const TMask& m) int err = _distinta->reset(); char tipodist = m.get(F_TIPODIST)[0]; long ndist = m.get_long(F_NUMBER); - aggiorna(); - err = _distinta->write(TRUE, common_f(m)); + aggiorna(); + + TToken_string datidist; + err = _distinta->write(TRUE, common_f(m, datidist)); if (err == NOERR) { //riposiziono la relazione _rel->lfile().setkey(4); diff --git a/ef/ef0300a.uml b/ef/ef0300a.uml index cd05e1dd5..3b048b01b 100755 --- a/ef/ef0300a.uml +++ b/ef/ef0300a.uml @@ -159,8 +159,8 @@ BEGIN ITEM "Da elim." ITEM "Nr. Ri.Ba." ITEM "Scadenza" - ITEM "Cliente/Fornitore@30" - ITEM "Banca d'appoggio@30" + ITEM "Cliente/Fornitore@50" + ITEM "Banca d'appoggio@40" ITEM "Nr. Fattura" ITEM "Data Fattura" ITEM "Nr. Rata" diff --git a/ef/ef0301.cpp b/ef/ef0301.cpp index 35a9819e5..db10c57b1 100755 --- a/ef/ef0301.cpp +++ b/ef/ef0301.cpp @@ -26,22 +26,25 @@ TDistinta::~TDistinta() // permette di leggere la distinta del tipo e numero passati int TDistinta::read(const char tipo, const long numero, word lockop) { - int err = NOERR; - CHECK(tipo!='\0' && numero > 0,"Can't read distinta from NULL elements"); + int err = _iskeynotfound; TLocalisamfile f(LF_EFFETTI); f.setkey(4); if (_righe_dist.items() > 0) // Se ha letto una distinta precedente, sblocca la prima riga { f.read((TRectype&)_righe_dist[0],_isequal,_unlock); _righe_dist.destroy(); // Rimuove tutte le righe precedenti } - for (int i=0; err == NOERR ; i++) + if (tipo >= ' ' && numero > 0) { - TEffetto* effetto = new TEffetto; - word lock = (i == 0 && lockop == _lock) ? _lock : _nolock; // Lock solo sulla prima riga - err = effetto->read(f, tipo, numero, i+1, lock);//legge un effetto per chiave 4 - if (err == NOERR) - _righe_dist.add(effetto); - } + err = NOERR; + for (int i=0; err == NOERR ; i++) + { + TEffetto* effetto = new TEffetto; + word lock = (i == 0 && lockop == _lock) ? _lock : _nolock; // Lock solo sulla prima riga + err = effetto->read(f, tipo, numero, i+1, lock);//legge un effetto per chiave 4 + if (err == NOERR) + _righe_dist.add(effetto); + } + } // se ho letto degli effetti della distinta ed ho // trovato la fine file elimino l'errore if ((_righe_dist.items()>0)||(err == _iseof) ) @@ -78,6 +81,7 @@ int TDistinta::write(bool force, TToken_string* dati_dist) effetto.put(EFF_DATADIST, dati_dist->get()); effetto.put(EFF_CODABIP, dati_dist->get()); effetto.put(EFF_CODCABP, dati_dist->get()); + effetto.put(EFF_NRIGADIST, i+1); } //riscrivo l'effetto con i dati della distinta a cui appartiene diff --git a/ef/ef0301.h b/ef/ef0301.h index b2c351178..795791200 100755 --- a/ef/ef0301.h +++ b/ef/ef0301.h @@ -9,7 +9,7 @@ // Definizione dell'oggetto Distinta con la classe TDistinta // /////////////////////////////////////////////////////////////// -class TDistinta:public TObject +class TDistinta : public TObject { //array che contiene puntatori agli effetti nella distinta TArray _righe_dist; @@ -20,7 +20,7 @@ protected: public: //ritorna un riferimento all'array degli effetti nella distinta - TArray& righe(){ return _righe_dist;} + TArray& righe() { return _righe_dist; } //ritorna il numero degli effetti nella distinta (nell'array) const int items() const{ return _righe_dist.items(); } //elimina tutti gli effetti nella distinta (appartenti all'array) @@ -51,6 +51,8 @@ public: TDate data_cam() const { return eff(0).get_date(EFF_DATACAMBIO); } //restituisce il cambio delle distinta real cambio() const { return eff(0).get_real(EFF_CAMBIO); } + //restituisce TRUE se il cambio delle distinta e' contro euro + bool contro_euro() const { return eff(0).get_bool(EFF_CONTROEURO); } //restituisce il codice abi di presentazione effetti const TString& abip()const { return eff(0).get(EFF_CODABIP); } //restituisce il codice cab di presentazione effetti @@ -58,7 +60,7 @@ public: // restituisce l'effetto n-esimo TEffetto& operator[](const int index) { return eff(index); } //costruttore di default - TDistinta() {}; + TDistinta() { } //costruttore distinta del tipo e numero passato TDistinta(const char tipo, const long numero, word lockop = _nolock); //costruttore distinta utilizzando il record passato diff --git a/ef/ef0500.cpp b/ef/ef0500.cpp index 514bb046e..ce806b185 100755 --- a/ef/ef0500.cpp +++ b/ef/ef0500.cpp @@ -304,7 +304,7 @@ void TEmissione::inizializza_file() TFilename fileriba = _msk->get(F_UNITA); fileriba << ":\\" << _msk->get(F_NOMEFILE); _trasfile->open(fileriba,'w'); - _trasfile->set_tot_importi(0.0); + _trasfile->set_tot_importi(ZERO); _foutput = (fo)_msk->get_int(F_FOR_OUT); } @@ -637,7 +637,7 @@ bool TRiba_form::validate(TForm_item &cf, TToken_string &s) picture << ",@@@"; real importo(dati->get(2)); cf.set(importo.string(picture)); - } + } } } valore = cf.get(); @@ -1028,10 +1028,10 @@ void TRiba_file:: validate(TCursor& cur,TRecord_text &rec, TToken_string &s, TSt TString descfatt; for (int i = 0; i < elem; i+=3) { - descfatt << dati->get(i); - descfatt << " "; - descfatt << dati->get(i+1); - descfatt << " "; + descfatt << dati->get(i); + descfatt << " "; + descfatt << dati->get(i+1); + descfatt << " "; } int l = descfatt.len(); TString in(s.get()); @@ -1056,30 +1056,27 @@ void TRiba_file:: validate(TCursor& cur,TRecord_text &rec, TToken_string &s, TSt // dove: è uno delle macro seguenti: // "!ADD" aggiunge l'importo dell'effetto corrente al totale // "!TOT" emette il totale - TString in(s.get()); + const TString in(s.get()); CHECK(in[0]=='!',"Macro _IMPORTO senza carattere '!'"); - in.ltrim(1); - if (in=="ADD") + if (in=="!ADD") { real importo(str); add_tot_importi(importo); - valore.cut(0); - valore << importo.string(13,0); + valore = importo.string(13,0); } - else if (in=="TOT") + else if (in=="!TOT") { - valore.cut(0); real importo = tot_importi(); - valore << importo.string("##############@"); - set_tot_importi(0.0); + valore = importo.string("##############@"); + set_tot_importi(ZERO); } else CHECKS (TRUE,"Sotto-Macro _IMPORTO non definita",(const char *)in); } else if (code == "_CODSIA") { - TConfig cnf(CONFIG_DITTA); - valore = cnf.get("CODSIA", "ef"); + TConfig cnf(CONFIG_DITTA, "ef"); + valore = cnf.get("CODSIA"); } else CHECKS (TRUE,"Macro non definita",(const char *)code); diff --git a/ef/ef0600.cpp b/ef/ef0600.cpp index 611dd44c0..07ceeb752 100755 --- a/ef/ef0600.cpp +++ b/ef/ef0600.cpp @@ -331,7 +331,8 @@ print_action TPrint_effetti_app::postprocess_print(int file, int counter) _pr.reset(); } if (_tot_cliente != 0.0) - { + { + TString ragsoc; _pr.put("TOTALE",50); _pr.put(_tot_cliente.string("###.###.##@,@@"),72); printer().print(_pr); @@ -807,25 +808,28 @@ bool TPrint_effetti_app::set_print(int) select_cursor(_cur_2); break; case st_distinta: - cod_from = mask.get(F_DA_DATA3); - cod_to = mask.get(F_A_DATA3); - from.put(EFF_DATASCAD,cod_from); - to.put(EFF_DATASCAD,cod_to); - cod_from = mask.get(F_DADIST); - cod_to = mask.get(F_ADIST); - filter.cut(0); - if (mask.get(F_DATIPODIST).empty()) - filter << "(NDIST==\"\")"; - else - { - if (cod_from.empty()) - cod_from = "1"; - filter << "(NDIST>=" << cod_from << ")"; - if (cod_to.not_empty()) - filter << "&&(NDIST<=" << cod_to << ")"; - filter << "&&(TIPODIST==\"" << mask.get(F_DATIPODIST) << "\")"; - } - select_cursor(_cur_3); + { + cod_from = mask.get(F_DA_DATA3); + cod_to = mask.get(F_A_DATA3); + from.put(EFF_DATASCAD,cod_from); + to.put(EFF_DATASCAD,cod_to); + cod_from = mask.get(F_DADIST); + cod_to = mask.get(F_ADIST); + filter.cut(0); + const TString16 tipodist(mask.get(F_DATIPODIST)); + + if (tipodist.not_empty()) + { + if (cod_from.not_empty()) + filter << "(NDIST>=" << cod_from << ") &&"; + if (cod_to.empty()) // le distinte + cod_to = "99999999"; + filter << "(NDIST<=" << cod_to << ")&&(TIPODIST==\"" << tipodist << "\")"; + } + else + filter << "(NDIST<=\"\")"; + select_cursor(_cur_3); + } break; case st_cliente: { @@ -873,10 +877,10 @@ bool TPrint_effetti_app::user_create() TString ordine = "CODABIP|DATASCAD|NPROGTR"; _cur_2 = add_cursor(new TSorted_cursor(_rel,ordine,"",3)); //STAMPA PER DISTINTA - ordine = "TIPODIST|NDIST|NRIGADIST|DATASCAD|NPROGTR"; + ordine = "TIPODIST|NDIST|NRIGADIST|DATASCAD|NPROGTR"; _cur_3 = add_cursor(new TSorted_cursor(_rel,ordine,"",3)); //STAMPA PER CLIENTE - ordine = "CODCF|NPROGTR"; + ordine = "CODCF|NPROGTR"; _cur_4 = add_cursor(new TSorted_cursor(_rel,ordine,"",3));; add_file(LF_EFFETTI); enable_print_menu(); diff --git a/ef/ef0800.cpp b/ef/ef0800.cpp index 07851f8f6..33c1dca7b 100755 --- a/ef/ef0800.cpp +++ b/ef/ef0800.cpp @@ -395,8 +395,11 @@ bool TContabilizzazione_effetti_app::add_cg_row(const TEffetto& eff, TArray& cus { const TRectype& riga = eff.row_r(n); desc << ' ' << riga.get(REFF_NFATT); + if (desc.len() >= 40) + break; } - if (desc.len() > 50) desc.cut(50); + if (n < eff.rows_r()) + desc << " ..."; c_rec->put(RMV_DESCR, desc); // setta i valori per la riga banca @@ -597,6 +600,7 @@ void TContabilizzazione_effetti_app::compile_head_mov() const TDate datacam = _distinta->data_cam(); const TString16 codval = _distinta->codval(); const real cambio = _distinta->cambio(); + const bool eurocambio = _distinta->contro_euro(); const long ndist = _distinta->ndist(); TString des; @@ -630,8 +634,14 @@ void TContabilizzazione_effetti_app::compile_head_mov() mov.put(MOV_CODVAL,codval); mov.put(MOV_DATACAM,datacam); mov.put(MOV_CAMBIO,cambio); + if (eurocambio && cambio > ZERO) + { + if (mov.curr().exist(MOV_CONTROEURO)) + mov.put(MOV_CONTROEURO, eurocambio); + else + mov.put(MOV_CAMBIO, real(1936.27) / cambio); + } // MOV_TOTDOC e MOV_TOTDOCVAL vengono completati prima della scrittura del movimento - // e solo nel caso di saldaconto abilitato } void TContabilizzazione_effetti_app::compile_riga_partita(TRiga_partite& riga, const TEffetto& effetto, const TRectype& riga_effetto) @@ -646,21 +656,36 @@ void TContabilizzazione_effetti_app::compile_riga_partita(TRiga_partite& riga, c riga.put(PART_DATADOC,head_mov.get_date(MOV_DATADOC)); riga.put(PART_DATAPAG,effetto.get_date(EFF_DATASCAD)); riga.put(PART_NUMDOC,head_mov.get(MOV_NUMDOC)); // Sarebbe il numero della distinta... - // La descrizione della riga (PART_DESCR) la lascio vuota. Verificare con Guy le regole necessarie per la sua compilazione eventuale - real imp = riga_effetto.get_real(REFF_IMPORTO); - real imp_val = riga_effetto.get_real(REFF_IMPORTOVAL); + // La descrizione della riga (PART_DESCR) la lascio vuota. + // Verificare con Guy le regole necessarie per la sua compilazione eventuale riga.put(PART_SEZ,sezione()); + const real imp = riga_effetto.get_real(REFF_IMPORTO); + const real imp_val = riga_effetto.get_real(REFF_IMPORTOVAL); /* Non scrivo qui gli importi: li sommo quando faccio i pagamenti riga.put(PART_IMPORTO,imp); riga.put(PART_IMPORTOVAL,imp_val); */ riga.put(PART_CODVAL,effetto.get(EFF_CODVAL)); - riga.put(PART_CAMBIO,effetto.get_real(EFF_CAMBIO)); riga.put(PART_DATACAM,effetto.get_date(EFF_DATACAMBIO)); + real cambio = effetto.get(EFF_CAMBIO); + riga.put(PART_CAMBIO, cambio); + if (effetto.get_bool(EFF_CONTROEURO)) + { + if (!((TRectype&)riga).exist(PART_CONTROEURO)) + { + if (cambio > ZERO) + { + cambio = real(1936.27) / cambio; + riga.put(PART_CAMBIO, cambio); + } + } + else + riga.put(PART_CONTROEURO, TRUE); + } riga.put(PART_TIPOCF,_cliente.tipo()); riga.put(PART_SOTTOCONTO,_cliente.sottoconto()); - riga.put(PART_IMPTOTDOC,effetto.get_real(EFF_IMPORTO)); - riga.put(PART_IMPTOTVAL,effetto.get_real(EFF_IMPORTOVAL)); + riga.put(PART_IMPTOTDOC,effetto.get(EFF_IMPORTO)); + riga.put(PART_IMPTOTVAL,effetto.get(EFF_IMPORTOVAL)); // PART_GRUPPOCL e PART_CONTOCL sono gia' compilati dalla TPartita::new_row() // Aggiorna il totale movimento in lire e totale movimento in valuta (solo con saldaconto abilitato) if (_sc_enabled) @@ -698,8 +723,9 @@ void TContabilizzazione_effetti_app::compile_riga_pagamento(TRectype& riga_pagam error_type TContabilizzazione_effetti_app::write_all(bool change_status) { TRectype& head = _movimento->lfile().curr(); - head.put(MOV_TOTDOC,_total_mov); // Se il saldaconto non e' abilitato sono entrambi a 0.0 + head.put(MOV_TOTDOC,_total_mov); head.put(MOV_TOTDOCVAL,_total_mov_val); + long orig_numreg, numreg = head.get_long(MOV_NUMREG); orig_numreg = numreg; while (_movimento->write() == _isreinsert) @@ -839,7 +865,9 @@ void TContabilizzazione_effetti_app::contabilize_bill(const char tipo, const lon const TString16 codval = eff.get(EFF_CODVAL); const TDate datacam = eff.get(EFF_DATACAMBIO); - const real cambio = eff.get(EFF_CAMBIO); + real cambio = eff.get(EFF_CAMBIO); + if (cambio > ZERO && eff.get_bool(EFF_CONTROEURO)) + cambio = real(1936.27) / cambio; const TValuta valuta_eff(codval, datacam, cambio); if (!good()) break; diff --git a/ef/f31.dir b/ef/f31.dir index 4f37e656e..51fdb6725 100755 --- a/ef/f31.dir +++ b/ef/f31.dir @@ -1,3 +1,3 @@ 31 0 -$effetti|0|0|162|34|Effetti|NEFF|| +$effetti|12|12|163|34|Effetti|NEFF|| diff --git a/ef/f31.trr b/ef/f31.trr index cfa2ea648..538eb86b5 100755 --- a/ef/f31.trr +++ b/ef/f31.trr @@ -1,5 +1,5 @@ 31 -29 +30 NPROGTR|3|7|0|Numero progressivo effetto DATASCAD|5|8|0|Data di scadenza TIPOPAG|2|1|0|Tipo pagamento @@ -11,6 +11,7 @@ DATAEMISS|5|8|0|Data emissione CODVAL|1|3|0|Codice valuta DATACAMBIO|5|8|0|Data cambio CAMBIO|4|15|5|Cambio +CONTROEURO|8|1|0|Cambio espresso contro Euro CODABI|10|5|0|Codice ABI banca CODCAB|10|5|0|Codice CAB banca ULTRATA|8|1|0|Ultima rata diff --git a/include/csort.c b/include/csort.c index fe77f7c72..c595e6e91 100755 --- a/include/csort.c +++ b/include/csort.c @@ -192,15 +192,18 @@ static void prep_merge() rr->rc = bf1; /* --- the last seq has fewer rcds than the rest --- */ if (i == no_seq-1) { - if (totrcd % nrcds > rcds_seq) { + unsigned nrcd_last = (unsigned) totrcd % nrcds; + if (nrcd_last == 0) + nrcd_last = nrcds; + if (nrcd_last > rcds_seq) { rr->rbuf = rcds_seq; /* @(!) 2.3.00.112 */ - rr->rdsk = (unsigned) (totrcd % nrcds) - rcds_seq; + rr->rdsk = nrcd_last - rcds_seq; /* @(:) 2.3.00.112 */ } else { /* @(!) 2.3.00.112 */ - rr->rbuf = (unsigned) (totrcd % nrcds); + rr->rbuf = nrcd_last; /* @(:) 2.3.00.112 */ rr->rdsk = 0; } diff --git a/include/currency.cpp b/include/currency.cpp index c0b262bd9..6f6aa7127 100755 --- a/include/currency.cpp +++ b/include/currency.cpp @@ -45,11 +45,11 @@ public: const char* expand_value(const char* val); real exchange(const real& num, - const char* fromval, const real& fromchg, - const char* toval, const real& tochg, + const char* fromval, const real& fromchg, bool fromeuro, + const char* toval, const real& tochg, bool toeuro, bool price = FALSE); int get_dec(const char* val, bool prices = FALSE); - const real& get_change(const char* val); + const real& get_change(const char* val, bool& contro_euro); TDowJones() : TFile_cache("%VAL") { } virtual ~TDowJones() { } @@ -65,8 +65,9 @@ TObject* TDowJones::rec2obj(const TRectype& rec) const { data->_chg = rec.get_real("R10"); if (data->_chg <= ZERO) - { - NFCHECK("Codice valuta senza cambio: '%s'", (const char*)codval); + { + if (codval.not_empty()) + NFCHECK("Codice valuta senza cambio: '%s'", (const char*)codval); data->_chg = 1.0; } } @@ -100,9 +101,9 @@ void TDowJones::test_cache() FOR_EACH_ASSOC_OBJECT(_cache, hash, key, obj) if (*key) { const TExchangeData& data = *(const TExchangeData*)obj; - if (_base_val.empty() && data._chg == 1.0) + if ((_base_val.empty() || stricmp(key, "LIT") == 0) && data._chg == 1.0) _base_val = key; else - if (_euro_val.empty() && data._is_euro) + if (data._is_euro && _euro_val.empty()) _euro_val = key; } @@ -118,13 +119,14 @@ void TDowJones::test_cache() if (_base_val.empty()) // Si son dimenticati delle LIRE? { TExchangeData* lira = new TExchangeData; - lira->_chg = 1.0; lira->_dec = lira->_dec_prices = 0; + lira->_chg = 1.0; lira->_dec = 0; lira->_dec_prices = 2; lira->_is_euro = lira->_contro_euro = FALSE; _base_val = "LIT"; _cache.add(_base_val, lira); } _firm_val = prefix().firm().codice_valuta(); - _euro_chg = get_change(_euro_val); + bool dummy_ce; + _euro_chg = get_change(_euro_val, dummy_ce); } } @@ -177,8 +179,10 @@ const TString& TDowJones::get_euro_val() real TDowJones::exchange(const real& num, // Importo da convertire const char* frval, // Dalla valuta const real& frchg, // Dal cambio + bool freur, // Dal cambio in euro const char* toval, // Alla valuta const real& tochg, // Al cambio + bool toeur, // Al cambio in euro bool price) // e' un prezzo ? { real n = num; @@ -186,13 +190,15 @@ real TDowJones::exchange(const real& num, // Importo da convertire { const TExchangeData& datafr = get(frval); const TExchangeData& datato = get(toval); - const real fr = frchg <= ZERO ? datafr._chg : frchg; - const real to = tochg <= ZERO ? datato._chg : tochg; - const int mode = (datafr._contro_euro ? 1 : 0)+(datato._contro_euro ? 2 : 0); + real fr = frchg; + if (fr <= ZERO) { fr = datafr._chg; freur = datafr._contro_euro; } + real to = tochg; + if (to <= ZERO) { to = datato._chg; toeur = datato._contro_euro; } + const int mode = (freur ? 1 : 0) + (toeur ? 2 : 0); switch (mode) { case 1: - n = n * _euro_chg / (fr * to); // Modo misto 1 + n = (n * _euro_chg) / (fr * to); // Modo misto 1 break; case 2: n = n * (fr * to) / _euro_chg; // Modo misto 2 @@ -215,13 +221,13 @@ int TDowJones::get_dec(const char* val, bool price) return price ? data._dec_prices : data._dec; } -const real& TDowJones::get_change(const char* val) +const real& TDowJones::get_change(const char* val, bool& contro_euro) { const TExchangeData& data = get(val); + contro_euro = data._contro_euro; return data._chg; } - /////////////////////////////////////////////////////////// // TCurrency /////////////////////////////////////////////////////////// @@ -256,7 +262,7 @@ int TCurrency::get_euro_dec(bool price) return DowJones.get_dec(get_euro_val(), price); } -void TCurrency::force_value(const char* newval, const real& newchange) +void TCurrency::force_value(const char* newval, const real& newchange, bool neweuro) { newval = DowJones.expand_value(newval); if (newval && *newval) @@ -264,22 +270,25 @@ void TCurrency::force_value(const char* newval, const real& newchange) strncpy(_val, newval, 4); _val[3] = '\0'; _exchange = newchange; + _euro = neweuro; } else { *_val = '\0'; _exchange = ZERO; + _euro = FALSE; } } -void TCurrency::change_value(const char* val, const real& newchange) +void TCurrency::change_value(const char* val, const real& newchange, bool to_euro) { val = DowJones.expand_value(val); if (!_num.is_zero() && stricmp(_val, val) != 0) { - _num = DowJones.exchange(_num, _val, _exchange, val, newchange, is_price()); + _num = DowJones.exchange(_num, _val, _exchange, _euro, + val, newchange, to_euro, is_price()); } - force_value(val, newchange); + force_value(val, newchange, to_euro); } int TCurrency::decimals() const @@ -302,7 +311,7 @@ int TCurrency::compare(const TSortable& s) const void TCurrency::copy(const TCurrency& cur) { _num = cur._num; - force_value(cur._val, cur._exchange); + force_value(cur._val, cur._exchange, _euro); } const char* TCurrency::string(bool dotted) const @@ -325,8 +334,8 @@ TCurrency& TCurrency::operator+=(const TCurrency& cur) } else { - real n = DowJones.exchange(cur._num, cur._val, cur._exchange, - _val, _exchange, is_price()); + real n = DowJones.exchange(cur._num, cur._val, cur._exchange, cur._euro, + _val, _exchange, _euro, is_price()); _num += n; } return *this; @@ -346,8 +355,8 @@ TCurrency& TCurrency::operator-=(const TCurrency& cur) _num -= cur._num; else { - real n = DowJones.exchange(cur._num, cur._val, cur._exchange, - _val, _exchange, is_price()); + real n = DowJones.exchange(cur._num, cur._val, cur._exchange, cur._euro, + _val, _exchange, _euro, is_price()); _num -= n; } return *this; @@ -383,9 +392,9 @@ bool TCurrency::same_value_as(const TCurrency& cur) const return FALSE; } -TCurrency::TCurrency(const real& num, const char* val, const real& exchg, bool price) +TCurrency::TCurrency(const real& num, const char* val, const real& exchg, bool euro, bool price) : _num(num), _price(price) { - force_value(val, exchg); + force_value(val, exchg, euro); } diff --git a/include/currency.h b/include/currency.h index 32b116b7f..ddbe2ad0a 100755 --- a/include/currency.h +++ b/include/currency.h @@ -14,7 +14,8 @@ class TCurrency : public TSortable real _num; // Valore assoluto char _val[4]; // Codice valuta real _exchange; // Cambio personalizzato - bool _price; + bool _euro; // Cambio personalizzato contro Euro + bool _price; // Prezzo unitario o no protected: virtual int compare(const TSortable& s) const; @@ -31,8 +32,8 @@ public: void set_price(bool p) { _price = p; } bool is_price() const { return _price; } - void force_value(const char* newval, const real& newchange = ZERO); - void change_value(const char* newval, const real& newchange = ZERO); + void force_value(const char* newval, const real& newchange = ZERO, bool neweuro = FALSE); + void change_value(const char* newval, const real& newchange = ZERO, bool neweuro = FALSE); void change_to_base_val() { change_value(get_base_val()); } void change_to_firm_val() { change_value(get_firm_val()); } void change_to_euro_val() { change_value(get_euro_val()); } @@ -62,7 +63,7 @@ public: TCurrency(bool price = FALSE) : _price(price) { _val[0] = '\0'; } TCurrency(const TCurrency& cur) { copy(cur); } - TCurrency(const real& num, const char* val = "", const real& exchg = ZERO, bool price = FALSE); + TCurrency(const real& num, const char* val = "", const real& exchg = ZERO, bool euro = FALSE, bool price = FALSE); virtual ~TCurrency() { } }; @@ -73,8 +74,8 @@ public: TPrice() : TCurrency(TRUE) { } TPrice(const TPrice& price) { copy(price); } - TPrice(const real& num, const char* val = "", const real& exc = ZERO) - : TCurrency(num, val, exc, TRUE) { } + TPrice(const real& num, const char* val = "", const real& exc = ZERO, bool euro = FALSE) + : TCurrency(num, val, exc, euro, TRUE) { } virtual ~TPrice() { } }; diff --git a/include/effetti.h b/include/effetti.h index 25ccf8b96..5d647fc93 100755 --- a/include/effetti.h +++ b/include/effetti.h @@ -12,6 +12,7 @@ #define EFF_CODVAL "CODVAL" #define EFF_DATACAMBIO "DATACAMBIO" #define EFF_CAMBIO "CAMBIO" +#define EFF_CONTROEURO "CONTROEURO" #define EFF_CODABI "CODABI" #define EFF_CODCAB "CODCAB" #define EFF_ULTRATA "ULTRATA" diff --git a/include/filetext.cpp b/include/filetext.cpp index dd387e1bf..72bb0956d 100755 --- a/include/filetext.cpp +++ b/include/filetext.cpp @@ -192,8 +192,9 @@ void TFile_text::set_gen_parm(TConfig& config, const TString& section) _typefield = config.get_int("TYPEFIELD",section); // Numero del campo tipo (puo' essere -1) _fixedlen = _fieldsep <= ' '; // && _recordsep.blank(); _typepos = config.get_int("TYPEPOS", section, -1, -1); - _typelen = config.get_int("TYPELEN", section, -1, -1); - CHECKD(_typelen <= 16, "Tipo record di lunghezza spropositata: ", _typelen); + _typelen = config.get_int("TYPELEN", section, -1, 0); + if (_typelen > 16) + NFCHECK("Tipo record di lunghezza spropositata: %d", _typelen); } void TFile_text::set_type_parm(TConfig& config, TString& section) @@ -505,18 +506,21 @@ int TFile_text::read(TRecord_text& rec) TArray& a_tc = tr.tracciati_campo(); const int items = a_tc.items(); buffer.restart(); + TString lavoro; for (int i = 0; i < items; i++) { - const char* lavoro = buffer.get(); - if (lavoro == NULL) - lavoro = ""; + buffer.get(i, lavoro); rec.add(lavoro, i); } } else { - TString16 tipo = buffer.mid(_typepos, _typelen); - tipo.trim(); + TString16 tipo; + if (_typepos >= 0 && _typelen > 0) + { + tipo = buffer.mid(_typepos, _typelen); + tipo.trim(); + } rec.set_type(tipo);//istanzio il tipo del record text TTracciato_record* tr = t_rec(tipo); if (tr != NULL) @@ -529,7 +533,7 @@ int TFile_text::read(TRecord_text& rec) TTracciato_campo& tc = tr->get(i); const int pos = tc.position(); const int len = tc.length(); - const char* lavoro = buffer.mid(pos, len); + const TString& lavoro = buffer.mid(pos, len); rec.add(lavoro, i); } } @@ -706,7 +710,7 @@ int TFile_text::_autosave(TRelation& rel, const TRecord_text& rec, TTracciato_re if (field.name().not_empty()) { if (field.file()==0) - field.set_file(rel.lfile().num()); + field.set_file(rel.lfile().num()); valore = rec.row(i); // formatta il campo del file di testo secondo le specifiche del campo su file isam preformat_field(field,valore,rel,tr.type()); @@ -787,16 +791,18 @@ const TString& TFile_text::get_field(const TRecord_text& rec, const char* name) //Carica nel record_text il campo alla posizione con il valore già formattato void TFile_text::add_field(TRecord_text& rec, const int ncampo, const char* val) { - TTracciato_record& tr = *t_rec(rec.type()); - TTracciato_campo& tc = tr.get(ncampo); + TTracciato_record* tr = t_rec(rec.type()); + CHECKS(tr, "Tracciato inesistente ", (const char*)rec.type()); + TTracciato_campo& tc = tr->get(ncampo); rec.add(val, ncampo); } //Carica nel record_text il campo con il valore già formattato void TFile_text::add_field(TRecord_text& rec, const char* name, const char* val) { - TTracciato_record& tr = *t_rec(rec.type()); - int ncampo = tr.get_pos(name); + TTracciato_record* tr = t_rec(rec.type()); + CHECKS(tr, "Tracciato inesistente ", (const char*)rec.type()); + int ncampo = tr->get_pos(name); CHECKS(ncampo >= 0, "Campo inesistente ", name); rec.add(val, ncampo); } @@ -909,11 +915,15 @@ TString& TFile_text::format_textfield(const TTracciato_campo& tc, TString& campo campo.left_just(length, fillch); } else + { if (length > 0) + { if (tc.align() == 'R') campo=campo.right(length); else campo.cut(length); + } + } return campo; } @@ -928,7 +938,8 @@ TString& TFile_text::format_field(const TTracciato_campo& tc, short lfile, TStri const bool is_memo = record.type(tc.field().name()) == _memofld; if (!fpicture(tc).blank()) - { TString tmp; + { + TString tmp; tmp.picture(fpicture(tc), campo); campo=tmp; } @@ -940,11 +951,15 @@ TString& TFile_text::format_field(const TTracciato_campo& tc, short lfile, TStri campo.left_just(length, ffiller(tc)); } else + { if (length > 0) + { if (falign(tc) == 'R') campo=campo.right(length); else - campo.cut(length); + campo.cut(length); + } + } return campo; } diff --git a/include/isam.cpp b/include/isam.cpp index 3d4576265..7a68811c5 100755 --- a/include/isam.cpp +++ b/include/isam.cpp @@ -136,7 +136,6 @@ int findfld(const RecDes *recd, const char *s) } void __getfieldbuff(byte l, byte t, const char * recin, char *s) - { CHECK(recin, "Can't read from a Null record"); @@ -619,6 +618,7 @@ void set_autoload_new_files( TBaseisamfile::TBaseisamfile(int logicnum) { + CHECK(openrec, "This applications lies, it really do use files!"); _logicnum = logicnum; _isam_handle = 0; _curr_key = 0; @@ -3052,8 +3052,8 @@ void TRecfield::set(int from, int to) if (nf == FIELDERR) { NFCHECK("File n. %d unknown field %s", _rec->num(), _name); - _p = _isam_string; - _len = 50; + _p = _rec->string(); + _len = 0; _dec = 0; _type = _alfafld; } diff --git a/include/mov.h b/include/mov.h index 202638ca4..c1b1f29f2 100755 --- a/include/mov.h +++ b/include/mov.h @@ -24,6 +24,7 @@ #define MOV_MESELIQ "MESELIQ" #define MOV_CODVAL "CODVAL" #define MOV_CAMBIO "CAMBIO" +#define MOV_CONTROEURO "CONTROEURO" #define MOV_DATACAM "DATACAM" #define MOV_STAMPATO "STAMPATO" #define MOV_REGST "REGST" diff --git a/include/os_win16.cpp b/include/os_win16.cpp index 9ec5d00a1..2d1c0a016 100755 --- a/include/os_win16.cpp +++ b/include/os_win16.cpp @@ -220,7 +220,7 @@ bool os_test_disk_free_space(const char* path, unsigned long filesize) if (path && *path && path[1] == ':') { const char letter = toupper(path[0]); - disk = 'A' - letter + 1; + disk = letter - 'A' + 1; } bool space_ok = FALSE; struct _diskfree_t drive; @@ -238,14 +238,14 @@ unsigned long os_get_disk_size(const char* path) if (path && *path && path[1] == ':') { const char letter = toupper(path[0]); - disk = 'A' - letter + 1; + disk = letter - 'A' + 1; } unsigned long bytes = 0; struct _diskfree_t drive; if (_dos_getdiskfree(disk, &drive) == 0) { - unsigned long bytes = drive.total_clusters; + bytes = drive.total_clusters; bytes *= drive.sectors_per_cluster; bytes *= drive.bytes_per_sector; } diff --git a/include/partite.h b/include/partite.h index da11be12f..35074e07d 100755 --- a/include/partite.h +++ b/include/partite.h @@ -29,6 +29,7 @@ #define PART_CODPAG "CODPAG" #define PART_CODVAL "CODVAL" #define PART_CAMBIO "CAMBIO" +#define PART_CONTROEURO "CONTROEURO" #define PART_DATACAM "DATACAM" #define PART_IMPORTOVAL "IMPORTOVAL" #define PART_IMPTOTDOC "IMPTOTDOC" diff --git a/include/postman.cpp b/include/postman.cpp index f40f00a38..bb117db5c 100755 --- a/include/postman.cpp +++ b/include/postman.cpp @@ -242,7 +242,7 @@ void TPostman::load_filters() if ((is_mod && app.compare(appmod, 2, TRUE) == 0) || app.compare(appmod, -1, TRUE) == 0) { - TString80 key = row.get(); key.trim(); // Tipo di filtro + TString80 key = row.get(2); key.trim(); // Tipo di filtro if (is_mod) key << "-MOD"; row = row.get(); row.trim(); // Espressione di filtro if (key.not_empty() && row.not_empty() && row != "1") diff --git a/include/relapp.cpp b/include/relapp.cpp index bfeb13d7e..52efb0ee2 100755 --- a/include/relapp.cpp +++ b/include/relapp.cpp @@ -686,15 +686,25 @@ int TRelation_application::delete_mode() rec_to.put(fn, str); } } - } + } - cur.curr() = rec_from; - cur.read(); - while (cur.file().status() == NOERR && cur.curr() <= rec_to) - { - sht.check(cur.pos()); - ++cur; + if (rec_from.empty() && rec_to.empty()) + { + sht.check(-1); } + else + { + const long totit = cur.items(); + cur.freeze(TRUE); + cur.curr() = rec_from; + cur.read(); + while (cur.pos() < totit && cur.curr() <= rec_to) + { + sht.check(cur.pos()); + ++cur; + } + cur.freeze(FALSE); + } } else { diff --git a/include/relation.cpp b/include/relation.cpp index 3c0452f04..6089113ab 100755 --- a/include/relation.cpp +++ b/include/relation.cpp @@ -890,21 +890,17 @@ bool TRelation::exist(int logicnum) const return lucky; } - /////////////////////////////////////////////////////////// // TCursor /////////////////////////////////////////////////////////// - -HIDDEN bool __evalcondition(const TRelation& r,TExpression* cond, const TArray & frefs) +HIDDEN bool __evalcondition(const TRelation& /* r */,TExpression* cond, const TArray& frefs) { -// TFieldref f; for (int i = cond->numvar() - 1; i >= 0; i--) { -// const TFixed_string s(cond->varname(i)); -// f = s; -// f = cond->varname(i); - cond->setvar(i, (const char *) (TRecfield &)frefs[i]); + const TRecfield* fr = (const TRecfield*)frefs.objptr(i); + if (fr) + cond->setvar(i, (const char*)*fr); } return cond->as_bool(); } @@ -954,6 +950,33 @@ void TCursor::close_index(FILE* f) } } +bool TCursor::has_simple_filter() const +{ + bool yes = _filterfunction == NULL; + if (yes && _fexpr && _fexpr->numvar() > 0) + { + const RecDes& recd = *curr().rec_des(); // Descrizione del record della testata + const KeyDes& kd = recd.Ky[_nkey-1]; // Elenco dei campi della chiave del cursore + for (int i = _fexpr->numvar()-1; yes && i >= 0; i--) + { + const TString& vn = _fexpr->varname(i); + TFieldref f(vn, 0); + yes = f.file() == 0; + if (yes) + { + for (int k = kd.NkFields-1; k >= 0; k--) + { + const int nf = kd.FieldSeq[k] % MaxFields; + const RecFieldDes& rf = recd.Fd[nf]; + yes = kd.FromCh[k] == 255 && f.name() == rf.Name; + if (yes) break; + } + } + } + } + return yes; + + TRecnotype TCursor::buildcursor(TRecnotype rp) { FILE* _f = open_index(TRUE); @@ -979,19 +1002,26 @@ TRecnotype TCursor::buildcursor(TRecnotype rp) const bool filtered = has_filter(); TRecnotype* page = new TRecnotype [CMAXELPAGE]; +<<<<<<< relation.cpp // TRecnotype pos = DB_index_recno(handle); +// pos = DB_index_recno(fhnd); _pos = -1; - while (!DB_index_eof(handle)) + const bool simple_filter = has_simple_filter(); + + while (TRUE) { - const TRecnotype recno = DB_index_recno(handle); + if (DB_index_eof(fhnd)) break; + const char* s0 = DB_index_getkey(fhnd); + if (l && (strncmp(to(), s0, l) < 0)) break; + const TRecnotype recno = DB_index_recno(fhnd); if (recno == oldrecno) break; // means that no more keys are available oldrecno=recno; const char* s0 = DB_index_getkey(handle); if (l && (strncmp(to(), s0, l) < 0)) break; if (pagecnt == CMAXELPAGE) { - if (filtered) + if (filtered && !simple_filter) pagecnt = filtercursor(pagecnt,page); size_t written = fwrite(page, sizeof(TRecnotype), pagecnt, _f); @@ -1009,15 +1039,24 @@ TRecnotype TCursor::buildcursor(TRecnotype rp) ap += pagecnt; pagecnt = 0; } - page[pagecnt++] = recno; - long rec = DB_index_next(handle); - if (rec < 0) - fatal_box("Can't read index n. %d - file n. %d",file().getkey(),file().num()); + if (filtered && simple_filter) + { + if (simple_filtercursor(s0)) + page[pagecnt++] = recno; + } + else + page[pagecnt++] = recno; + + DB_index_next(fhnd); + int rt=get_error(-1); + if (rt != NOERR) + fatal_box("Can't read index n. %d - file n. %d",DB_tagget(file().filehnd()->fhnd),file().filehnd()->ln); } // while if (pagecnt) { - if (filtered) + if (filtered && !simple_filter) pagecnt = filtercursor(pagecnt, page); + size_t written = fwrite(page, sizeof(TRecnotype), pagecnt, _f); CHECKS(written == pagecnt, "Error writing index ", (const char*)_indexname); if (_pos < 0) @@ -1038,7 +1077,6 @@ TRecnotype TCursor::buildcursor(TRecnotype rp) return ap; } - int TCursor::filtercursor(int pagecnt, TRecnotype* page) { TLocalisamfile& fil = file(); @@ -1066,6 +1104,64 @@ int TCursor::filtercursor(int pagecnt, TRecnotype* page) return np; } +bool TCursor::simple_filtercursor(const char* key) const +{ + const RecDes& recd = *curr().rec_des(); // Descrizione del record della testata + const KeyDes& kd = recd.Ky[_nkey-1]; // Elenco dei campi della chiave del cursore + + TFieldref f; + for (int i = _fexpr->numvar()-1; i >= 0; i--) + { + f = _fexpr->varname(i); + int offset = 0; + for (int k = 0; k < kd.NkFields; k++) + { + const int nf = kd.FieldSeq[k] % MaxFields; + const RecFieldDes& rf = recd.Fd[nf]; + int len = rf.Len; + if (f.name() == rf.Name) + { + offset += f.from(); + if (f.to() > f.from()) + len = f.to() - f.from(); + else + len -= f.from(); + char* val = (char*)(key+offset); + char oldchar = '\0'; + for (int l = len; l >= 0; l--) // rtrim + { + if (l == 0 || val[l-1] != ' ') + { + oldchar = val[l]; + val[l] = '\0'; + break; + } + } + switch (rf.TypeF) + { + case _boolfld: + _fexpr->setvar(i, strchr("1STXY", *val)!=NULL ? "X" : " "); + break; + case _intfld: + case _longfld: + { + for (const char* v = val; *v == ' ' || *v == '0'; v++); + _fexpr->setvar(i, v); + } + break; + default: + _fexpr->setvar(i, val); + break; + } + if (oldchar) + val[l] = oldchar; + break; + } + offset += len; + } + } + return _fexpr->as_bool(); +} bool TCursor::ok() const { @@ -1208,9 +1304,10 @@ void TCursor::filter( if (vn[0] != '#') { TFieldref f(vn, 0); - - _frefs.add(new TRecfield(_if->curr(f.file()), f.name(), f.from(), f.to())); + _frefs.add(new TRecfield(_if->curr(f.file()), f.name(), f.from(), f.to()), i); } + else + NFCHECK("Variabile strana %s", (const char*)vn); } } } @@ -1797,16 +1894,20 @@ TFieldref::TFieldref(const TString& s, short defid) { operator=(s); if (_fileid == 0) _fileid = defid; +} + +void TFieldref::copy(const TFieldref& f) +{ + _fileid = f._fileid; + _id = f._id; + _name = f._name; + _from = f._from; + _to = f._to; } TObject* TFieldref::dup() const { - TFieldref* f = new TFieldref(); - f->_fileid = _fileid; - f->_id = _id; - f->_name = _name; - f->_from = _from; - f->_to = _to; + TFieldref* f = new TFieldref(*this); return f; } diff --git a/include/relation.h b/include/relation.h index 6b6678bfb..e62872e19 100755 --- a/include/relation.h +++ b/include/relation.h @@ -273,6 +273,8 @@ protected: virtual TRecnotype buildcursor(TRecnotype rp); // @cmember Permette di creare una pagina di cursori virtual int filtercursor(int pagecnt, TRecnotype* page); + // Controlla se una chiave rispetta il filtro + bool simple_filtercursor(const char* key) const; // @cmember Posiziona il cursore in modo che il record corrente corrisponda alla // posizione dell'indice temporaneo TRecnotype readrec(); @@ -401,12 +403,13 @@ public: // @cmember Controlla se esiste un filtro sul cursor bool has_filter() const { return _filter.not_empty() || _filterfunction; } + bool has_simple_filter() const; // @cmember Salva la posizione attuale di tutti i file del cursore void save_status() { _if->save_status(); } // @cmember Ripristina la posizione attuale di tutti i file del cursore - void restore_status () + void restore_status() { _if->restore_status(); } // @cmember Costruttore @@ -497,6 +500,8 @@ protected: virtual void print_on(ostream& out) const; // @cmember Duplica l'oggetto TFieldref virtual TObject* dup() const; + + void copy(const TFieldref& fr); // @access Public Member public: @@ -504,9 +509,13 @@ public: TFieldref(); // @cmember Costruttore TFieldref(const TString&, short defid); + // @cmember Costruttore + TFieldref(const TFieldref& f) { copy(f); } // @cmember Operatore di assegnamento TFieldref& operator =(const TString& s); + // @cmember Operatore di assegnamento + TFieldref& operator =(const TFieldref& f) { copy(f); return *this; } // @cmember Controlla la validita' dell'oggetto (TRUE se il numero del file e' valido) virtual bool ok() const diff --git a/include/sheet.cpp b/include/sheet.cpp index bad0a9022..97aa7c6b2 100755 --- a/include/sheet.cpp +++ b/include/sheet.cpp @@ -965,7 +965,7 @@ TSheet::TSheet(short x, short y, short dx, short dy, if (!(buttons & 0x10)) add_button(DLG_SELECT, "~Selezione", K_ENTER); if (check_enabled()) { - add_button(DLG_USER, "Tutti", 0); + add_button(DLG_USER, "~Tutti", 0); set_handler(DLG_USER, tutti_handler); } @@ -1109,6 +1109,7 @@ bool TSheet::on_key(KEY key) stop_run(key); break; case K_CTRL+'E': + case K_DEL: if (items() && id2pos(DLG_DELREC) >= 0) stop_run(K_DEL); break; @@ -1120,6 +1121,10 @@ bool TSheet::on_key(KEY key) if (id2pos(DLG_LINK) >= 0) stop_run(key); break; + case K_CTRL+'S': + if (id2pos(DLG_SELECT) >= 0) + stop_run(K_ENTER); + break; default: break; } @@ -1131,6 +1136,9 @@ bool TSheet::on_key(KEY key) // case K_SPACE: // check(selected(), !checked(selected())); // break; + case K_CTRL+'T': + tutti_handler(field(DLG_USER), K_SPACE); + break; case K_F7: uncheck(-1); break; diff --git a/include/utility.cpp b/include/utility.cpp index e8eb5d11e..4e790d571 100755 --- a/include/utility.cpp +++ b/include/utility.cpp @@ -343,60 +343,61 @@ const char *esc( const char *s1 = s; char *s2 = __tmp_string; int base; - - while (*s1) - { - if (*s1 == '\\') - { - s1++; - switch (tolower(*s1)) - { - case 'b' : *s2++ = '\b'; break; - case 'e' : *s2++ = '\033'; break; - case 'f' : *s2++ = '\f'; break; - case 'n' : *s2++ = '\n'; break; - case 'r' : *s2++ = '\r'; break; - case 't' : *s2++ = '\t'; break; - default : - { - if (isdigit(*s1)) - { - if (*s1 == '0') - { - s1++; - if (tolower(*s1) == 'x') - { - s1++; - base = 16; - } - else base = 8; - } - else base = 10; - *s2 = 0; - char c = tolower(*s1); - while (isdigit(c) || (base == 16 && c >= 'a' && c <= 'f')) - { - *s2 *= base; - if (isdigit(*s1)) *s2 += (*s1 - 48); - else *s2 += (*s1 - 'a' + 10) & 0x0F; - s1++; - c = tolower(*s1); - } - s2++; s1--; - } - else *s2++ = *s1; - } - } - } - else - if (*s1 == '^') - { - s1++; - *s2++ = (tolower(*s1) - 'a' + 1); - } - else *s2++ = *s1 ; - s1++; - } + + if (s1) + while (*s1) + { + if (*s1 == '\\') + { + s1++; + switch (tolower(*s1)) + { + case 'b' : *s2++ = '\b'; break; + case 'e' : *s2++ = '\033'; break; + case 'f' : *s2++ = '\f'; break; + case 'n' : *s2++ = '\n'; break; + case 'r' : *s2++ = '\r'; break; + case 't' : *s2++ = '\t'; break; + default : + { + if (isdigit(*s1)) + { + if (*s1 == '0') + { + s1++; + if (tolower(*s1) == 'x') + { + s1++; + base = 16; + } + else base = 8; + } + else base = 10; + *s2 = 0; + char c = tolower(*s1); + while (isdigit(c) || (base == 16 && c >= 'a' && c <= 'f')) + { + *s2 *= base; + if (isdigit(*s1)) *s2 += (*s1 - 48); + else *s2 += (*s1 - 'a' + 10) & 0x0F; + s1++; + c = tolower(*s1); + } + s2++; s1--; + } + else *s2++ = *s1; + } + } + } + else + if (*s1 == '^') + { + s1++; + *s2++ = (tolower(*s1) - 'a' + 1); + } + else *s2++ = *s1 ; + s1++; + } *s2 = '\0'; return(__tmp_string); } diff --git a/mg/anamag.h b/mg/anamag.h index 8172d4294..07d61f08e 100755 --- a/mg/anamag.h +++ b/mg/anamag.h @@ -3,6 +3,7 @@ #define ANAMAG_CODART "CODART" #define ANAMAG_DESCR "DESCR" +#define ANAMAG_DESCRAGG "DESCRAGG" #define ANAMAG_GRMERC "GRMERC" #define ANAMAG_RAGGFIS "RAGGFIS" #define ANAMAG_CLASSEFIS "CLASSEFIS" @@ -46,6 +47,16 @@ #define ANAMAG_VALSTATUN "VALSTATUN" #define ANAMAG_PROV "PROV" #define ANAMAG_PAESE "PAESE" +#define ANAMAG_USER1 "USER1" +#define ANAMAG_USER2 "USER2" +#define ANAMAG_USER3 "USER3" +#define ANAMAG_USER4 "USER4" +#define ANAMAG_USER5 "USER5" +#define ANAMAG_USER6 "USER6" +#define ANAMAG_USER7 "USER7" +#define ANAMAG_USER8 "USER8" +#define ANAMAG_USER9 "USER9" +#define ANAMAG_USER10 "USER10" #define ANAMAG_NUMREG1 "NUMREG1" #define ANAMAG_NUMREG2 "NUMREG2" diff --git a/mg/batbcau.h b/mg/batbcau.h index 3d07251bf..f1784c89b 100755 --- a/mg/batbcau.h +++ b/mg/batbcau.h @@ -33,8 +33,11 @@ #define F_DIBAEXPLOSION 140 #define F_DEFAULTMAG 141 #define F_DEFAULTDEP 142 -#define F_LIV_ESPL 143 +#define F_LIV_ESPL 143 #define F_COSTO_ESPL 144 +#define F_DESCDEFMAG 145 +#define F_DESCDEFDEP 146 +#define H_DEFAULTMAG 147 #define G_SGNVAL 20 #define G_SGNQTA 21 diff --git a/mg/batbcau.uml b/mg/batbcau.uml index 707a8144c..12ffbf757 100755 --- a/mg/batbcau.uml +++ b/mg/batbcau.uml @@ -89,7 +89,7 @@ END LISTBOX F_TIPOPR 16 BEGIN - PROMPT 2 9 "Tipo prezzo " + PROMPT 2 8 "Tipo prezzo " FIELD S6 ITEM "P|Prezzo" ITEM "C|Costo" @@ -99,14 +99,14 @@ END BOOL F_MOVQTA BEGIN FIELD B0 - PROMPT 2 11 "Movimenta solo quantita'" + PROMPT 2 10 "Movimenta solo quantita'" MESSAGE TRUE RESET,F_MOVVAL END BOOL F_MOVVAL BEGIN FIELD B1 - PROMPT 42 11 "Movimenta solo valori" + PROMPT 42 10 "Movimenta solo valori" MESSAGE TRUE RESET,F_MOVQTA END @@ -118,7 +118,7 @@ END STRING F_CAUCOLL 5 BEGIN - PROMPT 2 15 "Causale collegata " + PROMPT 2 13 "Causale collegata " FIELD S9 USE %CAU SELECT S9=="" FLAGS "U" @@ -134,7 +134,7 @@ END STRING F_DCAUCOLL 50 40 BEGIN - PROMPT 32 15 "" + PROMPT 32 13 "" USE %CAU KEY 2 SELECT S9=="" FLAGS "U" INPUT S0 F_DCAUCOLL @@ -150,20 +150,20 @@ END BOOL F_DIBAEXPLOSION BEGIN FIELD B3 - PROMPT 2 17 "Esplodi mediante Distinta Base" + PROMPT 2 15 "Esplodi mediante Distinta Base" MESSAGE TRUE ENABLE,F_COSTO_ESPL|ENABLE,F_LIV_ESPL MESSAGE CLEAR,F_COSTO_ESPL|CLEAR,F_LIV_ESPL END NUMBER F_LIV_ESPL 1 BEGIN - PROMPT 40 17 "Livello " + PROMPT 40 15 "Livello " FIELD I0 END LISTBOX F_COSTO_ESPL 14 BEGIN - PROMPT 52 17 "Costo da utilizzare " + PROMPT 28 16 "Costo da utilizzare " FIELD S11 ITEM " |Nessuno" ITEM "U|Ultimo costo" @@ -172,6 +172,7 @@ END STRING F_DEFAULTMAG 3 BEGIN + FLAGS "U" PROMPT 2 18 "Magazzino di default " FIELD S10[1,3] USE MAG SELECT CODTAB[4,5]=="" @@ -179,23 +180,48 @@ BEGIN DISPLAY "Codice" CODTAB DISPLAY "Descrizione@50" S0 OUTPUT F_DEFAULTMAG CODTAB - MESSAGE EMPTY DISABLE,F_DEFAULTDEP - MESSAGE ENABLE,F_DEFAULTDEP + OUTPUT F_DESCDEFMAG S0 + OUTPUT H_DEFAULTMAG B0 + MESSAGE EMPTY HIDE,F_DEFAULTDEP |HIDE,F_DESCDEFDEP + MESSAGE SHOW,F_DEFAULTDEP|SHOW,F_DESCDEFDEP + CHECKTYPE NORMAL +END + +STRING F_DESCDEFMAG 70 45 +BEGIN + FLAGS "D" + PROMPT 32 18 "" +END + +BOOL H_DEFAULTMAG +BEGIN + FLAGS "HG" + PROMPT 2 18 "divisione in dep" + MESSAGE FALSE DISABLE,F_DEFAULTDEP + MESSAGE TRUE ENABLE,F_DEFAULTDEP END STRING F_DEFAULTDEP 2 BEGIN + FLAGS "U" PROMPT 2 19 "Deposito di default " FIELD S10[4,5] USE MAG SELECT CODTAB[4,5]!="" - INPUT CODTAB[1,3] F_DEFAULTMAG + INPUT CODTAB[1,3] F_DEFAULTMAG SELECT INPUT CODTAB[4,5] F_DEFAULTDEP DISPLAY "Codice" CODTAB DISPLAY "Descrizione@50" S0 OUTPUT F_DEFAULTMAG CODTAB[1,3] OUTPUT F_DEFAULTDEP CODTAB[4,5] + OUTPUT F_DESCDEFDEP S0 + CHECKTYPE NORMAL END +STRING F_DESCDEFDEP 70 45 +BEGIN + FLAGS "D" + PROMPT 32 19 "" +END ENDPAGE PAGE "Movimentazione campi" 11 60 14 diff --git a/mg/f111.dir b/mg/f111.dir index e2e71eeb8..7a3c90958 100755 --- a/mg/f111.dir +++ b/mg/f111.dir @@ -1,3 +1,3 @@ 111 0 -$rmovmag|136|150|95|0|Righe movimenti di magazzino||| +$rmovmag|40290|42456|105|0|Righe movimenti di magazzino||| diff --git a/mg/f111.trr b/mg/f111.trr index efe4edda1..6da7ca03a 100755 --- a/mg/f111.trr +++ b/mg/f111.trr @@ -1,5 +1,5 @@ 111 -11 +13 NUMREG|3|7|0|Numero di registrazione NRIG|2|4|0|Numero di riga CODMAG|1|5|0|Codice magazzino e deposito @@ -9,6 +9,8 @@ UM|1|2|0|Unita' di misura QUANT|4|15|5|Quantita' PREZZO|4|18|3|Prezzo CAUS|1|6|0|Causale di magazzino della riga +IMPIANTO|1|5|0|Codice Impianto (MRP) +LINEA|1|5|0|Codice linea (MRP) AUTOMATICA|1|1|0|Flag di riga automatica ESPLOSA|8|1|0|Flag di riga esplosa (da DiBa) 2 diff --git a/mg/mg1100.cpp b/mg/mg1100.cpp index 3e0b34b98..c25fa29b3 100755 --- a/mg/mg1100.cpp +++ b/mg/mg1100.cpp @@ -17,9 +17,9 @@ // class TMask_movmag : public TMask { - TRecord_cache _cache_causali; - TArticolo_giacenza _curr_art; - + static TRecord_cache cache_causali; + static TArticolo_giacenza curr_art ; + TEsercizi_contabili esercizi; TMov_mag * _mov_mag; TCodgiac_livelli * livelli_giac; // oggetto gestione livelli di giacenza TString _price_codart; @@ -526,11 +526,10 @@ bool TMask_movmag::handle_codcaus(TMask_field &fld, KEY k) bool TMask_movmag::handle_datacomp(TMask_field &fld, KEY k) { if (k == K_TAB) // && fld.focusdirty()) - { - TEsercizi_contabili esc; - int codes= esc.date2esc(TDate(fld.get())); - if (codes > 0) - { + { + TMask_movmag& m = (TMask_movmag&) fld.mask(); + const int codes=m.esercizi.date2esc(TDate(fld.get())); + if (codes>0) { fld.mask().field(F_ANNOES).set(codes); fld.mask().field(H_ANNOES).set(codes); } diff --git a/mg/mg4200.cpp b/mg/mg4200.cpp index 8fc3dc9be..2cc3c90a2 100755 --- a/mg/mg4200.cpp +++ b/mg/mg4200.cpp @@ -424,7 +424,7 @@ protected: void setprint_permagazzini(); void setprint_perarticoli(); void setprint_perarticoli_all(); - bool calcola_giacenze(); + bool calcola_giacenze(const bool b = TRUE); public: TStampa_inventario() {} @@ -460,11 +460,11 @@ bool TStampa_inventario::destroy() return TRUE; } -bool TStampa_inventario::calcola_giacenze() +bool TStampa_inventario::calcola_giacenze(const bool b) { //Scorre l'anagrafica di magazzino e calcola per ognuno la giacenza alla data indicata //Memorizzando i records in un file temporaneo che avrà lo stesso tracciato di LF_MAG - TIsamtempfile* temp_mag = new TIsamtempfile(LF_MAG, "tmpmag", TRUE, TRUE); + TIsamtempfile* temp_mag = new TIsamtempfile(LF_MAG, "tmpmag", TRUE, b); TRelation ana_rel(LF_ANAMAG); TCursor ana_cur(&ana_rel); @@ -491,13 +491,16 @@ bool TStampa_inventario::calcola_giacenze() // Se il file è ok lo sostituisce all'interno della relazione del form const bool rt = temp_mag->good(); - if (rt) - _form->relation()->replace(temp_mag); - else + if (!rt) { error_box("Errore %d in creazione file temporaneo per saldi di magazzino alla data indicata.", temp_mag->status()); delete temp_mag; } + else + if (b) // Non sostituire in caso di stampa tutti gli articoli + _form->relation()->replace(temp_mag); + else + delete temp_mag; // in caso di stampa tutti gli articoli, non cancella fisicamente il file; per riaprirlo poi return rt; } @@ -854,8 +857,16 @@ void TStampa_inventario::setprint_perarticoli_all() joinexp << "ANNOES==" << _mask->get(F_ANNOES) << "|CODART==CODART"; TSortedfile *mag; + TRelation *rel = NULL; + + if (_mask->get_bool(F_ALLADATA)) + { + TIsamtempfile* temp_mag = new TIsamtempfile(LF_MAG, "tmpmag", FALSE, TRUE); // Non crearlo, auto cancella il file + rel = new TRelation(temp_mag); + } + // !?!?!! ATTENZIONE : Modifica temporanea - mag= new TSortedfile(LF_MAG,NULL,sortexp,"",1); + mag= new TSortedfile(LF_MAG,rel,sortexp,"",1); // il filtro viene qui settato DOPO la creazione del Sortedfile a causa di una bug // sulla libreria nei TSorted_file / TCursor mag->cursor().setfilter(filter); @@ -884,19 +895,30 @@ void TStampa_inventario::main_loop() if (*_mask->get(F_FILTRO)=='T') // tutti gli articoli { _form = new TForm_inventario("mg4200aa", ""); + if (b && !calcola_giacenze(FALSE)) + { + delete _form; + continue; + } setprint_perarticoli_all(); } else { _form = new TForm_inventario("mg4200a", ""); if (b && !calcola_giacenze()) + { + delete _form; continue; + } setprint_perarticoli(); } } else { _form = new TForm_inventario("mg4200b", ""); if (b && !calcola_giacenze()) + { + delete _form; continue; + } setprint_permagazzini(); } _form->set_parametri(_mask->get(F_CATVENLISTINO), diff --git a/mg/mglib.h b/mg/mglib.h index 65a89f5cf..9c7404380 100755 --- a/mg/mglib.h +++ b/mg/mglib.h @@ -425,7 +425,6 @@ typedef enum class TCausale_magazzino : public TRectype { - static TDecoder _ragg_fisc; public: const TString & codice() const {return get("CODTAB");} @@ -446,6 +445,7 @@ public: bool has_default_dep() const {return *default_dep() > ' '; } bool is_fiscale(); TCausale_magazzino(const char * codice); + TCausale_magazzino(const TRectype &r); virtual ~TCausale_magazzino() {} }; @@ -455,6 +455,7 @@ class TLine_movmag; // ( un movimento (testata+righe) == un oggetto TMov_mag ) class TMov_mag : public TMultiple_rectype { + static TCausale_magazzino *_causmag; // TString16 _annoes; // codice esercizio del movimento TDate _datacomp; // data di competenza @@ -463,8 +464,6 @@ class TMov_mag : public TMultiple_rectype TAssoc_array lines_to_add; TAssoc_array lines_to_subtract; - static TRecord_cache _cache_causali; - protected: virtual void load_rows_file(int logicnum); virtual void set_body_key(TRectype & rowrec); diff --git a/mg/mglib02.cpp b/mg/mglib02.cpp index 6cbc1c8c5..12dbba7d1 100755 --- a/mg/mglib02.cpp +++ b/mg/mglib02.cpp @@ -231,8 +231,8 @@ bool TArticolo::lock_and_prompt(const char * cod) case _iskeynotfound: mess.cut(0); mess << "Il record di anagrafica\ndell'articolo ''"<< cod << "'' non esiste."; - error_box(mess); - return FALSE; + //error_box(mess); + //return FALSE; break; default: mess.cut(0); @@ -581,6 +581,20 @@ bool TArticolo_giacenza::riporta_saldi(const char * oldes, const char* newes, co rec.zero(MAG_SCARTI); } + // Per non perdere le modifiche in memoria, al fine di avere i saldi riportati correttamente + // visto che non vengono salvati e poi riletti da disco, li si salvano nel TRecord_array + // dell'esercizio newes + if (!save_to_disk) + { + TRecord_array copia(rec_arr); + TRecord_array& nuovo = TArticolo_giacenza::mag(codes); + + if (copia.rows() > 0) + nuovo = copia; + else + azzera_saldi(codes, FALSE); + } + // Scrive il pastrocchio (eventualmente sovrascrive) return save_to_disk ? (rec_arr.write(TRUE) == NOERR) : TRUE; } @@ -1178,16 +1192,10 @@ void TArticolo_giacenza_data::al(const TDate& data, const char* codmag, const ch remove_body(LF_MAG); // Azzero la cache dei magazzini - TRecord_array& rmag = mag(annoes); - for (int i = find_mag(annoes, codmag, livello); i > 0; - i = find_mag(annoes, codmag, livello, i)) - { - const TRectype& rec = rmag.row(i); - if (reset_giac) - azzera_saldi(annoes, FALSE); - else - riporta_saldi(predes, annoes, tipo, catven, codlis, FALSE); - } + if (reset_giac) + azzera_saldi(annoes, FALSE); + else + riporta_saldi(predes, annoes, tipo, catven, codlis, FALSE); TRelation rel(LF_RMOVMAG); rel.add(LF_MOVMAG, "NUMREG==NUMREG"); TRectype filter(LF_RMOVMAG); @@ -1212,6 +1220,7 @@ void TArticolo_giacenza_data::al(const TDate& data, const char* codmag, const ch rel.lfile(LF_MOVMAG).set_curr(p_movmag); TMov_mag& movmag = *p_movmag; const TRectype& rmovmag = rel.curr(); + TRecord_array& rmag = mag(annoes); for (cur = 0; cur.pos() < items; ++cur) { @@ -1221,7 +1230,7 @@ void TArticolo_giacenza_data::al(const TDate& data, const char* codmag, const ch { const TString16 codmag = rmovmag.get(RMOVMAG_CODMAG); const TString16 livello = rmovmag.get(RMOVMAG_LIVGIAC); - i = find_mag(annoes, codmag, livello); + const int i = find_mag(annoes, codmag, livello); if (i >= 0) { TRectype& rec = (TRectype&)rmag.row(i); @@ -1314,8 +1323,6 @@ int TCausale_magazzino::sgn(TTipo_saldomag tiposaldo) const return segno; } -TDecoder TCausale_magazzino::_ragg_fisc("%RFC", "S6"); - bool TCausale_magazzino::is_fiscale() { bool rt = FALSE; @@ -1325,7 +1332,7 @@ bool TCausale_magazzino::is_fiscale() rt = tm == 'S' || tm == 'C'; // La causale deve essere Carico o Scarico... if (rt) { - const TRectype& rfc = ragg_fisc_cache.get(raggfisc()); + const TRectype& rfc = cache().get("RFC",raggfisc()); const char ragg = rfc.get_char("S6"); rt &= (ragg == 'S' || ragg == 'C'); // Ed il raggruppamento deve essere Carico o Scarico } @@ -1337,16 +1344,15 @@ bool TCausale_magazzino::is_fiscale() TCausale_magazzino::TCausale_magazzino(const char * codice): TRectype(LF_TABCOM) { -/* - TTable f("%CAU"); - settab("CAU"); - put("CODTAB", codice); - if (TRectype::read(f) != NOERR) - zero(); -*/ this->TRectype::operator =(cache().get("%CAU", codice)); } +TCausale_magazzino::TCausale_magazzino(const TRectype &r): + TRectype(r) +{ + CHECK(r.num() == LF_TABCOM, "Tipo record errato sulla causale di magazzino"); +} + const real CENTO=real(100.0); bool TCondizione_vendita::ricerca(const char * codice, const real & qta) diff --git a/mg/mglib02a.cpp b/mg/mglib02a.cpp index 06d270fa6..add0a842f 100755 --- a/mg/mglib02a.cpp +++ b/mg/mglib02a.cpp @@ -68,7 +68,7 @@ int TLine_movmag::operator==(TLine_movmag &l) // ******************************** // TMov_mag -TRecord_cache TMov_mag::_cache_causali("%CAU"); +TCausale_magazzino *TMov_mag::_causmag = NULL; TMov_mag::TMov_mag() : TMultiple_rectype(LF_MOVMAG), @@ -85,7 +85,11 @@ const TCausale_magazzino& TMov_mag::causale(const char* cod) const { if (cod == NULL || *cod == '\0') cod = get(MOVMAG_CODCAUS); - return (TCausale_magazzino&)_cache_causali.get(cod); + if (!_causmag) + _causmag = new TCausale_magazzino(cod); + else + *_causmag = cache().get("%CAU",cod); + return *_causmag; } void TMov_mag::zero(char c) @@ -201,50 +205,53 @@ bool TMov_mag::add_explrows() const const TCausale_magazzino& cau = causale(codcaus); if (cau.esplodente() && !b[r].get_bool(RMOVMAG_ESPLOSA)) { - // devono esserci n righe automatiche esplose - //if (!b.exist(r + 1) || !b[r + 1].get_bool(RMOVMAG_ESPLOSA)) + const TString codart = row.get(RMOVMAG_CODART); + const char tipo_costo = cau.get("S11")[0]; + const int livello = cau.get_int("I0"); + const TString4 umroot(row.get(RMOVMAG_UM)); + // mancano le righe, le inserisco + boom.destroy(); + bool ok=distinta.set_root(row); + if (ok) { - // mancano le righe, le inserisco - const char tipo_costo = cau.get("S11")[0]; - const int livello = cau.get_int("I0"); - const TString4 umroot(row.get(RMOVMAG_UM)); - // mancano le righe, le inserisco - boom.destroy(); - if (distinta.set_root(row.get(RMOVMAG_CODART),umroot,row.get_real(RMOVMAG_QUANT))) + distinta.explode(boom, TRUE, RAGGR_EXP_NONE, livello, "A"); + TString codmag(codmag_rauto(r)); + real prezzo(prezzo_rauto(r)); + TRectype * linea_auto; + for (int newrow=0; newrow < boom.items() ; newrow++) { - distinta.explode(boom, TRUE, RAGGR_EXP_NONE, livello, "A"); - TString codmag(codmag_rauto(r)); - real prezzo(prezzo_rauto(r)); - TRectype * linea_auto; - for (int newrow=0; newrow < boom.items() ; newrow++) - { - TRiga_esplosione & riga_esp=(TRiga_esplosione & )(boom[newrow]); - linea_auto = new TRectype(row); - linea_auto->put(RMOVMAG_CODART, riga_esp.articolo()); - linea_auto->put(RMOVMAG_UM, riga_esp.um()); - linea_auto->put(RMOVMAG_QUANT, riga_esp.val()); - if (codmag.not_empty()) - linea_auto->put(RMOVMAG_CODMAG, codmag); - //if (!prezzo.is_zero()) - articolo.read(riga_esp.articolo()); - if (tipo_costo == 'U') - prezzo = articolo.get_real(ANAMAG_ULTCOS1); - else - if (tipo_costo == 'S') - prezzo = articolo.get_real(ANAMAG_COSTSTD); - linea_auto->put(RMOVMAG_PREZZO, prezzo); - linea_auto->put(RMOVMAG_NRIG, r+1+newrow); - linea_auto->put(RMOVMAG_ESPLOSA, TRUE); - //linea_auto->put(RMOVMAG_TIPORIGA, (char) riga_automatica); - //linea_auto->put(RMOVMAG_CODCAUS, codcaus); - b.insert_row(linea_auto); - added=TRUE; - } + TRiga_esplosione & riga_esp=(TRiga_esplosione & )(boom[newrow]); + linea_auto = new TRectype(row); + linea_auto->put(RMOVMAG_CODART, riga_esp.articolo()); + linea_auto->put(RMOVMAG_UM, riga_esp.um()); + linea_auto->put(RMOVMAG_QUANT, riga_esp.val()); + if (codmag.not_empty()) + linea_auto->put(RMOVMAG_CODMAG, codmag); + //if (!prezzo.is_zero()) + articolo.read(riga_esp.articolo()); + if (tipo_costo == 'U') + prezzo = articolo.get_real(ANAMAG_ULTCOS1); + else + if (tipo_costo == 'S') + prezzo = articolo.get_real(ANAMAG_COSTSTD); + linea_auto->put(RMOVMAG_PREZZO, prezzo); + linea_auto->put(RMOVMAG_NRIG, r+1+newrow); + linea_auto->put(RMOVMAG_ESPLOSA, TRUE); + //linea_auto->put(RMOVMAG_TIPORIGA, (char) riga_automatica); + //linea_auto->put(RMOVMAG_CODCAUS, codcaus); + b.insert_row(linea_auto); + added=TRUE; } - } + } // ora ci sono, mi basta eliminare la riga "padre" - if (boom.items() > 0) + if (boom.items() > 0 ) + { + if (boom.items() == 1 && codart == ((TRiga_esplosione &)boom[0]).articolo()) + error_box("Movimento di magazzino %ld:\ndistinta %s ciclica", get_long(MOVMAG_NUMREG),(const char *)codart); b.destroy_row(r,TRUE); + } + else + error_box("Movimento di magazzino %ld:\nimpossibile esplodere l'articolo %s", get_long(MOVMAG_NUMREG),(const char *)codart); } } // ciclo righe return added; diff --git a/mg/rmovmag.h b/mg/rmovmag.h index 7061f4aae..c7932735d 100755 --- a/mg/rmovmag.h +++ b/mg/rmovmag.h @@ -11,6 +11,8 @@ #define RMOVMAG_PREZZO "PREZZO" #define RMOVMAG_CODCAUS "CAUS" #define RMOVMAG_TIPORIGA "AUTOMATICA" -#define RMOVMAG_ESPLOSA "ESPLOSA" +#define RMOVMAG_ESPLOSA "ESPLOSA" +#define RMOVMAG_IMPIANTO "IMPIANTO" +#define RMOVMAG_LINEA "LINEA" #endif diff --git a/mr/mr2.cpp b/mr/mr2.cpp index ada40c497..108b8d11f 100755 --- a/mr/mr2.cpp +++ b/mr/mr2.cpp @@ -9,8 +9,10 @@ int main(int argc, char** argv) { case 0: // MRP mr2100(argc,argv); break; - case 1: // planning + case 1: // generic planning mr2200(argc,argv); break; + case 2: // generic planning + mr2300(argc,argv); break; } exit(0); return 0; diff --git a/mr/mr2.h b/mr/mr2.h index 528cc7ccb..64e88b504 100755 --- a/mr/mr2.h +++ b/mr/mr2.h @@ -3,6 +3,7 @@ int mr2100(int argc, char* argv[]); int mr2200(int argc, char* argv[]); +int mr2300(int argc, char* argv[]); #endif // __MR2_H diff --git a/mr/mr2.url b/mr/mr2.url index e55a6b25b..dc409d674 100755 --- a/mr/mr2.url +++ b/mr/mr2.url @@ -15,20 +15,23 @@ MENU MENU_BAR(1) SUBMENU MENU_FILE "~File" image USER_BMP_CHECK "check.bmp" -image USER_BMP_ARROWUP "darrowu.bmp" -image USER_BMP_ARROWDOWN "darrowd.bmp" -image USER_BMP_ARROWLEFT "darrowl.bmp" -image USER_BMP_ARROWRIGHT "darrowr.bmp" -image USER_BMP_ARROWUP_RED "darrowu2.bmp" -image USER_BMP_ARROWDOWN_RED "darrowd2.bmp" -image USER_BMP_ARROWLEFT_RED "darrowl2.bmp" -image USER_BMP_ARROWRIGHT_RED "darrowr2.bmp" +image USER_BMP_ARROWUP "..\include\darrowu.bmp" +image USER_BMP_ARROWDOWN "..\include\darrowd.bmp" +image USER_BMP_ARROWLEFT "..\include\darrowl.bmp" +image USER_BMP_ARROWRIGHT "..\include\darrowr.bmp" +image USER_BMP_ARROWUP_RED "..\include\darrowu2.bmp" +image USER_BMP_ARROWDOWN_RED "..\include\darrowd2.bmp" +image USER_BMP_ARROWLEFT_RED "..\include\darrowl2.bmp" +image USER_BMP_ARROWRIGHT_RED "..\include\darrowr2.bmp" -image USER_BMP_ARROWUPLEFT "darrowul.bmp" -image USER_BMP_ARROWDOWNLEFT "darrowdl.bmp" -image USER_BMP_ARROWUPRIGHT "darrowur.bmp" -image USER_BMP_ARROWDOWNRIGHT "darrowdr.bmp" +image USER_BMP_ARROWUPLEFT "..\include\darrowul.bmp" +image USER_BMP_ARROWDOWNLEFT "..\include\darrowdl.bmp" +image USER_BMP_ARROWUPRIGHT "..\include\darrowur.bmp" +image USER_BMP_ARROWDOWNRIGHT "..\include\darrowdr.bmp" image USER_BMP_SELECT_ORDP "selordp.bmp" image USER_BMP_SELECT_ORDF "selordf.bmp" +image USER_BMP_ORDINI_INPUT "ord_in.bmp" +image USER_BMP_ORDINI_OUTPUT "ord_out.bmp" + diff --git a/mr/mr2100.cpp b/mr/mr2100.cpp index 1412e724c..96b840fcf 100755 --- a/mr/mr2100.cpp +++ b/mr/mr2100.cpp @@ -29,6 +29,18 @@ const real& TMRP_record::add_sched_rec(const real & val) return _sched_receipts; } +const real& TMRP_record::add_planned_ord(const real & val) +{ + _planned_orders += val; + return _planned_orders; +} + +const real& TMRP_record::add_proposed_ord(const real & val) +{ + _proposed_orders += val; + return _proposed_orders; +} + const real& TMRP_record::add_net_req(const real & val) { _net_requirement += val; @@ -47,9 +59,9 @@ TMRP_record & TMRP_record::operator=(const TMRP_record & a) _gross_requirement=a._gross_requirement; _on_hand=a._on_hand; _sched_receipts=a._sched_receipts; - _released_receipts=a._released_receipts; _net_requirement=a._net_requirement; _planned_orders=a._planned_orders; + _proposed_orders=a._proposed_orders; return *this; } @@ -141,7 +153,7 @@ TMRP_line & TMRP_line::operator=(const TMRP_line & a) TMRP_record& TMRP_line::record(int i) const { TMRP_record* rec = (TMRP_record*)_req_per_bucket.objptr(i); - CHECKD(rec != NULL, "Invalid MRP record ", i); + CHECKD(rec, "Invalid MRP record ", i); return *rec; } @@ -176,9 +188,6 @@ real TMRP_line::sizeup_net_requirement(int i, const real &val) real lm,li; lotti_riordino(lm,li); - int cazzo; - if (!lm.is_zero() && !li.is_zero() ) - cazzo=1; if (req > lm) // Se la richiesta supera il lotto minimo { if (li > ZERO) @@ -203,6 +212,13 @@ const real& TMRP_line::add_gross_req(const TMRP_time& t, const real& val) const real& TMRP_line::add_sched_rec(const TMRP_time& t, const real &val) { return record(t).add_sched_rec(val);} +const real& TMRP_line::add_planned_ord(const TMRP_time& t, const real &val) +{ return record(t).add_planned_ord(val);} + +const real& TMRP_line::add_proposed_ord(int i, const real &val) +{ + return record(i).add_proposed_ord(val); +} const real & TMRP_line::set_net_req(int i, const real &val) { if (val>ZERO) @@ -214,32 +230,38 @@ const real & TMRP_line::set_net_req(int i, const real &val) const real & TMRP_line::add_net_req(const TMRP_time &t, const real &val) { return record(t).add_net_req(val); } +const real & TMRP_line::add_net_req(int i, const real &val) +{ return record(i).add_net_req(val); } + const real & TMRP_line::set_on_hand(int i, const real &val) { return record(i).set_on_hand(val);} const real & TMRP_line::set_on_hand(const TMRP_time &t, const real &val) { return record(t).set_on_hand(val);} -const TMRP_time& TMRP_line::lead_time(int i, TMRP_time& t) const +const TMRP_time& TMRP_line::lead_time(int i, TMRP_time& t, bool anticipate) const { t = record(i).time(); - TLocalisamfile dist(LF_DIST); - dist.put("CODDIST", codice()); - if (dist.read() == NOERR) + if (anticipate) { - int days = dist.get_int("LEADTIME"); - long hours = dist.get_long("LEADHOURS"); - t.sub_time(days, hours); - } - else - { - TLocalisamfile anamag(LF_ANAMAG); - anamag.put(ANAMAG_CODART, codice()); - if (anamag.read() == NOERR) + TLocalisamfile dist(LF_DIST); + dist.put("CODDIST", codice()); + if (dist.read() == NOERR) { - int days = anamag.get_int("LEADTIME"); - t.sub_time(days); + int days = dist.get_int("LEADTIME"); + long hours = dist.get_long("LEADHOURS"); + t.sub_time(days, hours); + } + else + { + TLocalisamfile anamag(LF_ANAMAG); + anamag.put(ANAMAG_CODART, codice()); + if (anamag.read() == NOERR) + { + int days = anamag.get_int("LEADTIME"); + t.sub_time(days); + } } } return t; @@ -273,10 +295,12 @@ real &TMRP_line::scorta_minima(real &g, const TDate &d) const TMRP_line::TMRP_line(const char* art, const char* giac, - const char* mag, const char* imp, - const char* lin, long codcli) + const char* mag, const char* magc, + const char* imp, const char* lin, + long codcli) : _codart(art), _livgiac(giac), - _codmag(mag), _codimp(imp), _codlin(lin), _codcli(codcli) + _codmag(mag), _codmag_coll(magc), + _codimp(imp), _codlin(lin), _codcli(codcli) { if (_articolo_giac==NULL) _articolo_giac= new TArticolo_giacenza(); @@ -293,17 +317,6 @@ TMRP_line::TMRP_line(const TMRP_line&a) // TMRP_lines /////////////////////////////////////////////////////////// -TSortable* TMRP_lines::new_obj(const TToken_string& key) const -{ - TCodice_articolo art; key.get(0, art); art.trim(); - TString80 gia; key.get(1, gia); gia.trim(); - TString16 mag; key.get(2, mag); mag.trim(); - TString16 imp; key.get(3, imp); imp.trim(); - TString16 lin; key.get(4, lin); lin.trim(); - TString16 clifor ; key.get(5, clifor); - return new TMRP_line(art, gia, mag, imp, lin, atol(clifor)); -} - TMRP_lines::TMRP_lines(const TMRP_lines & a) { TMRP_lines::operator=(a); @@ -323,8 +336,20 @@ TMRP_lines & TMRP_lines::operator= (const TMRP_lines &a) return *this; } -TMRP_line* TMRP_lines::find(const TCodice_articolo& codart, - const TString& gia, const TString& mag, +TSortable* TMRP_lines::new_obj(const TToken_string& key) const +{ + TCodice_articolo art; key.get(0, art); art.trim(); + TString16 gia; key.get(1, gia); gia.trim(); + TString8 mag; key.get(2, mag); mag.trim(); + TString8 magc; key.get(3, magc); magc.trim(); + TString8 imp; key.get(4, imp); imp.trim(); + TString8 lin; key.get(5, lin); lin.trim(); + TString16 clifor ; key.get(6, clifor); + return new TMRP_line(art, gia, mag, magc, imp, lin, atol(clifor)); +} + +TMRP_line* TMRP_lines::find(const TCodice_articolo& codart, const TString& gia, + const TString& mag, const TString& magc, const TString& imp, const TString& lin, long codcli, bool create) @@ -332,19 +357,25 @@ TMRP_line* TMRP_lines::find(const TCodice_articolo& codart, _key = codart; _key.add(gia); if (_ignore_mag) + { _key.add(" ",2); - else - _key.add(mag,2); - if (_ignore_imp) _key.add(" ",3); + } else - _key.add(imp,3); - if (_ignore_lin) + { + _key.add(mag,2); + _key.add(magc,3); + } + if (_ignore_imp) _key.add(" ",4); else - _key.add(lin,4); + _key.add(imp,4); + if (_ignore_lin) + _key.add(" ",5); + else + _key.add(lin,5); - _key.add(codcli,5); + _key.add(codcli,6); TSortable* s = create ? add_obj(_key) : find_obj(_key); return (TMRP_line*)s; @@ -371,7 +402,7 @@ TMRP_lines::~TMRP_lines() class TRiga_ordine : public TToken_string { public: - int compare(const TToken_string& r, int level = SORT_COMPLETE) const; + int compare(const TToken_string& r, int level = SORT_COMPLETE, bool ascending=TRUE) const; int compare_field(TString &str0, TString &str1,short field_no) const; TRiga_ordine& operator=(TToken_string& r); @@ -384,7 +415,7 @@ public: virtual ~TRiga_ordine() { } }; -int TRiga_ordine::compare(const TToken_string& riga, int level) const +int TRiga_ordine::compare(const TToken_string& riga, int level, bool ascending) const { TString16 str0, str1; int cmp = 0; @@ -430,7 +461,7 @@ int TRiga_ordine::compare(const TToken_string& riga, int level) const cmp=compare_field(str0,str1,f); } } - return cmp; + return ascending ? cmp : -cmp; } int TRiga_ordine::compare_field(TString &str0, TString &str1,short field_no) const @@ -506,10 +537,11 @@ TRiga_ordine::TRiga_ordine(const TDate& datadoc, long forn, const TMRP_line& lin add(line.codimp(),F_CODIMP-FIRST_FIELD); add(line.codlin(),F_CODLIN-FIRST_FIELD); - add(line.net_requirement(bucket).string(),F_QUANTITA-FIRST_FIELD); - + real q = line.net_requirement(bucket); + //q -= line.planned_orders(bucket); const TCodice_um um; - const TQuantita qta(line.codice(), um, ZERO); + const TQuantita qta(line.codice(), um, q); + add(qta.val().string(),F_QUANTITA-FIRST_FIELD); add(qta.um(),F_UM-FIRST_FIELD); add(price.string(),F_PREZZO-FIRST_FIELD); @@ -609,13 +641,14 @@ class TMatResPlanning : public TSkeleton_application TLav_finder _artinfo; private: - bool gross2net_logic(TMRP_line &curr_article, int bucket,bool lotsizing_f, bool lotsizing_p); - bool build_gross_requirements(const TMatResMask& m); - bool build_sched_receipts(const TMatResMask& m); + bool gross2net_logic(TMRP_line &curr_article, int bucket,bool lotsizing_f, bool lotsizing_p, bool use_leadtime); + bool load_gross_requirements(const TMatResMask& m); + bool load_planned_orders(const TMatResMask& m); bool explode_articles(const TMatResMask& m); bool test_codnum(const TCodice_numerazione& num, TString_array& a) const; - bool test_status(const TRectype& doc, TString_array& a) const; + int test_status(const TRectype& doc, TString_array& a) const; + bool has_confirmed_status(const TRectype& doc, TToken_string & riga ) const; protected: bool preprocess_cycle(const TMatResMask& m); // req iniziale dai docs @@ -663,23 +696,26 @@ public: int TMatResMask::round_date(TDate& date, bool up) const { // Dimensione del bucke in giorni - int bucket_size = get_int(F_BUCKET) * 7; - if (bucket_size < 7) bucket_size = 7; + const int bucket_size = get_int(F_BUCKETS); // Riporta la data al primo lunedi prima dell'inizio - TDate inizio = get(F_DADATA); - const int wday = inizio.wday(); - if (wday > 1) inizio -= wday-1; - + TDate inizio = get_date(F_DADATA); + if (bucket_size>1) // non vado a giorni + { + const int wday = inizio.wday(); + if (wday > 1) inizio -= wday-1; + } // Calcola il bucket di appartenenza const int days = int(date - inizio); - const int bucket = days / bucket_size; - + int bucket; + if (days<0) + bucket = days / bucket_size; + else + bucket = days / bucket_size; if (up) // Arrotonda alla fine del bucket - date = inizio + long((bucket+1) * bucket_size - 1); + date = inizio + long((bucket+1 )* bucket_size - 1 /*- get_int(F_LASTWRKDAY)*/); else // Arrotonda all'inizio del bucket date = inizio + long(bucket * bucket_size); - return bucket; } @@ -783,8 +819,8 @@ bool TMatResMask::on_field_event(TOperable_field& o, TField_event e, long jolly) } } break; - case F_SORT_ORDINI: - if (e == fe_modify) + case F_RESORT_ORDINI: + if (e == fe_button) sort_orders(); break; case F_SELECT_ORDF: @@ -867,49 +903,32 @@ int TMatResMask::add_order_line(const TDate& datadoc, long forn, const TMRP_line return pos; } +static int order_compare(TSheet_field &s,int i1,int i2, int sorttype) +{ + TMask &m=s.mask(); + const bool ascending=!m.get_bool(F_SORT_ORDER); + const TRiga_ordine& r1 = (TRiga_ordine&)s.row(i1); + const TRiga_ordine& r2 = (TRiga_ordine&)s.row(i2); + return r1.compare(r2,sorttype,ascending); +} static int order_compareDFA(TSheet_field &s,int i1,int i2) -{ - const TRiga_ordine& r1 = (TRiga_ordine&)s.row(i1); - const TRiga_ordine& r2 = (TRiga_ordine&)s.row(i2); - return r1.compare(r2,SORT_BY_DFA); -} +{ return order_compare(s,i1,i2,SORT_BY_DFA);} static int order_compareDAF(TSheet_field &s,int i1,int i2) -{ - const TRiga_ordine& r1 = (TRiga_ordine&)s.row(i1); - const TRiga_ordine& r2 = (TRiga_ordine&)s.row(i2); - return r1.compare(r2,SORT_BY_DAF); -} +{ return order_compare(s,i1,i2,SORT_BY_DAF);} static int order_compareAFD(TSheet_field &s,int i1,int i2) -{ - const TRiga_ordine& r1 = (TRiga_ordine&)s.row(i1); - const TRiga_ordine& r2 = (TRiga_ordine&)s.row(i2); - return r1.compare(r2,SORT_BY_AFD); -} +{ return order_compare(s,i1,i2,SORT_BY_AFD);} static int order_compareADF(TSheet_field &s,int i1,int i2) -{ - const TRiga_ordine& r1 = (TRiga_ordine&)s.row(i1); - const TRiga_ordine& r2 = (TRiga_ordine&)s.row(i2); - return r1.compare(r2,SORT_BY_ADF); -} +{ return order_compare(s,i1,i2,SORT_BY_ADF);} static int order_compareFAD(TSheet_field &s,int i1,int i2) -{ - const TRiga_ordine& r1 = (TRiga_ordine&)s.row(i1); - const TRiga_ordine& r2 = (TRiga_ordine&)s.row(i2); - return r1.compare(r2,SORT_BY_FAD); -} +{ return order_compare(s,i1,i2,SORT_BY_FAD);} static int order_compareFDA(TSheet_field &s,int i1,int i2) -{ - const TRiga_ordine& r1 = (TRiga_ordine&)s.row(i1); - const TRiga_ordine& r2 = (TRiga_ordine&)s.row(i2); - int cmp=r1.compare(r2,SORT_BY_FDA); - return cmp; -} +{ return order_compare(s,i1,i2,SORT_BY_FDA);} void TMatResMask::sort_orders() { TSheet_field& s = sfield(F_ORDINI); TSheet_field& a = s; - switch (-get_int(F_SORT_ORDINI)) + switch (-get_int(F_SORT)) { case SORT_BY_DAF: a.sort(order_compareDAF); break; @@ -955,7 +974,7 @@ void TMatResMask::select_orders(char type) s.force_update(r); } } - TString msg=format("Ordini %s %s",type=='F' ? "fornitore" : "di produzione" ,on ? "selezionati" :" de-selezionati"); + TString msg=format("Ordini %s %s",type=='F' ? "fornitore" : "di produzione" ,on ? "selezionati" :"de-selezionati"); xvt_statbar_set(msg); } @@ -992,28 +1011,42 @@ TMatResMask::TMatResMask() : TCalendar_mask("mr2100a") bool TMatResPlanning::test_codnum(const TCodice_numerazione& num, TString_array& a) const { + TString troia; + for (int diocane=0 ; diocane< a.items(); diocane++ ) + { + troia = a.row(diocane).get(0); + if (troia == num.codice()) return TRUE; + } + return FALSE; bool yes = a.find(num.codice()) >= 0; return yes; } -bool TMatResPlanning::test_status(const TRectype& doc, +bool TMatResPlanning::has_confirmed_status(const TRectype& doc, + TToken_string & riga ) const +{ + const char statodoc = doc.get_char(DOC_STATO); + const char state_def = riga.get_char(F_STATODEF - FIRST_FIELD); + return (statodoc >= state_def); +} +int TMatResPlanning::test_status(const TRectype& doc, TString_array& a) const { const TString16 tipodoc = doc.get(DOC_TIPODOC); - const int statodoc = doc.get_int(DOC_STATO); - bool yes = FALSE; - for (int i = a.items()-1; i >= 0 && !yes; i--) + const char statodoc = doc.get_char(DOC_STATO); + for (int i = a.items()-1; i >= 0; i--) { TToken_string& riga = a.row(i); const char* t = riga.get(0); if (tipodoc == t) { - const int state_fr = riga.get_int(F_DASTATO - FIRST_FIELD); - const int state_to = riga.get_int(F_ASTATO - FIRST_FIELD); - yes = statodoc >= state_fr && statodoc <= state_to; + const char state_fr = riga.get_char(F_DASTATO - FIRST_FIELD); + const char state_to = riga.get_char(F_ASTATO - FIRST_FIELD); + if (statodoc >= state_fr && statodoc <= state_to) + return i; } } - return yes; + return -1; } static long table_items(const char* tab) @@ -1026,7 +1059,7 @@ static long table_items(const char* tab) /////////// finished: 100% /////////// tested : 100% -bool TMatResPlanning::build_gross_requirements(const TMatResMask& m) +bool TMatResPlanning::load_gross_requirements(const TMatResMask& m) { TDate date_fr = m.get(F_DADATA); const int bucket_fr = m.round_date(date_fr, FALSE); @@ -1055,7 +1088,7 @@ bool TMatResPlanning::build_gross_requirements(const TMatResMask& m) TString_array& n = m.sfield(F_NUM_ORC).rows_array(); TString_array& a = m.sfield(F_TIPI_ORC).rows_array(); - TProgind pi(table_items("%NUM"), "Fase 1: caricamento fabbisogni lordi...", TRUE, TRUE); + TProgind pi(table_items("%NUM"), "Caricamento fabbisogni lordi...", TRUE, TRUE); // Scandisce tutte le numerazioni considerando solo quelle // contenenti i tipi documento specificati nella maschera @@ -1094,7 +1127,7 @@ bool TMatResPlanning::build_gross_requirements(const TMatResMask& m) if (!doc_cons.ok()) doc_cons = curr_doc.get(DOC_DATADOC); - if (test_status(curr_doc, a)) + if (test_status(curr_doc, a)>=0) { // Scandisce le righe articolo e memorizza // le quantita' richieste @@ -1117,17 +1150,17 @@ bool TMatResPlanning::build_gross_requirements(const TMatResMask& m) { const TCodice_articolo art = riga.get(RDOC_CODARTMAG); const TString16 liv = riga.get(RDOC_LIVELLO); - const TString16 mag = nomag ? EMPTY_STRING : riga.get(RDOC_CODMAG); - const TString16 imp = noimp ? EMPTY_STRING : riga.get(RDOC_IMPIANTO); - const TString16 lin = nolin ? EMPTY_STRING : riga.get(RDOC_LINEA); + const TString8 mag = nomag ? EMPTY_STRING : riga.get(RDOC_CODMAG); + const TString8 imp = noimp ? EMPTY_STRING : riga.get(RDOC_IMPIANTO); + const TString8 lin = nolin ? EMPTY_STRING : riga.get(RDOC_LINEA); const TCodice_um um = riga.get(RDOC_UMQTA); TQuantita q(art, um, qta); q.convert2umbase(); - TMRP_line* line = _articles.find(art, liv, mag, imp, lin, 0L); + TMRP_line* line = _articles.find(art, liv, mag, "", imp, lin, 0L); if (line == NULL) { // nuova linea - line = _articles.find(art, liv, mag, imp, lin, 0L, TRUE); + line = _articles.find(art, liv, mag, "", imp, lin, 0L, TRUE); line->set_description(riga.get(RDOC_DESCR)); } const TMRP_time t(datacons, 0, imp, lin); @@ -1170,7 +1203,7 @@ bool TMatResPlanning::explode_articles(const TMatResMask& m) if (pi == NULL) { TString80 msg; - msg.format("Fase 2: esplosione articoli (livello %d)", level++); + msg.format("Esplosione articoli (livello %d)", level++); pi = new TProgind(_articles.items()-a, msg, TRUE, TRUE); } pi->addstatus(1); @@ -1206,10 +1239,10 @@ bool TMatResPlanning::explode_articles(const TMatResMask& m) TString16 imp = line.codimp(); TString16 lin = line.codlin(); _artinfo.art2magimpline(art, mag, imp, lin); - TMRP_line* son = _articles.find(art, riga.giacenza(),mag, imp, lin, 0L); + TMRP_line* son = _articles.find(art, riga.giacenza(),mag, "", imp, lin, 0L); if (son == NULL) { - son = _articles.find(art, riga.giacenza(), mag, imp, lin, 0L, TRUE); + son = _articles.find(art, riga.giacenza(), mag, "", imp, lin, 0L, TRUE); son->set_description(distinta.describe(art)); } line.add_son(riga.val(), son); @@ -1225,7 +1258,7 @@ bool TMatResPlanning::explode_articles(const TMatResMask& m) /////////// finished: 100% /////////// tested: -bool TMatResPlanning ::build_sched_receipts(const TMatResMask& m) +bool TMatResPlanning ::load_planned_orders(const TMatResMask& m) { TDate date_fr = m.get(F_DADATA); const int bucket_fr = m.round_date(date_fr, FALSE); @@ -1247,7 +1280,7 @@ bool TMatResPlanning ::build_sched_receipts(const TMatResMask& m) TString_array& n = m.sfield(F_NUM_ORF).rows_array(); TString_array& a = m.sfield(F_TIPI_ORF).rows_array(); - TProgind pi(table_items("%NUM"), "Fase 3: caricamento arrivi futuri...", TRUE, TRUE); + TProgind pi(table_items("%NUM"), "Caricamento arrivi futuri...", TRUE, TRUE); // Scandisce tutte le numerazioni considerando solo quelle // contenenti i tipi documento specificati nella maschera @@ -1282,7 +1315,8 @@ bool TMatResPlanning ::build_sched_receipts(const TMatResMask& m) if (evaso) continue; - if (!test_status(curr, a)) + const int sheetrow = test_status(curr, a); + if (sheetrow<0) continue; // Data di consegna standard @@ -1316,7 +1350,7 @@ bool TMatResPlanning ::build_sched_receipts(const TMatResMask& m) const TString16 mag = riga.get(RDOC_CODMAG); const TString16 imp = riga.get(RDOC_IMPIANTO); const TString16 lin = riga.get(RDOC_LINEA); - TMRP_line* line = _articles.find(art, liv, mag, imp, lin, 0L, FALSE); + TMRP_line* line = _articles.find(art, liv, mag, "", imp, lin, 0L, TRUE); if (line != NULL) { const TCodice_um um = riga.get(RDOC_UMQTA); @@ -1324,7 +1358,10 @@ bool TMatResPlanning ::build_sched_receipts(const TMatResMask& m) q.convert2umbase(); const TMRP_time t(consegna, 0, imp, lin); - line->add_sched_rec(t, q.val()); + if (has_confirmed_status(doc, a.row(sheetrow))) + line->add_sched_rec(t, q.val()); + else + line->add_planned_ord(t, q.val()); } } } @@ -1342,12 +1379,21 @@ bool TMatResPlanning ::build_sched_receipts(const TMatResMask& m) bool TMatResPlanning::preprocess_cycle(const TMatResMask& m) { // costruisce il gross requirement dai DOC di planning - if (build_gross_requirements(m)) + bool ok=load_gross_requirements(m); + // costruisce gli sched rec degli elementi dai DOCS ordini fornitore emessi + ok |= load_planned_orders(m); + if (ok) + // esplode l'array mediante la DIBA + return explode_articles(m); + +/* + // costruisce il gross requirement dai DOC di planning + if (load_gross_requirements(m)) // esplode l'array mediante la DIBA if (explode_articles(m)) // costruisce gli sched rec degli elementi dai DOCS ordini fornitore emessi - return build_sched_receipts(m); - + return load_planned_orders(m); +*/ return FALSE; } @@ -1355,7 +1401,7 @@ bool TMatResPlanning::preprocess_cycle(const TMatResMask& m) /////////// tested: // implementa la logica che porta dal fabbisogno lordo a quello netto // per quel bucket e riporta il balance on hand sul bucket successivo -bool TMatResPlanning::gross2net_logic(TMRP_line &curr_article, int bucket, bool lotsizing_f, bool lotsizing_p) +bool TMatResPlanning::gross2net_logic(TMRP_line &curr_article, int bucket, bool lotsizing_f, bool lotsizing_p, bool use_leadtime) { // Verifico se esiste gia' un fabbisogno netto real sm,tmpreal = -curr_article.net_requirement(bucket); @@ -1390,7 +1436,7 @@ bool TMatResPlanning::gross2net_logic(TMRP_line &curr_article, int bucket, bool if (net_req > ZERO) { TMRP_time lead_time; - curr_article.lead_time(bucket, lead_time); + curr_article.lead_time(bucket, lead_time, use_leadtime); for (int o = 0; o < n_figli; o++) { @@ -1400,6 +1446,7 @@ bool TMatResPlanning::gross2net_logic(TMRP_line &curr_article, int bucket, bool article_son.add_gross_req(lead_time, tmpreal); } } + curr_article.add_proposed_ord(bucket, curr_article.net_requirement(bucket)); return TRUE; } @@ -1408,13 +1455,13 @@ bool TMatResPlanning::gross2net_logic(TMRP_line &curr_article, int bucket, bool bool TMatResPlanning::net_requirement_cycle(const TMatResMask& m) { bool ok = TRUE; - bool lotsizing_p=m.get_bool(F_LOTSIZING_P); - bool lotsizing_f=m.get_bool(F_LOTSIZING_F); - + const bool lotsizing_p=m.get_bool(F_LOTSIZING_P); + const bool lotsizing_f=m.get_bool(F_LOTSIZING_F); + const bool use_leadtime=!m.get_bool(F_IGN_LDTIME); // ordina gli articoli const long total = _articles.sort(); - TProgind pi(total, "Fase 4: calcolo dei fabbisogni netti", FALSE, TRUE); + TProgind pi(total, "Calcolo dei fabbisogni netti", FALSE, TRUE); // cicla iterativamente sugli elementi di _articles for (long a = 0; a < total; a++) @@ -1431,7 +1478,7 @@ bool TMatResPlanning::net_requirement_cycle(const TMatResMask& m) for (int bucket = 0; ok && bucket <= last; bucket = curr_article.next_bucket(bucket)) { - ok = gross2net_logic(curr_article, bucket, lotsizing_f, lotsizing_p); + ok = gross2net_logic(curr_article, bucket, lotsizing_f, lotsizing_p, use_leadtime); if (!ok) break; } @@ -1452,9 +1499,9 @@ bool TMatResPlanning::build_orders(TMatResMask& m) const long tot = _articles.items(); if (tot > 0L) { - const int leadtime = m.get_int(F_LEADTIME); + const int extratime = m.get_int(F_XTRA_LDTIME); - TProgind pi(tot, "Fase 5: generazione righe ordini...", FALSE, TRUE); + TProgind pi(tot, "Generazione righe ordini...", FALSE, TRUE); for (long a = 0; a < tot; a++) { pi.addstatus(1); @@ -1467,11 +1514,13 @@ bool TMatResPlanning::build_orders(TMatResMask& m) for (int b = line.last_bucket(); b >= 0; b--) { real qta = line.net_requirement(b); - if (!qta.is_zero() && !qta.round(5).is_zero())// > real("0.00001")) + //qta -= line.planned_orders(b); + qta.round(5); + if (!qta.is_zero()) { TMRP_time time = line.time(b); if (line.sons() == 0) // Sottrai alle foglie il bonus - time.sub_time(leadtime); + time.sub_time(extratime); TDate date = time.date(); m.round_date(date); @@ -1546,10 +1595,10 @@ bool TMatResPlanning::emit_orders(TMatResMask& m) if (qta.is_zero()) continue; if (datadoc < today) - if (!noyes_box("Riga %d: data di documento inferiore a quella odierna. Confermi ?",r+1)) + if (!noyes_box("Riga %d: data di emissione del documento (%s) inferiore a quella odierna. Confermi ?",r+1,(const char *)datadoc.string())) continue; if (datacon < datadoc) - if (!noyes_box("Riga %d: data di consegna inferiore a quella del documento. Confermi ?",r+1)) + if (!noyes_box("Riga %d: data di consegna (%s) inferiore a quella di emissione del documento (%s). Confermi ?",r+1,(const char *)datacon.string(), (const char *)datadoc.string())) continue; if (prod || forn!=0L) { diff --git a/mr/mr2100.h b/mr/mr2100.h index 40052a7bc..767ed15a9 100755 --- a/mr/mr2100.h +++ b/mr/mr2100.h @@ -6,10 +6,10 @@ class TMRP_record : public TObject TMRP_time _time; // time real _gross_requirement; // gross req real _on_hand; // projected on hand - real _sched_receipts; // scheduled receipts - real _released_receipts; // released scheduled receipts (not used) + real _sched_receipts; // scheduled receipts (released ) real _net_requirement; // lot-sized net requirement real _planned_orders; // anticipated planned orders + real _proposed_orders; // anticipated planned orders public: const real& gross_requirement() const { return _gross_requirement; } @@ -17,12 +17,15 @@ public: const real& sched_receipts() const { return _sched_receipts; } const real& net_requirement() const { return _net_requirement; } const real& planned_orders() const { return _planned_orders; } + const real& proposed_orders() const { return _proposed_orders; } const real& set_on_hand(const real & val) { return _on_hand=val;} const real& set_net_req(const real & val) { return _net_requirement=val;} const real& add_net_req(const real & val); const real& add_gross_req(const real& val); const real& add_sched_rec(const real& val); + const real& add_planned_ord(const real& val); + const real& add_proposed_ord(const real& val); TMRP_record & operator=(const TMRP_record & a); @@ -38,9 +41,10 @@ class TMRP_line : public TSortable { TCodice_articolo _codart; TString16 _livgiac; - TString16 _codmag; - TString16 _codimp; - TString16 _codlin; + TString8 _codmag; + TString8 _codmag_coll; + TString8 _codimp; + TString8 _codlin; long _codcli; static TArticolo_giacenza *_articolo_giac; @@ -62,6 +66,7 @@ public: const TCodice_articolo& codice() const { return _codart; } const TString& livgiac() const { return _livgiac; } const TString& codmag() const { return _codmag; } + const TString& codmag_coll() const { return _codmag_coll; } const TString& codimp() const { return _codimp; } const TString& codlin() const { return _codlin; } long codcli() const { return _codcli; } @@ -93,6 +98,9 @@ public: const real & planned_orders(int i) const {return record(i).planned_orders();} + const real & proposed_orders(int i) const + {return record(i).proposed_orders();} + const TString& set_description(const TString &s) { return _description=s; } const real& set_on_hand(int i, const real& val); @@ -100,9 +108,13 @@ public: const real& add_gross_req(const TMRP_time& t, const real& val); const real& add_sched_rec(const TMRP_time& t, const real& val); + const real& add_planned_ord(const TMRP_time& t, const real& val); const real& add_net_req(const TMRP_time& t, const real& val); + const real& add_net_req(int i, const real& val); + const real& set_net_req(int i, const real& val); + const real& add_proposed_ord(int i, const real& val); real sizeup_net_requirement(int i, const real& val); real& giacenza_attuale(real&) const; @@ -110,7 +122,7 @@ public: real &scorta_minima(real&) const; real &scorta_minima(real&, const TDate & data) const; - const TMRP_time& lead_time(int i, TMRP_time& t) const; + const TMRP_time& lead_time(int i, TMRP_time& t, bool antic = TRUE) const; const TMRP_time& time(int i) const { return record(i).time(); } @@ -118,7 +130,8 @@ public: TMRP_line & operator=(const TMRP_line & a); TMRP_line(const char* art, const char* giac, - const char* magdep, const char* imp, const char* lin, + const char* magdep, const char* magdepc, + const char* imp, const char* lin, long codcli); TMRP_line(const TMRP_line&a); virtual ~TMRP_line() { } @@ -135,7 +148,7 @@ protected: public: TMRP_line* find(const TCodice_articolo& codart, - const TString& giac, const TString& mag, + const TString& giac, const TString& mag, const TString& magc, const TString& imp, const TString& lin, long codcli, bool create=FALSE); diff --git a/mr/mr2100a.h b/mr/mr2100a.h index a118b171d..02803618b 100755 --- a/mr/mr2100a.h +++ b/mr/mr2100a.h @@ -6,6 +6,7 @@ #define F_TIPI_ORC 202 #define F_NUM_ORF 203 #define F_TIPI_ORF 204 +#define F_IGN_LDTIME 205 #define F_DADATA 206 #define F_ADATA 207 #define F_BUCKETS 208 @@ -20,7 +21,7 @@ #define F_NOIMP 217 #define F_NOLIN 218 #define F_KEEP_IMP 219 -#define F_LEADTIME 220 +#define F_XTRA_LDTIME 220 #define F_ORC_MASTER 221 #define F_SORT 222 #define F_LOTSIZING_P 223 @@ -30,21 +31,30 @@ #define F_CATVEN_CV 227 #define F_TIPOCF_CONDV 228 #define F_CF_CONDV 229 +#define F_SORT_ORDER 230 +// campi senza default sul profilo #define F_YEAR 301 #define F_IMPIANTO 302 #define F_LINEA 303 #define F_CALENDAR 304 -#define F_ORDINI 401 -#define F_SORT_ORDINI 402 -#define F_SELECT_ORDF 403 -#define F_SELECT_ORDP 404 +#define F_ORDINI 305 +#define F_SELECT_ORDF 306 +#define F_SELECT_ORDP 307 +#define F_RESORT_ORDINI 308 +// sheet tipi doc #define F_TIPO 101 -#define F_DASTATO 102 -#define F_ASTATO 103 -#define F_DESCTIPO 104 +#define F_DESCTIPO 102 +#define F_DASTATO 103 +#define F_ASTATO 104 +#define F_STATODEF 105 +// sheet tipi doc +#define F_CODNUM 101 +#define F_DESCNUM 110 + +// sheet ordini #define F_SELECTED 101 #define F_ORD_TYPE 102 #define F_DATADOC 103 diff --git a/mr/mr2100a.uml b/mr/mr2100a.uml index e926cf2c0..d3a80188d 100755 --- a/mr/mr2100a.uml +++ b/mr/mr2100a.uml @@ -46,21 +46,21 @@ ENDPAGE PAGE "Query" -1 -1 80 19 -GROUPBOX DLG_NULL 78 7 +GROUPBOX DLG_NULL 78 4 BEGIN - PROMPT 1 2 "@bParametri dell'elaborazione" + PROMPT 1 1 "@bParametri dell'elaborazione" END DATE F_DADATA BEGIN - PROMPT 2 4 "Dalla data " + PROMPT 2 2 "Dalla data " CHECKTYPE REQUIRED GROUP 1 END DATE F_ADATA BEGIN - PROMPT 45 4 "Alla data " + PROMPT 45 2 "Alla data " CHECKTYPE REQUIRED VALIDATE DATE_CMP_FUNC > F_DADATA WARNING "La data finale deve essere maggiore di quella iniziale" @@ -70,7 +70,7 @@ END LIST F_BUCKETS 1 15 BEGIN GROUP 1 - PROMPT 2 6 "Bucket temporale " + PROMPT 2 3 "Bucket temporale " ITEM "1|1 Settimana" MESSAGE DISABLE,F_BUCKET|COPY,F_BUCKET ITEM "2|2 Settimane" @@ -94,7 +94,7 @@ END NUMBER F_BUCKET 2 BEGIN GROUP 1 - PROMPT 45 6 "Settimane " + PROMPT 45 3 "Settimane " FLAGS "U" CHECKTYPE REQUIRED END @@ -114,39 +114,16 @@ BEGIN PROMPT 2 12 "Non suddividere per linee" END -BOOLEAN F_KEEP_IMP -BEGIN - GROUP 1 - PROMPT 2 13 "Mantieni la produzione all'interno dello stesso impianto" -END -BOOLEAN F_LOTSIZING_F -BEGIN - GROUP 1 - PROMPT 2 15 "Lotti minimi sugli ordini di acquisto" -END - -BOOLEAN F_LOTSIZING_P -BEGIN - GROUP 1 - PROMPT 2 16 "Lotti minimi sugli ordini di produzione" -END - -NUMBER F_LEADTIME 2 -BEGIN - GROUP 1 - PROMPT 2 17 "Lead time aggiuntivo sui materiali " - FLAGS "U" -END ENDPAGE -PAGE "Parametri" -1 -1 80 19 +PAGE "Elabora" -1 -1 80 19 LIST F_ORC_MASTER 1 20 BEGIN GROUP 1 - PROMPT 1 0 "" + PROMPT 1 5 "" ITEM "O|Ordini da clienti" ITEM "M|Master Schedule Plan" END @@ -154,51 +131,56 @@ END SPREADSHEET F_NUM_ORC 8 6 BEGIN GROUP 1 - PROMPT 1 1 "" + PROMPT 1 6 "" ITEM "Codice" END SPREADSHEET F_TIPI_ORC 62 6 BEGIN GROUP 1 - PROMPT 16 1 "" + PROMPT 16 6 "" ITEM "Tipo@4" + ITEM "Descrizione@50" ITEM "Da stato" ITEM "A stato" - ITEM "Descrizione@50" END TEXT DLG_NULL BEGIN - PROMPT 1 8 "@bOrdini produzione/fornitori" + PROMPT 1 13 "@bOrdini produzione/fornitori" END SPREADSHEET F_NUM_ORF 8 6 BEGIN GROUP 1 - PROMPT 1 9 "" + PROMPT 1 14 "" ITEM "Codice" END SPREADSHEET F_TIPI_ORF 62 6 BEGIN GROUP 1 - PROMPT 16 9 "" + PROMPT 16 14 "" ITEM "Tipo@4" + ITEM "Descrizione@50" ITEM "Da stato" ITEM "A stato" - ITEM "Descrizione@50" + ITEM "Stato def." END +ENDPAGE + +PAGE "Genera" -1 -1 78 20 + TEXT DLG_NULL BEGIN - PROMPT 2 16 "@bOrdini di produzione" + PROMPT 2 6 "@bOrdini di produzione" END STRING F_NUM_PROD 4 BEGIN GROUP 1 - PROMPT 27 16 "Numerazione " + PROMPT 27 6 "Numerazione " FLAGS "U" USE %NUM INPUT CODTAB F_NUM_PROD @@ -212,7 +194,7 @@ END STRING F_TIPO_PROD 4 BEGIN GROUP 1 - PROMPT 50 16 "Tipo " + PROMPT 50 6 "Tipo " FLAGS "U" USE %TIP INPUT CODTAB F_TIPO_PROD @@ -226,7 +208,7 @@ END STRING F_RIGA_PROD 4 BEGIN GROUP 1 - PROMPT 66 16 "Riga " + PROMPT 66 6 "Riga " FLAGS "U" USE %TRI SELECT S7=="M" INPUT CODTAB F_RIGA_PROD @@ -239,13 +221,13 @@ END TEXT DLG_NULL BEGIN - PROMPT 2 17 "@bOrdini a fornitori" + PROMPT 2 7 "@bOrdini a fornitori" END STRING F_NUM_FORN 4 BEGIN GROUP 1 - PROMPT 27 17 "Numerazione " + PROMPT 27 7 "Numerazione " FLAGS "U" COPY USE F_NUM_PROD INPUT CODTAB F_NUM_FORN @@ -258,7 +240,7 @@ END STRING F_TIPO_FORN 4 BEGIN GROUP 1 - PROMPT 50 17 "Tipo " + PROMPT 50 7 "Tipo " FLAGS "U" COPY USE F_TIPO_PROD INPUT CODTAB F_TIPO_FORN @@ -271,7 +253,7 @@ END STRING F_RIGA_FORN 4 BEGIN GROUP 1 - PROMPT 66 17 "Riga " + PROMPT 66 7 "Riga " FLAGS "U" COPY USE F_RIGA_PROD INPUT CODTAB F_RIGA_FORN @@ -284,7 +266,7 @@ END LIST F_TIPOCV 10 BEGIN GROUP 1 - PROMPT 2 18 "Preleva i prezzi da " + PROMPT 2 8 "Preleva i prezzi da " ITEM "|Anagrafica" MESSAGE HIDE,F_CODCONDV|HIDE,F_TIPOCF_CONDV|HIDE,F_CATVEN_CV|CHECK,F_CODCONDV ITEM "L|Listino" @@ -297,7 +279,7 @@ END STRING F_CODCONDV 3 BEGIN - PROMPT 36 18 "" + PROMPT 36 8 "" USE LF_CONDV INPUT TIPO F_TIPOCV INPUT CATVEN F_CATVEN_CV @@ -319,7 +301,7 @@ END STRING F_CATVEN_CV 2 BEGIN - PROMPT 43 18 "Categoria di vendita " + PROMPT 43 8 "Categoria di vendita " USE CVE INPUT CODTAB F_CATVEN_CV DISPLAY "Codice" CODTAB @@ -331,36 +313,86 @@ END LIST F_TIPOCF_CONDV 9 BEGIN - PROMPT 43 18 "" + PROMPT 43 8 "" ITEM "C|Cliente" ITEM "F|Fornitore" END + +BOOLEAN F_KEEP_IMP +BEGIN + GROUP 1 + PROMPT 2 13 "Mantieni la produzione all'interno dello stesso impianto" +END + +BOOLEAN F_LOTSIZING_F +BEGIN + GROUP 1 + PROMPT 2 15 "Lotti minimi sugli ordini di acquisto" +END + +BOOLEAN F_LOTSIZING_P +BEGIN + GROUP 1 + PROMPT 2 16 "Lotti minimi sugli ordini di produzione" +END + +BOOL F_IGN_LDTIME +BEGIN + GROUP 1 + PROMPT 2 17 "Ignora lead time di anagrafica " + FLAGS "U" +END + +NUMBER F_XTRA_LDTIME 2 +BEGIN + GROUP 1 + PROMPT 42 17 "anticipa di " + FLAGS "U" +END + +TEXT DLG_NULL +BEGIN + GROUP 1 + PROMPT 58 17 "giorni sui materiali" + FLAGS "U" +END + ENDPAGE PAGE "Fabbisogni" -1 -1 78 20 BUTTON F_SELECT_ORDP 20 2 BEGIN - PROMPT 1 1 "Ordini di produzione" + PROMPT 12 1 "Ordini di produzione" PICTURE USER_BMP_SELECT_ORDP END BUTTON F_SELECT_ORDF 20 2 BEGIN - PROMPT 24 1 "Ordini a fornitore" + PROMPT 46 1 "Ordini a fornitore" PICTURE USER_BMP_SELECT_ORDF END -LIST F_SORT_ORDINI 40 +LIST F_SORT 25 BEGIN - PROMPT 1 3 "Ordina per " - ITEM "1|Data / fornitore / articolo" - ITEM "2|Data / articolo / fornitore" - ITEM "3|Fornitore / articolo / data" - ITEM "4|Fornitore / data / articolo" - ITEM "5|Articolo / fornitore / data" - ITEM "6|Articolo / data / fornitore" + PROMPT 1 3 "Ordinamento " + ITEM "1|Data/fornitore/articolo" + ITEM "2|Data/articolo/fornitore" + ITEM "3|Fornitore/articolo/data" + ITEM "4|Fornitore/data/articolo" + ITEM "5|Articolo/fornitore/data" + ITEM "6|Articolo/data/fornitore" +END + +BOOLEAN F_SORT_ORDER +BEGIN + PROMPT 42 3 "Inverso" +END + +BUTTON F_RESORT_ORDINI 10 1 +BEGIN + PROMPT 62 3 "Riordina" END SPREADSHEET F_ORDINI @@ -388,11 +420,6 @@ BEGIN END -//TEXT DLG_NULL -//BEGIN -// PROMPT 1 -1 "Premere il bottone (+) in alto a destra della tabella per riordinarla" -//END - ENDPAGE PAGE "Calendario" -1 -1 78 20 @@ -441,28 +468,30 @@ ENDMASK PAGE "Numerazioni clienti" -1 -1 60 6 -STRING F_TIPO 4 +STRING F_CODNUM 4 BEGIN - PROMPT 1 1 "Codice " + PROMPT 1 1 "Numerazione " FLAGS "U" USE %NUM - INPUT CODTAB F_TIPO + INPUT CODTAB F_CODNUM DISPLAY "Codice" CODTAB DISPLAY "Descrizione@50" S0 - OUTPUT F_TIPO CODTAB - OUTPUT F_DESCTIPO S0 + OUTPUT F_CODNUM CODTAB + OUTPUT F_DESCNUM S0 CHECKTYPE REQUIRED ADD NONE END -STRING F_DESCTIPO 50 +STRING F_DESCNUM 50 40 BEGIN - PROMPT 16 1 "" + PROMPT 1 2 "Descrizione " + FLAGS "U" USE %NUM KEY 2 - INPUT S0 F_DESCTIPO - DISPLAY "Descrizione@70" S0 + INPUT S0 F_DESCNUM + DISPLAY "Descrizione@50" S0 DISPLAY "Codice" CODTAB - COPY OUTPUT F_TIPO + OUTPUT F_DESCNUM S0 + OUTPUT F_CODNUM CODTAB CHECKTYPE REQUIRED ADD NONE END @@ -490,7 +519,7 @@ PAGE "Ordini clienti" -1 -1 60 10 STRING F_TIPO 4 BEGIN - PROMPT 1 1 "Tipo " + PROMPT 1 1 "Tipo " FLAGS "U" USE %TIP INPUT CODTAB F_TIPO @@ -502,9 +531,21 @@ BEGIN ADD NONE END -NUMBER F_DASTATO 1 +STRING F_DESCTIPO 50 40 BEGIN - PROMPT 1 2 "Da stato " + PROMPT 1 2 "Descrizione " + USE %TIP KEY 2 + INPUT S0 F_DESCTIPO + DISPLAY "Descrizione@70" S0 + DISPLAY "Codice" CODTAB + COPY OUTPUT F_TIPO + CHECKTYPE REQUIRED + ADD NONE +END + +STRING F_DASTATO 1 +BEGIN + PROMPT 1 3 "Da stato " USE %STD INPUT CODTAB F_DASTATO DISPLAY "Stato" CODTAB @@ -514,9 +555,9 @@ BEGIN ADD NONE END -NUMBER F_ASTATO 1 +STRING F_ASTATO 1 BEGIN - PROMPT 16 2 "A stato " + PROMPT 1 4 "A stato " COPY USE F_DASTATO INPUT CODTAB F_ASTATO COPY DISPLAY F_DASTATO @@ -525,18 +566,6 @@ BEGIN ADD NONE END -STRING F_DESCTIPO 50 -BEGIN - PROMPT 16 1 "" - USE %TIP KEY 2 - INPUT S0 F_DESCTIPO - DISPLAY "Descrizione@70" S0 - DISPLAY "Codice" CODTAB - COPY OUTPUT F_TIPO - CHECKTYPE REQUIRED - ADD NONE -END - BUTTON DLG_OK 10 2 BEGIN PROMPT -13 -1 "" @@ -559,28 +588,30 @@ ENDMASK PAGE "Numerazioni fornitori" -1 -1 60 6 -STRING F_TIPO 4 +STRING F_CODNUM 4 BEGIN - PROMPT 1 1 "Codice " + PROMPT 1 1 "Numerazione " FLAGS "U" USE %NUM - INPUT CODTAB F_TIPO + INPUT CODTAB F_CODNUM DISPLAY "Codice" CODTAB DISPLAY "Descrizione@50" S0 - OUTPUT F_TIPO CODTAB - OUTPUT F_DESCTIPO S0 + OUTPUT F_CODNUM CODTAB + OUTPUT F_DESCNUM S0 CHECKTYPE REQUIRED ADD NONE END -STRING F_DESCTIPO 50 +STRING F_DESCNUM 50 40 BEGIN - PROMPT 16 1 "" + PROMPT 1 2 "Descrizione " + FLAGS "U" USE %NUM KEY 2 - INPUT S0 F_DESCTIPO - DISPLAY "Descrizione@70" S0 + INPUT S0 F_DESCNUM + DISPLAY "Descrizione@50" S0 DISPLAY "Codice" CODTAB - COPY OUTPUT F_TIPO + OUTPUT F_DESCNUM S0 + OUTPUT F_CODNUM CODTAB CHECKTYPE REQUIRED ADD NONE END @@ -609,7 +640,7 @@ PAGE "Ordini fornitori" -1 -1 60 10 STRING F_TIPO 4 BEGIN - PROMPT 1 1 "Tipo " + PROMPT 1 1 "Tipo " FLAGS "U" USE %TIP INPUT CODTAB F_TIPO @@ -621,9 +652,21 @@ BEGIN ADD NONE END -NUMBER F_DASTATO 1 +STRING F_DESCTIPO 50 40 BEGIN - PROMPT 1 2 "Da stato " + PROMPT 1 2 "Descrizione " + USE %TIP KEY 2 + INPUT S0 F_DESCTIPO + DISPLAY "Descrizione@70" S0 + DISPLAY "Codice" CODTAB + COPY OUTPUT F_TIPO + CHECKTYPE REQUIRED + ADD NONE +END + +STRING F_DASTATO 1 +BEGIN + PROMPT 1 3 "Da stato " USE %STD INPUT CODTAB F_DASTATO DISPLAY "Stato" CODTAB @@ -633,9 +676,9 @@ BEGIN ADD NONE END -NUMBER F_ASTATO 1 +STRING F_ASTATO 1 BEGIN - PROMPT 16 2 "A stato " + PROMPT 1 4 "A stato " COPY USE F_DASTATO INPUT CODTAB F_ASTATO COPY DISPLAY F_DASTATO @@ -644,14 +687,13 @@ BEGIN ADD NONE END -STRING F_DESCTIPO 50 +STRING F_STATODEF 1 BEGIN - PROMPT 16 1 "" - USE %TIP KEY 2 - INPUT S0 F_DESCTIPO - DISPLAY "Descrizione@70" S0 - DISPLAY "Codice" CODTAB - COPY OUTPUT F_TIPO + PROMPT 1 5 "Stato definitivo " + COPY USE F_DASTATO + INPUT CODTAB F_STATODEF + COPY DISPLAY F_DASTATO + OUTPUT F_STATODEF CODTAB CHECKTYPE REQUIRED ADD NONE END diff --git a/mr/mr2200.cpp b/mr/mr2200.cpp index 13c4ee90b..11df1b1c9 100755 --- a/mr/mr2200.cpp +++ b/mr/mr2200.cpp @@ -1,123 +1,12 @@ -#include -#include -#include -#include -#include -#include -#include -#include - -#include "mrplib.h" -#include "../mg/mglib.h" -#include "../ve/velib.h" -#include "../ve/veconf.h" - -#include "mr2100.h" #include "mr2200.h" -//#include "mr2201.h" - #include "mr2200a.h" #include "mr2200b.h" -const real MAXCAPACITY("999999999.99"); -const int NO_PROPOSE=1000 ; - -enum TMSP_mode {_actual_schedule, _stock_break}; -enum TMSP_logic {_first_fit_logic, _JIT_logic}; - -class TMSP_mask : public TCalendar_mask -{ - // quantità provenienti dai documenti "ordine": - TMSP_constraints _constraints; - - // quantità provenienti dai documenti "planning" (commesse): - TMSP_lines _articles; - - // quantità per il processo di nettificazione/sizing in caso di generazione dell'MSP - TMRP_lines _mrp_articles; - // proposte del sistema - TMRP_lines _proposed_articles, _proposed_1stlevel; - - // capacità linea per linea - TCRP_lines _capacities; - -protected: - bool is_page_msp() const {return curr_page()==2;} - bool is_page_crp() const {return curr_page()==4;} - - bool on_field_event(TOperable_field& o, TField_event e, long jolly); - - bool load_MRP_lines(TMSP_mode mode, int level=0); - bool nettify_MRP_lines(bool already_net, bool lotsizing=FALSE); - void add_MRP_bucket(TMRP_line& new_article, int nbucket, const real &curr_arts); - // proposta automatica del sistema - bool general_review(bool check_machine, bool check_human, bool useextralines, bool useextrahours,bool lotsizing, bool no_outcapacity, int anticipomin,int anticipomax, TMSP_mode mode, TMSP_logic logic, const char *msg ); - int insert_propose(bool verbose=FALSE) ; - bool remove_propose(bool verbose=FALSE) ; - void add_or_sub_propose(char sign); - - void propose_1stJIT(TMSP_logic logic, bool check_m, bool check_h); - // controlli - void print_articles(); - void print_capacities(); - bool sortMSPsheet(); - bool sortCRPsheet(); - void check_articles(); - void check_capacities(); - void pack_article_sheet(); - // capacity review - bool capacity_review(bool useextralines, bool useextrahours); - TCRP_line *compute_capacity(TLinea_prod &lineaprod, bool useextralines, bool useextrahours); - - TMSP_constraint* find_constraint(const TMSP_line& l,bool force_insert=FALSE); - int find_constr_row(TMSP_constraint& c); - - bool test_art_row(int r, bool signal=TRUE); - bool test_load_row(int r, bool signal=TRUE); - int init_bucket0(TArticolo_giacenza &art, int r); - - bool do_test_art_row(int r, int c, bool signal); - void do_test_art_2ndlevel(TMSP_line2 *mspline, bool erase=FALSE); - - void copy_sheet_row(TToken_string & newrow, const TToken_string & row); - - void clear_sheets(); - -public: - void msprow2codes(TToken_string &row, long &clifor, TCodice_articolo &art , - TString & liv, TString & mag, TString & imp, TString & lin, TString & um); - void crprow2codes(TToken_string &row, TString & imp, TString & lin, long &clifor, TCodice_articolo &art , - TString & liv, TString & um); - TMRP_line* find_propose(long codcli, const char * codart,const char * liv, - const char * codimp,const char * codlin,const char * mag, - bool Force=FALSE); - TMSP_line* find_article(long cli, const char *art, const char *liv, - const char *imp, const char *lin, const char *mag,bool Force=FALSE) - {return _articles.find(cli, art, liv, imp, lin, mag, Force);} - - - int days_per_bucket() const; - - int round_date(TDate& date, bool up = FALSE) const; - void round_field(TMask_field& fld, bool up) const; - - int test_codnum(const TCodice_numerazione& num) const; - bool test_tipodoc_num( const TSheet_field &sheet_num , const TSheet_field &sheet_type) ; - - bool test_status(const TRectype& doc, int tipo) const; - bool carica_documenti(); - void fill_sheet(); - bool salva_documenti(); - - TMSP_mask(); - virtual ~TMSP_mask() { } -}; - class TMSPCheck_mask : public TAutomask { protected: int _col, _row, _constr_row, _last_col, _last_row; - TMSP_mask * _main_mask; + TPlanning_mask * _main_mask; TSheet_field * _sheet; protected: int max_rows() {return _sheet->items();} @@ -128,16 +17,16 @@ protected: virtual int fill_mask(const bool show=TRUE); virtual bool is_constraint(int row); virtual bool is_article(int row); - virtual int find_constraint(int row); + virtual int find_constr_row(int row); public: - void gopos(int row, int col); virtual void gopos_mainmask(); + void gopos(int row, int col); void fix_actual_pos(); short last_row(){ return _last_row;} short last_col(){ return _last_col;} - TMSPCheck_mask(TMSP_mask * main_mask); - TMSPCheck_mask(TMSP_mask * main_mask,const char * m,TSheet_field * s ); + TMSPCheck_mask(TPlanning_mask * main_mask); + TMSPCheck_mask(TPlanning_mask * main_mask,const char * m,TSheet_field * s ); }; @@ -148,9 +37,9 @@ protected: virtual int fill_mask(const bool show=TRUE); virtual bool is_constraint(int row); virtual bool is_article(int row); - virtual int find_constraint(int row); + virtual int find_constr_row(int row); public: - TCRPCheck_mask(TMSP_mask * main_mask); + TCRPCheck_mask(TPlanning_mask * main_mask); }; @@ -160,13 +49,13 @@ public: // Arrotonda la data al bucket e ne restituisce il numero (data iniziale==bucket 0) -int TMSP_mask::round_date(TDate& date, bool up) const +int TPlanning_mask::round_date(TDate& date, bool up) const { // Dimensione del bucke in giorni - int bucket_size = days_per_bucket(); + const int bucket_size = days_per_bucket(); // Riporta la data al primo lunedi prima dell'inizio - TDate inizio = get(F_DADATA); + TDate inizio = get_date(F_DADATA); if (bucket_size>1) // non vado a giorni { const int wday = inizio.wday(); @@ -180,13 +69,13 @@ int TMSP_mask::round_date(TDate& date, bool up) const else bucket = days / bucket_size; if (up || days<0) // Arrotonda alla fine del bucket - date = inizio + long((bucket+1 )* bucket_size - 1); + date = inizio + long((bucket+1 )* bucket_size - 1 - get_int(F_LASTWRKDAY)); else // Arrotonda all'inizio del bucket date = inizio + long(bucket * bucket_size); return bucket; } -void TMSP_mask::round_field(TMask_field& fld, bool up) const +void TPlanning_mask::round_field(TMask_field& fld, bool up) const { TDate date = fld.get(); if (date.ok()) @@ -196,12 +85,12 @@ void TMSP_mask::round_field(TMask_field& fld, bool up) const } } -int TMSP_mask::test_codnum(const TCodice_numerazione& num) const +int TPlanning_mask::test_codnum(const TCodice_numerazione& num) const { int r=0; for (int s = 2; s > 0; s--) { - const short id = s == 2 ? F_NUM_PLA : F_NUM_ORC; + const short id = s == _Doc_planning ? F_NUM_PLA : F_NUM_ORC; TString_array& nums = sfield(id).rows_array(); for (int i = nums.items()-1; i >= 0; i--) { @@ -215,7 +104,7 @@ int TMSP_mask::test_codnum(const TCodice_numerazione& num) const return r; } -bool TMSP_mask::test_tipodoc_num(const TSheet_field &sheet_num ,const TSheet_field &sheet_type) +bool TPlanning_mask::test_tipodoc_num(const TSheet_field &sheet_num ,const TSheet_field &sheet_type) { TString16 tipo; TString_array& nums = sheet_num.rows_array(); @@ -224,7 +113,6 @@ bool TMSP_mask::test_tipodoc_num(const TSheet_field &sheet_num ,const TSheet_f { bool ok=FALSE; tipo = types.row(j).get(0) ; - const char * cazzoinculo=(const char * )tipo; for (int i = nums.items()-1; i >= 0; i--) { TCodice_numerazione num(nums.row(i).get(0)); @@ -241,19 +129,18 @@ bool TMSP_mask::test_tipodoc_num(const TSheet_field &sheet_num ,const TSheet_f return TRUE; } -bool TMSP_mask::test_status(const TRectype& doc, int s) const +int TPlanning_mask::test_status(const TRectype& doc, int s) const { - const short id = (s & 2) ? F_TIPI_PLA : F_TIPI_ORC; + const short id = (s & _Doc_planning) ? F_TIPI_PLA : F_TIPI_ORC; TSheet_field& sf = sfield(id); const int idfr = sf.cid2index(F_DASTATO); const int idto = sf.cid2index(F_ASTATO); const TString16 tipodoc = doc.get(DOC_TIPODOC); const int statodoc = doc.get_int(DOC_STATO); - bool yes = FALSE; TString_array& a = sf.rows_array(); - for (int i = a.items()-1; i >= 0 && !yes; i--) + for (int i = a.items()-1; i >= 0 ; i--) { TToken_string& riga = a.row(i); const char* t = riga.get(0); @@ -261,11 +148,26 @@ bool TMSP_mask::test_status(const TRectype& doc, int s) const { const int state_fr = riga.get_int(idfr); const int state_to = riga.get_int(idto); - yes = statodoc >= state_fr && statodoc <= state_to; + if (statodoc >= state_fr && statodoc <= state_to) + return i; } } - return yes; + return -1; +} + +bool TPlanning_mask::has_confirmed_status(const TRectype &doc, TToken_string &riga) const +{ + const char statodoc = doc.get_char(DOC_STATO); + char def_status = riga.get_char(F_STATODEF-FIRST_FIELD); + return def_status > ' ' ? statodoc >= def_status : FALSE; +} + +bool TPlanning_mask::has_confirmed_status(const TRectype &doc) const +{ + int sheetrow = test_status(doc, _Doc_planning); + TToken_string & riga = sfield(F_TIPI_PLA).row(sheetrow); + return has_confirmed_status(doc, riga); } // Metodo standard per contare gli elementi di una tabella @@ -280,7 +182,29 @@ static long table_items(const char* tab) } */ -bool TMSP_mask::carica_documenti() +bool TPlanning_mask::elabora() +{ + TSheet_field& s = sfield(F_ARTICOLI); + clear_sheets(); + if (carica_documenti()) + { + fill_sheet(); + const bool some_lines=s.items() > 0; + enable(-G_PREPROCESS, !some_lines); + enable(-G_POSTPROCESS, some_lines); + if (some_lines) + { + s.select(2); + s.set_focus(); + on_field_event((TOperable_field&)field(F_SHOWPRICES), fe_modify, 0L); + on_field_event((TOperable_field&)field(F_MSP_SORT), fe_init, 0L ); + } + return some_lines>0; + } + return FALSE; +} + +bool TPlanning_mask::carica_documenti() { const bool ignore_mag=get_bool(F_NOMAG_IN); const bool ignore_imp=get_bool(F_NOIMP_IN); @@ -300,6 +224,7 @@ bool TMSP_mask::carica_documenti() const int year_to = date_to.year(); const TString& numplan = get(F_NUM_PLAN); + const TString& tipoplan = get(F_TIPO_PLAN); TTable num("%NUM"); TCodice_numerazione cod; @@ -338,7 +263,7 @@ bool TMSP_mask::carica_documenti() // Scandisce i documenti inevasi e considera solo // quelli con uno stato nel range corretto TString msg; - msg.format("Caricamento documenti %s (numerazione '%s')",tn & 1 ? "ordine":"di planning",(const char *)cod.codice()); + msg.format("Caricamento documenti %s (numerazione '%s')",tn & _Doc_vincoli ? "ordine":"di planning",(const char *)cod.codice()); TProgind pi(items,msg , TRUE, TRUE); for (cur = 0; cur.pos() < items; ++cur) { @@ -354,9 +279,10 @@ bool TMSP_mask::carica_documenti() if (!datacons.ok()) datacons = curr.get(DOC_DATADOC); - if (!test_status(curr, tn)) + const int sheetrow=test_status(curr, tn); + if (sheetrow < 0) continue; - + // Scandisce le righe articolo e memorizza // le quantita' richieste TDocumento doc(cur.curr()); @@ -371,10 +297,11 @@ bool TMSP_mask::carica_documenti() { const TCodice_articolo art = riga.get(RDOC_CODARTMAG); const TString16 liv = livelli_giac().enabled() ? riga.get(RDOC_LIVELLO) : ""; - const long cli = (ignore_cli && (tn & 1)) ||ignore_allcli ? 0 : doc.get_long(DOC_CODCF) ; - const TString16 mag = ignore_mag && (tn & 1) ? "" : riga.get(RDOC_CODMAG); - const TString16 imp = ignore_imp && (tn & 1) ? "" : riga.get(RDOC_IMPIANTO); - const TString16 lin = ignore_lin && (tn & 1) ? "" : riga.get(RDOC_LINEA); + const long cli = (ignore_cli && (tn & _Doc_vincoli)) ||ignore_allcli ? 0 : doc.get_long(DOC_CODCF) ; + const TString8 mag = ignore_mag && (tn & _Doc_vincoli) ? "" : riga.get(RDOC_CODMAG); + const TString8 magc = ignore_mag && (tn & _Doc_vincoli) ? "" : riga.get(RDOC_CODMAGC); + const TString8 imp = ignore_imp && (tn & _Doc_vincoli) ? "" : riga.get(RDOC_IMPIANTO); + const TString8 lin = ignore_lin && (tn & _Doc_vincoli) ? "" : riga.get(RDOC_LINEA); const TCodice_um um = riga.get(RDOC_UMQTA); TQuantita q(art, um, qta); q.convert2umbase(); @@ -382,39 +309,51 @@ bool TMSP_mask::carica_documenti() TDate consegna = riga.get(RDOC_DATACONS); if (!consegna.ok()) consegna = datacons; - int buck = round_date(consegna) - bucket_fr + 1; + TDate consegna_upper(consegna); + int buck = round_date(consegna_upper,tn & _Doc_vincoli) - bucket_fr + 1; + if ((tn & _Doc_vincoli) && consegna_upper>consegna) + buck--; if (buck < 0) buck = 0; else if (buck > LAST_BUCKET) buck = LAST_BUCKET; TMSP_constraint* line; - if (tn & 1) + if (tn & _Doc_vincoli) { line = _constraints.find(cli, art, liv, imp, lin, mag, TRUE); line->set_mastercode_check(two_level && !distinta_master(art)); } else { - line = _articles. find(cli, art, liv, imp, lin, mag, TRUE); + line = _articles. find(cli, art, liv, imp, lin, mag, magc, TRUE); } if (line->desc().empty()) line->set_desc(riga.get(RDOC_DESCR)); - //if (buck >= 0 && buck <= LAST_BUCKET) - if (buck > 0 && buck < LAST_BUCKET && cod.codice() == numplan) + if (buck >= 0 && buck <= LAST_BUCKET) { int annodoc=riga.get_int(RDOC_ANNO); TString8 codnum(cod.codice()); - char provv; - long numdoc; - int numrig; - if (!line->riga(buck, numdoc, numrig)) + TString4 tiporiga(riga.get(RDOC_TIPORIGA)); + char provv= riga.get_char(RDOC_PROVV); + long numdoc = riga.get_long(RDOC_NDOC); + int numrig = riga.get_int(RDOC_NRIGA); + real prz = riga.get_int(RDOC_PREZZO); + prz = prz / qta * q.val(); + line->add_rigaref(buck, codnum, annodoc, numdoc, numrig,q.val(),prz);// memorizza la provenienza dal doc + } + + if (tn & _Doc_planning) + { + // controlla lo stato definitivo dei documenti + // appartenenti alla numerazione da generare + const bool confirmed = has_confirmed_status(rel.lfile().curr(), sfield(F_TIPI_PLA).row(sheetrow)); + if (confirmed) { - provv = riga.get_char(RDOC_PROVV); - numdoc = riga.get_long(RDOC_NDOC); - numrig = riga.get_int(RDOC_NRIGA); - line->set_riga(buck, provv, codnum,annodoc,numdoc, numrig);// memorizza la provenienza dal doc + //line->qta_locked(buck) = TRUE; + line->qta_min(buck) += q.val(); + } else { + add_MRP_bucket(*find_propose(cli, art, liv, imp, lin, mag, magc, TRUE), buck, q.val()); } } - line->qta(buck) += q.val(); real price; find_price(get(F_TIPOCV),get(F_CODCONDV),get(F_CATVEN_CV), @@ -438,16 +377,16 @@ bool TMSP_mask::carica_documenti() // - stesso magazzino // - stesso impianto e linea // - stessa linea -TMSP_constraint* TMSP_mask::find_constraint(const TMSP_line& l, bool force_insert) +TMSP_constraint* TPlanning_mask::find_constraint(const TMSP_line& l, bool force_insert) { const bool ignore_mag=get_bool(F_NOMAG_IN); const bool ignore_imp=get_bool(F_NOIMP_IN); const bool ignore_lin=get_bool(F_NOLIN_IN); const bool ignore_cli=get_bool(F_NOCLI_IN); - TString16 codmag=ignore_mag ? "" : l.codmag(); - TString16 codimp=ignore_imp ? "" : l.codimp(); - TString16 codlin=ignore_lin ? "" : l.codlin(); + TString8 codmag=ignore_mag ? "" : l.codmag(); + TString8 codimp=ignore_imp ? "" : l.codimp(); + TString8 codlin=ignore_lin ? "" : l.codlin(); long codcli=ignore_cli ? 0L : l.cliente() ; // se il magazzino o l'impianto non e' indicato sul vincolo cerca di individuarlo // in base ai default di linea/impianto @@ -495,7 +434,7 @@ TMSP_constraint* TMSP_mask::find_constraint(const TMSP_line& l, bool force_inser if (c == NULL && force_insert) { // MA STO VINCOLO MANCA PROPRIO! ALLORA LO INSERISCO - c = _constraints.find(codcli, l.codice(), l.livgiac(), codimp, codlin, codmag, TRUE); + c = _constraints.find(codcli, l.codice(), l.livgiac(), codimp, codlin, codmag, TRUE); if (c->desc().blank()) c->set_desc(l.desc()); c->set_mastercode_check(get_bool(F_2LEVEL_MSP) && !distinta_master(l.codice())); @@ -503,7 +442,8 @@ TMSP_constraint* TMSP_mask::find_constraint(const TMSP_line& l, bool force_inser return c; } -int TMSP_mask::find_constr_row(TMSP_constraint& cons) + +int TPlanning_mask::find_constr_row(TMSP_constraint& cons) { TSheet_field& sf = sfield(F_ARTICOLI); const int maxart=sf.items(); @@ -547,11 +487,14 @@ int TMSP_mask::find_constr_row(TMSP_constraint& cons) line.fill_sheet_row(sf.row(-1), *this); rowgiac.add("** Giacenza teorica",F_DESCART-FIRST_FIELD); row.add("** Ordini ",F_DESCART-FIRST_FIELD); - return sf.items()-3; + r = sf.items()-3; + TArticolo_giacenza art(cons.codice()); + init_bucket0(art, r+2); + return r; } -void TMSP_mask::fill_sheet() +void TPlanning_mask::set_sheet_header() { TSheet_field& sl = sfield(F_LINEE); TSheet_field& sf = sfield(F_ARTICOLI); @@ -561,38 +504,59 @@ void TMSP_mask::fill_sheet() const TDate date_to = get(F_ADATA); const int bucket_size = days_per_bucket(); - bool show_week = get_bool(F_SHOW_WEEK) && bucket_size>=7; + const bool show_week = get_bool(F_SHOW_WEEK) && bucket_size>=7; + const bool show_price = get_bool(F_SHOWPRICES); + TDate d = get(F_DADATA); TString16 str; for (int b = 0; b <= LAST_BUCKET; b++) { - if (b > 0 && b < LAST_BUCKET) - { - sf.enable_column(F_BUCKET0 + b*2, d < date_to); - sf.enable_column(F_BUCKET0 + b*2+1, d < date_to); - sl.enable_column(F_LBUCKET0 + b, d < date_to); - //su.enable_column(F_LBUCKET0 + b, d < date_to); - } + const bool on=(b > 0 && b < LAST_BUCKET && d < date_to); + sf.enable_column(F_BUCKET0 + b*2, on); + sf.enable_column(F_BUCKET0 + b*2+1, on && show_price ); + sf.set_column_width(F_BUCKET0+1+b*2-FIRST_FIELD, show_price ? 140 : 0); + sl.enable_column(F_LBUCKET0 + b, on); if (show_week) { - str = ""; + str = "S."; str << d.week() << '-' << d.year(); } else str = d.string(); switch(b) { - case 0: str.insert("< "); break; - //case 9: /* Nothing!! */ ; break; - case LAST_BUCKET: str.insert(">= "); break; - default: d += bucket_size; break; + case 0: str.insert("< "); break; + case LAST_BUCKET: str.insert(">= "); break; + default: d += bucket_size; break; } sf.set_column_header(F_BUCKET0 + b*2, str); sf.set_column_header(F_BUCKET0 + b*2 +1, str); sl.set_column_header(F_LBUCKET0 + b, str); - //su.set_column_header(F_LBUCKET0 + b, str); } + sf.force_update(); + sl.force_update(); +} +void TPlanning_mask::enable_codes(int row, bool on) +{ + TSheet_field& sf = sfield(F_ARTICOLI); + const bool ignore_cli=get_bool(F_NOCLI_IN); + const bool ignore_imp=get_bool(F_NOIMP_IN); + const bool ignore_lin=get_bool(F_NOLIN_IN); + const bool ignore_mag=get_bool(F_NOMAG_IN); + sf.enable_cell(row,F_CLIENTE-FIRST_FIELD, on&& ignore_cli); + sf.enable_cell(row,F_CODIMP-FIRST_FIELD, on && ignore_imp); + sf.enable_cell(row,F_CODLIN-FIRST_FIELD, on && ignore_lin); + sf.enable_cell(row,F_MAGAZZINO-FIRST_FIELD, on && ignore_mag); + sf.enable_cell(row,F_DEPOSITO-FIRST_FIELD, on && ignore_mag); + sf.enable_cell(row,F_MAG_COLL-FIRST_FIELD, on && ignore_mag); + sf.enable_cell(row,F_DEP_COLL-FIRST_FIELD, on && ignore_mag); +} +void TPlanning_mask::fill_sheet() +{ + set_sheet_header(); + TSheet_field& sl = sfield(F_LINEE); + TSheet_field& sf = sfield(F_ARTICOLI); TMSP_constraint* last_constraint = NULL; const long totart = _articles.sort(); @@ -616,8 +580,10 @@ void TMSP_mask::fill_sheet() last_constraint = curr_constraint; curr_constraint->set_on_sheet(); } - TToken_string& row = sf.row(-1); + const int new_row=sf.items(); + TToken_string& row = sf.row(new_row); line.fill_sheet_row(row, *this); + disable_codes(new_row); } const long totcon = _constraints.sort(); for (long j = 0; j < totcon; j++) @@ -626,28 +592,29 @@ void TMSP_mask::fill_sheet() if (!cons.is_on_sheet()) { // aggiunge le tre linee - TToken_string& row = sf.row(-1); - cons.fill_sheet_row(row, *this); + TToken_string& consrow = sf.row(-1); + cons.fill_sheet_row(consrow, *this); cons.set_on_sheet(); sf.disable_cell(sf.items()-1, -1); //linea della giacenza prog TToken_string& rowgiac = sf.row(-1); - copy_sheet_row(rowgiac,row); + copy_sheet_row(rowgiac,consrow); sf.disable_cell(sf.items()-1, -1); //linea articolo (vuota) TMSP_line line(cons); line.fill_sheet_row(sf.row(-1), *this); rowgiac.add("** Giacenza teorica",F_DESCART-FIRST_FIELD); - row.add("** Ordini ",F_DESCART-FIRST_FIELD); + consrow.add("** Ordini ",F_DESCART-FIRST_FIELD); } } + TArticolo_giacenza art; for (int r = sf.items()-1; r >0 ; ) { // init bucket 0 TCodice_articolo codart(sf.cell(r,sf.cid2index(F_ARTICOLO))); if (codart.blank()) r = r-2; - TArticolo_giacenza art(codart); + art.read(codart); r=init_bucket0(art, r); } sf.force_update(); @@ -655,7 +622,7 @@ void TMSP_mask::fill_sheet() // ritorna il numero del bucket dell'eventuali proposte +1 // (NO_PROPOSE se nessuna proposta) -int TMSP_mask::insert_propose(bool verbose) +int TPlanning_mask::insert_propose(bool verbose) { int firstbuck=NO_PROPOSE; if (_proposed_articles.items()>0L) @@ -673,7 +640,7 @@ int TMSP_mask::insert_propose(bool verbose) } return firstbuck; } -bool TMSP_mask::remove_propose(bool verbose) +bool TPlanning_mask::remove_propose(bool verbose) { if (_proposed_articles.items()<=0L) { @@ -686,14 +653,14 @@ bool TMSP_mask::remove_propose(bool verbose) return TRUE; } -void TMSP_mask::add_or_sub_propose(char sign) +void TPlanning_mask::add_or_sub_propose(char sign) { const long new_rows=_proposed_articles.items(); TSheet_field& sf = sfield(F_ARTICOLI); for (long new_row=0; new_row < new_rows; new_row++) { const TMRP_line & a=_proposed_articles[new_row]; - TMSP_line line(a.codcli(), a.codice(), a.livgiac(), a.codimp(), a.codlin(), a.codmag()); + TMSP_line line(a.codcli(), a.codice(), a.livgiac(), a.codimp(), a.codlin(), a.codmag(), a.codmag_coll()); bool line_found=FALSE; TMSP_constraint* constraint= find_constraint(line,FALSE); @@ -721,8 +688,9 @@ void TMSP_mask::add_or_sub_propose(char sign) TToken_string &row=sf.row(art_row); long codcli; TCodice_articolo codart ; - TString16 liv, mag, codimp, codlin, codum; - msprow2codes(row,codcli,codart,liv, mag, codimp, codlin, codum); + TString16 liv; + TString8 mag, magc, codimp, codlin, codum; + msprow2codes(row,codcli,codart,liv, mag, magc, codimp, codlin, codum); if (!sf.cell_disabled(art_row, F_BUCKET1-FIRST_FIELD)) { @@ -740,17 +708,24 @@ void TMSP_mask::add_or_sub_propose(char sign) { art_row++; sf.insert(art_row); + TToken_string& predrow = sf.row(art_row-1); TToken_string& artrow = sf.row(art_row); constraint->fill_sheet_row(artrow, *this,TRUE); + artrow.add(predrow.get_long(F_PRIORITA-FIRST_FIELD), F_PRIORITA-FIRST_FIELD); + artrow.add(predrow.get_char(F_TIPOCF_SHEET-FIRST_FIELD), F_TIPOCF_SHEET-FIRST_FIELD); artrow.add(a.codimp(), F_CODIMP-FIRST_FIELD); artrow.add(a.codlin(), F_CODLIN-FIRST_FIELD); - TString16 str=a.codmag().left(3); + TString8 str=a.codmag().left(3); artrow.add(str, F_MAGAZZINO-FIRST_FIELD); str=a.codmag().mid(3); artrow.add(str, F_DEPOSITO-FIRST_FIELD); + str=a.codmag_coll().left(3); + artrow.add(str, F_MAG_COLL-FIRST_FIELD); + str=a.codmag_coll().mid(3); + artrow.add(str, F_DEP_COLL-FIRST_FIELD); } TToken_string& artrow = sf.row(art_row); - const int lastbuck =_proposed_articles[new_row].last_bucket(); + const int lastbuck = _proposed_articles[new_row].last_bucket(); //TDate data_buck; for (int bucket=0; bucket<=lastbuck ; bucket++) { @@ -758,13 +733,13 @@ void TMSP_mask::add_or_sub_propose(char sign) real art_per_buck(artrow.get(F_BUCKET1 + b*2 - FIRST_FIELD)); if (sign>0) - art_per_buck+=_proposed_articles[new_row].sched_receipts(bucket); + art_per_buck += _proposed_articles[new_row].planned_orders(bucket); else { - if (art_per_buck >= _proposed_articles[new_row].sched_receipts(bucket)) - art_per_buck-=_proposed_articles[new_row].sched_receipts(bucket); + if (art_per_buck >= _proposed_articles[new_row].planned_orders(bucket)) + art_per_buck -= _proposed_articles[new_row].planned_orders(bucket); else - art_per_buck=ZERO; + art_per_buck = ZERO; } artrow.add(art_per_buck.string(), F_BUCKET1 + b*2 - FIRST_FIELD); real price; @@ -781,7 +756,7 @@ void TMSP_mask::add_or_sub_propose(char sign) // compatta le linee togliendo i doppioni -void TMSP_mask::pack_article_sheet() +void TPlanning_mask::pack_article_sheet() { TSheet_field& sf = sfield(F_ARTICOLI); TToken_string lastrow; @@ -814,7 +789,7 @@ void TMSP_mask::pack_article_sheet() } -void TMSP_mask::check_articles() +void TPlanning_mask::check_articles() { TSheet_field& sf = sfield(F_ARTICOLI); int items=sf.items(); @@ -823,12 +798,19 @@ void TMSP_mask::check_articles() message_box("Nessun articolo da verificare"); return; } + TMSPCheck_mask cm(this); + int curr_row=sf.selected(); + const bool is_disabled=sf.cell_disabled(curr_row,F_BUCKET1-FIRST_FIELD) ; + const bool is_constr=(is_disabled && curr_row>0 && sf.cell_disabled(curr_row-1,F_BUCKET1-FIRST_FIELD)); + if (is_disabled && !is_constr) + curr_row++; + cm.gopos(curr_row, 1); cm.run(); cm.gopos_mainmask(); } -void TMSP_mask::check_capacities() +void TPlanning_mask::check_capacities() { TSheet_field& sf = sfield(F_LINEE); int items=sf.items(); @@ -843,29 +825,34 @@ void TMSP_mask::check_capacities() sf.set_focus_cell(cm.last_row(),cm.last_col()+F_LBUCKET0); } -void TMSP_mask::print_articles() +void TPlanning_mask::print_articles() { TString repname("mr2200"); TSheet_field& sf = sfield(F_ARTICOLI); const int nrows=sf.items(); - TIsamtempfile * report = new TIsamtempfile(LF_MRPREPORT,repname, TRUE, FALSE ); + TIsamtempfile * report = new TIsamtempfile(LF_MRPREPORT,repname, TRUE, TRUE ); TString8 codimp,codlin; TProgind pi(nrows, format("Stampa %s...",(const char *)(get_bool(F_MSCHEDULEPLAN)? "Master Schedule Plan":"pianificazione ordini"))); char block='\0'; - for (int r=nrows-1; r >=0 ; r--) + const int a_buck0 = sf.cid2index(F_BUCKET0); + for (int r=0; rcurr(); - record.zero(' '); - const int a_buck0 = sf.cid2index(F_BUCKET0); if (sf.cell_disabled(r, a_buck0 +2)) { if (r= 0; b--) { switch(b) { - case 0: - campo = "QTAFIRST"; break; - case LAST_BUCKET: - campo = "QTALAST"; break; - default: - campo.format("QTA%d", b); break; + case 0: + campo = "QTAFIRST"; break; + case LAST_BUCKET: + campo = "QTALAST"; break; + default: + campo.format("QTA%d", b); break; } record.put(campo, row.get(sf.cid2index(F_BUCKET0+b*2))); } report->write(); pi.addstatus(1); } -// delete report; -// TIsamtempfile * report = new TIsamtempfile(LF_MRPREPORT,repname, FALSE, FALSE ); TMSP_form form(report); // stampa if (form.cursor()->items() > 0) @@ -905,7 +891,7 @@ void TMSP_mask::print_articles() // quindi la delete viene gia' fatta alla distruzione di _form } -void TMSP_mask::print_capacities() +void TPlanning_mask::print_capacities() { TString repname("mr2200"); TSheet_field& sf = sfield(F_LINEE); @@ -916,8 +902,9 @@ void TMSP_mask::print_capacities() TString codart; TProgind pi(nrows, format("Stampa %s...",(const char *)(*get(F_LOADTYPE)=='M'? "carico macchina":"carico uomo"))); + const int a_buck0 = sf.cid2index(F_LBUCKET0); char block='\0'; - for (int r=nrows-1; r >=0 ; r--) + for (int r=0; r ZERO) { + int lastbuck =mrpline.last_bucket(); TString16 livello_di_giacenza(mrpline.livgiac()); TString8 codlin(mrpline.codlin()); TString8 codimp(mrpline.codimp()); - bool no_labor=!dist_tree().set_root(mrpline.codice()); - if (!no_labor) + dist_tree().set_global("_LIVELLO",livello_di_giacenza); + dist_tree().set_global("_IMPIANTO",codimp); + dist_tree().set_global("_LINEA",codlin); + dist_tree().set_global("_MAGAZZINO",mrpline.codmag()); + bool no_limits=!dist_tree().set_root(mrpline.codice()); + if (!no_limits) { - TDate data_buck; - dist_tree().set_global("_LIVELLO",livello_di_giacenza); - dist_tree().set_global("_IMPIANTO",codimp); - dist_tree().set_global("_LINEA",codlin); - dist_tree().set_global("_MAGAZZINO",mrpline.codmag()); - // la logica del ciclo sulle lav e' da invertire: prima il bucket , poi le lavorazioni - // se si vogliono caricare più lavorazioni TRiga_esplosione * l=dist_tree().first_critical_labor(labors); - no_labor=(l==NULL); - if (!no_labor) + no_limits=(l==NULL); + if (!no_limits) { curr_labor=TDistinta_tree::find_labor(l); // cerca le linee sulle quali e' possibile eseguire questa lavorazione // e la carica con la lavorazione relativa all'articolo corrente const int lineestd = curr_labor->linee_standard(); const int maxlinee = useextralines ? curr_labor->linee() : lineestd; - TCRP_line *crpline_lin,*crpline_imp,*crpline_firm; + TCRP_line *crpline_art,*crpline_lin,*crpline_imp,*crpline_firm; real load, capacity, unit_load, hload, hcapacity, unit_hload ; // carichi di linea int nbucket, lower_buck, upper_buck; @@ -1147,17 +1137,27 @@ bool TMSP_mask::general_review(bool check_machine, bool check_human, bool useext { lower_buck = bucket - anticipomax/days_per_bucket(); upper_buck = (attemp <= 2 ? bucket-anticipomin/days_per_bucket(): LAST_BUCKET); - nbucket=lower_buck; } else { - lower_buck = (attemp <= 2 ? bucket-anticipomax/days_per_bucket(): 0); + lower_buck = (attemp <= 2 ? bucket-anticipomax/days_per_bucket() : 1); upper_buck = bucket - anticipomin/days_per_bucket(); - nbucket=upper_buck; } - if (lower_buck<1) + if (lower_buck<1) lower_buck=1; - if (nbucket<1) - nbucket=1; - do { + if (upper_buck>bucket) + upper_buck=bucket; + if (logic == _first_fit_logic) + nbucket=lower_buck; + else + nbucket=upper_buck; + if (nbucket>bucket) + { + // sono oltre il bucket attuale: il sotto stock si propagherebbe fino alla fine ? + art_per_buck = mrpline.net_requirement(lastbuck) ; + mrpline.set_net_req(bucket,art_per_buck); + } + while (art_per_buck > ZERO // ho un sotto-stock da risolvere + && nbucket>=lower_buck && nbucket <= upper_buck) // sono entro il range definito + { int nlinea, numlinee; if (ignore_lin || codlin.blank() ) @@ -1180,46 +1180,49 @@ bool TMSP_mask::general_review(bool check_machine, bool check_human, bool useext TString8 codimplin=linea_prod.codimp(); if ( ignore_imp || codimp.blank() || codimp == codimplin) { - crpline_lin=_capacities.find(linea_prod); - if (crpline_lin==NULL) - crpline_lin=compute_capacity(linea_prod,useextralines, useextrahours); - crpline_imp =_capacities.find(codimplin); - crpline_firm=_capacities.find(); - int human_level=1; + crpline_lin = _capacities.find(linea_prod); + if (crpline_lin == NULL) + crpline_lin = compute_capacity(linea_prod,useextralines, useextrahours); + crpline_art = _capacities.find(codimplin, linea_prod.codice(), mrpline.codice(), mrpline.codcli(),TRUE); + crpline_imp = _capacities.find(codimplin); + crpline_firm = _capacities.find(); + int human_level = 1; if ( linea_prod.personale_dedicato()) - human_level=3; + human_level = 3; else if (linea_prod.get_impianto()->personale_dedicato()) - human_level=2; + human_level = 2; // individua il massimo caricabile sulla linea unit_load = l->val()*curr_labor->um_temporale().converti_in_ore()/curr_labor->produttiv_linea(nlinea); - unit_hload=unit_load*curr_labor->numpers_linea(nlinea); + unit_hload = unit_load*curr_labor->numpers_linea(nlinea); - capacity = check_machine ? crpline_lin->capacity(nbucket) : MAXCAPACITY; - load = crpline_lin->load(nbucket); + capacity = check_machine ? crpline_lin->capacity(nbucket).machine() : MAXCAPACITY; + load = crpline_lin->load(nbucket).machine(); switch (human_level) { case 3: - hcapacity = crpline_lin->human_capacity(nbucket) ; - hload = crpline_lin->human_load(nbucket); + hcapacity = crpline_lin->capacity(nbucket).human() ; + hload = crpline_lin->load(nbucket).human(); break; case 2: - hcapacity = crpline_imp->human_capacity(nbucket) ; - hload = crpline_imp->human_load(nbucket); + hcapacity = crpline_imp->capacity(nbucket).human() ; + hload = crpline_imp->load(nbucket).human(); break; default: - hcapacity = crpline_firm->human_capacity(nbucket) ; - hload = crpline_firm->human_load(nbucket); + hcapacity = crpline_firm->capacity(nbucket).human() ; + hload = crpline_firm->load(nbucket).human(); break; } - // ridimensiona al massimo numero di articoli dovuto alle macchine curr_arts = art_per_buck ; - if (mode != _actual_schedule /*|| no_outcapacity*/) + if (mode == _stock_break /*|| no_outcapacity*/) { + // ridimensiona al massimo numero di articoli dovuto alle macchine + capacity *= (100.0+get_int(F_EXTRACAPACITY))/100.0; if (load + curr_arts * unit_load > capacity ) { curr_arts = (capacity - load ) / unit_load; curr_arts.floor(); } + hcapacity *= (100.0+get_int(F_EXTRAHCAPACITY))/100.0; // ridimensiona al massimo numero di articoli dovuto alle macchine if (check_human && hload + curr_arts * unit_hload > hcapacity) { @@ -1228,7 +1231,7 @@ bool TMSP_mask::general_review(bool check_machine, bool check_human, bool useext } /* // elimina i picchi di capacita' (errato) - if (curr_arts != art_per_buck && mode == _actual_schedule) + if (curr_arts != art_per_buck && mode == _actual_plan) { TMRP_line* new_article = _proposed_articles.find(mrpline.codice(), mrpline.livgiac(), mrpline.codmag(), @@ -1239,24 +1242,31 @@ bool TMSP_mask::general_review(bool check_machine, bool check_human, bool useext if (curr_arts>ZERO) { // aggiunge il carico macchina - art_per_buck-=curr_arts; + art_per_buck -= curr_arts; load= curr_arts * unit_load; - crpline_lin->add_load(nbucket, load ); - // aggiunge il carico uomo - load*=curr_labor->numpers_linea(nlinea); + crpline_art->load(nbucket).add_machine(load); + crpline_lin->load(nbucket).add_machine(load); + hload = load*curr_labor->numpers_linea(nlinea); switch (human_level) { case 3: - crpline_lin->add_human_load(nbucket, load ); + crpline_lin->load(nbucket).add_human(hload); case 2: - crpline_imp->add_human_load(nbucket, load ); - default: - crpline_firm->add_human_load(nbucket, load ); + crpline_imp->load(nbucket).add_human(hload); + case 1: + crpline_firm->load(nbucket).add_human(hload); } + crpline_art->load(nbucket).add_human(hload) ; if (mode == _stock_break) { + TString8 codmag(mrpline.codmag()); + TString8 codmagc(mrpline.codmag_coll()); + if (codmag.blank()) + codmag = linea_prod.codmagdep(); + if (codmagc.blank()) + codmagc = linea_prod.codmagdep_coll(); TMRP_line* new_article = find_propose(mrpline.codcli(), mrpline.codice(), - mrpline.livgiac(), codimplin , linea_prod.codice(), mrpline.codmag(), TRUE); + mrpline.livgiac(), codimplin , linea_prod.codice(), codmag, codmagc, TRUE); add_MRP_bucket(*new_article, nbucket, curr_arts); } } @@ -1268,36 +1278,49 @@ bool TMSP_mask::general_review(bool check_machine, bool check_human, bool useext nbucket++; else nbucket--; - } while(art_per_buck > ZERO && nbucket>=lower_buck && nbucket <= upper_buck ); + } attemp++; // altro tentativo - } + } // ciclo di risoluzione dei sotto-stock } // qui andrebbe aggiunta la gestione di più lavorazioni critiche, ora disabled // l=dist_tree().next_critical_labor(labors); - if (no_labor) // nessuna lavorazione da controllare o capacita' infinita + } + if (mode == _stock_break) + { + if (no_limits) // nessuna lavorazione da controllare o capacita' infinita { - if (mode == _stock_break) + int nbucket; + if (logic == _first_fit_logic) + nbucket = bucket - anticipomax/days_per_bucket(); + else + nbucket = bucket - anticipomin/days_per_bucket(); + if (nbucket < 1) + nbucket = 1; + if (nbucket <= bucket) { - const int lastbuck =mrpline.last_bucket(); - for (int b=0; b<=lastbuck ; b++) - { - real art_per_buck(mrpline. net_requirement(b));// quantità da produrre nel bucket - if (art_per_buck > ZERO) - { - int nbucket; - if (logic == _first_fit_logic) - nbucket = b - anticipomax/days_per_bucket(); - else - nbucket = b - anticipomin/days_per_bucket(); - if (nbucket<1) - nbucket=1; - TMRP_line* new_article = find_propose(mrpline.codcli(), mrpline.codice(), mrpline.livgiac(), - mrpline.codimp() , mrpline.codlin(), mrpline.codmag(), TRUE); - add_MRP_bucket(*new_article, nbucket, art_per_buck); - } - } + TMRP_line* new_article = find_propose(mrpline.codcli(), mrpline.codice(), mrpline.livgiac(), + mrpline.codimp() , mrpline.codlin(), mrpline.codmag(), mrpline.codmag_coll(), TRUE); + add_MRP_bucket(*new_article, nbucket, art_per_buck); + art_per_buck = ZERO; } - } + } + real pending(art_per_buck); + pending -= mrpline.net_requirement(bucket); + if (pending != ZERO || art_per_buck != ZERO) + { + const TDate lastdate = mrpline.record(lastbuck).time().date(); + int b=bucket+1; + do { + data_buck=get_date(F_DADATA); + data_buck+=days_per_bucket()*(b-1); + const TMRP_time t(data_buck, 0, "",""); + if (mrpline.record(t).net_requirement() > ZERO) + mrpline.add_net_req(b, pending); + else + mrpline.add_net_req(t, art_per_buck); + b++; + } while (lastdate > data_buck); + } } } } @@ -1306,26 +1329,27 @@ bool TMSP_mask::general_review(bool check_machine, bool check_human, bool useext } -bool TMSP_mask::capacity_review(bool useextralines, bool useextrahours) +bool TPlanning_mask::capacity_review(bool useextralines, bool useextrahours) { bool ok; - if (!load_MRP_lines(_actual_schedule)) + TWait_cursor clessidra; + if (!load_MRP_lines(_actual_plan)) return FALSE; - nettify_MRP_lines(TRUE); + gross2net(_actual_plan); _capacities.destroy(); - const char *msg="Calcolo carico attuale"; + const char *msg="Calcolo carico attuale..."; if (get(F_RECALC_TYPE).left(1)=="1") - ok = general_review(TRUE, TRUE, useextralines, useextrahours, FALSE, FALSE, 0, 0, _actual_schedule,_first_fit_logic, msg); + ok = general_review(TRUE, TRUE, useextralines, useextrahours, FALSE, FALSE, 0, 0, _actual_plan,_first_fit_logic, msg); else if (get(F_RECALC_TYPE).left(3)=="JIT") - ok = general_review(TRUE, TRUE, useextralines, useextrahours, FALSE, FALSE, 0, 0, _actual_schedule,_first_fit_logic, msg); + ok = general_review(TRUE, TRUE, useextralines, useextrahours, FALSE, FALSE, 0, 0, _actual_plan,_first_fit_logic, msg); _capacities.sort(); return ok; } -TCRP_line *TMSP_mask::compute_capacity(TLinea_prod &lineaprod, bool useextralines, bool useextrahours) +TCRP_line *TPlanning_mask::compute_capacity(TLinea_prod &lineaprod, bool useextralines, bool useextrahours) { TString8 codlin(lineaprod.codice()); TString8 codimp(lineaprod.codimp()); @@ -1355,45 +1379,41 @@ TCRP_line *TMSP_mask::compute_capacity(TLinea_prod &lineaprod, bool useextraline cal.add_oremacchina(capacity, data_buck,useextrahours); if (lineaprod.personale_dedicato()) cal.add_oreuomo(human, data_buck,useextrahours); - if (compute_imp && lineaprod.get_impianto()->personale_dedicato()) + if (compute_imp && lineaprod.get_impianto()->personale_dedicato()) cal_imp.add_oreuomo(human_imp, data_buck,useextrahours); if (compute_firm) cal_firm.add_oreuomo(human_firm, data_buck,useextrahours); ++data_buck; } - crpline_lin->set_capacity(b,capacity); + crpline_lin->capacity(b).set_machine(capacity); if (human > ZERO) { - crpline_lin->set_human_capacity(b,human); - crpline_imp->set_human_capacity(b,human+crpline_imp->human_capacity(b)); - crpline_firm->set_human_capacity(b,human+crpline_firm->human_capacity(b)); + crpline_lin->capacity(b).set_human(human); + crpline_imp->capacity(b).set_human(human+crpline_imp->capacity(b).human()); + crpline_firm->capacity(b).set_human(human+crpline_firm->capacity(b).human()); } - else - crpline_lin->set_human_capacity(b,ZERO); if (human_imp > ZERO) { - crpline_imp->set_human_capacity(b,human_imp+crpline_imp->human_capacity(b)); - crpline_firm->set_human_capacity(b,human_imp+crpline_firm->human_capacity(b)); + crpline_imp->capacity(b).set_human(human_imp+crpline_imp->capacity(b).human()); + crpline_firm->capacity(b).set_human(human_imp+crpline_firm->capacity(b).human()); } - else - crpline_imp->set_human_capacity(b,ZERO); if (human_firm > ZERO) - crpline_firm->set_human_capacity(b,human_firm+crpline_firm->human_capacity(b)); + crpline_firm->capacity(b).set_human(human_firm+crpline_firm->capacity(b).human()); } return crpline_lin; } -TMRP_line* TMSP_mask::find_propose( +TMRP_line* TPlanning_mask::find_propose( long codcli, const char * codart,const char * liv, const char * codimp,const char * codlin, - const char * mag, bool Force) + const char * mag, const char * magcoll, bool Force) { - return _proposed_articles.find(codart,liv,mag,codimp,codlin,codcli, Force); + return _proposed_articles.find(codart, liv, mag, magcoll, codimp, codlin, codcli, Force); } // carica le MRP line dallo sheet articoli -void TMSP_mask::msprow2codes(TToken_string &row,long &clifor, TCodice_articolo &art , - TString & liv, TString & mag, TString & imp, TString & lin, TString & um) +void TPlanning_mask::msprow2codes(TToken_string &row,long &clifor, TCodice_articolo &art , + TString & liv, TString & mag, TString & magc, TString & imp, TString & lin, TString & um) { clifor = row.get_long(F_CLIENTE-FIRST_FIELD); art = row.get(F_ARTICOLO-FIRST_FIELD); @@ -1403,12 +1423,14 @@ void TMSP_mask::msprow2codes(TToken_string &row,long &clifor, TCodice_articolo & livelli_giac().pack_grpcode(liv, row.get(F_LIV4-FIRST_FIELD),4); add_magcode(mag,row.get(F_MAGAZZINO-FIRST_FIELD)); add_depcode(mag,row.get(F_DEPOSITO-FIRST_FIELD)); + add_magcode(magc,row.get(F_MAG_COLL-FIRST_FIELD)); + add_depcode(magc,row.get(F_DEP_COLL-FIRST_FIELD)); imp = row.get(F_CODIMP-FIRST_FIELD); imp.trim(); lin = row.get(F_CODLIN-FIRST_FIELD); lin.trim(); um = row.get(F_UM-FIRST_FIELD); um.trim(); } -void TMSP_mask::crprow2codes(TToken_string &row, TString & imp, TString & lin, long &clifor, TCodice_articolo &art , +void TPlanning_mask::crprow2codes(TToken_string &row, TString & imp, TString & lin, long &clifor, TCodice_articolo &art , TString & liv, TString & um) { clifor=0L; @@ -1423,7 +1445,7 @@ void TMSP_mask::crprow2codes(TToken_string &row, TString & imp, TString & lin, l um = row.get(F_LUM-FIRST_FIELD); um.trim(); } // carica le MRP line dallo sheet articoli -bool TMSP_mask::load_MRP_lines(TMSP_mode mode, int level) +bool TPlanning_mask::load_MRP_lines(TMSP_mode mode, int level) { TSheet_field& sa = sfield(F_ARTICOLI); if (sa.items()==0) @@ -1443,68 +1465,83 @@ bool TMSP_mask::load_MRP_lines(TMSP_mode mode, int level) const bool is_constraint=sa.cell_disabled(r, a_buck0+2); if (is_constraint) { - bool has_mastercodes; + bool is_second_level; const int prior=get_int(F_2LEVEL_PRIORITY); if (prior>0) - has_mastercodes=(atoi(row->get(F_PRIORITA-FIRST_FIELD))==prior); + is_second_level=(atoi(row->get(F_PRIORITA-FIRST_FIELD))>=prior); else - has_mastercodes=(row->get_char(F_MASTERCODE-FIRST_FIELD)==MASTERCODE_CHAR); - skip = (level == 1 && !has_mastercodes || level == 2 && has_mastercodes ); + is_second_level=(row->get_char(F_MASTERCODE-FIRST_FIELD)==MASTERCODE_CHAR); + skip = (level == 1 && !is_second_level || level == 2 && is_second_level ); } if (!skip) { long clifor; TCodice_articolo art ; - TString16 liv,mag, imp, lin; + TString16 liv; + TString8 mag, magc, imp, lin; TCodice_um um ; - msprow2codes(*row,clifor, art , liv, mag, imp, lin, um); + msprow2codes(*row, clifor, art, liv, mag, magc, imp, lin, um); TMRP_line* curr_article=last_constraint; - if (is_constraint || mode != _stock_break) - curr_article = _mrp_articles.find(art, liv, mag, imp, lin, clifor ,TRUE); + if (!is_constraint || mode == _stock_break) + curr_article = _mrp_articles.find(art, liv, mag, magc, imp, lin, clifor ,TRUE); if (is_constraint) - last_constraint=curr_article; + last_constraint = curr_article; + TMSP_line* mspline = _articles.find(*row, FALSE); + bool added_some=FALSE; for (int nbucket=LAST_BUCKET-1; nbucket>=0 ; nbucket--) { data_buck=get_date(F_DADATA); - data_buck+=days_per_bucket()*nbucket-1; + data_buck+=days_per_bucket()*(nbucket-1); const TMRP_time t(data_buck, 0, imp, lin); real qta=row->get(a_buck0+nbucket*2); if (qta != ZERO) { TQuantita q(art, um, qta); q.convert2umbase(); + real rq(mspline ? mspline->qta_min(nbucket) : ZERO); // mette i vincoli nel gross req // e le celle normali negli sched receipts switch (mode) { - case _actual_schedule: - if (!is_constraint) + case _actual_plan: + case _released_schedule: + if (curr_article) { - curr_article->add_gross_req(t, q.val()); - curr_article->add_sched_rec(t, q.val()); + curr_article->add_planned_ord(t, q.val() - rq); + added_some=TRUE; + } + // no break; + if (curr_article) + { + curr_article->add_sched_rec(t, rq); + added_some=TRUE; } break; case _stock_break: if (is_constraint) { curr_article->add_gross_req(t, q.val()); - last_constraint=curr_article; + added_some=TRUE; } else { if (last_constraint) - last_constraint->add_sched_rec(t, q.val()); + { + last_constraint->add_sched_rec(t, rq); + //last_constraint->add_planned_ord(t, q.val() - rq); + } } break; } - added_some=TRUE; } else if (added_some) - curr_article->set_on_hand(t, ZERO); - if (nbucket == 0) + curr_article->set_on_hand(t, ZERO); // per settare tutti i bucket precedenti + if (nbucket == 0 && is_constraint) { - curr_article->set_on_hand(t, curr_article->giacenza_attuale(qta,data_buck)); + //curr_article->set_on_hand(t, curr_article->giacenza_attuale(qta,data_buck)); + if (last_constraint) + last_constraint->set_on_hand(t, curr_article->giacenza_attuale(qta,data_buck)); } } } @@ -1512,9 +1549,9 @@ bool TMSP_mask::load_MRP_lines(TMSP_mode mode, int level) return TRUE; } -// is_net_requirement: dice se le quantità presenti sono da considerare gia' come net req o +// already_net: dice se le quantità presenti sono da considerare gia' come net req o // se devo prenderle come scheduled rec e il net req lo devo calcolare di conseguenza -bool TMSP_mask::nettify_MRP_lines(bool already_net, bool lotsizing) +bool TPlanning_mask::gross2net(TMSP_mode mode, bool lotsizing) { // *********** // gross 2 net @@ -1527,32 +1564,29 @@ bool TMSP_mask::nettify_MRP_lines(bool already_net, bool lotsizing) for (int bucket = 0; bucket <= last; bucket = mrp_line.next_bucket(bucket)) { real netreq,giacres; - if (already_net) + switch (mode) { - // generazione del master schedule plan; le quantità sono da considerare nette - netreq= mrp_line.sched_receipts(bucket); - giacres=0; - mrp_line.set_net_req(bucket, netreq ); - } else { - // generazione delle pianificazioni (commesse, Master Production Plan (non per famiglie), prove di budget ecc) - giacres = mrp_line. - on_hand(bucket); - giacres += mrp_line.sched_receipts(bucket); - giacres -= mrp_line.gross_requirement(bucket); - if (lotsizing) - netreq = mrp_line.sizeup_net_requirement(bucket, giacres); - else - { - netreq = -giacres; - netreq = mrp_line.set_net_req(bucket, netreq); - } - giacres += netreq; - } - if (giacres > ZERO) - { - const int nb = mrp_line.next_bucket(bucket); - if (nb <= mrp_line.last_bucket()) - mrp_line.set_on_hand(nb, giacres); + case _actual_plan: + netreq += mrp_line.planned_orders(bucket); + case _released_schedule: + netreq += mrp_line.sched_receipts(bucket); + mrp_line.set_net_req(bucket, netreq); + break; + case _stock_break: + giacres = mrp_line.on_hand(bucket); + giacres += mrp_line.sched_receipts(bucket); + giacres -= mrp_line.gross_requirement(bucket); + if (lotsizing) + netreq = mrp_line.sizeup_net_requirement(bucket, giacres); + else + { + netreq = -giacres; + netreq = mrp_line.set_net_req(bucket, netreq); + } + const int nb = mrp_line.next_bucket(bucket); + if (nb <= mrp_line.last_bucket()) + mrp_line.set_on_hand(nb, giacres); + break; } } } @@ -1560,13 +1594,14 @@ bool TMSP_mask::nettify_MRP_lines(bool already_net, bool lotsizing) } -int TMSP_mask::days_per_bucket() const +int TPlanning_mask::days_per_bucket() const { return get_int(F_DAYXBUCK) * (get_int(F_BUCKETS) ? get_int(F_BUCKETS) : get_int(F_BUCKET)); } -void TMSP_mask::clear_sheets() +void TPlanning_mask::clear_sheets() { + field(F_DADATA).set_focus(); TSheet_field &sa=sfield(F_ARTICOLI); if (sa.items()>0) { @@ -1590,7 +1625,7 @@ void TMSP_mask::clear_sheets() // - sulla riga dell'ordinato progressivo => sottrae la giacenza iniziale // ********** // valore di ritorno:restituisce l'ultima linea dello sheet processata -int TMSP_mask::init_bucket0(TArticolo_giacenza &art, int r) +int TPlanning_mask::init_bucket0(TArticolo_giacenza &art, int r) { TSheet_field& sf = sfield(F_ARTICOLI); @@ -1637,7 +1672,7 @@ int TMSP_mask::init_bucket0(TArticolo_giacenza &art, int r) return c-2; } -bool TMSP_mask::do_test_art_row(int r, int c, bool signal) +bool TPlanning_mask::do_test_art_row(int r, int c, bool signal) { TSheet_field& sf = sfield(F_ARTICOLI); TMask & smask= sf.sheet_mask(); @@ -1709,6 +1744,9 @@ bool TMSP_mask::do_test_art_row(int r, int c, bool signal) // aggancia i master di 2' livello if (art2ndlev=currconstr->use_mspline2(curr_row, sf)) do_test_art_2ndlevel(art2ndlev); + else + if (signal) + message_box("Impossibile determinare l'articolo Master per %s",(const char*)currconstr->codice()); r--; } while (art2ndlev=currconstr->get_unused_line2()) @@ -1720,7 +1758,7 @@ bool TMSP_mask::do_test_art_row(int r, int c, bool signal) return signal; } -void TMSP_mask::do_test_art_2ndlevel(TMSP_line2 *art2ndlev, bool erase) +void TPlanning_mask::do_test_art_2ndlevel(TMSP_line2 *art2ndlev, bool erase) { TSheet_field& sf = sfield(F_ARTICOLI); TMask & smask= sf.sheet_mask(); @@ -1732,7 +1770,7 @@ void TMSP_mask::do_test_art_2ndlevel(TMSP_line2 *art2ndlev, bool erase) , mc->livello(), mc->codimp(), mc->codlin(), mc->codmag()); if (master_constr==NULL) { - master_constr=_constraints.find(art2ndlev->constraint().cliente(),mc->articolo(), mc->livello(), mc->codimp(), mc->codlin(), mc->codmag(),TRUE); + master_constr=_constraints.find(art2ndlev->constraint().cliente(),mc->articolo(), mc->livello(), mc->codimp(), mc->codlin(), mc->codmag(), TRUE); } int mrow= find_constr_row(*master_constr); @@ -1771,17 +1809,53 @@ void TMSP_mask::do_test_art_2ndlevel(TMSP_line2 *art2ndlev, bool erase) } } -bool TMSP_mask::test_art_row(int r, bool signal) +// controllo linee in modo interattivo +bool TPlanning_mask::test_art_row(int r, bool signal) { + int ok = TRUE; TSheet_field& sf = sfield(F_ARTICOLI); - TToken_string & curr_row=sf.row(r); int first,last; - if (!TRiga_articolo::find_block(sf, r, first, last)) - return TRUE; - return do_test_art_row(last, first, signal); + if (TRiga_articolo::find_block(sf, r, first, last)) + { + TToken_string & curr_row=sf.row(r); + do_test_art_row(last, first, signal); + if (signal) + { + TMSP_line* line = _articles.find(curr_row, FALSE); + if (line) + { + real value; + for (int b = 0 ; b < LAST_BUCKET; b++) + { + value = (curr_row.get(sf.cid2index(F_BUCKET0 + b*2))); + if (value != line->qta_min(b)) + { + if (line->qta_locked(b)) + { + error_box("Impossibile modificare la quantita' per l'articolo %s, colonna %d",(const char *)line->codice(),b); + do_events(); + ok = FALSE; + } + else if (value < line->qta_min(b)) + { + error_box("Impossibile inserire una quantita' inferiore a %s per l'articolo %s, colonna %d",(const char *)line->qta_min(b).string(),(const char *)line->codice(),b); + do_events(); + ok = FALSE; + } + } + if (!ok) + { + curr_row.add(line->qta_min(b).string(), sf.cid2index(F_BUCKET0 + b*2)); + sf.force_update(r); + } + } + } + } + } + return ok; } -bool TMSP_mask::test_load_row(int r, bool signal) +bool TPlanning_mask::test_load_row(int r, bool signal) { TSheet_field& sf = sfield(F_LINEE); const int narticoli=sf.items(); @@ -1820,9 +1894,9 @@ bool TMSP_mask::test_load_row(int r, bool signal) } -bool TMSP_mask::salva_documenti() +int TPlanning_mask::salva_documenti() { - bool ok=TRUE; + int some=0L; TSheet_field& sf = sfield(F_ARTICOLI); const int b0 = sf.cid2index(F_BUCKET0); const int b1 = sf.cid2index(F_BUCKET1); @@ -1835,70 +1909,130 @@ bool TMSP_mask::salva_documenti() const int bucket_size = days_per_bucket(); const bool number_by_cli = get_bool(F_NUMBERBYCLI); + TProgind pi(LAST_BUCKET, "Emissione documenti" , FALSE, TRUE); for (int b = 1; b < LAST_BUCKET; b++) { - const TDate data = from + long(bucket_size * (b-1)); - if (data > date_to) - break; + pi.addstatus(1); + TDate datacons = from + long(bucket_size * (b-1)); + if (datacons > date_to) + continue; + round_date(datacons,TRUE); - const int anno = data.year(); - - FOR_EACH_SHEET_ROW(sf, r, row) if (!sf.cell_disabled(r, b1)) + FOR_EACH_SHEET_ROW(sf, r, row) + if (!sf.cell_disabled(r, b1)) { TMSP_line& line = *_articles.find(*row, TRUE); - - const real& old = line.qta(b); - const real val = row->get(b0 + b*2); + if ((get(F_DA_MAGAZZ).empty() || line.codmag() >= get(F_DA_MAGAZZ)) && (get(F_A_MAGAZZ).empty() || line.codmag() <= get(F_A_MAGAZZ)) && (get(F_DA_IMPIANTO).empty() || line.codimp() >= get(F_DA_IMPIANTO)) && (get(F_A_IMPIANTO).empty() || line.codimp() <= get(F_A_IMPIANTO))) { - if (old != val) + TDate datadoc = datacons; + datadoc -= cache().get(LF_ANAMAG,line.codice()).get_real(ANAMAG_GIORNIRIOR); + round_date(datadoc); + const TString8 new_tipodoc(get(F_TIPO_PLAN)); + const TString8 new_codnum(get(F_NUM_PLAN)); + const int new_anno = datadoc.year(); + const long new_numdoc = (number_by_cli ? line.cliente() * 100L : 0L)+datadoc.week(); + const int new_numrig = 0; + TString8 codnum; + int anno; + long numdoc; + int numrig; + + real old, val,new_val(row->get(b0 + b*2)); + if (new_val < line.qta_min(b)) { - long numdoc = 0L; - int numrig = 0; - - if (!line.riga(b, numdoc, numrig)) - { - if (number_by_cli) - numdoc = line.cliente() * 100L; - numdoc += data.week(); - } - const real incr = val-old; - TRiga_documento& riga = doc_rows.add_to_row(anno, numdoc, numrig, incr); - if (riga.get(RDOC_CODART).empty()) + if (yesno_box("Impossibile inserire un ordine inferiore a %s per %s. Interrompo ?",(const char *)line.qta_min(b).string(), (const char *)line.codice())) + return FALSE; + } + new_val -= line.qta_min(b); + TRigadoc_ref *rdr=line.first_rigaref(b); + bool found=FALSE; + while (rdr || found==FALSE && new_val!=ZERO) + { + if (rdr==NULL && !found) { - riga.put(RDOC_CODART, line.codice()); - riga.put(RDOC_CODARTMAG, line.codice()); - riga.put(RDOC_LIVELLO, line.livgiac()); - riga.put(RDOC_CHECKED, "X"); - riga.put(RDOC_CODMAG, line.codmag()); - riga.put(RDOC_LINEA, line.codlin()); - riga.put(RDOC_IMPIANTO, line.codimp()); - riga.put(RDOC_UMQTA, row->get(sf.cid2index(F_UM))); - riga.put(RDOC_DATACONS, data); - riga.put(RDOC_DESCR, row->get(sf.cid2index(F_DESCART))); - - TRectype& doc = (TRectype&)riga.doc().head(); - if (doc.get(DOC_DATACONS).empty()) + found=TRUE; + rdr=new TRigadoc_ref(new_codnum,new_anno,new_numdoc,new_numrig,ZERO,ZERO); + line.add_rigaref(b, rdr); + } + old = rdr->qta_residua(); + codnum = rdr->codnum(); + anno = rdr->annodoc(); + numdoc = rdr->numdoc(); + numrig = rdr->numrig(); + //if (rdr->codnum()==new_codnum && rdr->annodoc() == new_anno && rdr->numdoc() == new_numdoc) + if (rdr->codnum()==new_codnum) + { + TToken_string keydoc("D"); + keydoc.add(anno); + keydoc.add(codnum); + keydoc.add(numdoc); + const TRectype & docrec = cache().get(LF_DOC,keydoc); + if (docrec.empty() || + new_tipodoc == docrec.get(DOC_TIPODOC) && !has_confirmed_status(docrec)) { - doc.put(DOC_DATACONS, data); - doc.put(DOC_TIPOCF, "C"); - doc.put(DOC_CODCF, line.cliente()); - } - doc.put(DOC_DATADOC, from); + val = new_val; + new_val = ZERO; + if (val != old) + { + const real incr = val-old; + TRiga_documento& riga = doc_rows.add_to_row(rdr, incr); + if (riga.get(RDOC_CODART).empty()) + { + riga.put(RDOC_CODART, line.codice()); + riga.put(RDOC_CODARTMAG, line.codice()); + riga.put(RDOC_LIVELLO, line.livgiac()); + riga.put(RDOC_CHECKED, "X"); + riga.put(RDOC_CODMAG, line.codmag()); + riga.put(RDOC_CODMAGC, line.codmag_coll()); + riga.put(RDOC_LINEA, line.codlin()); + riga.put(RDOC_IMPIANTO, line.codimp()); + riga.put(RDOC_UMQTA, row->get(sf.cid2index(F_UM))); + riga.put(RDOC_DATACONS, datacons); + riga.put(RDOC_DESCR, row->get(sf.cid2index(F_DESCART))); + + TRectype& doc = (TRectype&)riga.doc().head(); + if (doc.get(DOC_DATACONS).empty()) + { + doc.put(DOC_DATACONS, datacons); + doc.put(DOC_TIPOCF, "C"); + doc.put(DOC_CODCF, line.cliente()); + } + doc.put(DOC_DATADOC, from); + } + if (val == ZERO) + { + line.remove_rigaref(b); + enable_codes(r); + } + else + { + line.qta(b) -= old; + line.qta(b) += rdr->qta_residua(); + disable_codes(r); + } + sf.force_update(r); + } + } } - } + rdr=line.next_rigaref(b); + } // ciclo di aggiornamento dei riferimenti ai docs } } - ok = doc_rows.flush(data)>=0L && ok; + const long recs= doc_rows.flush(datacons); + if (recs > 0L) + some += 1; + else if (recs < 0L) + some = -1; } - return ok; + return some; } // copia i dati della riga al di fuori delle informazioni dei bucket -void TMSP_mask::copy_sheet_row(TToken_string & newrow, const TToken_string & row) +void TPlanning_mask::copy_sheet_row(TToken_string & newrow, const TToken_string & row) { const TSheet_field& sf = sfield(F_ARTICOLI); const int b0 = sf.cid2index(F_BUCKET0); @@ -1910,7 +2044,7 @@ void TMSP_mask::copy_sheet_row(TToken_string & newrow, const TToken_string & row } } -bool TMSP_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) +bool TPlanning_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) { const char * confirm_msg="Le attuali %d linee di articoli verranno perse. Confermi?"; switch (o.dlg()) @@ -1970,7 +2104,7 @@ bool TMSP_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) const TSheet_field& s = sfield(F_NUM_PLA); FOR_EACH_SHEET_ROW_BACK(s, r, row) if (o.get() == row->get(s.cid2index(F_NUMERAZ))) return TRUE; - return error_box("Numerazione non inclusa tra quelle di planning"); + return o.error_box("Numerazione non inclusa tra quelle di planning"); } break; case F_TIPO_PLAN: @@ -1979,11 +2113,12 @@ bool TMSP_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) const TSheet_field& s = sfield(F_TIPI_PLA); FOR_EACH_SHEET_ROW_BACK(s, r, row) if (o.get() == row->get(s.cid2index(F_TIPO))) return TRUE; - return error_box("Tipo documento non incluso tra quelli di planning"); + return o.error_box("Tipo documento non incluso tra quelli di planning"); } break; case F_ARTICOLI: { + static TToken_string _curr_art_row; TSheet_field& s = (TSheet_field&)o; switch(e) { @@ -1998,7 +2133,16 @@ bool TMSP_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) } break; case se_leave: - test_art_row((int)jolly); + if (_curr_art_row != s.row((int)jolly)) + { + const bool ok=test_art_row((int)jolly); + if (!ok) + _curr_art_row.cut(0); + return ok; + } + break; + case se_enter: + _curr_art_row= s.row((int)jolly); break; default: break; @@ -2067,19 +2211,19 @@ bool TMSP_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) case DLG_ELABORA: if (e == fe_button && check_fields()) { - TSheet_field& s = sfield(F_ARTICOLI); - int lineeart=s.items(); - if (lineeart==0 || yesno_box(confirm_msg,lineeart)) + if (is_page_crp()) { - clear_sheets(); - if (carica_documenti()) + if (capacity_review(get_bool(F_USENONSTDLIN_CRP) ,get_bool(F_USEEXTRAHRS_CRP) )) { - fill_sheet(); - enable(-G_PREPROCESS, s.items() == 0); - enable(-G_POSTPROCESS, s.items() > 0); - s.set_focus(); - on_field_event((TOperable_field&)field(F_SHOWPRICES), fe_modify, jolly ); - on_field_event((TOperable_field&)field(F_MSP_SORT), fe_init, jolly ); + on_field_event((TOperable_field&)field(F_LOADTYPE), fe_modify, jolly ); + sfield(F_LINEE).set_focus(); + } + } else { + TSheet_field& s = sfield(F_ARTICOLI); + int lineeart=s.items(); + if (lineeart==0 || yesno_box(confirm_msg,lineeart)) + { + elabora(); } } } @@ -2115,32 +2259,22 @@ bool TMSP_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) sfield(F_ARTICOLI).set_focus(); } break; - case F_RECALC_CRP: - if (e == fe_button && check_fields()) - { - if (capacity_review(get_bool(F_USENONSTDLIN_CRP) ,get_bool(F_USEEXTRAHRS_CRP) )) - { - on_field_event((TOperable_field&)field(F_LOADTYPE), fe_modify, jolly ); - sfield(F_LINEE).set_focus(); - } - } - break; case F_CHECK: if (e == fe_button) { - if (is_page_msp()) - check_articles(); - else if (is_page_crp()) + if (is_page_crp()) check_capacities(); + else + check_articles(); } break; case F_PRINT: if (e == fe_button) { - if (is_page_msp()) - print_articles(); - else if (is_page_crp()) + if (is_page_crp()) print_capacities(); + else + print_articles(); } break; case F_CHECKLINE: @@ -2148,7 +2282,7 @@ bool TMSP_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) { const TSheet_field& s = sfield(F_ARTICOLI); TMSPCheck_mask cm(this); - //cm.disable(-G_MOVIMENTO); + cm.disable(-G_MOVIMENTO); int curr_row=s.selected(); const bool is_disabled=s.cell_disabled(curr_row,F_BUCKET1-FIRST_FIELD) ; const bool is_constr=(is_disabled && curr_row>0 && s.cell_disabled(curr_row-1,F_BUCKET1-FIRST_FIELD)); @@ -2156,22 +2290,50 @@ bool TMSP_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) curr_row++; cm.gopos(curr_row, 1); cm.run(); - cm.gopos_mainmask(); + //cm.gopos_mainmask(); } break; - case F_SHOWPRICES: - if (e == fe_modify) + case F_DETTAGLIO_OUT: + if (e == fe_button) { TSheet_field& s = sfield(F_ARTICOLI); - const bool on = get_bool(F_SHOWPRICES); - for (int b=LAST_BUCKET ; b>=0 ; b--) + int curr_row=s.selected(); + TMSP_line *l = _articles.find(s.row(curr_row)); + if (l) { - s.set_column_width(F_BUCKET0+1+b*2-FIRST_FIELD, on ? 140 : 0); - s.enable_column(F_BUCKET0+1+b*2-FIRST_FIELD, on && b>0 && b < LAST_BUCKET); - // ^^^^- da sostituire con un piu' elegante (ma non implementato): s.show(F_BUCKET0+1+b*2-FIRST_FIELD,on); + TLista_ordini m(l,"Pianificazione"); + if (m.run()!= K_ESC) + m.edit_checked(); + } else { + message_box("Nessun ordine pianificato per questa riga"); } - s.force_update(); } + break; + case F_DETTAGLIO_IN: + if (e == fe_button) + { + TSheet_field& s = sfield(F_ARTICOLI); + int curr_row=s.selected(); + + while (curr_row && !s.cell_disabled(curr_row,F_BUCKET1-FIRST_FIELD)) + curr_row--; + TMSP_constraint *c = _constraints.find(s.row(curr_row)); + if (c) + { + TLista_ordini m(c,"Vincoli"); + if (m.run()!= K_ESC) + m.edit_checked(); + } else { + message_box("Nessun vincolo per questa riga"); + } + } + break; + case F_SHOW_WEEK: + case F_SHOWPRICES: + if (e == fe_modify) + set_sheet_header(); + break; + case F_SHOWDETAILS: case F_SHOWPERC: if (e == fe_modify) on_field_event((TOperable_field&)field(F_LOADTYPE), fe_modify, jolly ); @@ -2185,24 +2347,20 @@ bool TMSP_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) const bool show_human=*get(F_LOADTYPE)=='H'; TSheet_field& sl = sfield(F_LINEE); sl.destroy(); - //TSheet_field& su = sfield(F_TESTE); - //su.destroy(); const long max_capacities=_capacities.items(); for (long c=0; c0 && !yesno_box(confirm_msg,lineeart)) + return FALSE; + } + break; default: break; } return TRUE; } -TMSP_mask::TMSP_mask() +TPlanning_mask::TPlanning_mask(const char * name) + : TCalendar_mask(name) +{ + init(); +} + +TPlanning_mask::TPlanning_mask() : TCalendar_mask("mr2200a") +{ + init(); +} + +void TPlanning_mask::init() { TSheet_field& sf = sfield(F_ARTICOLI); sf.set_append(FALSE); @@ -2282,13 +2473,13 @@ void TMSPCheck_mask::gopos_mainmask() sf.set_focus_cell(curr_row, last_col()*2+F_BUCKET0); } -TMSPCheck_mask::TMSPCheck_mask(TMSP_mask * main_mask, const char *m,TSheet_field * s): +TMSPCheck_mask::TMSPCheck_mask(TPlanning_mask * main_mask, const char *m,TSheet_field * s): TAutomask(m), _main_mask(main_mask) , _sheet(s) { _last_col=_last_row=_constr_row=-1; } -TMSPCheck_mask::TMSPCheck_mask(TMSP_mask * main_mask): +TMSPCheck_mask::TMSPCheck_mask(TPlanning_mask * main_mask): TAutomask("mr2200b.msk"), _main_mask(main_mask), _sheet(&main_mask->sfield(F_ARTICOLI)) { _last_col=_last_row=_constr_row=-1; @@ -2314,12 +2505,14 @@ int TMSPCheck_mask::fill_mask(const bool show_fields) long codcli ; TCodice_articolo codart; - TString16 liv, mag, codimp, codlin, um; - _main_mask->msprow2codes(row,codcli,codart,liv,mag,codimp, codlin, um); + TString16 liv; + TString8 mag, magc, codimp, codlin; + TString4 um; + _main_mask->msprow2codes(row, codcli, codart, liv, mag, magc, codimp, codlin, um); if (_last_row!=_row) { - _constr_row=find_constraint(_row); + _constr_row=find_constr_row(_row); set(FC_RIGA,_row+1); set(FC_CODCLI,codcli,TRUE); set(FC_CODART,codart,TRUE); @@ -2327,6 +2520,8 @@ int TMSPCheck_mask::fill_mask(const bool show_fields) set(FC_CODLIN,codlin,TRUE); set(FC_CODMAG,mag.left(3),TRUE); set(FC_CODDEP,mag.mid(3),TRUE); + //set(FC_CODMAG_C,magc.left(3),TRUE); + //set(FC_CODDEP_C,magc.mid(3),TRUE); } set(FC_BUCKET,_col); TDate data_buck(_main_mask->get_date(F_DADATA)); @@ -2341,8 +2536,8 @@ int TMSPCheck_mask::fill_mask(const bool show_fields) { real art_per_buck(row.get(F_BUCKET0 + _col*2 - FIRST_FIELD)); set(FC_FINAL_VALUE,art_per_buck.string()); - TMRP_line* new_article = _main_mask->find_propose(codcli, codart,liv,codimp,codlin,mag); - TMSP_line* old_article = _main_mask->find_article(codcli, codart,liv,codimp,codlin,mag); + TMRP_line* new_article = _main_mask->find_propose(codcli, codart, liv, codimp, codlin, mag, magc); + TMSP_line* old_article = _main_mask->find_article(codcli, codart, liv, codimp, codlin, mag, magc); real old_value=ZERO; real new_value=ZERO; @@ -2526,7 +2721,7 @@ bool TMSPCheck_mask::on_field_event(TOperable_field& o, TField_event e, long jol return TRUE; } -int TMSPCheck_mask::find_constraint(int row) +int TMSPCheck_mask::find_constr_row(int row) { while (row >=0 ) { @@ -2618,7 +2813,7 @@ void TMSPCheck_mask::check_pos_range() // /////////////////////////////////////////////////////////// -TCRPCheck_mask::TCRPCheck_mask(TMSP_mask * main_mask): +TCRPCheck_mask::TCRPCheck_mask(TPlanning_mask * main_mask): TMSPCheck_mask(main_mask, "mr2200c.msk", & main_mask->sfield(F_LINEE)) { go_top(); @@ -2648,7 +2843,7 @@ bool TCRPCheck_mask::is_article(int row) return (*_sheet->row(row).get(F_CODARTCRP-FIRST_FIELD)>' '); } -int TCRPCheck_mask::find_constraint(int row) +int TCRPCheck_mask::find_constr_row(int row) { const int max=max_rows(); while (row < max) @@ -2677,7 +2872,7 @@ int TCRPCheck_mask::fill_mask(const bool show_fields) if (_last_row!=_row) { - _constr_row=find_constraint(_row); + _constr_row=find_constr_row(_row); set(FC_RIGA,_row+1); set(FC_CODIMP,codimp); set(FC_CODLIN,codlin); @@ -2728,41 +2923,44 @@ int TCRPCheck_mask::fill_mask(const bool show_fields) // Applicazione principale /////////////////////////////////////////////////////////// -class TMSP_app : public TSkeleton_application +void TPlanning_app ::openfiles() { -protected: - virtual void main_loop(); - virtual bool firm_change_enabled() const { return FALSE; } - -public: - TMSP_app() {} -}; - - -void TMSP_app ::main_loop() + open_files(LF_TABCOM, LF_TAB, LF_DOC, LF_RIGHEDOC, 0); + open_files(LF_CLIFO, LF_CFVEN, LF_OCCAS, LF_INDSP, LF_CONDV, 0); + open_files(LF_MAG, LF_MOVMAG, LF_RMOVMAG, 0); + open_files(LF_ANAMAG, LF_DIST, LF_RDIST, LF_MRPREPORT, 0); +} +bool TPlanning_app ::create() +{ + if (TSkeleton_application::create()) + { + openfiles(); + _m = new TPlanning_mask(); + _m->field(F_MSCHEDULEPLAN).set(" "); + return TRUE; + } + return FALSE; +} + +void TPlanning_app::main_loop() { - open_files(LF_TABCOM, LF_TAB, LF_DOC, LF_RIGHEDOC, 0); - open_files(LF_CLIFO, LF_CFVEN, LF_OCCAS, LF_INDSP, LF_CONDV, 0); - open_files(LF_MAG, LF_ANAMAG, LF_DIST, LF_RDIST, LF_MRPREPORT, 0); - - TMSP_mask m; TConfig prassid(CONFIG_DITTA, "ve"); // apre il file di configurazione della ditta corrente if (prassid.get_bool("GES", NULL, A_LISTINI)) { - m.enable(F_CATVEN_CV,prassid.get_bool("GESLISCV")); + mask().enable(F_CATVEN_CV,prassid.get_bool("GESLISCV")); } else { - m.disable(F_TIPOCV); - m.disable(F_CATVEN_CV); + mask().disable(F_TIPOCV); + mask().disable(F_CATVEN_CV); } - while (m.run()!=K_QUIT) ; + while (mask().run()!=K_QUIT) ; } int mr2200(int argc, char* argv[]) { - TMSP_app a; - a.run(argc, argv, "Master Schedule Planning"); + TPlanning_app a; + a.run(argc, argv, "Pianificazione ordini"); return 0; } diff --git a/mr/mr2200.h b/mr/mr2200.h index 84df68f2c..abea566ae 100755 --- a/mr/mr2200.h +++ b/mr/mr2200.h @@ -1,392 +1,129 @@ -// funzioni di ricerca distinta master -bool distinta_master(const char *code); -// funzione per l'uso degli alberi delle distinte -TDistinta_tree &dist_tree(); +#include +#include "mrplib.h" +#include "../mg/mglib.h" +#include "../ve/velib.h" +#include "../ve/veconf.h" -#define MASTERCODE_CHAR 'M' +#include "mr2100.h" +#include "mr2201.h" -//*********************** -// oggetto TRiga articolo -class TMSP_constraint; -class TMSP_constraints; +const real MAXCAPACITY("999999999.99"); +const int NO_PROPOSE=1000 ; -class TRiga_articolo : public TToken_string +enum TMSP_mode {_actual_plan, _released_schedule, _stock_break}; +enum TMSP_logic {_first_fit_logic, _JIT_logic}; + + +class TPlanning_mask : public TCalendar_mask { -public: -static int order_compare(TSheet_field & s, int i1, int i2, int level); -static int order_compare( const TToken_string& r1 , const TToken_string& r2 , int level, bool ascending=TRUE); -static int compare_field(TString &str0, TString &str1,short field_no) ; -static int order_comparePCAL(TSheet_field & s, int i1, int i2); -static int order_comparePCLA(TSheet_field & s, int i1, int i2); -static int order_comparePALC(TSheet_field & s, int i1, int i2); -static int order_comparePACL(TSheet_field & s, int i1, int i2); -static int order_comparePLAC(TSheet_field & s, int i1, int i2); -static int order_comparePLCA(TSheet_field & s, int i1, int i2); -static int order_compareCAL(TSheet_field & s, int i1, int i2); -static int order_compareCLA(TSheet_field & s, int i1, int i2); -static int order_compareALC(TSheet_field & s, int i1, int i2); -static int order_compareACL(TSheet_field & s, int i1, int i2); -static int order_compareLAC(TSheet_field & s, int i1, int i2); -static int order_compareLCA(TSheet_field & s, int i1, int i2); -static int order_comparePCA(TSheet_field & s, int i1, int i2); -static int order_comparePAC(TSheet_field & s, int i1, int i2); -static int order_compareAC(TSheet_field & s, int i1, int i2); -static int order_compareCA(TSheet_field & s, int i1, int i2); -static bool find_block(const TSheet_field& sf, const int riga, int &first_row, int &last_row ); + // quantità provenienti dai documenti "ordine": + TMSP_constraints _constraints; - int compare(const TToken_string& r, int level) const; - TRiga_articolo& operator=(TToken_string& r); - TRiga_articolo& operator+=(TRiga_articolo& r); + // quantità provenienti dai documenti "planning" (commesse): + TMSP_lines _articles; - TRiga_articolo() : TToken_string(128) { } - TRiga_articolo(const TMSP_constraint & line); - virtual ~TRiga_articolo() { } -}; -#define SORT_BY_PCAL -1 // cliente / articolo / impianto-linea -#define SORT_BY_PCLA -2 // -#define SORT_BY_PALC -3 // -#define SORT_BY_PACL -4 // -#define SORT_BY_PLAC -5 // -#define SORT_BY_PLCA -6 // -#define SORT_BY_PCA - 8 // cliente / articolo -#define SORT_BY_PAC - 9 // -#define SORT_BY_PRIORITY 16 -#define SORT_WITHOUT_LINE 8 -#define SORT_BY_CAL -17 // cliente / articolo / impianto-linea -#define SORT_BY_CLA -18 // -#define SORT_BY_ALC -19 // -#define SORT_BY_ACL -20 // -#define SORT_BY_LAC -21 // -#define SORT_BY_LCA -22 // -#define SORT_BY_CA -24 // cliente / articolo -#define SORT_BY_AC -25 // + // quantità per il processo di nettificazione/sizing in caso di generazione dell'MSP + TMRP_lines _mrp_articles; + // proposte del sistema + TMRP_lines _proposed_articles, _proposed_1stlevel; -//*********************** -// form di stampa degli sheet -class TMSP_form : public TForm -{ -protected: - bool validate(TForm_item &cf, TToken_string &s); -public: - TMSP_form (TIsamtempfile * rep); -}; -class TCRP_form : public TForm -{ -protected: - bool validate(TForm_item &cf, TToken_string &s); -public: - TCRP_form (TIsamtempfile * rep); -}; -class TMSP_constraints : public TMRP_array -{ -protected: - virtual TSortable* new_obj(const TToken_string& key) const; - -public: - TMSP_constraint* find(long cliente,const TString& codart,const TString& giac, - const TString& imp, const TString& lin, const TString& mag, - bool create=FALSE) ; - - TMSP_constraint& operator[](long n) const - { return (TMSP_constraint&)find_obj(n); } -}; - -class TMSP_record : public TObject -{ -public: - long _numdoc; - int _numrig; - real _qta; - real _price; - virtual TObject* dup() const; - TMSP_record() : _numdoc(0L), _numrig(0) { } -}; - -class TMaster_code : public TObject -{ - TString _code; - TString _liv; - TString _um; - TString _codimp; - TString _codlin; - TString _codmag; - real _expr; - real _leadtime; -public: - const char *articolo() const {return _code;} - const char *livello() const {return _liv;} - const char *um() const {return _um;} - const real &expr() const {return _expr;} - const real &leadtime() const {return _leadtime;} - const char *codimp() const {return _codimp;} - const char *codlin() const {return _codlin;} - const char *codmag() const {return _codmag;} - - TMaster_code(const char *code, const char *liv, const char *ummaster, const real &expr, const real &leadtime, const char *codimp, const char *codlin, const char *codmag); - TMaster_code(const char *code, const char *liv,const char *ummaster, const real &expr, int leadtime, const char *codimp, const char *codlin, const char *codmag); - virtual ~TMaster_code() {} -}; - - -class TMSP_line2 : public TObject -{ - bool _used; - TMSP_constraint *_constraint; - TArray _mastercodes; -public: - bool used() {return _used;} - void set_use(bool on) {_used=on;} - void add_mastercode (TMaster_code *); - TMaster_code *get_mastercode (int i=0); - TMSP_constraint &constraint() {return *_constraint;} - TMSP_line2(const TMSP_constraint &c); - virtual ~TMSP_line2() {} -}; - -class TMSP_record_array : public TObject -{ - TArray _buckets; - -public: - int items() const { return _buckets.items(); } - int last() const { return _buckets.last(); } - int pred(int i) const { return _buckets.pred(i); } - - virtual TMSP_record_array& operator=(const TMSP_record_array& a); - TMSP_record& operator[](int b); -}; - - -class TMSP_constraint : public TSortable -{ - long _cliente; - TCodice_articolo _codart; - TString16 _giac; - TString8 _imp, _lin; - TString8 _mag; - TString _desc; + // capacità linea per linea + TCRP_lines _capacities; - bool _on_sheet; - bool _check_master; - TArray _lines2; // codici di livello 2 per articoli NON master - TMSP_constraints _upperlines; // vincoli dei codici di livello 1 per articoli master - - TMSP_record_array _bucket_qta; - protected: - virtual int compare(const TSortable& s) const; + enum Categoria_doc {_Doc_vincoli=1, _Doc_planning=2}; -public: - long cliente() const { return _cliente; } - const TCodice_articolo& codice() const { return _codart; } - const TString& livgiac() const { return _giac; } - const TString& codimp() const { return _imp; } - const TString& codlin() const { return _lin; } - const TString& codmag() const { return _mag; } - const TString& desc() const { return _desc; } - void set_desc(const char* str) { _desc = str; } + bool is_page_crp() const {return curr_page()==4;} - bool riga(int b, long& ndoc, int& nriga); - void set_riga(int b, char provv, TString& codnum, int annodoc, long ndoc, int nriga); - // master sched. a due livelli: - int find_distinta_master(const TMSP_constraint & constr, TString & master, TString & livmaster,TString & um,real & expr, TString & imp,TString & lin,TString & magdep, int fromindex=0); - void set_mastercode_check(bool on); - bool mastercodes2check() const ; + bool on_field_event(TOperable_field& o, TField_event e, long jolly); - TMSP_line2 * use_mspline2(TMSP_constraint&line); - TMSP_line2 * use_mspline2(TToken_string &row, TSheet_field & sf); - void discard_line2(TMSP_line2 * ); - void reset_unused_line2(); - TMSP_line2 * get_unused_line2(); + bool load_MRP_lines(TMSP_mode mode, int level=0); + bool gross2net(TMSP_mode mode, bool lotsizing=FALSE); + void add_MRP_bucket(TMRP_line& new_article, int nbucket, const real &curr_arts); + // proposta automatica del sistema + bool general_review(bool check_machine, bool check_human, bool useextralines, bool useextrahours,bool lotsizing, bool no_outcapacity, int anticipomin,int anticipomax, TMSP_mode mode, TMSP_logic logic, const char *msg ); + int insert_propose(bool verbose=FALSE) ; + bool remove_propose(bool verbose=FALSE) ; + void add_or_sub_propose(char sign); - TMSP_constraint* add_upperline(const TMSP_constraint& constr); - TMSP_constraint* get_upperline(TMSP_constraint& constr); - bool has_upperlines() const ; + void propose_1stJIT(TMSP_logic logic, bool check_m, bool check_h); + // controlli + void print_articles(); + void print_capacities(); + bool sortMSPsheet(); + bool sortCRPsheet(); + void check_articles(); + void check_capacities(); + void pack_article_sheet(); + // capacity review + bool capacity_review(bool useextralines, bool useextrahours); + TCRP_line *compute_capacity(TLinea_prod &lineaprod, bool useextralines, bool useextrahours); - int last() const { return _bucket_qta.last(); } - int pred(int i) const { return _bucket_qta.pred(i); } + TMSP_constraint* find_constraint(const TMSP_line& l,bool force_insert=FALSE); + int find_constr_row(TMSP_constraint& c); - virtual real& qta(int b) { return _bucket_qta[b]._qta; } - virtual real& price(int b) { return _bucket_qta[b]._price; } + bool test_art_row(int r, bool signal=TRUE); + bool test_load_row(int r, bool signal=TRUE); + int init_bucket0(TArticolo_giacenza &art, int r); - virtual void fill_sheet_row(TToken_string& row, const TMask & m, bool codes_only=FALSE) ; + bool do_test_art_row(int r, int c, bool signal); + void do_test_art_2ndlevel(TMSP_line2 *mspline, bool erase=FALSE); - bool is_on_sheet() const { return _on_sheet; } - void set_on_sheet(bool on = TRUE) { _on_sheet = on; } + void copy_sheet_row(TToken_string & newrow, const TToken_string & row); - TMSP_constraint & operator=(const TMSP_constraint & line); - - TMSP_constraint(long cliente, - const TCodice_articolo& codart, - const TString& giac, - const TString& imp, const TString& lin, - const TString& mag); - TMSP_constraint(const TMSP_constraint & cons); - virtual ~TMSP_constraint() { } -}; - - -// linee contenenti pianificazioni -class TMSP_line : public TMSP_constraint -{ -public: - - virtual void fill_sheet_row(TToken_string& row, const TMask & m, bool codes_only=FALSE) ; - TMSP_line(long cliente, const TCodice_articolo& codart, - const TString& giac, const TString& mag, - const TString& imp, const TString& lin); - TMSP_line(TMSP_line & line); - TMSP_line(TMSP_constraint & cons); - virtual ~TMSP_line() { } -}; - - -class TMSP_lines : public TMRP_array -{ -protected: - virtual TSortable* new_obj(const TToken_string& key) const; - -public: - TMSP_line* find(long cliente, const TString& art, const TString& gia, - const TString& imp, const TString& lin, const TString& mag, - bool create=FALSE); - - TMSP_line* find(const TToken_string& row, bool create=FALSE); - - TMSP_line& operator[](long i) const - { return (TMSP_line&)find_obj(i); } -}; - - -class TCapacita_prod : public TSortable -{ - real _capacity; // Capacita' macchina - real _human_capacity; // Capacita' macchina - real _load; // Carico macchina - real _human_load; // Carico uomo - -// static TDecoder* _umart1; // Decoder per trovare unita' base articolo -// static TDecoder* _umart2; // Decoder per trovare conversione -// static TDecoder* _umdist; // Decoder per trovare unita' base distinta - -protected: - virtual int compare(const TSortable& s) const; - virtual TObject* dup() const { return new TCapacita_prod(*this); } - - void copy(const TCapacita_prod& q); - real get_factor(const TCodice_um& um) const; - void convert(real& val, const TCodice_um& from_um, const TCodice_um& to_um) const; - -public: - const TCapacita_prod& operator =(const TCapacita_prod& q) - { copy(q); return q; } - - void set(const real& cap, const real& load); - void set_capacity(const real& cap){_capacity=cap;} - void set_human_capacity(const real& cap){_human_capacity=cap;} - void set_load(const real& load) {_load=load;} - void set_human_load(const real& load) {_human_load=load;} - - void add_capacity(const real& cap){_capacity+=cap;} - void add_human_capacity(const real& cap){_human_capacity+=cap;} - void add_load(const real& load) {_load+=load;} - void add_human_load(const real& load) {_human_load+=load;} - - real & capacity() {return _capacity;} - real & load() {return _load;} - real & human_capacity() {return _human_capacity;} - real & human_load() {return _human_load;} + void clear_sheets(); + void set_sheet_header(); + void fill_sheet(); + void enable_codes(int r, bool on = TRUE); + void disable_codes(int r) {enable_codes(r,FALSE);} - TCapacita_prod (); - TCapacita_prod (const real& cap, const real& load); - TCapacita_prod (const TCapacita_prod & q) { copy(q); } - virtual ~TCapacita_prod () {} -}; - - -class TCRP_line : public TSortable -{ - TString8 _lineap, _imp; - TString _desc; - bool _on_sheet; - - TArray _bucket; - - -protected: - virtual int compare(const TSortable& s) const; - TCapacita_prod& bucket(int n) ; - TCapacita_prod& operator[](int n) - {return bucket(n);} - + // costruttore per la derivazione + TPlanning_mask(const char * name); public: - - const TString& codimp() const { return _imp; } - const TString& codlin() const { return _lineap; } - const TString& desc() const { return _desc; } - void set_desc(const char* str) { _desc = str; } + void msprow2codes(TToken_string &row, long &clifor, TCodice_articolo &art , + TString & liv, TString & mag, TString & magcoll, TString & imp, TString & lin, TString & um); + void crprow2codes(TToken_string &row, TString & imp, TString & lin, long &clifor, TCodice_articolo &art , + TString & liv, TString & um); + TMRP_line* find_propose(long codcli, const char * codart,const char * liv, + const char * codimp,const char * codlin,const char * mag, const char * magcoll, + bool Force=FALSE); + TMSP_line* find_article(long cli, const char *art, const char *liv, + const char *imp, const char *lin, const char *mag, const char *magc, + bool Force=FALSE) + {return _articles.find(cli, art, liv, imp, lin, mag, magc, Force);} - int last() const { return _bucket.last(); } - int pred(int i) const { return _bucket.pred(i); } - real& capacity(int b) { return bucket(b).capacity(); } - real& load(int b) { return bucket(b).load(); } - real& human_capacity(int b) { return bucket(b).human_capacity(); } - real& human_load(int b) { return bucket(b).human_load(); } + int days_per_bucket() const; - void set_capacity(int b,const real & v ) { bucket(b).set_capacity(v); } - void set_human_capacity(int b,const real & v ) { bucket(b).set_human_capacity(v); } -// void set_load(int b, const real & v) { bucket(b).set_load(v); } -// void set_human_capacity(int b,const real & v ) { bucket(b).set_human_capacity(v); } -// void set_human_load(int b, const real & v) { bucket(b).set_human_load(v); } + int round_date(TDate& date, bool up = FALSE) const; + void round_field(TMask_field& fld, bool up) const; -// void add_capacity(int b,const real & v ) { bucket(b).add_capacity(v); } - void add_load(int b, const real & v) { bucket(b).add_load(v); } -// void add_human_capacity(int b,const real & v ) { bucket(b).add_human_capacity(v); } - void add_human_load(int b, const real & v) { bucket(b).add_human_load(v); } + int test_codnum(const TCodice_numerazione& num) const; + bool test_tipodoc_num( const TSheet_field &sheet_num , const TSheet_field &sheet_type) ; - void fill_capacity_row(TToken_string& row, bool percent=FALSE); - void fill_load_row(TToken_string& row, bool percent=FALSE); - void fill_hcapacity_row(TToken_string& row, bool percent=FALSE); - void fill_hload_row(TToken_string& row, bool percent=FALSE); + int test_status(const TRectype& doc, int tipo) const; + bool has_confirmed_status(const TRectype& doc, TToken_string &riga) const; + bool has_confirmed_status(const TRectype &doc) const; - bool is_on_sheet() const { return _on_sheet; } - void set_on_sheet(bool on = TRUE) { _on_sheet = on; } + bool elabora(); + bool carica_documenti(); + int salva_documenti(); - //TCRP_line(const TString& codlin); - TCRP_line(const TString& codimp,const TString& codlin); - virtual ~TCRP_line() { } + void init(); + TPlanning_mask(); + virtual ~TPlanning_mask() { } }; -class TCRP_lines : public TMRP_array +class TPlanning_app : public TSkeleton_application { + TPlanning_mask *_m; protected: - virtual TSortable* new_obj(const TToken_string& key) const; - -public: - TCRP_line* find(const TLinea_prod& linea_prod, - const char * codart="", long codcli=0L, bool create=FALSE); - TCRP_line* find(const char * codimp="", const char * codlin="", - const char * codart="", long codcli=0L, bool create=FALSE); - TCRP_line& operator[](long n) const - { return (TCRP_line&)find_obj(n); } + void openfiles() ; + virtual TPlanning_mask& mask() {return *_m;} + virtual bool create(); + virtual void main_loop(); + virtual bool firm_change_enabled() const { return FALSE; } }; -class TPlan_docs : public TMRP_array -{ - TString16 _num, _doc, _rig; - -protected: - virtual TSortable* new_obj(const TToken_string& key) const; - -public: - TDocumento& find(int anno, long num); - - TRiga_documento& add_to_row(int anno, long num, int riga, const real& qta); - long flush(const TDate& data); - - TPlan_docs(const char* num, const char* tip, const char* rig); - virtual ~TPlan_docs() { } -}; diff --git a/mr/mr2200a.h b/mr/mr2200a.h index 0222e2e82..164cc0544 100755 --- a/mr/mr2200a.h +++ b/mr/mr2200a.h @@ -4,9 +4,12 @@ #define G_POSTPROCESS 2 #define G_MASTERSCHEDULE 6 #define G_NOMASTERSCHEDULE 7 +#define G_BUCKET_DEF 8 +#define G_BUCKET_WEEK 9 #define G_FIRSTFIT 10 #define G_INFINITE 20 #define G_FINITE 30 +#define G_FINITE_H 35 #define G_QTA 40 #define G_VALORI 41 @@ -40,11 +43,11 @@ #define F_HUMANCHECK_CRP 222 #define F_2LEVEL_MSP 223 #define F_2LEVEL_PRIORITY 224 -//#define F_??? 225 +#define F_EXTRACAPACITY 225 #define F_SHOWPERC 226 -#define F_SHOWPERC2 227 +#define F_SHOWDETAILS 227 #define F_LOADTYPE 228 -//#define F_??? 229 +#define F_EXTRAHCAPACITY 229 #define F_USENONSTDLIN_MSP 230 #define F_USEEXTRAHRS_MSP 231 @@ -59,8 +62,8 @@ #define F_ANTICIPOMIN 240 #define F_OUTOFCAPACITY 241 #define F_MAXGIORNIGIAC 242 -//#define F_??? 243 -//#define F_??? 244 +#define F_ANTICIPOMAX2 243 +#define F_ANTICIPOMIN2 244 //#define F_??? 245 #define F_RECALC_TYPE2 246 @@ -94,7 +97,8 @@ #define F_BUCKET 350 #define F_BUCKETS 351 #define F_DAYXBUCK 352 - +#define F_LASTWRKDAY 353 +#define H_BUCKET 354 // non profiled fields : nenumber freely #define F_ARTICOLI 401 @@ -120,6 +124,7 @@ #define F_DESCTIPO 102 #define F_DASTATO 103 #define F_ASTATO 104 +#define F_STATODEF 105 // sheet articoli #define LAST_BUCKET 13 @@ -138,44 +143,49 @@ #define F_CODLIN 111 #define F_MAGAZZINO 112 #define F_DEPOSITO 113 -#define F_UM 114 -#define F_BUCKET0 115 -#define F_BUCKET0_V 116 -#define F_BUCKET1 117 -#define F_BUCKET1_V 118 -#define F_BUCKET2 119 -#define F_BUCKET2_V 120 -#define F_BUCKET3 121 -#define F_BUCKET3_V 122 -#define F_BUCKET4 123 -#define F_BUCKET4_V 124 -#define F_BUCKET5 125 -#define F_BUCKET5_V 126 -#define F_BUCKET6 127 -#define F_BUCKET6_V 128 -#define F_BUCKET7 129 -#define F_BUCKET7_V 130 -#define F_BUCKET8 131 -#define F_BUCKET8_V 132 -#define F_BUCKET9 133 -#define F_BUCKET9_V 134 -#define F_BUCKET10 135 -#define F_BUCKET10_V 136 -#define F_BUCKET11 137 -#define F_BUCKET11_V 138 -#define F_BUCKET12 139 -#define F_BUCKET12_V 140 -#define F_BUCKET13 141 -#define F_BUCKET13_V 142 -#define F_MASTERCODE 143 -#define F_SORTCODIMP 144 -#define F_SORTCODLIN 145 +#define F_MAG_COLL 114 +#define F_DEP_COLL 115 +#define F_UM 116 +#define F_BUCKET0 117 +#define F_BUCKET0_V 118 +#define F_BUCKET1 119 +#define F_BUCKET1_V 120 +#define F_BUCKET2 121 +#define F_BUCKET2_V 122 +#define F_BUCKET3 123 +#define F_BUCKET3_V 124 +#define F_BUCKET4 125 +#define F_BUCKET4_V 126 +#define F_BUCKET5 127 +#define F_BUCKET5_V 128 +#define F_BUCKET6 129 +#define F_BUCKET6_V 130 +#define F_BUCKET7 131 +#define F_BUCKET7_V 132 +#define F_BUCKET8 133 +#define F_BUCKET8_V 134 +#define F_BUCKET9 135 +#define F_BUCKET9_V 136 +#define F_BUCKET10 137 +#define F_BUCKET10_V 138 +#define F_BUCKET11 139 +#define F_BUCKET11_V 140 +#define F_BUCKET12 141 +#define F_BUCKET12_V 142 +#define F_BUCKET13 143 +#define F_BUCKET13_V 144 +#define F_MASTERCODE 145 +#define F_SORTCODIMP 146 +#define F_SORTCODLIN 147 +#define H_CODIMP 150 #define F_DESCCLI 151 -#define F_DESCIMP 158 -#define F_DESCLIN 159 -#define F_DESCMAG 160 -#define H_CODIMP 161 +#define F_DESCIMP 152 +#define F_DESCLIN 153 +#define F_DESCMAG 154 +#define F_DESCMAGCOLL 155 +#define F_DETTAGLIO_IN 160 +#define F_DETTAGLIO_OUT 161 // sheet linee #define F_CODIMPCRP 101 diff --git a/mr/mr2200a.uml b/mr/mr2200a.uml index a104113ec..b88b13259 100755 --- a/mr/mr2200a.uml +++ b/mr/mr2200a.uml @@ -1,24 +1,24 @@ -#include "mr2200a.h" +#include "mr2200a.h" #include "mr2url.h" -TOOLBAR "" 0 18 -1 -1 +TOOLBAR "" 0 19 -1 -1 STRING DLG_PROFILE 50 BEGIN - PROMPT 16 -4 "Profilo " + PROMPT 9 -3 "Profilo " PSELECT END BUTTON DLG_ELABORA 10 2 BEGIN - PROMPT -16 -3 "~Elabora" + PROMPT -16 -1 "~Elabora" PICTURE BMP_ELABORA END BUTTON F_CHECK 10 2 BEGIN - PROMPT -16 -1 "Controlla" + PROMPT -26 -1 "Controlla" PICTURE USER_BMP_CHECK GROUP G_POSTPROCESS FLAGS "D" @@ -26,7 +26,7 @@ END BUTTON F_PRINT 10 2 BEGIN - PROMPT -26 -1 "Stampa" + PROMPT -36 -1 "Stampa" PICTURE BMP_PRINT GROUP G_POSTPROCESS FLAGS "D" @@ -34,20 +34,19 @@ END BUTTON DLG_SAVEREC 10 2 BEGIN - PROMPT -36 -1 "~Registra" + PROMPT -46 -1 "~Registra" PICTURE BMP_SAVEREC PICTURE BMP_SAVERECDN FLAGS "D" GROUP G_POSTPROCESS END - -BUTTON DLG_EDIT 10 2 +/*BUTTON DLG_EDIT 10 2 BEGIN PROMPT -46 -1 "Edit" MESSAGE RUN,ve0,-1 PICTURE BMP_EDIT -END +END*/ BUTTON DLG_CANCEL 10 2 BEGIN @@ -73,7 +72,7 @@ END DATE F_DADATA BEGIN - PROMPT 2 5 "Dalla data " + PROMPT 2 5 "Dalla data " CHECKTYPE REQUIRED GROUP G_PREPROCESS END @@ -89,53 +88,65 @@ END LIST F_BUCKETS 1 15 BEGIN - PROMPT 2 7 "Bucket temporale " + PROMPT 2 7 "Intervalli di " ITEM "1|1 Settimana" - MESSAGE DISABLE,F_BUCKET|COPY,F_BUCKET|"7",F_DAYXBUCK + MESSAGE SHOW,G_BUCKET_WEEK@|HIDE,G_BUCKET_DEF@|COPY,F_BUCKET|"7",F_DAYXBUCK ITEM "2|2 Settimane" - MESSAGE DISABLE,F_BUCKET|COPY,F_BUCKET|"7",F_DAYXBUCK + MESSAGE SHOW,G_BUCKET_WEEK@|HIDE,G_BUCKET_DEF@|COPY,F_BUCKET|"7",F_DAYXBUCK ITEM "4|1 Mese" - MESSAGE DISABLE,F_BUCKET|COPY,F_BUCKET|"7",F_DAYXBUCK + MESSAGE SHOW,G_BUCKET_WEEK@|HIDE,G_BUCKET_DEF@|COPY,F_BUCKET|"7",F_DAYXBUCK ITEM "8|2 Mese" - MESSAGE DISABLE,F_BUCKET|COPY,F_BUCKET|"7",F_DAYXBUCK + MESSAGE SHOW,G_BUCKET_WEEK@|HIDE,G_BUCKET_DEF@|COPY,F_BUCKET|"7",F_DAYXBUCK ITEM "13|3 Mesi" - MESSAGE DISABLE,F_BUCKET|COPY,F_BUCKET|"7",F_DAYXBUCK + MESSAGE SHOW,G_BUCKET_WEEK@|HIDE,G_BUCKET_DEF@|COPY,F_BUCKET|"7",F_DAYXBUCK ITEM "17|4 Mesi" - MESSAGE DISABLE,F_BUCKET|COPY,F_BUCKET|"7",F_DAYXBUCK + MESSAGE SHOW,G_BUCKET_WEEK@|HIDE,G_BUCKET_DEF@|COPY,F_BUCKET|"7",F_DAYXBUCK ITEM "26|6 Mesi" - MESSAGE DISABLE,F_BUCKET|COPY,F_BUCKET|"7",F_DAYXBUCK + MESSAGE SHOW,G_BUCKET_WEEK@|HIDE,G_BUCKET_DEF@|COPY,F_BUCKET|"7",F_DAYXBUCK ITEM "52|1 Anno" - MESSAGE DISABLE,F_BUCKET|COPY,F_BUCKET|"7",F_DAYXBUCK - ITEM " |Settimane" - MESSAGE ENABLE,F_BUCKET|"7",F_DAYXBUCK + MESSAGE SHOW,G_BUCKET_WEEK@|HIDE,G_BUCKET_DEF@|COPY,F_BUCKET|"7",F_DAYXBUCK + ITEM " | " + MESSAGE SHOW,G_BUCKET_WEEK@|SHOW,G_BUCKET_DEF@|"7",F_DAYXBUCK ITEM "0|1 Giorno" - MESSAGE DISABLE,F_BUCKET|"1",F_BUCKET|"1",F_DAYXBUCK + MESSAGE HIDE,G_BUCKET_WEEK@|HIDE,G_BUCKET_DEF@|"1",F_BUCKET|"1",F_DAYXBUCK GROUP G_PREPROCESS END -LIST F_DAYXBUCK 1 9 +NUMBER H_BUCKET 2 BEGIN - PROMPT 45 7 "" + PROMPT 35 7 "= " FLAGS "D" - ITEM "7|Settimane" - ITEM "1|Giorni " + GROUP G_BUCKET_WEEK END - NUMBER F_BUCKET 2 BEGIN - PROMPT 58 7 "" - FLAGS "U" + PROMPT 35 7 "= " + FLAGS "GU" CHECKTYPE REQUIRED - GROUP G_PREPROCESS + MESSAGE COPY,H_BUCKET + GROUP G_PREPROCESS G_BUCKET_DEF +END +LIST F_DAYXBUCK 1 9 +BEGIN + PROMPT 42 7 "" + ITEM "1|giorni" + ITEM "7|settimane" + FLAGS "D" + GROUP G_BUCKET_WEEK END -BOOL F_SHOW_WEEK + +LIST F_LASTWRKDAY 1 9 BEGIN - PROMPT 2 9 "N.settimana sulle intestazioni" - GROUP G_PREPROCESS + PROMPT 56 7 "Ordini al " + ITEM "2|Venerdi" + ITEM "1|Sabato" + ITEM "0|Domenica" + GROUP G_BUCKET_WEEK G_PREPROCESS END + TEXT DLG_NULL BEGIN PROMPT 32 10 "@bInput" @@ -194,21 +205,6 @@ BEGIN GROUP G_PREPROCESS END - -BOOL F_2LEVEL_MSP -BEGIN - PROMPT 2 16 "Scheduling a due livelli" - MESSAGE TRUE SHOW,F_2LEVEL_PRIORITY - MESSAGE FALSE HIDE,F_2LEVEL_PRIORITY - GROUP G_PREPROCESS -END -NUMBER F_2LEVEL_PRIORITY 4 -BEGIN - PROMPT 32 16 "con priorita " - GROUP G_PREPROCESS -END - - ENDPAGE PAGE "Elabora" -1 -1 80 19 @@ -216,11 +212,24 @@ PAGE "Elabora" -1 -1 80 19 BOOL F_MSCHEDULEPLAN BEGIN PROMPT 1 1 "Crea il Master Schedule Plan" - MESSAGE TRUE SHOW,G_MASTERSCHEDULE@|HIDE,G_NOMASTERSCHEDULE@ - MESSAGE FALSE SHOW,G_NOMASTERSCHEDULE@|HIDE,G_MASTERSCHEDULE@ - GROUP G_PREPROCESS + MESSAGE TRUE SHOW,G_MASTERSCHEDULE@|HIDE,G_NOMASTERSCHEDULE@|"C",F_TIPOCF|DISABLE,F_TIPOCF + MESSAGE FALSE SHOW,G_NOMASTERSCHEDULE@|HIDE,G_MASTERSCHEDULE@|ENABLE,F_TIPOCF + FLAGS "HG" + DEFAULT NONE END +BOOL F_2LEVEL_MSP +BEGIN + PROMPT 1 1 "Pianificazione a due livelli" + MESSAGE TRUE SHOW,F_2LEVEL_PRIORITY + MESSAGE FALSE HIDE,F_2LEVEL_PRIORITY + GROUP G_PREPROCESS G_MASTERSCHEDULE +END +NUMBER F_2LEVEL_PRIORITY 4 +BEGIN + PROMPT 34 1 "con priorita " + GROUP G_PREPROCESS G_MASTERSCHEDULE +END TEXT DLG_NULL BEGIN @@ -229,7 +238,7 @@ BEGIN END TEXT DLG_NULL BEGIN - PROMPT 2 2 "@bOrdini in input" + PROMPT 2 2 "@bVincoli da soddisfare" GROUP G_NOMASTERSCHEDULE END @@ -249,7 +258,7 @@ BEGIN GROUP G_PREPROCESS END -SPREADSHEET F_TIPI_ORC 56 5 +SPREADSHEET F_TIPI_ORC 56 5 BEGIN PROMPT 20 3 "" ITEM "Tipo@4" @@ -266,7 +275,7 @@ BEGIN END TEXT DLG_NULL BEGIN - PROMPT 2 9 "@bOrdini di output" + PROMPT 2 9 "@bOrdini da pianificare" GROUP G_NOMASTERSCHEDULE END @@ -284,62 +293,10 @@ BEGIN ITEM "Descrizione@30" ITEM "Da stato" ITEM "A stato" + ITEM "Stato def." GROUP G_PREPROCESS END -TEXT DLG_NULL -BEGIN - PROMPT 2 16 "@bSchedule Plan" - GROUP G_MASTERSCHEDULE -END -TEXT DLG_NULL -BEGIN - PROMPT 2 16 "@bOrdini generati" - GROUP G_NOMASTERSCHEDULE -END - -STRING F_NUM_PLAN 4 -BEGIN - PROMPT 27 16 "Numerazione " - FLAGS "U" - USE %NUM - INPUT CODTAB F_NUM_PLAN - DISPLAY "Codice" CODTAB - DISPLAY "Descrizione@30" S0 - OUTPUT F_NUM_PLAN CODTAB - CHECKTYPE REQUIRED - GROUP G_PREPROCESS - ADD NONE -END - -STRING F_TIPO_PLAN 4 -BEGIN - PROMPT 50 16 "Tipo " - FLAGS "U" - USE %TIP - INPUT CODTAB F_TIPO_PLAN - DISPLAY "Codice" CODTAB - DISPLAY "Descrizione@30" S0 - OUTPUT F_TIPO_PLAN CODTAB - CHECKTYPE REQUIRED - GROUP G_PREPROCESS - ADD NONE -END - -STRING F_RIGA_PLAN 4 -BEGIN - PROMPT 66 16 "Riga " - FLAGS "U" - USE %TRI SELECT S7=="M" - INPUT CODTAB F_RIGA_PLAN - DISPLAY "Codice" CODTAB - DISPLAY "Descrizione@30" S0 - OUTPUT F_RIGA_PLAN CODTAB - CHECKTYPE REQUIRED - GROUP G_PREPROCESS - ADD NONE -END - LIST F_TIPOCV 10 BEGIN GROUP G_PREPROCESS @@ -387,6 +344,234 @@ BEGIN CHECKTYPE REQUIRED END +ENDPAGE + + +PAGE "Genera" -1 -1 78 20 +GROUPBOX DLG_NULL 78 7 +BEGIN + PROMPT 1 1 "@b Ricalcolo" +END + +LIST F_RECALC_TYPE 35 +BEGIN + PROMPT 2 2 "Logica propositiva " + ITEM "1|FirstFit " + MESSAGE ENABLE,G_FINITE@ + MESSAGE COPY,F_RECALC_TYPE2 + ITEM "1_INF|FirstFit (capacita' infinite) " + MESSAGE DISABLE,G_FINITE@ + MESSAGE COPY,F_RECALC_TYPE2 + ITEM "1_INFH|FirstFit (capacita' umane infinite)" + MESSAGE ENABLE,G_FINITE@ + MESSAGE COPY,F_RECALC_TYPE2 + ITEM "JIT|JustInTime " + MESSAGE ENABLE,G_FINITE@ + MESSAGE COPY,F_RECALC_TYPE2 + ITEM "JIT_INF|JustInTime (capacita' infinite)" + MESSAGE DISABLE,G_FINITE@ + MESSAGE COPY,F_RECALC_TYPE2 + ITEM "JIT_INFH|JustInTime (capacita umane infin.)" + MESSAGE ENABLE,G_FINITE@ + MESSAGE COPY,F_RECALC_TYPE2 +END + +BOOL F_LOTSIZING +BEGIN + PROMPT 2 3 "Ridimensiona in base ai lotti" +END + +BOOL F_OUTOFCAPACITY +BEGIN + FLAGS "D" + PROMPT 2 4 "Elimina gli out-of-capacity" +END + +NUMBER F_EXTRACAPACITY 2 +BEGIN + PROMPT 42 3 "Capacita' macchina extra (%)" + GROUP G_FINITE +END + +NUMBER F_EXTRAHCAPACITY 2 +BEGIN + PROMPT 42 4 "Capacita' umana extra (%) " + GROUP G_FINITE +END + + +//BOOL F_HUMANCHECK_MSP +//BEGIN +// PROMPT 46 2 "Risorse umane limitate" +// GROUP G_FINITE +//END + +NUMBER F_ANTICIPOMIN 3 +BEGIN + PROMPT 2 5 "Anticipo minimo " + FLAGS "U" +END +NUMBER F_ANTICIPOMAX 3 +BEGIN + PROMPT 2 6 "Anticipo massimo " +END + +NUMBER F_ANTICIPOMIN2 3 +BEGIN + PROMPT 42 5 "(articoli non Master) " + FLAGS "U" +END +NUMBER F_ANTICIPOMAX2 3 +BEGIN + PROMPT 42 6 "(articoli non Master) " +END + +TEXT DLG_NULL +BEGIN + PROMPT 25 5 "giorni" +END +TEXT DLG_NULL +BEGIN + PROMPT 25 6 "giorni" +END + + +NUMBER F_MAXGIORNIGIAC 3 +BEGIN + PROMPT 2 8 "Massima permanenza in giacenza " +END + +TEXT DLG_NULL +BEGIN + PROMPT 39 8 "giorni" +END + +BOOL F_USENONSTDLIN_MSP +BEGIN + PROMPT 2 9 "Abilita linee non standard" +END + +BOOL F_USEEXTRAHRS_MSP +BEGIN + PROMPT 2 10 "Abilita turni straordinari" +END + +GROUPBOX DLG_NULL 78 7 +BEGIN + PROMPT 1 11 "@b Registrazione" +END + +BOOLEAN F_NUMBERBYCLI +BEGIN + PROMPT 2 12 "Numera gli ordini per cliente" + GROUP G_PREPROCESS +END + + +TEXT DLG_NULL +BEGIN + PROMPT 2 13 "Numerazione " +END +TEXT DLG_NULL +BEGIN + PROMPT 14 13 "Schedule Plan" + GROUP G_MASTERSCHEDULE +END +TEXT DLG_NULL +BEGIN + PROMPT 14 13 "da generare " + GROUP G_NOMASTERSCHEDULE +END + +STRING F_NUM_PLAN 4 +BEGIN + PROMPT 31 13 "" + FLAGS "U" + USE %NUM + INPUT CODTAB F_NUM_PLAN + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@30" S0 + OUTPUT F_NUM_PLAN CODTAB + CHECKTYPE REQUIRED +// GROUP G_PREPROCESS + ADD NONE +END + +STRING F_TIPO_PLAN 4 +BEGIN + PROMPT 39 13 "tipo " + FLAGS "U" + USE %TIP + INPUT CODTAB F_TIPO_PLAN + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@30" S0 + OUTPUT F_TIPO_PLAN CODTAB + CHECKTYPE REQUIRED +// GROUP G_PREPROCESS + ADD NONE +END + +STRING F_RIGA_PLAN 4 +BEGIN + PROMPT 52 13 "tipo riga " + FLAGS "U" + USE %TRI SELECT S7=="M" + INPUT CODTAB F_RIGA_PLAN + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@30" S0 + OUTPUT F_RIGA_PLAN CODTAB + CHECKTYPE REQUIRED +// GROUP G_PREPROCESS + ADD NONE +END + +STRING F_DA_IMPIANTO 5 +BEGIN + FLAGS "U" + PROMPT 2 14 "Dall'impianto " + USE IMP + INPUT CODTAB F_DA_IMPIANTO + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_DA_IMPIANTO CODTAB + CHECKTYPE NORMAL +END +STRING F_A_IMPIANTO 5 +BEGIN + FLAGS "U" + PROMPT 2 15 " all'impianto " + COPY USE F_DA_IMPIANTO + INPUT CODTAB F_A_IMPIANTO + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_A_IMPIANTO CODTAB + CHECKTYPE NORMAL +END + +STRING F_DA_MAGAZZ 3 +BEGIN + FLAGS "U" + PROMPT 24 14 "Dal magazzino " + USE MAG SELECT CODTAB[4,5]="" + INPUT CODTAB F_DA_MAGAZZ + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_DA_MAGAZZ CODTAB + CHECKTYPE NORMAL +END +STRING F_A_MAGAZZ 3 +BEGIN + FLAGS "U" + PROMPT 24 15 " al magazzino " + COPY USE F_DA_MAGAZZ + INPUT CODTAB F_A_MAGAZZ + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_A_MAGAZZ CODTAB + CHECKTYPE NORMAL +END + + ENDPAGE PAGE "M.S.P." -1 -1 78 20 @@ -404,16 +589,16 @@ PAGE "M.S.P." -1 -1 78 20 // PROMPT 2 1 "Logica di proposta:" //END -LIST F_RECALC_TYPE2 30 +LIST F_RECALC_TYPE2 19 BEGIN FLAGS "D" PROMPT 2 1 "Proposte " - ITEM "1|FirstFit " - ITEM "1_INF|FirstFit (capac. infinite) " - ITEM "1_INFH|FirstFit (capac. umane inf.) " - ITEM "JIT|JustInTime " - ITEM "JIT_INF|JustInTime (capac. infinite) " - ITEM "JIT_INFH|JustInTime (capac. umane inf.)" + ITEM "1|FirstFit " + ITEM "1_INF|FirstFit cap.inf. " + ITEM "1_INFH|FirstFit c.u.inf. " + ITEM "JIT|JustInTime " + ITEM "JIT_INF|JustInTime cap.inf." + ITEM "JIT_INFH|JustInTime c.u.inf." END BUTTON F_CANCEL_MSP 9 2 @@ -424,7 +609,7 @@ END BUTTON F_RECALC_MSP 9 2 BEGIN - PROMPT 64 1 "Ricalcola" + PROMPT 68 1 "Ricalcola" PICTURE BMP_RECALC END @@ -457,7 +642,7 @@ END BUTTON F_MSP_RESORT 9 BEGIN - PROMPT 64 3 "Riordina" + PROMPT 68 3 "Riordina" END //BUTTON F_CHECK_MSP 9 2 @@ -474,12 +659,17 @@ END // GROUP G_POSTPROCESS //END +BOOL F_SHOW_WEEK +BEGIN + PROMPT 42 5 "Mostra settimana" +END BOOL F_SHOWPRICES BEGIN - PROMPT 56 5 "Mostra prezzi" + PROMPT 64 5 "Mostra prezzi" END + TEXT DLG_NULL BEGIN PROMPT 2 5 "@bMaster Schedule Plan" @@ -508,6 +698,8 @@ BEGIN ITEM "Linea" ITEM "Mag@3" ITEM "Dep@2" + ITEM "Mag.c@3" + ITEM "Dep.c@2" ITEM "UM." ITEM "Bucket0" ITEM "Bucket0" @@ -541,155 +733,6 @@ BEGIN DEFAULT NONE END -ENDPAGE - -PAGE "Genera" -1 -1 78 20 -GROUPBOX DLG_NULL 78 7 -BEGIN - PROMPT 1 1 "@b Ricalcolo" -END - -LIST F_RECALC_TYPE 35 -BEGIN - PROMPT 2 2 "Logica propositiva " - ITEM "1|FirstFit " - MESSAGE ENABLE,G_FINITE@ - MESSAGE COPY,F_RECALC_TYPE2 - ITEM "1_INF|FirstFit (capacita' infinite) " - MESSAGE DISABLE,G_FINITE@ - MESSAGE COPY,F_RECALC_TYPE2 - ITEM "1_INFH|FirstFit (capacita' umane infinite)" - MESSAGE DISABLE,G_FINITE@ - MESSAGE COPY,F_RECALC_TYPE2 - ITEM "JIT|JustInTime " - MESSAGE ENABLE,G_FINITE@ - MESSAGE COPY,F_RECALC_TYPE2 - ITEM "JIT_INF|JustInTime (capacita' infinite)" - MESSAGE DISABLE,G_FINITE@ - MESSAGE COPY,F_RECALC_TYPE2 - ITEM "JIT_INFH|JustInTime (capacita umane infin.)" - MESSAGE DISABLE,G_FINITE@ - MESSAGE COPY,F_RECALC_TYPE2 -END - -BOOL F_LOTSIZING -BEGIN - PROMPT 2 3 "Ridimensiona in base ai lotti" -END - -BOOL F_OUTOFCAPACITY -BEGIN - FLAGS "D" - PROMPT 2 4 "Elimina gli out-of-capacity" -END - - -//BOOL F_HUMANCHECK_MSP -//BEGIN -// PROMPT 46 2 "Risorse umane limitate" -// GROUP G_FINITE -//END - -NUMBER F_ANTICIPOMIN 3 -BEGIN - PROMPT 2 5 "Anticipo minimo " - FLAGS "U" -END -NUMBER F_ANTICIPOMAX 3 -BEGIN - PROMPT 2 6 "Anticipo massimo " -END -TEXT DLG_NULL -BEGIN - PROMPT 25 5 "giorni" -END -TEXT DLG_NULL -BEGIN - PROMPT 25 6 "giorni" -END - - -NUMBER F_MAXGIORNIGIAC 3 -BEGIN - PROMPT 2 8 "Massima permanenza in giacenza " -END - -TEXT DLG_NULL -BEGIN - PROMPT 39 8 "giorni" -END - -BOOL F_USENONSTDLIN_MSP -BEGIN - PROMPT 2 9 "Abilita linee non standard" -END - -BOOL F_USEEXTRAHRS_MSP -BEGIN - PROMPT 2 10 "Abilita turni straordinari" -END - -GROUPBOX DLG_NULL 78 6 -BEGIN - PROMPT 1 11 "@b Registrazione" -END - -BOOLEAN F_NUMBERBYCLI -BEGIN - PROMPT 2 12 "Numera gli ordini per cliente" - GROUP G_PREPROCESS -END - - - -STRING F_DA_IMPIANTO 5 -BEGIN - FLAGS "U" - PROMPT 2 13 "Dall'impianto " - USE IMP - INPUT CODTAB F_DA_IMPIANTO - DISPLAY "Codice" CODTAB - DISPLAY "Descrizione@50" S0 - OUTPUT F_DA_IMPIANTO CODTAB - CHECKTYPE NORMAL -END -STRING F_A_IMPIANTO 5 -BEGIN - FLAGS "U" - PROMPT 26 13 "all'impianto " - COPY USE F_DA_IMPIANTO - INPUT CODTAB F_A_IMPIANTO - DISPLAY "Codice" CODTAB - DISPLAY "Descrizione@50" S0 - OUTPUT F_A_IMPIANTO CODTAB - CHECKTYPE NORMAL -END - -STRING F_DA_MAGAZZ 3 -BEGIN - FLAGS "U" - PROMPT 2 14 "Dal magazzino " - USE MAG SELECT CODTAB[4,5]="" - INPUT CODTAB F_DA_MAGAZZ - DISPLAY "Codice" CODTAB - DISPLAY "Descrizione@50" S0 - OUTPUT F_DA_MAGAZZ CODTAB - CHECKTYPE NORMAL -END -STRING F_A_MAGAZZ 3 -BEGIN - FLAGS "U" - PROMPT 26 14 "al magazzino " - COPY USE F_DA_MAGAZZ - INPUT CODTAB F_A_MAGAZZ - DISPLAY "Codice" CODTAB - DISPLAY "Descrizione@50" S0 - OUTPUT F_A_MAGAZZ CODTAB - CHECKTYPE NORMAL -END - - - ENDPAGE PAGE "C.R.P." -1 -1 78 20 @@ -713,15 +756,9 @@ BEGIN PROMPT 30 1 "Turni straordinari" END -BUTTON F_RECALC_CRP 9 2 -BEGIN - PROMPT 64 1 "~Ricalcola" - PICTURE BMP_RECALC -END - LIST F_CRP_SORT 23 BEGIN - FLAGS "D" + FLAGS "HD" PROMPT 2 3 "Ordina per " ITEM "ILA|Impianto+Linea+Articolo" ITEM "AIL|Articolo+Impianto+Linea" @@ -730,13 +767,13 @@ END BOOL F_CRP_SORT_ORDER BEGIN - FLAGS "D" + FLAGS "HD" PROMPT 42 3 "inverso" END BUTTON F_CRP_RESORT 9 1 BEGIN - FLAGS "D" + FLAGS "HD" PROMPT 64 3 "Riordina" END @@ -750,24 +787,28 @@ END LIST F_LOADTYPE 20 BEGIN - PROMPT 2 5 "" + PROMPT 2 3 "" ITEM "M|Carico macchina" ITEM "H|Carico uomo" END +BOOL F_SHOWDETAILS +BEGIN + PROMPT 36 3 "Mostra dettaglio" +END BOOL F_SHOWPERC BEGIN - PROMPT 56 5 "Mostra percentuali" + PROMPT 56 3 "Mostra percentuali" END SPREADSHEET F_LINEE BEGIN FLAG "D" - PROMPT 0 6 "" + PROMPT 0 4 "" ITEM "Impianto@F6" ITEM "Linea@F6" - ITEM "Articolo@20" + ITEM "Articolo@F20" ITEM "UM" ITEM "Bucket0" ITEM "Bucket1" @@ -882,7 +923,7 @@ PAGE "Ordini clienti" -1 -1 70 10 STRING F_TIPO 4 BEGIN - PROMPT 1 2 "Tipo " + PROMPT 1 1 "Tipo " FLAGS "U" USE %TIP INPUT CODTAB F_TIPO @@ -896,7 +937,7 @@ END STRING F_DESCTIPO 50 BEGIN - PROMPT 26 2 "" + PROMPT 1 2 "Descrizione " USE %TIP KEY 2 INPUT S0 F_DESCTIPO DISPLAY "Descrizione@70" S0 @@ -906,9 +947,9 @@ BEGIN ADD NONE END -NUMBER F_DASTATO 1 +STRING F_DASTATO 1 BEGIN - PROMPT 1 3 "Da stato " + PROMPT 1 3 "Da stato " USE %STD INPUT CODTAB F_DASTATO DISPLAY "Stato" CODTAB @@ -918,9 +959,10 @@ BEGIN ADD NONE END -NUMBER F_ASTATO 1 + +STRING F_ASTATO 1 BEGIN - PROMPT 16 3 "A stato " + PROMPT 1 4 "A stato " COPY USE F_DASTATO INPUT CODTAB F_ASTATO COPY DISPLAY F_DASTATO @@ -929,7 +971,6 @@ BEGIN ADD NONE END - BUTTON DLG_OK 10 2 BEGIN PROMPT -13 -1 "" @@ -966,7 +1007,7 @@ END STRING F_DESCNUMERAZ 50 BEGIN - PROMPT 26 1 "" + PROMPT 1 2 "Descrizione " USE %NUM KEY 2 INPUT S0 F_DESCNUMERAZ DISPLAY "Descrizione@70" S0 @@ -996,12 +1037,11 @@ ENDPAGE ENDMASK - PAGE "Ordini planning" -1 -1 70 10 STRING F_TIPO 4 BEGIN - PROMPT 1 2 "Tipo " + PROMPT 1 1 "Tipo " FLAGS "U" USE %TIP INPUT CODTAB F_TIPO @@ -1015,7 +1055,7 @@ END STRING F_DESCTIPO 50 BEGIN - PROMPT 26 2 "" + PROMPT 1 2 "Descrizione " USE %TIP KEY 2 INPUT S0 F_DESCTIPO DISPLAY "Descrizione@70" S0 @@ -1025,9 +1065,9 @@ BEGIN ADD NONE END -NUMBER F_DASTATO 1 +STRING F_DASTATO 1 BEGIN - PROMPT 1 3 "Da stato " + PROMPT 1 3 "Da stato " USE %STD INPUT CODTAB F_DASTATO DISPLAY "Stato" CODTAB @@ -1037,9 +1077,9 @@ BEGIN ADD NONE END -NUMBER F_ASTATO 1 +STRING F_ASTATO 1 BEGIN - PROMPT 16 3 "A stato " + PROMPT 1 4 "A stato " COPY USE F_DASTATO INPUT CODTAB F_ASTATO COPY DISPLAY F_DASTATO @@ -1048,6 +1088,17 @@ BEGIN ADD NONE END +STRING F_STATODEF 1 +BEGIN + PROMPT 1 5 "Stato definitivo " + COPY USE F_DASTATO + INPUT CODTAB F_ASTATO + COPY DISPLAY F_DASTATO + OUTPUT F_ASTATO CODTAB + CHECKTYPE NORMAL + ADD NONE +END + BUTTON DLG_OK 10 2 BEGIN PROMPT -13 -1 "" @@ -1067,7 +1118,7 @@ ENDPAGE ENDMASK -PAGE "Articoli" -1 -1 80 18 +PAGE "Articoli" -1 -1 80 19 LIST F_TIPOCF_SHEET 9 @@ -1080,7 +1131,7 @@ END NUMBER F_CLIENTE 6 BEGIN - PROMPT 14 0 "" + PROMPT 16 0 "" USE LF_CLIFO INPUT TIPOCF F_TIPOCF_SHEET SELECT INPUT CODCF F_CLIENTE @@ -1201,6 +1252,7 @@ END STRING F_DESCIMP 50 37 BEGIN PROMPT 25 5 "" + FLAGS "D" USE IMP KEY 2 INPUT S0 F_DESCIMP DISPLAY "Descrizione@50" S0 @@ -1228,6 +1280,7 @@ END STRING F_DESCLIN 50 37 BEGIN PROMPT 25 6 "" + FLAGS "D" USE LNP KEY 2 INPUT S0 F_DESCLIN DISPLAY "Descrizione@50" S0 @@ -1264,6 +1317,44 @@ END STRING F_DESCMAG 50 37 BEGIN PROMPT 25 7 "" + FLAGS "D" + USE MAG KEY 2 + INPUT S0 F_DESCMAG + DISPLAY "Descrizione@50" S0 + DISPLAY "Magazzino" CODTAB[1,3] + DISPLAY "Deposito" CODTAB[4,5] + COPY OUTPUT F_MAGAZZINO + CHECKTYPE NORMAL +END + +STRING F_MAG_COLL 3 +BEGIN + PROMPT 1 8 "Mag.colleg. " + FLAGS "U" + USE MAG + INPUT CODTAB[1,3] F_MAG_COLL + INPUT CODTAB[4,5] F_DEP_COLL + DISPLAY "Magazzino" CODTAB[1,3] + DISPLAY "Deposito" CODTAB[4,5] + DISPLAY "Descrizione@50" S0 + OUTPUT F_MAG_COLL CODTAB[1,3] + OUTPUT F_DEP_COLL CODTAB[4,5] + OUTPUT F_DESCMAGCOLL S0 + CHECKTYPE NORMAL +END + +STRING F_DEP_COLL 2 +BEGIN + PROMPT 19 8 "" + FLAGS "U" + COPY ALL F_MAG_COLL + CHECKTYPE NORMAL +END + +STRING F_DESCMAGCOLL 50 37 +BEGIN + PROMPT 25 8 "" + FLAGS "D" USE MAG KEY 2 INPUT S0 F_DESCMAG DISPLAY "Descrizione@50" S0 @@ -1286,32 +1377,32 @@ END STRING F_UM 2 BEGIN - PROMT 1 8 "Unita' di misura " + PROMT 1 9 "Unita' di misura " FLAGS "D" END NUMBER F_BUCKET0 17 2 BEGIN - PROMPT 40 8 "0 " + PROMPT 40 9 "0 " FLAGS "DU" END NUMBER F_BUCKET0_V 15 3 BEGIN - PROMPT 62 8 "" + PROMPT 62 9 "" FLAGS "DU" END NUMBER F_BUCKET1 17 2 BEGIN - PROMPT 1 9 "1 " + PROMPT 1 10 "1 " FLAGS "U" GROUP G_QTA END NUMBER F_BUCKET1_V 15 3 BEGIN - PROMPT 22 9 "" + PROMPT 22 10 "" FLAGS "U" GROUP G_VALORI END @@ -1319,167 +1410,167 @@ END NUMBER F_BUCKET2 17 2 BEGIN - PROMPT 40 9 "2 " + PROMPT 40 10 "2 " FLAGS "U" GROUP G_QTA END NUMBER F_BUCKET2_V 15 3 BEGIN - PROMPT 62 9 "" + PROMPT 62 10 "" FLAGS "U" GROUP G_VALORI END NUMBER F_BUCKET3 17 2 BEGIN - PROMPT 1 10 "3 " + PROMPT 1 11 "3 " FLAGS "U" GROUP G_QTA END NUMBER F_BUCKET3_V 15 3 BEGIN - PROMPT 22 10 "" + PROMPT 22 11 "" FLAGS "U" GROUP G_VALORI END NUMBER F_BUCKET4 17 2 BEGIN - PROMPT 40 10 "4 " + PROMPT 40 11 "4 " FLAGS "U" GROUP G_QTA END NUMBER F_BUCKET4_V 15 3 BEGIN - PROMPT 62 10 "" + PROMPT 62 11 "" FLAGS "U" GROUP G_VALORI END NUMBER F_BUCKET5 17 2 BEGIN - PROMPT 1 11 "5 " + PROMPT 1 12 "5 " FLAGS "U" GROUP G_QTA END NUMBER F_BUCKET5_V 15 3 BEGIN - PROMPT 22 11 "" + PROMPT 22 12 "" FLAGS "U" GROUP G_VALORI END NUMBER F_BUCKET6 17 2 BEGIN - PROMPT 40 11 "6 " + PROMPT 40 12 "6 " FLAGS "U" GROUP G_QTA END NUMBER F_BUCKET6_V 15 3 BEGIN - PROMPT 62 11 "" + PROMPT 62 12 "" FLAGS "U" GROUP G_VALORI END NUMBER F_BUCKET7 17 2 BEGIN - PROMPT 1 12 "7 " + PROMPT 1 13 "7 " FLAGS "U" GROUP G_QTA END NUMBER F_BUCKET7_V 15 3 BEGIN - PROMPT 22 12 "" + PROMPT 22 13 "" FLAGS "U" GROUP G_VALORI END NUMBER F_BUCKET8 17 2 BEGIN - PROMPT 40 12 "8 " + PROMPT 40 13 "8 " FLAGS "U" GROUP G_QTA END NUMBER F_BUCKET8_V 15 3 BEGIN - PROMPT 62 12 "" + PROMPT 62 13 "" FLAGS "U" GROUP G_VALORI END NUMBER F_BUCKET9 17 2 BEGIN - PROMPT 1 13 "9 " + PROMPT 1 14 "9 " FLAGS "U" GROUP G_QTA END NUMBER F_BUCKET9_V 15 3 BEGIN - PROMPT 22 13 "" + PROMPT 22 14 "" FLAGS "U" GROUP G_VALORI END NUMBER F_BUCKET10 17 2 BEGIN - PROMPT 40 13 "10" + PROMPT 40 14 "10" FLAGS "U" GROUP G_QTA END NUMBER F_BUCKET10_V 15 3 BEGIN - PROMPT 62 13 "" + PROMPT 62 14 "" FLAGS "U" GROUP G_VALORI END NUMBER F_BUCKET11 17 2 BEGIN - PROMPT 1 14 "11" + PROMPT 1 15 "11" FLAGS "U" GROUP G_QTA END NUMBER F_BUCKET11_V 15 3 BEGIN - PROMPT 22 14 "" + PROMPT 22 15 "" FLAGS "U" GROUP G_VALORI END NUMBER F_BUCKET12 17 2 BEGIN - PROMPT 40 14 "12" - FLAGS "U" + PROMPT 40 15 "12" + FLAGS "U" GROUP G_QTA END NUMBER F_BUCKET12_V 15 3 BEGIN - PROMPT 62 14 "" + PROMPT 62 15 "" FLAGS "U" GROUP G_VALORI END NUMBER F_BUCKET13 17 2 BEGIN - PROMPT 1 15 "13" + PROMPT 1 16 "13" FLAGS "DU" END NUMBER F_BUCKET13_V 15 3 BEGIN - PROMPT 22 15 "" + PROMPT 22 16 "" FLAGS "DU" END @@ -1503,19 +1594,31 @@ END*/ BUTTON DLG_OK 10 2 BEGIN - PROMPT -13 -1 "" + PROMPT -15 -1 "" +END + +BUTTON F_DETTAGLIO_IN 10 2 +BEGIN + PROMPT -25 -1 "Dett. IN" + PICTURE USER_BMP_ORDINI_INPUT END BUTTON F_CHECKLINE 10 2 BEGIN - PROMPT -23 -1 "" - PICTURE USER_BMP_CHECK + PROMPT -35 -1 "" + PICTURE USER_BMP_CHECK PICTURE BMP_LENTE END +BUTTON F_DETTAGLIO_OUT 10 2 +BEGIN + PROMPT -45 -1 "Dett. OUT" + PICTURE USER_BMP_ORDINI_OUTPUT +END + BUTTON DLG_CANCEL 10 2 BEGIN - PROMPT -33 -1 "" + PROMPT -55 -1 "" END ENDPAGE @@ -1559,13 +1662,6 @@ STRING F_DESCIMPCRP 50 37 BEGIN PROMPT 18 2 "" FLAGS "D" -// USE IMP KEY 2 -// INPUT S0 F_DESCIMPCRP -// DISPLAY "Descrizione@50" S0 -// DISPLAY "Codice@16" CODTAB -// COPY OUTPUT F_CODIMPCRP -// CHECKTYPE NORMAL -// ADD NONE END STRING F_CODLINCRP 5 @@ -1586,36 +1682,35 @@ STRING F_DESCLINCRP 50 37 BEGIN PROMPT 18 3 "" FLAGS "D" -// USE LNP KEY 2 -// INPUT S0 F_DESCLINCRP -// DISPLAY "Codice" CODTAB -// DISPLAY "Descrizione@50" S0 -// COPY OUTPUT F_CODLINCRP -// CHECKTYPE NORMAL -// ADD NONE END STRING F_CODARTCRP 20 BEGIN - PROMPT 1 4 "" + PROMPT 1 4 "Articolo " FLAGS "" + USE LF_ANAMAG + INPUT CODART F_CODARTCRP + DISPLAY "Codice" CODART + DISPLAY "Descrizione@50" DESCR + OUTPUT F_CODARTCRP CODART + OUTPUT F_DESCARTCRP DESCR END STRING F_DESCARTCRP 50 BEGIN - PROMPT 18 4 "" + PROMPT 18 5 "" FLAGS "D" END STRING F_LUM 3 BEGIN - PROMPT 1 5 "Unita' di misura " + PROMPT 1 6 "Unita' di misura " FLAGS "DU" END NUMBER F_LBUCKET0 17 2 BEGIN - PROMPT 1 6 "0 " + PROMPT 43 6 "0 " FLAGS "DU" END diff --git a/mr/mr2201.cpp b/mr/mr2201.cpp index 36110d920..79285066c 100755 --- a/mr/mr2201.cpp +++ b/mr/mr2201.cpp @@ -1,22 +1,13 @@ -#include -#include -#include -#include -#include -#include -#include -#include - +#include #include "mrplib.h" #include "../mg/mglib.h" #include "../ve/velib.h" #include "../ve/veconf.h" #include "mr2100.h" -#include "mr2200.h" +#include "mr2201.h" #include "mr2200a.h" -#include "mr2200b.h" // albero per le ricerche sulle dist static TDistinta_tree *_dist_tree=NULL; @@ -219,59 +210,50 @@ int TRiga_articolo::order_compare( const TToken_string &r1 , const TToken_strin } else { // ordinamenti non standard short f; - short fields_ACL[] = {F_ARTICOLO, F_CLIENTE, F_SORTCODIMP, F_SORTCODLIN}; - short fields_ALC[] = {F_ARTICOLO, F_SORTCODIMP, F_SORTCODLIN, F_CLIENTE}; - short fields_LAC[] = {F_SORTCODIMP, F_SORTCODLIN, F_ARTICOLO, F_CLIENTE}; - short fields_LCA[] = {F_SORTCODIMP, F_SORTCODLIN, F_CLIENTE, F_ARTICOLO}; - short fields_CLA[] = {F_CLIENTE, F_SORTCODIMP, F_SORTCODLIN, F_ARTICOLO}; - short fields_CAL[] = {F_CLIENTE, F_ARTICOLO, F_SORTCODIMP, F_SORTCODLIN}; - short fields_CA[] = {F_CLIENTE, F_CLIENTE, F_CLIENTE, F_ARTICOLO}; - short fields_AC[] = {F_ARTICOLO, F_CLIENTE, F_CLIENTE, F_CLIENTE}; - for (int i = -1; i <= 4 && cmp == 0; i++) + short fields_ACL[] = {F_PRIORITA,F_ARTICOLO, F_CLIENTE, F_SORTCODIMP, F_SORTCODLIN,F_PRIORITA}; + short fields_ALC[] = {F_PRIORITA,F_ARTICOLO, F_SORTCODIMP, F_SORTCODLIN, F_CLIENTE,F_PRIORITA}; + short fields_LAC[] = {F_PRIORITA,F_SORTCODIMP, F_SORTCODLIN, F_ARTICOLO, F_CLIENTE,F_PRIORITA}; + short fields_LCA[] = {F_PRIORITA,F_SORTCODIMP, F_SORTCODLIN, F_CLIENTE, F_ARTICOLO,F_PRIORITA}; + short fields_CLA[] = {F_PRIORITA,F_CLIENTE, F_SORTCODIMP, F_SORTCODLIN, F_ARTICOLO,F_PRIORITA}; + short fields_CAL[] = {F_PRIORITA,F_CLIENTE, F_ARTICOLO, F_SORTCODIMP, F_SORTCODLIN,F_PRIORITA}; + short fields_CA[] = {F_PRIORITA,F_CLIENTE, F_ARTICOLO, F_PRIORITA, F_PRIORITA, F_PRIORITA}; + short fields_AC[] = {F_PRIORITA,F_ARTICOLO, F_CLIENTE, F_PRIORITA, F_PRIORITA, F_PRIORITA}; + for (int ii = 0; ii < 4 && cmp == 0; ii++) { - if (i<0 || i>3) + const int i = ii + (-level <= SORT_BY_PRIORITY ? 0 : 1); + switch (level) { - if (-level <= SORT_BY_PRIORITY == i<0) - f = F_PRIORITA; - else - f = 0; - } else - switch (level) - { - case SORT_BY_PCAL: - case SORT_BY_CAL: - f=fields_CAL[i]; break; - case SORT_BY_PCLA: - case SORT_BY_CLA: - f=fields_CLA[i]; break; - case SORT_BY_PLCA: - case SORT_BY_LCA: - f=fields_LCA[i]; break; - case SORT_BY_PLAC: - case SORT_BY_LAC: - f=fields_LAC[i]; break; - case SORT_BY_PACL: - case SORT_BY_ACL: - f=fields_ACL[i]; break; - case SORT_BY_PALC: - case SORT_BY_ALC: - f=fields_ALC[i]; break; - case SORT_BY_PAC: - case SORT_BY_AC: - f=fields_AC[i]; break; - case SORT_BY_PCA: - case SORT_BY_CA: - f=fields_CA[i]; break; - default: - NFCHECK("Ordinamento sconosciuto"); - break; - } - if (f) - { - r1.get(f-FIRST_FIELD, str0); - r2.get(f-FIRST_FIELD, str1); - cmp=TRiga_articolo::compare_field(str0,str1,f) * (ascending && f != F_PRIORITA ? 1 : -1); + case SORT_BY_PCAL: + case SORT_BY_CAL: + f=fields_CAL[i]; break; + case SORT_BY_PCLA: + case SORT_BY_CLA: + f=fields_CLA[i]; break; + case SORT_BY_PLCA: + case SORT_BY_LCA: + f=fields_LCA[i]; break; + case SORT_BY_PLAC: + case SORT_BY_LAC: + f=fields_LAC[i]; break; + case SORT_BY_PACL: + case SORT_BY_ACL: + f=fields_ACL[i]; break; + case SORT_BY_PALC: + case SORT_BY_ALC: + f=fields_ALC[i]; break; + case SORT_BY_PAC: + case SORT_BY_AC: + f=fields_AC[i]; break; + case SORT_BY_PCA: + case SORT_BY_CA: + f=fields_CA[i]; break; + default: + NFCHECK("Ordinamento sconosciuto"); + break; } + r1.get(f-FIRST_FIELD, str0); + r2.get(f-FIRST_FIELD, str1); + cmp=TRiga_articolo::compare_field(str0,str1,f) * (ascending && f != F_PRIORITA ? 1 : -1); } } return cmp; @@ -423,7 +405,7 @@ TRiga_articolo::TRiga_articolo(const TMSP_constraint& line) add(line.codlin(),F_CODLIN-FIRST_FIELD); TString8 str = line.codmag().left(3); - add(str, F_MAGAZZINO-FIRST_FIELD); + add(str,F_MAGAZZINO-FIRST_FIELD); str = line.codmag().mid(3); add(str, F_DEPOSITO-FIRST_FIELD); @@ -440,15 +422,65 @@ TRiga_articolo::TRiga_articolo(const TMSP_constraint& line) } /////////////////////////////////////////////////////////// +TRigadoc_ref::TRigadoc_ref(const char *codnum, int annodoc, long numdoc,int numrig, const real &qta, const real &prz) +{ + _codnum =codnum; + _annodoc =annodoc; + _numdoc =numdoc; + _numrig =numrig; + _qta=qta; + _prz=prz; +} +TObject* TRigadoc_ref::dup() const +{ + TRigadoc_ref* o=new TRigadoc_ref(_codnum,_annodoc,_numdoc,_numrig,_qta,_prz); + return o; +} +//////////////////// +TMSP_record::TMSP_record() : + _curr_ref(-1), _qta_locked(FALSE), _qta_min(ZERO),_qta(ZERO),_price(ZERO) +{ } + TObject* TMSP_record::dup() const { TMSP_record* o=new TMSP_record(); - o->_numdoc=_numdoc; - o->_numrig=_numrig; + o->_rigadoc_refs =_rigadoc_refs; + o->_qta_locked=_qta_locked; + o->_qta_min=_qta_min; o->_qta=_qta; o->_price=_price; return o; } +void TMSP_record::remove_rigaref() +{ + CHECK(_curr_ref>0,"Nessun riferimento a riga documento da cancellare"); + _rigadoc_refs.remove(_curr_ref-1); + if (_curr_ref>=_rigadoc_refs.items()) + _curr_ref--; +} +void TMSP_record::add_rigaref(TRigadoc_ref *r) +{ + _rigadoc_refs.add(r); + _curr_ref = _rigadoc_refs.items(); +} +TRigadoc_ref *TMSP_record::first_rigaref() +{ + _curr_ref=0; + return next_rigaref(); +} +TRigadoc_ref *TMSP_record::next_rigaref() +{ + if (_rigadoc_refs.items()<=_curr_ref) + return NULL; + return (TRigadoc_ref *)_rigadoc_refs.objptr(_curr_ref++); +} +TRigadoc_ref* TMSP_record::rigaref(int n) +{ + if (_rigadoc_refs.items()<=n) + return NULL; + return (TRigadoc_ref* )_rigadoc_refs.objptr(_curr_ref=n); +} + /////////////////////////////////////////////////////////// TMSP_record& TMSP_record_array::operator[](int b) @@ -472,58 +504,69 @@ TMSP_record_array& TMSP_record_array::operator=(const TMSP_record_array& a) /////////////////////////////////////////////////////////// - -TCapacita_prod::TCapacita_prod () : - _capacity(), _load() - { } - -TCapacita_prod::TCapacita_prod (const real& cap, const real& load) : - _capacity(cap), _load(load) -{ } - -void TCapacita_prod::set(const real& cap, const real& load) -{ _capacity=(cap);_load=(load);} - -void TCapacita_prod::copy (const TCapacita_prod & q) +TCapacity_couple::TCapacity_couple() : + _machine(ZERO), _human(ZERO) +{} +TCapacity_couple::TCapacity_couple(const real & machine, const real & human) : + _machine(machine), _human(human) +{} +TCapacity_couple& TCapacity_couple::operator= (const TCapacity_couple&c) +{ + _machine = c._machine; + _human = c._human; + return *this; +} +TCapacity_couple::TCapacity_couple(const TCapacity_couple&c) : + _machine(c._machine), _human(c._human) { - _capacity=q._capacity; // Valore attuale - _load=q._load; // Valore attuale } -int TCapacita_prod::compare(const TSortable& s) const +/////////////////////////////////////////////////////////// +TCapacity_record::TCapacity_record () : + _capacity(), _load() +{ } + +void TCapacity_record::copy(const TCapacity_record & q) { - TCapacita_prod& c=(TCapacita_prod&)s; - real r=_capacity-c._capacity; + _capacity=q._capacity; + _load=q._load; +} + +int TCapacity_record::compare(const TSortable& s) const +{ + TCapacity_record& c=(TCapacity_record&)s; + real r=_capacity.machine()-c._capacity.machine(); return r.sign(); } - -TCRP_line::TCRP_line(const TString& codimp,const TString& codlin) -: _lineap(codlin),_on_sheet(FALSE) +/////////////////////////////////////// +TCRP_line::TCRP_line(const TString& codimp,const TString& codlin,const TString& codart, long codcli) +: _lineap(codlin),_codart(codart), _codcli(codcli), _on_sheet(FALSE) { if (!codlin.blank()) { - TTable tablnp("LNP"); - tablnp.put("CODTAB",_lineap); - tablnp.read(); - _desc = tablnp.get("S0"); - _imp = tablnp.get("S6"); + const TRectype & rec = cache().get("LNP",_lineap); + _desc = rec.get("S0"); + _imp = rec.get("S6"); } else { _imp = codimp ; if (!codimp.blank()) { - TTable tabimp("IMP"); - tabimp.put("CODTAB",_imp); - tabimp.read(); - _desc = tabimp.get("S0"); + const TRectype & rec = cache().get("IMP",_imp); + _desc = rec.get("S0"); } else { _desc = "Totale ditta"; } } + if (!codart.blank()) + { + const TRectype & rec = cache().get(LF_ANAMAG,_codart); + _desc = rec.get("DESCR"); + } } int TCRP_line::compare(const TSortable& s) const @@ -531,14 +574,14 @@ int TCRP_line::compare(const TSortable& s) const const TCRP_line& c = (const TCRP_line&)s; int cmp = _imp.compare(c._imp); if (cmp == 0) - { cmp = _lineap.compare(c._lineap); - } + if (cmp == 0) + cmp = _codart.compare(c._codart); return cmp; } // carica una riga di sheet con i dati dell'oggetto vincolo -void TCRP_line::fill_capacity_row(TToken_string& row, bool percent) +void TCRP_line::fill_capacity_row(TToken_string& row, bool human, bool percent) { row.add(codimp(),F_CODIMPCRP -FIRST_FIELD); row.add(codlin(),F_CODLINCRP -FIRST_FIELD); @@ -548,24 +591,7 @@ void TCRP_line::fill_capacity_row(TToken_string& row, bool percent) real r; for (int bu = last(); bu > 0; bu = pred(bu)) { - r=capacity(bu); - if (!r.is_zero()) - row.add(percent ? "100" : r.string(), bu + F_LBUCKET0 -FIRST_FIELD); // buckets - else - row.add("", bu + F_LBUCKET0 -FIRST_FIELD); - } -} -void TCRP_line::fill_hcapacity_row(TToken_string& row, bool percent) -{ - row.add(codimp(),F_CODIMPCRP -FIRST_FIELD); - row.add(codlin(),F_CODLINCRP -FIRST_FIELD); - - row.add(percent ? "%": "ore",F_LUM -FIRST_FIELD); - - real r; - for (int bu = last(); bu > 0; bu = pred(bu)) - { - r=human_capacity(bu); + r= human ? capacity(bu).human() : capacity(bu).machine(); if (!r.is_zero()) row.add(percent ? "100" : r.string(), bu + F_LBUCKET0 -FIRST_FIELD); // buckets else @@ -574,43 +600,32 @@ void TCRP_line::fill_hcapacity_row(TToken_string& row, bool percent) } // carica una riga di sheet con i dati dell'oggetto vincolo -void TCRP_line::fill_load_row(TToken_string& row, bool percent) +void TCRP_line::fill_load_row(TToken_string& row, bool human, bool percent) { row.add(codimp(),F_CODIMPCRP -FIRST_FIELD); row.add(codlin(),F_CODLINCRP -FIRST_FIELD); + row.add(codart(),F_CODARTCRP -FIRST_FIELD); row.add(percent ? "%": "ore",F_LUM -FIRST_FIELD); - real r; + real c,l; for (int bu = last(); bu > 0; bu = pred(bu)) { - r=percent ? (capacity(bu).is_zero() ? ZERO : (100L * load(bu) / capacity(bu))) : load(bu) ; - row.add(r.string(), bu + F_LBUCKET0 -FIRST_FIELD); // buckets - } -} -void TCRP_line::fill_hload_row(TToken_string& row, bool percent) -{ - row.add(codimp(),F_CODIMPCRP -FIRST_FIELD); - row.add(codlin(),F_CODLINCRP -FIRST_FIELD); - - row.add(percent ? "%": "ore",F_LUM -FIRST_FIELD); - - real r; - for (int bu = last(); bu > 0; bu = pred(bu)) - { - r=percent ? (human_capacity(bu).is_zero() ? ZERO :(100L * human_load(bu) / human_capacity(bu))) : human_load(bu) ; - row.add(r.string(), bu + F_LBUCKET0 -FIRST_FIELD); // buckets + c = human ? capacity(bu).human() : capacity(bu).machine() ; + l = human ? load(bu).human() : load(bu).machine() ; + if (percent) + l = c.is_zero() ? ZERO : (100L * l / c); + row.add(l.string(), bu + F_LBUCKET0 -FIRST_FIELD); // buckets } } - -TCapacita_prod& TCRP_line::bucket(int n) +TCapacity_record& TCRP_line::bucket(int n) { - TCapacita_prod *o; - o=(TCapacita_prod *)_bucket.objptr(n); + TCapacity_record *o; + o=(TCapacity_record *)_bucket.objptr(n); if (o==NULL) { - o=new TCapacita_prod(); + o=new TCapacity_record(); _bucket.add(o,n); } return *o; @@ -624,17 +639,18 @@ TCapacita_prod& TCRP_line::bucket(int n) TSortable* TCRP_lines::new_obj(const TToken_string& key) const { TString8 codimp, codlin; - key.get(0,codimp); + TString codart; + long codcli; + key.get(3,codart); + codcli = atoi(codart); + key.get(2,codart); key.get(1,codlin); - return new TCRP_line(codimp, codlin); + key.get(0,codimp); + return new TCRP_line(codimp, codlin, codart, codcli); } TCRP_line* TCRP_lines::find(const TLinea_prod& linea_prod, const char * codart, long codcli, bool create) { -/* _key=linea_prod.codimp(); - _key.add(linea_prod.codice()); - TSortable* s = create ? add_obj(_key) : find_obj(_key); - return (TCRP_line*)s;*/ TString8 codimp(linea_prod.codimp()); TString8 codlin(linea_prod.codice()); return find(codimp, codlin ,codart, codcli, create); @@ -644,10 +660,23 @@ TCRP_line* TCRP_lines::find(const char * codimp, const char * codlin, const char { _key.add(codimp,0); _key.add(codlin,1); + TCRP_line * l = NULL; + if (create && codart && *codart) + { + l = (TCRP_line*)find_obj(_key); + CHECK(l,"Impossibile trovare la linea di Capacity review per un articolo"); + } _key.add(codart,2); // articolo _key.add(format("%ld",codcli),3); // cliente - TSortable* s = create ? add_obj(_key) : find_obj(_key); - return (TCRP_line*)s; + TCRP_line *s = (TCRP_line*)(create ? add_obj(_key) : find_obj(_key)); + if (create && l) + for (int b = l->last(); b >=0; b--) + { + s->capacity(b).set_machine(l->capacity(b).machine()); + s->capacity(b).set_human(l->capacity(b).human()); + } + + return s; } /////////////////////////////////////////////////////////// @@ -743,6 +772,10 @@ void TMSP_constraint::fill_sheet_row(TToken_string& row, const TMask & m, bool c row.add(str, F_MAGAZZINO-FIRST_FIELD); str = _mag.mid(3); row.add(str,F_DEPOSITO-FIRST_FIELD); + str = _mag_coll.left(3); + row.add(str, F_MAG_COLL-FIRST_FIELD); + str = _mag_coll.mid(3); + row.add(str,F_DEP_COLL-FIRST_FIELD); const TCodice_um um; const TQuantita qta_art(codice(), um, ZERO); @@ -762,40 +795,64 @@ void TMSP_constraint::fill_sheet_row(TToken_string& row, const TMask & m, bool c row.add(mastercodes2check() ? MASTERCODE_CHAR : ' ',F_MASTERCODE-FIRST_FIELD); } -bool TMSP_constraint::riga(int buck, long& ndoc, int& nrig) +TRigadoc_ref* TMSP_constraint::first_rigaref(int buck) { TMSP_record& b = _bucket_qta[buck]; - ndoc = b._numdoc; - nrig = b._numrig; - return ndoc > 0L && nrig > 0; + TRigadoc_ref* rdr=b.first_rigaref(); + return rdr; +} +TRigadoc_ref* TMSP_constraint::next_rigaref(int buck) +{ + TMSP_record& b = _bucket_qta[buck]; + TRigadoc_ref* rdr=b.next_rigaref(); + return rdr; +} +int TMSP_constraint::rigarefs(int buck) +{ + return _bucket_qta[buck].rigarefs(); +} +TRigadoc_ref * TMSP_constraint::rigaref(int buck, int n) +{ + return _bucket_qta[buck].rigaref(n); +} +void TMSP_constraint::add_rigaref(int buck, TString& codnum, int annodoc, long ndoc, int nrig, const real & qta, const real &prz) +{ + TMSP_record& b = _bucket_qta[buck]; + TRigadoc_ref *rdr= new TRigadoc_ref(codnum, annodoc, ndoc, nrig, qta,prz); + b.add_rigaref(rdr); } -void TMSP_constraint::set_riga(int buck, char provv, TString& codnum, int annodoc, long ndoc, int nrig) +void TMSP_constraint::add_rigaref(int buck, TRigadoc_ref *rdr) { TMSP_record& b = _bucket_qta[buck]; - b._numdoc = ndoc; - b._numrig = nrig; + b.add_rigaref(rdr); +} + +void TMSP_constraint::remove_rigaref(int buck) +{ + TMSP_record& b = _bucket_qta[buck]; + b.remove_rigaref(); } int TMSP_constraint::find_distinta_master(const TMSP_constraint & constr, TString & master,TString & livmaster,TString & um, real & expr, TString & imp,TString & lin,TString & magdep, int fromindex) { TArray sons; + dist_tree().set_global("_LIVELLO",constr.livgiac()); + dist_tree().set_global("_IMPIANTO",constr.codimp()); + dist_tree().set_global("_LINEA",constr.codlin()); + dist_tree().set_global("_MAGAZZINO",constr.codmag()); if (dist_tree().set_root(constr.codice())) { - dist_tree().set_global("_LIVELLO",constr.livgiac()); - dist_tree().set_global("_IMPIANTO",constr.codimp()); - dist_tree().set_global("_LINEA",constr.codlin()); - dist_tree().set_global("_MAGAZZINO",constr.codmag()); - dist_tree().explode(sons, FALSE, RAGGR_EXP_NONE, 1); + dist_tree().explode(sons, FALSE, RAGGR_EXP_NONE, 1, "AV"); TRiga_esplosione* riga; while (riga=(TRiga_esplosione* )sons.objptr(fromindex)) { - if (distinta_master(riga->articolo())) + if (distinta_master(riga->articolo(), TRUE)) { - master=riga->articolo(); - livmaster=riga->livello(); - um =riga->um(); - expr =riga->val(); + master = riga->articolo(); + livmaster = riga->livello(); + um = riga->um(); + expr = riga->val(); return fromindex; } fromindex=sons.succ(fromindex); @@ -819,7 +876,7 @@ void TMSP_constraint::set_mastercode_check(bool on) TMSP_line2 *TMSP_constraint::use_mspline2(TToken_string & row, TSheet_field & sf) { TString16 liv; - TString8 mag,imp,lin; + TString8 mag,magc,imp,lin; long codcli=row.get_long(F_CLIENTE-FIRST_FIELD); livelli_giac().pack_grpcode(liv, row.get(sf.cid2index(F_LIV1)),1); livelli_giac().pack_grpcode(liv, row.get(sf.cid2index(F_LIV2)),2); @@ -829,8 +886,10 @@ TMSP_line2 *TMSP_constraint::use_mspline2(TToken_string & row, TSheet_field & sf lin=row.get(sf.cid2index(F_CODLIN)); add_magcode(mag, row.get(sf.cid2index(F_MAGAZZINO))); add_depcode(mag, row.get(sf.cid2index(F_DEPOSITO))); + add_magcode(magc, row.get(sf.cid2index(F_MAG_COLL))); + add_depcode(magc, row.get(sf.cid2index(F_DEP_COLL))); codcli=row.get_long(F_CLIENTE-FIRST_FIELD); - TMSP_line mspline(codcli, codice(), liv, imp, lin, mag); + TMSP_line mspline(codcli, codice(), liv, imp, lin, mag, magc); for (int b= 1 ; b< LAST_BUCKET ; b++) { real q(row.get(sf.cid2index(F_BUCKET0+b*2))); @@ -945,6 +1004,7 @@ TMSP_constraint & TMSP_constraint::operator=(const TMSP_constraint & line) _imp=line.codimp(); _lin=line.codlin(); _mag=line.codmag(); + _mag_coll=line.codmag_coll(); _on_sheet=_on_sheet; _desc=line.desc(); _bucket_qta=line._bucket_qta; @@ -957,14 +1017,15 @@ TMSP_constraint::TMSP_constraint(long cliente, const TString& giac, const TString& imp, const TString& lin, - const TString& mag) + const TString& mag, + const TString& magc) : _cliente(cliente), _codart(codart), _giac(giac), - _imp(imp), _lin(lin), _mag(mag),_on_sheet(FALSE),_check_master(FALSE) + _imp(imp), _lin(lin), _mag(mag), _mag_coll(magc),_on_sheet(FALSE),_check_master(FALSE) { } TMSP_constraint::TMSP_constraint(const TMSP_constraint & line) : _cliente(line.cliente()), _codart(line.codice()), _giac(line.livgiac()), - _imp(line.codimp()), _lin(line.codlin()), _mag(line.codmag()), _on_sheet(FALSE), + _imp(line.codimp()), _lin(line.codlin()), _mag(line.codmag()), _mag_coll(line.codmag_coll()),_on_sheet(FALSE), _check_master(FALSE), _desc(line.desc()) { } @@ -981,7 +1042,7 @@ TSortable* TMSP_constraints::new_obj(const TToken_string& key) const TString8 imp; key.get(3, imp); imp.trim(); TString8 lin; key.get(4, lin); lin.trim(); TString8 mag; key.get(5, mag); mag.trim(); - return new TMSP_constraint(cli, art, gia, imp, lin, mag); + return new TMSP_constraint(cli, art, gia, imp, lin, mag, ""); } TMSP_constraint* TMSP_constraints::find(long cliente, @@ -990,6 +1051,7 @@ TMSP_constraint* TMSP_constraints::find(long cliente, const TString& imp, const TString& lin, const TString& mag, +// const TString& magc, bool create) { _key.format("%ld", cliente); @@ -998,6 +1060,7 @@ TMSP_constraint* TMSP_constraints::find(long cliente, _key.add(imp);_key.trim(); _key.add(lin);_key.trim(); _key.add(mag);_key.trim(); +// _key.add(magc);_key.trim(); TSortable* s = create ? add_obj(_key) : find_obj(_key); TMSP_constraint *c=(TMSP_constraint*)s; if (create) @@ -1008,6 +1071,55 @@ TMSP_constraint* TMSP_constraints::find(long cliente, return c; } +TMSP_constraint* TMSP_constraints::find(const TToken_string& row, bool create) +{ + TString80 str,giaclev; + _key.cut(0); + + for (int i = 0; i <= 11; i++) + { + row.get(i, str); + str.trim(); + switch (i+FIRST_FIELD) + { + case F_LIV1: + case F_LIV2: + case F_LIV3: + livelli_giac().pack_grpcode(giaclev, str, i+FIRST_FIELD-F_LIV1+1); break; + case F_LIV4: + livelli_giac().pack_grpcode(giaclev, str, 4); + _key.add(giaclev); + break; // Concatena i livelli + case F_MAGAZZINO: +// case F_MAG_COLL: + _key.add(str); + row.get(i+1, str); + _key << str; + break; // Concatena magazzini e depositi + case F_CLIENTE: + if (str.blank()) str = "0"; + case F_ARTICOLO: + case F_CODIMP: + case F_CODLIN: + _key.add(str); break; // Aggiungi normalmente + } + _key.trim(); + } + TSortable* s = create ? add_obj(_key) : find_obj(_key); + TMSP_constraint *c=(TMSP_constraint*)s; + if (create) + { + if (c->desc().blank()) + { + row.get(F_ARTICOLO, str); + c->set_desc(cache().get(LF_ANAMAG,str).get("DESCR")); + } + } + return c; +} + + + ////////////////////////////////////////////////////////// // TMSP_line /////////////////////////////////////////////////////////// @@ -1021,8 +1133,8 @@ void TMSP_line::fill_sheet_row(TToken_string& row, const TMask & m, bool codes_o TMSP_line::TMSP_line(long cliente, const TCodice_articolo& codart, const TString& giac, const TString& imp, - const TString& lin, const TString& mag) - : TMSP_constraint(cliente, codart, giac, imp, lin,mag) + const TString& lin, const TString& mag, const TString& magc) + : TMSP_constraint(cliente, codart, giac, imp, lin, mag, magc) { } TMSP_line::TMSP_line(TMSP_constraint & cons) @@ -1045,13 +1157,14 @@ TSortable* TMSP_lines::new_obj(const TToken_string& key) const TString imp; key.get(3, imp); imp.trim(); TString lin; key.get(4, lin); lin.trim(); TString mag; key.get(5, mag); mag.trim(); - return new TMSP_line(cliente, art, gia, imp, lin, mag); + TString magc; key.get(6, magc); magc.trim(); + return new TMSP_line(cliente, art, gia, imp, lin, mag, magc); } TMSP_line* TMSP_lines::find(long cliente, const TString& art, - const TString& gia, const TString& imp, - const TString& lin, const TString& mag, + const TString& gia, const TString& imp, const TString& lin, + const TString& mag, const TString& magc, bool create) { _key.format("%ld", cliente); @@ -1060,6 +1173,7 @@ TMSP_line* TMSP_lines::find(long cliente, _key.add(imp); _key.add(lin); _key.add(mag); + _key.add(magc); TSortable* s = create ? add_obj(_key) : find_obj(_key); return (TMSP_line*)s; } @@ -1069,7 +1183,7 @@ TMSP_line* TMSP_lines::find(const TToken_string& row, bool create) TString80 str,giaclev; _key.cut(0); - for (int i = 0; i <= 11; i++) + for (int i = 0; i <= 13; i++) { row.get(i, str); str.trim(); @@ -1085,11 +1199,15 @@ TMSP_line* TMSP_lines::find(const TToken_string& row, bool create) _key.add(giaclev); break; // Concatena i livelli case F_MAGAZZINO: + case F_MAG_COLL: _key.add(str); row.get(i+1, str); str.trim(); _key << str; break; // Concatena magazzini e depositi + case F_DEPOSITO: + case F_DEP_COLL: + break; // Ignora (vedi sopra) case F_CLIENTE: if (str.blank()) str = "0"; case F_ARTICOLO: @@ -1108,35 +1226,42 @@ TMSP_line* TMSP_lines::find(const TToken_string& row, bool create) TSortable* TPlan_docs::new_obj(const TToken_string& key) const { - int anno; key.get(0, anno); - long num; key.get(1, num); + TString8 codnum; key.get(0, codnum); + int anno; key.get(1, anno); + long num; key.get(2, num); - TDocumento* doc = new TDocumento('D', anno, _num, num); + TDocumento* doc = new TDocumento('D', anno, codnum, num); doc->head().put(DOC_TIPODOC, _doc); return doc; } -TDocumento& TPlan_docs::find(int anno, long num) +TDocumento& TPlan_docs::find(TRigadoc_ref * rdr) { - _key.format("%d|%ld", anno, num); + if (rdr) + _key.format("%s|%d|%ld",(const char *)rdr->codnum(), rdr->annodoc(), rdr->numdoc()); + else + _key = " |0|0"; return *(TDocumento*)add_obj(_key); } -TRiga_documento& TPlan_docs::add_to_row(int anno, long num, int riga, const real& qta) +TRiga_documento& TPlan_docs::add_to_row(TRigadoc_ref * rdr, const real& qta) { - TDocumento& doc = find(anno, num); + CHECK(rdr,"TPlan_docs::add_to_row :passare un rigaref fvalido"); + TDocumento& doc = find(rdr); + int riga = rdr->numrig(); if (riga <= 0 || riga > doc.physical_rows()) { TRiga_documento& r = doc.new_row(_rig); riga = r.get_int(RDOC_NRIGA); + rdr->set_numrig(riga); } TRiga_documento& rdoc = doc[riga]; real val = rdoc.get(RDOC_QTA); val += qta; if (val <= ZERO) - rdoc.put(RDOC_QTA, ZERO); - else - rdoc.put(RDOC_QTA, val); + val = ZERO; + rdoc.put(RDOC_QTA, val); + rdr->set_qta_residua(val); return rdoc; } @@ -1172,7 +1297,7 @@ long TPlan_docs::flush(const TDate& data) } if (err != NOERR) { - error_box("Impossibile riscrivere il documento del %d %s %ld",doc.anno(), (const char *)doc.numerazione(),doc.numero()); + error_box("Impossibile riscrivere il documento del %d %s %ld",(int)doc.anno(), (const char *)doc.numerazione(),(long)doc.numero()); retv=-1; } } @@ -1186,11 +1311,128 @@ TPlan_docs::TPlan_docs(const char* num, const char* tip, const char* rig) { } -bool distinta_master(const char *code) +bool distinta_master(const char *code, bool is_son) { const TRectype &rec=cache().get(LF_DIST,code); if (rec.empty()) - return FALSE; + return !is_son; return rec.get_bool("MASTER"); } +/////////////////////////////////////////////////////////// +// Sheet ordini / commessse +/////////////////////////////////////////////////////////// +void TLista_ordini::get_row(long r, TToken_string& row) +{ + row = ""; + if (r < _line->rigarefs(_curr_bucket)) + { + TRigadoc_ref * rdr=_line->rigaref(_curr_bucket,(int)r); + if (rdr) + { + TLocalisamfile & rdoc = _r->lfile(LF_RIGHEDOC); + TLocalisamfile & doc = _r->lfile(LF_DOC); + rdoc.put(RDOC_PROVV,"D"); + rdoc.put(RDOC_ANNO,rdr->annodoc()); + rdoc.put(RDOC_CODNUM,rdr->codnum()); + rdoc.put(RDOC_NDOC,rdr->numdoc()); + rdoc.put(RDOC_NRIGA,rdr->numrig()); + _r->read(); + row.add(" "); + row.add(rdr->annodoc()); + row.add(rdr->codnum()); + row.add(rdr->numdoc()); + row.add(rdr->numrig()); + TDate dc(rdoc.get_date(RDOC_DATACONS)); + row.add(dc.ok() ? dc : doc.get_date(RDOC_DATACONS)); + row.add(rdoc.get(RDOC_UMQTA)); + real q(rdoc.get_real(RDOC_QTA)); + row.add(q.string("#######@,@@@")); + q -= rdoc.get_real(RDOC_QTAEVASA); + row.add(q.string("#######@,@@@")); + //const char statodef=cache().get("%TIP",doc.get(DOC_TIPODOC)).get("S2")[1]; + row.add(doc.get(DOC_STATO)); + } + } + else + { + row = "|||||||"; + row.add(_line->qta(_curr_bucket).string("#######@,@@@")); + } +} + +bool TLista_ordini::edit_checked() +{ + for (long r=0; r < items()-1; r++) if (checked(r)) + { + TFilename ininame; + ininame.temp(); + ininame.ext("ini"); + { + TConfig action(ininame); + action.set("Action","MODIFY","Transaction"); + action.set_paragraph(format("%d",LF_DOC)); + TToken_string & rw = row(r); + action.set("PROVV","D"); + action.set("ANNODOC",rw.get(1)); + action.set("CODNUM",rw.get(2)); + action.set("NDOC",rw.get(3)); + } + TExternal_app editdoc(format("VE0 -1 -i%s",(const char *)ininame)); + editdoc.run(); + TConfig action(ininame); + TRigadoc_ref * rdr=_line->rigaref(_curr_bucket,(int)r); + } + return TRUE; +} + +long TLista_ordini::get_items() const +{ + const long i=_line->rigarefs(_curr_bucket); + return i == 0 ? i : i+1; +} + +void TLista_ordini::set_bucket(int b) +{ + _curr_bucket=b; + reset_parked(); +} +bool TLista_ordini::bucket_handler(TMask_field & f, KEY key) +{ + if (key == K_SPACE) + { + TLista_ordini &m = (TLista_ordini &)f.mask(); + const int buck=atoi(f.get()); + if (m.get_bucket() != buck) + { + m.set_bucket(buck); + m.select(0); + m.force_update(); + } + } + return TRUE; +} + +TLista_ordini::TLista_ordini(TMSP_constraint * l, const char * title) : + TSheet(-1, 5, 80, 15, title, + "@1|Anno|CodNum|Numero|Riga|Consegna@10|UM|Q.ta totale@12|Q.ta residua@12|Stato",0,2) +{ + _line = l; + TMask_field &f= add_list(FIRST_FIELD,0,"Bucket ",1,0,2,"","0|1|2|3|4|5|6|7|8|9|10|11|12|13","0|1|2|3|4|5|6|7|8|9|10|11|12|13"); + f.set_handler(bucket_handler); + _curr_bucket = 0; + while (_curr_bucket <= LAST_BUCKET && _line->rigarefs(_curr_bucket)==0) + _curr_bucket++; + f.set(_curr_bucket <= LAST_BUCKET ? _curr_bucket : 0); + f.set_focus(); + + enable_check(); + + _r= new TRelation(LF_RIGHEDOC); + _r->add(LF_DOC,"PROVV==PROVV|CODNUM==CODNUM|ANNO==ANNO|NDOC==NDOC"); +} + +TLista_ordini::~TLista_ordini() +{ + delete _r; +} diff --git a/mr/mr2201.h b/mr/mr2201.h new file mode 100755 index 000000000..e2668aef5 --- /dev/null +++ b/mr/mr2201.h @@ -0,0 +1,440 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +// funzioni di ricerca distinta master +bool distinta_master(const char *code, bool is_son=FALSE); +// funzione per l'uso degli alberi delle distinte +TDistinta_tree &dist_tree(); + +#define MASTERCODE_CHAR 'M' + +//*********************** +// oggetto TRiga articolo +class TMSP_constraint; +class TMSP_constraints; + +class TRiga_articolo : public TToken_string +{ +public: +static int order_compare(TSheet_field & s, int i1, int i2, int level); +static int order_compare( const TToken_string& r1 , const TToken_string& r2 , int level, bool ascending=TRUE); +static int compare_field(TString &str0, TString &str1,short field_no) ; +static int order_comparePCAL(TSheet_field & s, int i1, int i2); +static int order_comparePCLA(TSheet_field & s, int i1, int i2); +static int order_comparePALC(TSheet_field & s, int i1, int i2); +static int order_comparePACL(TSheet_field & s, int i1, int i2); +static int order_comparePLAC(TSheet_field & s, int i1, int i2); +static int order_comparePLCA(TSheet_field & s, int i1, int i2); +static int order_compareCAL(TSheet_field & s, int i1, int i2); +static int order_compareCLA(TSheet_field & s, int i1, int i2); +static int order_compareALC(TSheet_field & s, int i1, int i2); +static int order_compareACL(TSheet_field & s, int i1, int i2); +static int order_compareLAC(TSheet_field & s, int i1, int i2); +static int order_compareLCA(TSheet_field & s, int i1, int i2); +static int order_comparePCA(TSheet_field & s, int i1, int i2); +static int order_comparePAC(TSheet_field & s, int i1, int i2); +static int order_compareAC(TSheet_field & s, int i1, int i2); +static int order_compareCA(TSheet_field & s, int i1, int i2); +static bool find_block(const TSheet_field& sf, const int riga, int &first_row, int &last_row ); + + int compare(const TToken_string& r, int level) const; + TRiga_articolo& operator=(TToken_string& r); + TRiga_articolo& operator+=(TRiga_articolo& r); + + TRiga_articolo() : TToken_string(128) { } + TRiga_articolo(const TMSP_constraint & line); + virtual ~TRiga_articolo() { } +}; +#define SORT_BY_PCAL -1 // cliente / articolo / impianto-linea +#define SORT_BY_PCLA -2 // +#define SORT_BY_PALC -3 // +#define SORT_BY_PACL -4 // +#define SORT_BY_PLAC -5 // +#define SORT_BY_PLCA -6 // +#define SORT_BY_PCA - 8 // cliente / articolo +#define SORT_BY_PAC - 9 // +#define SORT_BY_PRIORITY 16 +#define SORT_WITHOUT_LINE 8 +#define SORT_BY_CAL -17 // cliente / articolo / impianto-linea +#define SORT_BY_CLA -18 // +#define SORT_BY_ALC -19 // +#define SORT_BY_ACL -20 // +#define SORT_BY_LAC -21 // +#define SORT_BY_LCA -22 // +#define SORT_BY_CA -24 // cliente / articolo +#define SORT_BY_AC -25 // + +//*********************** +// form di stampa degli sheet +class TMSP_form : public TForm +{ +protected: + bool validate(TForm_item &cf, TToken_string &s); +public: + TMSP_form (TIsamtempfile * rep); +}; + +class TCRP_form : public TForm +{ +protected: + bool validate(TForm_item &cf, TToken_string &s); +public: + TCRP_form (TIsamtempfile * rep); +}; + +class TMSP_constraints : public TMRP_array +{ +protected: + virtual TSortable* new_obj(const TToken_string& key) const; + +public: + TMSP_constraint* find(long cliente,const TString& codart,const TString& giac, + const TString& imp, const TString& lin, const TString& mag, + bool create=FALSE) ; + TMSP_constraint* find(const TToken_string& row, bool create=FALSE); + + TMSP_constraint& operator[](long n) const + { return (TMSP_constraint&)find_obj(n); } +}; + +class TRigadoc_ref : public TObject +{ + TString8 _codnum; + int _annodoc; + long _numdoc; + int _numrig ; + real _qta; + real _prz; +public: + const TString& codnum() {return _codnum;} + int annodoc() {return _annodoc;} + long numdoc() {return _numdoc;} + int numrig() {return _numrig ;} + void set_numrig(int nr) {_numrig = nr;} + void set_qta_residua(real & q) {_qta = q;} + real & qta_residua() {return _qta;} +// real & qta_totale() {return _qta;} + virtual TObject* dup() const; + TRigadoc_ref(const char *codnum, int annodoc, long numdoc,int numrig, const real &qta, const real &prz); +}; +class TMSP_record : public TObject +{ + int _curr_ref; + TArray _rigadoc_refs; +public: + bool _qta_locked; + real _qta_min; + real _qta; + real _price; + void add_rigaref(TRigadoc_ref *r); + void remove_rigaref(); + TRigadoc_ref *first_rigaref(); + TRigadoc_ref *next_rigaref(); + int rigarefs() {return _rigadoc_refs.items();} + TRigadoc_ref* rigaref(int n); + virtual TObject* dup() const; + TMSP_record(); +}; + +class TMaster_code : public TObject +{ + TString _code; + TString _liv; + TString _um; + TString _codimp; + TString _codlin; + TString _codmag; + real _expr; + real _leadtime; +public: + const char *articolo() const {return _code;} + const char *livello() const {return _liv;} + const char *um() const {return _um;} + const real &expr() const {return _expr;} + const real &leadtime() const {return _leadtime;} + const char *codimp() const {return _codimp;} + const char *codlin() const {return _codlin;} + const char *codmag() const {return _codmag;} + + TMaster_code(const char *code, const char *liv, const char *ummaster, const real &expr, const real &leadtime, const char *codimp, const char *codlin, const char *codmag); + TMaster_code(const char *code, const char *liv,const char *ummaster, const real &expr, int leadtime, const char *codimp, const char *codlin, const char *codmag); + virtual ~TMaster_code() {} +}; + + +class TMSP_line2 : public TObject +{ + bool _used; + TMSP_constraint *_constraint; + TArray _mastercodes; +public: + bool used() {return _used;} + void set_use(bool on) {_used=on;} + void add_mastercode (TMaster_code *); + TMaster_code *get_mastercode (int i=0); + TMSP_constraint &constraint() {return *_constraint;} + TMSP_line2(const TMSP_constraint &c); + virtual ~TMSP_line2() {} +}; + +class TMSP_record_array : public TObject +{ + TArray _buckets; + +public: + int items() const { return _buckets.items(); } + int last() const { return _buckets.last(); } + int pred(int i) const { return _buckets.pred(i); } + + virtual TMSP_record_array& operator=(const TMSP_record_array& a); + TMSP_record& operator[](int b); +}; + + +class TMSP_constraint : public TSortable +{ + long _cliente; + TCodice_articolo _codart; + TString16 _giac; // livelli di giacenza + TString8 _imp, _lin; // codice impianto e linea + TString8 _mag; // magazzino /deposito + TString8 _mag_coll; // magazzino /deposito collegato + TString _desc; + + bool _on_sheet; + bool _check_master; + TArray _lines2; // codici di livello 2 per articoli NON master + TMSP_constraints _upperlines; // vincoli dei codici di livello 1 per articoli master + + TMSP_record_array _bucket_qta; + +protected: + virtual int compare(const TSortable& s) const; + +public: + long cliente() const { return _cliente; } + const TCodice_articolo& codice() const { return _codart; } + const TString& livgiac() const { return _giac; } + const TString& codimp() const { return _imp; } + const TString& codlin() const { return _lin; } + const TString& codmag() const { return _mag; } + const TString& codmag_coll() const { return _mag_coll; } + const TString& desc() const { return _desc; } + void set_desc(const char* str) { _desc = str; } + + TRigadoc_ref * first_rigaref(int buck); + TRigadoc_ref * next_rigaref(int buck); + int rigarefs(int buck); + TRigadoc_ref* rigaref(int buck, int n); + void add_rigaref(int buck, TString& codnum, int annodoc, long ndoc, int nrig, const real & qta, const real &prz); + void add_rigaref(int buck, TRigadoc_ref *rdr); + void remove_rigaref(int buck); + // master sched. a due livelli: + int find_distinta_master(const TMSP_constraint & constr, TString & master, TString & livmaster,TString & um,real & expr, TString & imp,TString & lin,TString & magdep, int fromindex=0); + void set_mastercode_check(bool on); + bool mastercodes2check() const ; + + TMSP_line2 * use_mspline2(TMSP_constraint&line); + TMSP_line2 * use_mspline2(TToken_string &row, TSheet_field & sf); + void discard_line2(TMSP_line2 * ); + void reset_unused_line2(); + TMSP_line2 * get_unused_line2(); + + TMSP_constraint* add_upperline(const TMSP_constraint& constr); + TMSP_constraint* get_upperline(TMSP_constraint& constr); + bool has_upperlines() const ; + + int last() const { return _bucket_qta.last(); } + int pred(int i) const { return _bucket_qta.pred(i); } + + bool & qta_locked(int b) { return _bucket_qta[b]._qta_locked; } + virtual real& qta_min(int b) { return _bucket_qta[b]._qta_min; } + virtual real& qta(int b) { return _bucket_qta[b]._qta; } + virtual real& price(int b) { return _bucket_qta[b]._price; } + + virtual void fill_sheet_row(TToken_string& row, const TMask & m, bool codes_only=FALSE) ; + + bool is_on_sheet() const { return _on_sheet; } + void set_on_sheet(bool on = TRUE) { _on_sheet = on; } + + TMSP_constraint & operator=(const TMSP_constraint & line); + + TMSP_constraint(long cliente, + const TCodice_articolo& codart, + const TString& giac, + const TString& imp, const TString& lin, + const TString& mag, const TString& magc); + TMSP_constraint(const TMSP_constraint & cons); + virtual ~TMSP_constraint() { } +}; + + +// linee contenenti pianificazioni +class TMSP_line : public TMSP_constraint +{ +public: + + virtual void fill_sheet_row(TToken_string& row, const TMask & m, bool codes_only=FALSE) ; + TMSP_line(long cliente, const TCodice_articolo& codart, + const TString& giac, const TString& mag, const TString& magc, + const TString& imp, const TString& lin); + TMSP_line(TMSP_line & line); + TMSP_line(TMSP_constraint & cons); + virtual ~TMSP_line() { } +}; + + +class TMSP_lines : public TMRP_array +{ +protected: + virtual TSortable* new_obj(const TToken_string& key) const; + +public: + TMSP_line* find(long cliente, const TString& art, const TString& gia, + const TString& imp, const TString& lin, const TString& mag, const TString& magc, + bool create=FALSE); + + TMSP_line* find(const TToken_string& row, bool create=FALSE); + + TMSP_line& operator[](long i) const + { return (TMSP_line&)find_obj(i); } +}; + + +class TCapacity_couple : public TObject +{ + real _machine; + real _human; +public: + void set_machine(const real &v) {_machine = v;} + void set_human (const real &v) {_human = v;} + void add_machine(const real &v) {_machine += v;} + void add_human (const real &v) {_human += v;} +public: + const real &machine() const {return _machine;} + const real &human () const {return _human;} + TCapacity_couple& operator= (const TCapacity_couple &c); + TCapacity_couple(const TCapacity_couple&c); + TCapacity_couple(); + TCapacity_couple(const real & machine, const real & human); +}; +class TCapacity_record : public TSortable +{ + TCapacity_couple _capacity; // Capacita' + TCapacity_couple _load; // Carico +protected: + virtual int compare(const TSortable& s) const; + virtual TObject* dup() const { return new TCapacity_record(*this); } + + void copy(const TCapacity_record& q); + real get_factor(const TCodice_um& um) const; + void convert(real& val, const TCodice_um& from_um, const TCodice_um& to_um) const; + +public: + const TCapacity_record& operator =(const TCapacity_record& q) + { copy(q); return *this; } + + TCapacity_couple &capacity() {return _capacity;} + TCapacity_couple &load() {return _load;} + + TCapacity_record (); + TCapacity_record (const TCapacity_record & q) { copy(q); } + virtual ~TCapacity_record () {} +}; + + +class TCRP_line : public TSortable +{ + TString8 _imp,_lineap; + TString _codart; + long _codcli; + TString _desc; + bool _on_sheet; + + TArray _bucket; + + +protected: + virtual int compare(const TSortable& s) const; + TCapacity_record& bucket(int n) ; + TCapacity_record& operator[](int n) + {return bucket(n);} + +public: + const TString& codimp() const { return _imp; } + const TString& codlin() const { return _lineap; } + const TString& codart() const { return _codart; } + const TString& desc() const { return _desc; } + //void set_desc(const char* str) { _desc = str; } + + int last() const { return _bucket.last(); } + int pred(int i) const { return _bucket.pred(i); } + + TCapacity_couple& capacity(int b) { return bucket(b).capacity(); } + TCapacity_couple& load(int b) { return bucket(b).load(); } + + void fill_capacity_row(TToken_string& row, bool human, bool percent=FALSE); + void fill_load_row(TToken_string& row, bool human, bool percent=FALSE); + + bool is_on_sheet() const { return _on_sheet; } + void set_on_sheet(bool on = TRUE) { _on_sheet = on; } + + TCRP_line(const TString& codimp,const TString& codlin,const TString &codart, long codcli); + virtual ~TCRP_line() { } +}; + + +class TCRP_lines : public TMRP_array +{ +protected: + virtual TSortable* new_obj(const TToken_string& key) const; + +public: + TCRP_line* find(const TLinea_prod& linea_prod, + const char * codart="", long codcli=0L, bool create=FALSE); + TCRP_line* find(const char * codimp="", const char * codlin="", + const char * codart="", long codcli=0L, bool create=FALSE); + TCRP_line& operator[](long n) const + { return (TCRP_line&)find_obj(n); } +}; + +class TPlan_docs : public TMRP_array +{ + TString16 _num, _doc, _rig; + +protected: + virtual TSortable* new_obj(const TToken_string& key) const; + +public: + TDocumento& find(TRigadoc_ref * riga); + TRiga_documento& add_to_row(TRigadoc_ref * rdr, const real& qta); + long flush(const TDate& data); + + TPlan_docs(const char* num, const char* tip, const char* rig); + virtual ~TPlan_docs() { } +}; + + +class TLista_ordini : public TSheet +{ + TMSP_constraint * _line; + TRelation *_r; + int _curr_bucket; + static bool bucket_handler(TMask_field & f, KEY key); + +protected: + virtual void get_row(long r, TToken_string& row); + virtual long get_items() const; +public: + bool edit_checked(); + int get_bucket() {return _curr_bucket;} + void set_bucket(int b); + TLista_ordini(TMSP_constraint *l, const char * title); + ~TLista_ordini(); +}; \ No newline at end of file diff --git a/mr/mr2300.cpp b/mr/mr2300.cpp new file mode 100755 index 000000000..3d0fcd914 --- /dev/null +++ b/mr/mr2300.cpp @@ -0,0 +1,42 @@ +#include "mr2200.h" +#include "mr2200a.h" + +class TMSP_mask : public TPlanning_mask +{ +public: + TMSP_mask(); + virtual ~TMSP_mask() { } +}; + +TMSP_mask::TMSP_mask() + : TPlanning_mask("mr2300a") +{ + init(); +} + +class TMSP_app : public TPlanning_app +{ + TPlanning_mask *_m; +protected: + virtual TPlanning_mask& mask() {return *_m;} + virtual bool create(); +}; + +bool TMSP_app::create() +{ + if (TSkeleton_application::create()) + { + openfiles(); + _m = new TMSP_mask(); + _m->field(F_MSCHEDULEPLAN).set("X"); + return TRUE; + } + return FALSE; +} + +int mr2300(int argc, char* argv[]) +{ + TMSP_app a; + a.run(argc, argv, "Master Schedule Planning"); + return 0; +} diff --git a/mr/mr2300a.uml b/mr/mr2300a.uml new file mode 100755 index 000000000..f02bec87e --- /dev/null +++ b/mr/mr2300a.uml @@ -0,0 +1 @@ +#include "mr2200a.uml" diff --git a/mr/mr2url.h b/mr/mr2url.h index f5212820f..fd1f6d664 100755 --- a/mr/mr2url.h +++ b/mr/mr2url.h @@ -15,4 +15,6 @@ #define USER_BMP_SELECT_ORDP 1700 #define USER_BMP_SELECT_ORDF 1701 +#define USER_BMP_ORDINI_INPUT 1801 +#define USER_BMP_ORDINI_OUTPUT 1802 diff --git a/mr/mrplib.cpp b/mr/mrplib.cpp index 7931da3ab..58f903e1b 100755 --- a/mr/mrplib.cpp +++ b/mr/mrplib.cpp @@ -1144,10 +1144,12 @@ int TUnita_produttiva::raw_numpers_turno(int t) int TUnita_produttiva::numpers_turno(int t) { int val; - if (!TUnita_produttiva::personale_dedicato()) + if (TUnita_produttiva::personale_dedicato()) + { val=raw_numpers_turno(t); if (val==0) val=get_int("I1"); + } else val= mrp_config().numpers_turno(t); return val; @@ -1217,9 +1219,8 @@ TImpianto::TImpianto(const char* cod) settab("IMP"); if (cod && *cod) { - TTable t("IMP"); - t.put("CODTAB",cod); - t.read(); + const TRectype & rec = cache().get("IMP", cod); + *this = rec; } } @@ -1248,9 +1249,8 @@ TLinea_prod::TLinea_prod(const char* cod ) settab("LNP"); if (cod && *cod) { - TTable t("LNP"); - put("CODTAB",cod); - read(t); + const TRectype & rec = cache().get("LNP", cod); + *this = rec; } } @@ -1267,6 +1267,19 @@ const char * TLinea_prod::codmagdep() const } +const char * TLinea_prod::codmagdep_coll() const +{ + const char * cod=TUnita_produttiva::codmagdep_coll() ; + if (*cod==0) + { + TImpianto* imp=((TLinea_prod *)this)->get_impianto(); + if (imp) + return imp->codmagdep_coll(); + } + return cod; +} + + int TLinea_prod::inizio_turno(int t) { int val; diff --git a/mr/mrplib.h b/mr/mrplib.h index 023a468b9..e0b48bedc 100755 --- a/mr/mrplib.h +++ b/mr/mrplib.h @@ -239,6 +239,7 @@ public: virtual bool personale_dedicato() const { return get_bool("B0"); } virtual const char * codmagdep() const { return get("S7"); } + virtual const char * codmagdep_coll() const { return get("S8"); } const char * codmag() const ; const char * coddep() const ; @@ -273,6 +274,7 @@ public: // ** const char * codimp() const; virtual const char * codmagdep() const ; + virtual const char * codmagdep_coll() const ; bool to_check() const {return !get_bool("B9");} // int check_level() const {return !get_bool("I2");} // diff --git a/mr/mrprassi.men b/mr/mrprassi.men index d63091120..cfacc8a11 100755 --- a/mr/mrprassi.men +++ b/mr/mrprassi.men @@ -3,13 +3,14 @@ Caption = "Gestione della produzione" Picture = Module = 39 Flags = "" -Item_01 = "Planning", "mr2 -1", "F" -Item_01 = "MRP", "mr2 -0", "F" -Item_01 = "Archivi", [PRASSIMR_010] -Item_02 = "Stampe archivi", [PRASSIMR_020] +Item_01 = "M.S.P.", "mr2 -2", "F" +Item_01 = "M.R.P.", "mr2 -0", "F" +Item_01 = "Planificazione ordini", "mr2 -1", "F" Item_03 = "Stampe", [PRASSIMR_040] -Item_04 = "Servizi", [PRASSIMR_030] -Item_05 = "Configurazione MRP", [PRASSIMR_080] +Item_04 = "Archivi", [PRASSIMR_010] +Item_05 = "Stampe archivi", [PRASSIMR_020] +Item_06 = "Servizi", [PRASSIMR_030] +Item_07 = "Configurazione MRP", [PRASSIMR_080] [PRASSIMR_010] Caption = "Gestione archivi" diff --git a/mr/mrtbimp.h b/mr/mrtbimp.h index e48b9cb19..dfd73b40c 100755 --- a/mr/mrtbimp.h +++ b/mr/mrtbimp.h @@ -53,6 +53,10 @@ #define F_DESMAG 161 #define F_CODDEP 162 #define F_DESDEP 163 +#define F_CODMAG_C 164 +#define F_DESMAG_C 165 +#define F_CODDEP_C 166 +#define F_DESDEP_C 167 diff --git a/mr/mrtbimp.uml b/mr/mrtbimp.uml index 365107e37..edc9bc95e 100755 --- a/mr/mrtbimp.uml +++ b/mr/mrtbimp.uml @@ -455,7 +455,7 @@ END STRING F_CODMAG 3 BEGIN FLAGS "U" - PROMPT 2 18 "Magazzino " + PROMPT 2 18 "Magazzino " FIELD S7[1,3] USE MAG SELECT CODTAB[4,5]="" INPUT CODTAB F_CODMAG @@ -472,7 +472,7 @@ END STRING F_DESMAG 50 BEGIN FLAGS "U" - PROMPT 20 18 "" + PROMPT 24 18 "" USE MAG KEY 2 INPUT S0 F_DESMAG COPY DISPLAY F_CODMAG @@ -483,7 +483,7 @@ END STRING F_CODDEP 2 BEGIN FLAGS "U" - PROMPT 2 19 "Deposito " + PROMPT 2 19 "Deposito " FIELD S7[4,5] USE MAG // SELECT CODTAB[4,5]!="" INPUT CODTAB[1,3] F_CODMAG @@ -501,7 +501,7 @@ END STRING F_DESDEP 50 BEGIN FLAGS "U" - PROMPT 20 19 "" + PROMPT 24 19 "" USE MAG KEY 2 INPUT S0 F_DESDEP COPY DISPLAY F_CODDEP @@ -510,6 +510,63 @@ BEGIN END +STRING F_CODMAG_C 3 +BEGIN + FLAGS "U" + PROMPT 2 20 "Mag. collegato " + FIELD S8[1,3] + USE MAG SELECT CODTAB[4,5]="" + INPUT CODTAB F_CODMAG_C + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_CODMAG_C CODTAB[1,3] + OUTPUT F_CODDEP_C CODTAB[4,5] + OUTPUT F_DESMAG_C S0 + CHECKTYPE NORMAL + MESSAGE EMPTY RESET,F_CODDEP_C|RESET,F_DESDEP_C + MESSAGE ENABLE,F_CODDEP_C|ENABLE,F_DESDEP_C +END + +STRING F_DESMAG_C 50 +BEGIN + FLAGS "U" + PROMPT 24 20 "" + USE MAG KEY 2 + INPUT S0 F_DESMAG_C + COPY DISPLAY F_CODMAG_C + COPY OUTPUT F_CODMAG_C +END + + +STRING F_CODDEP_C 2 +BEGIN + FLAGS "U" + PROMPT 2 21 "Dep. collegato " + FIELD S8[4,5] + USE MAG // SELECT CODTAB[4,5]!="" + INPUT CODTAB[1,3] F_CODMAG_C + INPUT CODTAB[4,5] F_CODDEP_C + DISPLAY "Cod.Mag." CODTAB[1,3] + DISPLAY "Cod.Dep" CODTAB[4,5] + DISPLAY "Descrizione@50" S0 + OUTPUT F_CODMAG_C CODTAB[1,3] + OUTPUT F_CODDEP_C CODTAB[4,5] + OUTPUT F_DESDEP_C S0 + CHECKTYPE NORMAL + MESSAGE EMPTY RESET,F_DESDEP_C +END + +STRING F_DESDEP_C 50 +BEGIN + FLAGS "U" + PROMPT 24 21 "" + USE MAG KEY 2 + INPUT S0 F_DESDEP_C + COPY DISPLAY F_CODDEP_C + COPY OUTPUT F_CODDEP_C + CHECKTYPE NORMAL +END + ENDPAGE diff --git a/mr/mrtblnp.h b/mr/mrtblnp.h index 37450718c..13698fc08 100755 --- a/mr/mrtblnp.h +++ b/mr/mrtblnp.h @@ -58,6 +58,10 @@ #define F_DESMAG 161 #define F_CODDEP 162 #define F_DESDEP 163 +#define F_CODMAG_C 164 +#define F_DESMAG_C 165 +#define F_CODDEP_C 166 +#define F_DESDEP_C 167 #define F_YEAR 201 #define F_TYPE 202 diff --git a/mr/mrtblnp.uml b/mr/mrtblnp.uml index bab8329b8..391a9bcae 100755 --- a/mr/mrtblnp.uml +++ b/mr/mrtblnp.uml @@ -499,7 +499,7 @@ END STRING F_CODMAG 3 BEGIN FLAGS "U" - PROMPT 2 18 "Magazzino " + PROMPT 2 18 "Magazzino " FIELD S7[1,3] USE MAG SELECT CODTAB[4,5]="" INPUT CODTAB F_CODMAG @@ -516,7 +516,7 @@ END STRING F_DESMAG 50 BEGIN FLAGS "U" - PROMPT 20 18 "" + PROMPT 24 18 "" USE MAG KEY 2 INPUT S0 F_DESMAG COPY DISPLAY F_CODMAG @@ -527,7 +527,7 @@ END STRING F_CODDEP 2 BEGIN FLAGS "U" - PROMPT 2 19 "Deposito " + PROMPT 2 19 "Deposito " FIELD S7[4,5] USE MAG // SELECT CODTAB[4,5]!="" INPUT CODTAB[1,3] F_CODMAG @@ -545,7 +545,7 @@ END STRING F_DESDEP 50 BEGIN FLAGS "U" - PROMPT 20 19 "" + PROMPT 24 19 "" USE MAG KEY 2 INPUT S0 F_DESDEP COPY DISPLAY F_CODDEP @@ -553,6 +553,63 @@ BEGIN CHECKTYPE NORMAL END +STRING F_CODMAG_C 3 +BEGIN + FLAGS "U" + PROMPT 2 20 "Mag. collegato " + FIELD S8[1,3] + USE MAG SELECT CODTAB[4,5]="" + INPUT CODTAB F_CODMAG_C + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_CODMAG_C CODTAB[1,3] + OUTPUT F_CODDEP_C CODTAB[4,5] + OUTPUT F_DESMAG_C S0 + CHECKTYPE NORMAL + MESSAGE EMPTY RESET,F_CODDEP_C|RESET,F_DESDEP_C + MESSAGE ENABLE,F_CODDEP_C|ENABLE,F_DESDEP_C +END + +STRING F_DESMAG_C 50 +BEGIN + FLAGS "U" + PROMPT 24 20 "" + USE MAG KEY 2 + INPUT S0 F_DESMAG_C + COPY DISPLAY F_CODMAG_C + COPY OUTPUT F_CODMAG_C +END + + +STRING F_CODDEP_C 2 +BEGIN + FLAGS "U" + PROMPT 2 21 "Dep. collegato " + FIELD S8[4,5] + USE MAG // SELECT CODTAB[4,5]!="" + INPUT CODTAB[1,3] F_CODMAG_C + INPUT CODTAB[4,5] F_CODDEP_C + DISPLAY "Cod.Mag." CODTAB[1,3] + DISPLAY "Cod.Dep" CODTAB[4,5] + DISPLAY "Descrizione@50" S0 + OUTPUT F_CODMAG_C CODTAB[1,3] + OUTPUT F_CODDEP_C CODTAB[4,5] + OUTPUT F_DESDEP_C S0 + CHECKTYPE NORMAL + MESSAGE EMPTY RESET,F_DESDEP_C +END + +STRING F_DESDEP_C 50 +BEGIN + FLAGS "U" + PROMPT 24 21 "" + USE MAG KEY 2 + INPUT S0 F_DESDEP_C + COPY DISPLAY F_CODDEP_C + COPY OUTPUT F_CODDEP_C + CHECKTYPE NORMAL +END + ENDPAGE diff --git a/sc/sc0100p.h b/sc/sc0100p.h index 9fb1f5b6b..d59db4488 100755 --- a/sc/sc0100p.h +++ b/sc/sc0100p.h @@ -19,20 +19,24 @@ #define E_RAGSOCFORNITORE 316 #define E_PIVAFORNITORE 317 #define E_COFIFORNITORE 318 +#define E_GRUPPO 319 +#define E_CONTO 320 +#define E_SOTTOCONTO 321 +#define E_DESCONTO 322 -#define E_TOTALE 319 -#define E_CODPAG 320 -#define E_DESPAG 321 -#define E_ANNORIF 322 -#define E_NUMRIF 323 -#define E_DESCAGG 324 -#define E_SEZIONE 325 -#define E_TOTDOCVAl 326 -#define E_VALUTA 327 -#define E_DATACAMBIO 328 -#define E_CAMBIO 329 -#define E_TOTDOCVAL 330 -#define E_IMPOSTE 331 -#define E_CODCAUS 332 -#define E_CAUDES 333 +#define E_TOTALE 329 +#define E_CODPAG 330 +#define E_DESPAG 331 +#define E_ANNORIF 332 +#define E_NUMRIF 333 +#define E_DESCAGG 334 +#define E_SEZIONE 335 +#define E_TOTDOCVAl 336 +#define E_VALUTA 337 +#define E_DATACAMBIO 338 +#define E_CAMBIO 339 +#define E_TOTDOCVAL 340 +#define E_IMPOSTE 341 +#define E_CODCAUS 342 +#define E_CAUDES 343 #endif diff --git a/sc/sc0100p.uml b/sc/sc0100p.uml index 173546f50..ed7fcaa0e 100755 --- a/sc/sc0100p.uml +++ b/sc/sc0100p.uml @@ -129,17 +129,19 @@ BEGIN COPY OUTPUT E_DESCAGG END -LIST E_CLIFO 1 16 -BEGIN - ITEM "C|Cliente" MESSAGE SHOW,1@|HIDE,2@ - ITEM "F|Fornitore" MESSAGE SHOW,2@|HIDE,1@ +LIST E_CLIFO 1 10 +BEGIN + PROMPT 1 8 "" + ITEM " |Conto" MESSAGE HIDE,1@|HIDE,2@|SHOW,3@ + ITEM "C|Cliente" MESSAGE SHOW,1@|HIDE,2@|HIDE,3@ + ITEM "F|Fornitore" MESSAGE HIDE,1@|SHOW,2@|HIDE,3@ FIELD LF_PARTITE->TIPOC - FLAGS "HG" + FLAGS "DG" END NUMBER E_CLIENTE 6 BEGIN - PROMPT 1 8 "Cliente " + PROMPT 17 8 "" FIELD LF_PARTITE->SOTTOCONTO FLAGS "DG" GROUP 1 @@ -162,7 +164,7 @@ END NUMBER E_FORNITORE 6 BEGIN - PROMPT 1 8 "Fornitore " + PROMPT 17 8 "" FIELD LF_PARTITE->SOTTOCONTO FLAGS "DG" GROUP 2 @@ -183,6 +185,52 @@ BEGIN ADD RUN cg0 -1 F END +NUMBER E_GRUPPO 3 +BEGIN + PROMPT 17 8 "" + FLAGS "D" + GROUP 3 + FIELD LF_PARTITE->GRUPPO +END + +NUMBER E_CONTO 3 +BEGIN + PROMPT 22 8 "" + FLAGS "D" + GROUP 3 + FIELD LF_PARTITE->CONTO +END + +NUMBER E_SOTTOCONTO 6 +BEGIN + PROMPT 27 8 "" + FIELD LF_PARTITE->SOTTOCONTO + FLAGS "DG" + USE LF_PCON + INPUT GRUPPO E_GRUPPO + INPUT CONTO E_CONTO + INPUT SOTTOCONTO E_SOTTOCONTO + OUTPUT E_DESCONTO DESCR + CHECKTYPE REQUIRED + GROUP 3 +END + +STRING E_RAGSOCCLIENTE 50 +BEGIN + PROMPT 25 8 "" + FLAGS "D" + GROUP 1 + USE LF_CLIFO KEY 2 + INPUT TIPOCF "C" + INPUT RAGSOC E_RAGSOCCLIENTE + DISPLAY "Ragione Sociale@50" RAGSOC + DISPLAY "Partita IVA@12" PAIV + DISPLAY "Codice" CODCF + COPY OUTPUT E_CLIENTE + CHECKTYPE REQUIRED + ADD RUN cg0 -1 C +END + STRING E_RAGSOCFORNITORE 50 BEGIN PROMPT 25 8 "" @@ -200,20 +248,11 @@ BEGIN ADD RUN cg0 -1 F END -STRING E_RAGSOCCLIENTE 50 +STRING E_DESCONTO 50 40 BEGIN - PROMPT 25 8 "" + PROMPT 35 8 "" + GROUP 3 FLAGS "D" - GROUP 1 - USE LF_CLIFO KEY 2 - INPUT TIPOCF "C" - INPUT RAGSOC E_RAGSOCCLIENTE - DISPLAY "Ragione Sociale@50" RAGSOC - DISPLAY "Partita IVA@12" PAIV - DISPLAY "Codice" CODCF - COPY OUTPUT E_CLIENTE - CHECKTYPE REQUIRED - ADD RUN cg0 -1 C END STRING E_COFICLIENTE 16 diff --git a/sc/sc0101.cpp b/sc/sc0101.cpp index 7c2674f39..9e0d4e33e 100755 --- a/sc/sc0101.cpp +++ b/sc/sc0101.cpp @@ -76,8 +76,12 @@ TFattura_mask::TFattura_mask(TRiga_partite& fattura) else hide(-3); - const short clifo = _fattura.partita().conto().tipo() == 'C' ? E_CLIENTE : E_FORNITORE; - set_handler(clifo, clifo_handler); + const char tipo = _fattura.partita().conto().tipo(); + if (tipo > ' ') + { + const short clifo = tipo == 'C' ? E_CLIENTE : E_FORNITORE; + set_handler(clifo, clifo_handler); + } set_handler(E_DATADOC, datadoc_handler); set_handler(E_CODPAG, codpag_handler); diff --git a/sv/sv1100.cpp b/sv/sv1100.cpp index 596383bd4..183940999 100755 --- a/sv/sv1100.cpp +++ b/sv/sv1100.cpp @@ -374,6 +374,7 @@ class TStampa_schede : public TApplication char _prov; //

rovvisori o efinitivi bool _peragenti; // Stampa per agenti bool _perageart; // Stampa per agenti ma ordinata per Articolo, Cliente, documento + bool _provvart; // Stampa solo righe articolo con provvigione TString _curagente; // Codice e descrizione agente corrente TDate _fromdate, _todate; // Date limite TString _fromnum, _tonum; // Numerazioni limite @@ -912,11 +913,17 @@ bool TStampa_schede::raggruppa_articoli(TCursor& cur, TProgind* pi, bool last_cl for (int r = doc.physical_rows(); r > 0 && can_print; r--) { const TRiga_documento& rdoc = doc[r]; - if (rdoc.is_articolo() && fill_rdoc(curtab, rdoc, TRUE)) - { - can_print = write_tab(tab); - if (can_print) - update_totage(curtab); + if (rdoc.is_articolo()) + { + bool fill = TRUE; + if (_provvart) + fill = !rdoc.provvigione().is_zero(); + if (fill && fill_rdoc(curtab, rdoc, TRUE)) + { + can_print = write_tab(tab); + if (can_print) + update_totage(curtab); + } } } } @@ -1060,7 +1067,7 @@ bool TStampa_schede::filtra_doc_per_stat(const TRelation* rel) { const TString16 tipodoc = rel->curr().get(DOC_TIPODOC); const TRectype& tipo = cache().get("%TIP", tipodoc); - const stat = tipo.get_bool("B2"); + const bool stat = tipo.get_bool("B2"); return stat; } @@ -1191,6 +1198,7 @@ bool TStampa_schede::menu(MENU_TAG mt) _prov = m.get(F_PROVVIS)[0]; _peragenti = m.get_bool(F_SORTAGENTI); _perageart = m.get_bool(F_SORTAGEART); + _provvart = m.get_bool(F_PROVVART); _fromdate = m.get_date(F_FROMDATE); _todate = m.get_date(F_TODATE); _fromnum = m.get(F_FROMNUM); diff --git a/sv/sv1100a.h b/sv/sv1100a.h index bc96556f3..2710fbde1 100755 --- a/sv/sv1100a.h +++ b/sv/sv1100a.h @@ -17,6 +17,7 @@ #define F_SORTAGEART 115 #define F_DAAGENTE 116 #define F_ADAGENTE 117 +#define F_PROVVART 118 #define F_SINTETICA 201 #define F_DETTAGLIATA 202 diff --git a/sv/sv1100a.uml b/sv/sv1100a.uml index 0985272ec..7dad7d702 100755 --- a/sv/sv1100a.uml +++ b/sv/sv1100a.uml @@ -88,29 +88,21 @@ BEGIN FLAGS "HB" END +GROUPBOX DLG_NULL 78 4 +BEGIN + PROMPT 1 9 "@bSelezione Agenti" +END + BOOLEAN F_SORTAGENTI BEGIN - PROMPT 2 9 "Ordinamento per agenti" + PROMPT 2 10 "Ordinamento per agenti" MESSAGE FALSE CLEAR,4@ MESSAGE TRUE ENABLE,4@ END -GROUPBOX DLG_NULL 78 3 -BEGIN - PROMPT 1 10 "@bSelezione Agenti" -END - -BOOLEAN F_SORTAGEART -BEGIN - PROMPT 2 11 "Dettaglio articoli" - MESSAGE TRUE "D",F_TIPO|DISABLE,F_TIPO|CLEAR,F_ORDINE - MESSAGE FALSE ENABLE,F_TIPO - GROUP 4 -END - STRING F_DAAGENTE 5 BEGIN - PROMPT 33 11 "Dall'agente " + PROMPT 2 11 "Dall'agente " FLAGS "DZ" USE LF_AGENTI INPUT CODAGE F_DAAGENTE @@ -124,7 +116,7 @@ END STRING F_ADAGENTE 5 BEGIN - PROMPT 59 11 "All'agente " + PROMPT 23 11 "All'agente " FLAGS "DZ" COPY USE F_DAAGENTE INPUT CODAGE F_ADAGENTE @@ -135,6 +127,20 @@ BEGIN GROUP 4 END +BOOLEAN F_SORTAGEART +BEGIN + PROMPT 50 10 "Dettaglio articoli" + MESSAGE TRUE "D",F_TIPO|DISABLE,F_TIPO|CLEAR,F_ORDINE|ENABLE,F_PROVVART + MESSAGE FALSE ENABLE,F_TIPO|CLEAR,F_PROVVART + GROUP 4 +END + +BOOLEAN F_PROVVART +BEGIN + PROMPT 50 11 "Articoli con provvigione" + GROUP 4 +END + GROUPBOX DLG_NULL 78 4 BEGIN PROMPT 1 13 "@bLimiti di stampa" diff --git a/sv/sv1200.cpp b/sv/sv1200.cpp index cc1bd76be..5781a5266 100755 --- a/sv/sv1200.cpp +++ b/sv/sv1200.cpp @@ -392,6 +392,7 @@ class TStampa_stat : public TPrint_application bool _st_tota; // flag stampa totali di "anno" bool _st_val; // Stampa valori bool _st_qta; // Stampa quantita' + bool _st_uni; // Stampa valori/quantita' // ****************** // stampa file di Output TString _wrk_row; // stringa di lavoro per le righe di stampa @@ -506,14 +507,22 @@ bool TStampa_stat::set_print(int i) _st_tota=printmask().get_bool(F_STTOTALIANNO); _largcol = 0; - if (_st_val) _largcol += LARG_COLVAL; - if (_st_qta) _largcol += LARG_COLQTA; - if (_st_totr) - { - _largcol += LARG_COLPERC; - if (_st_val && _st_qta) // Doppia percentuale + if (_st_val) + { + _largcol += LARG_COLVAL; + if (_st_totr) _largcol += LARG_COLPERC; - } + } + if (_st_qta) + { + _largcol += LARG_COLQTA; + if (_st_totr) + _largcol += LARG_COLPERC; + } + if (_st_uni) + _largcol += LARG_COLVAL; + if (_largcol <= 0) + _largcol = 1; _numcol_dati = selmask().get_int(F_PERIODO); _col_anno =min(_numcol_dati,printmask().get_int(F_COLANNO)); //numero di colonne che formano un "Anno" @@ -589,7 +598,9 @@ void TStampa_stat::preprocess_header() nome_colonna1(col, col1); nome_colonna2(col, col2); _wrk_row = col1; - if (_st_val && _st_qta) + + const bool multiprint = (_st_val + _st_qta + _st_uni) > 1; + if (multiprint) { col1.trim(); col2.trim(); @@ -598,13 +609,28 @@ void TStampa_stat::preprocess_header() } set_row_atpos('H',row,_wrk_row,POS_PRIMACOL+c*_largcol); - if (_st_val && _st_qta) + if (multiprint) { + lastrow = row+1; int pos = POS_PRIMACOL+c*_largcol; - set_row_atpos('H',row+1,"Valore", pos + LARG_COLVAL-7); - if (_st_totr) pos += LARG_COLPERC; - set_row_atpos('H',row+1,"Quantita'",pos+LARG_COLVAL+LARG_COLQTA-13); - lastrow=row+1; + if (_st_val) + { + set_row_atpos('H',lastrow,"Valore", pos + LARG_COLVAL-7); + pos += LARG_COLVAL; + if (_st_totr) + pos += LARG_COLPERC; + } + if (_st_qta) + { + set_row_atpos('H',lastrow,"Quantita'",pos+LARG_COLQTA-13); + pos += LARG_COLQTA; + if (_st_totr) + pos += LARG_COLPERC; + } + if (_st_uni) + { + set_row_atpos('H',lastrow,"Medio", pos + LARG_COLVAL-6); + } } else { @@ -618,13 +644,20 @@ void TStampa_stat::preprocess_header() } if (_st_totr) { - lastrow=row+1; - if (_st_val && _st_qta) + int pos = POS_PRIMACOL+c*_largcol; + if (_st_val) { - const int pos = POS_PRIMACOL+c*_largcol; - set_row_atpos('H',row+1,"Perc.",pos+LARG_COLVAL+1); + lastrow=row+1; + pos += LARG_COLVAL; + set_row_atpos('H', lastrow, "Perc.", pos); + pos += LARG_COLPERC; } - set_row_atpos('H',row+1,"Perc.",POS_PRIMACOL+(c+1)*_largcol-LARG_COLPERC+1); + if (_st_qta) + { + lastrow=row+1; + pos += LARG_COLQTA; + set_row_atpos('H', lastrow, "Perc.", pos); + } } } row=lastrow; @@ -877,95 +910,138 @@ int TStampa_stat::set_rows_colonne(int row, const TRectype &strec) col = 0; for (int c = 0; c < _numcol_dati; c++) { - for (int t = 0; t < 2; t++) // Ciclo su valore e quantita' + const int idx = int(c / _col_anno); + for (int t = 0; t < 3; t++) // Ciclo su valore, quantita' e unitario { if (t == 0 && !_st_val) continue; if (t == 1 && !_st_qta) continue; + if (t == 2 && !_st_uni) + continue; - const int idx = int(c / _col_anno); - const real& tot_riga = t == 0 ? _totval_riga[idx] : _totqta_riga[idx]; - - colname.format("%s%d", t == 0 ? SVS_VALCOLNAME : SVS_QTACOLNAME, c); - const char* PICT = t == 0 ? PICTURE_VALORI : PICTURE_QUANTITA; + const real& tot_riga = t == 1 ? _totqta_riga[idx] : _totval_riga[idx]; + colname.format("%s%d", t == 1 ? SVS_QTACOLNAME : SVS_VALCOLNAME, c); + const char* PICT = t == 1 ? PICTURE_QUANTITA : PICTURE_VALORI; + + real colval = strec.get_real(colname); + if (t == 2) + { + colname.format("%s%d", SVS_QTACOLNAME, c); + const real qta = strec.get_real(colname); + if (qta.is_zero()) + colval = ZERO; + else + colval /= qta; + } position = POS_PRIMACOL + col*_largcol; - if (_st_val && _st_qta && t == 1) + if (t == 1 && _st_qta) { - position += LARG_COLVAL; - if (_st_totr) position += LARG_COLPERC; + if (_st_val) + { + position += LARG_COLVAL; + if (_st_totr) position += LARG_COLPERC; + } + } + if (t == 2 && _st_uni) + { + if (_st_val) + { + position += LARG_COLVAL; + if (_st_totr) position += LARG_COLPERC; + } + if (_st_qta) + { + position += LARG_COLQTA; + if (_st_totr) position += LARG_COLPERC; + } } switch (strec.get_char(SVS_TIPO)) { case LINEA_DATI: last_data=strec; - set_row_atpos('R',row,strec.get_real(colname).string(PICT),position); + set_row_atpos('R',row,colval.string(PICT),position); break; case LINEA_RAFFRONTI: switch (printmask().get(F_TIPORAFFRONTO)[0]) { case COMP_AS_VALUE: - set_row_atpos('R',row, strec.get_real(colname).string(PICT),position); + set_row_atpos('R',row, colval.string(PICT),position); break; case COMP_AS_DIFF: - r_totc= "+"; - r_totc << PICT; - set_row_atpos('R',row,((real)(last_data.get_real(colname)-strec.get_real(colname))).string(r_totc),position); + if (t < 2) + { + r_totc= "+"; + r_totc << PICT; + set_row_atpos('R',row,((real)(last_data.get_real(colname)-strec.get_real(colname))).string(r_totc),position); + } break; //?!?! aggiungi_perc=FALSE; case COMP_AS_PERC: - position += t == 0 ? LARG_COLVAL : LARG_COLQTA; - if (!strec.get_real(colname).is_zero()) - set_row_atpos('R',row,((real)(100*last_data.get_real(colname)/strec.get_real(colname))).string(PICTURE_PERCENT),position); - aggiungi_perc=FALSE; + if (t < 2) + { + position += t == 0 ? LARG_COLVAL : LARG_COLQTA; + if (!colval.is_zero()) + { + real p = 100.0 * last_data.get_real(colname) / colval; p.round(1); + set_row_atpos('R',row,p.string(PICTURE_PERCENT),position); + } + aggiungi_perc=FALSE; + } break; } break; case LINEA_TARGET: // v2.0 - set_row_atpos('R',row,strec.get_real(colname).string(PICT),position); + set_row_atpos('R',row,colval.string(PICT),position); break; } - - // colonna con la percentuale rispetto al totale di riga - if (_st_totr && aggiungi_perc && !tot_riga.is_zero()) + + if (t < 2) { - const int pos = position + (t == 0 ? LARG_COLVAL : LARG_COLQTA); - set_row_atpos('R',row,((real)(strec.get_real(colname)/tot_riga*100.0)).string(PICTURE_PERCENT),pos); - } - // riga con i totali di colonna - if (_st_totc && aggiungi_perc ) - { - TRectype & _rec_totale=(TRectype &)_group_recs[numlevels()]; - if (!_rec_totale.get_real(colname).is_zero()) + // colonna con la percentuale rispetto al totale di riga + if (_st_totr && aggiungi_perc && !tot_riga.is_zero()) { - r_totc=((real)(strec.get_real(colname)/_rec_totale.get_real(colname)*100.0)).string(PICTURE_PERCENT); - set_row_atpos('R',row+1,(const char *)r_totc,position+_largcol-LARG_COLPERC); - } else { - // aggiunge comunque una riga vuota per la spaziatura - set_row_atpos('R',row+1,"",0); + const int pos = position + (t == 0 ? LARG_COLVAL : LARG_COLQTA); + real p = 100.0 * colval / tot_riga; p.round(1); + set_row_atpos('R',row,p.string(PICTURE_PERCENT),pos); + } + // riga con i totali di colonna + if (_st_totc && aggiungi_perc ) + { + TRectype & _rec_totale=(TRectype &)_group_recs[numlevels()]; + const real tot = _rec_totale.get_real(colname); + if (!tot.is_zero()) + { + real p = 100.0 * colval / tot; p.round(1); + r_totc = p.string(PICTURE_PERCENT); + set_row_atpos('R',row+1,(const char *)r_totc,position+_largcol-LARG_COLPERC); + } else { + // aggiunge comunque una riga vuota per la spaziatura + set_row_atpos('R',row+1,"",0); + } + } + // colonna con il totale di un "anno" + if (_st_tota && aggiungi_perc && (((c+1)%_col_anno)==0 || c== _numcol_dati-1)) + { + col++; + + position = POS_PRIMACOL+col*_largcol; + if (_st_val && _st_qta && t == 1) + { + position += LARG_COLVAL; + if (_st_totr) position += LARG_COLPERC; + } + set_row_atpos('R',row,(const char *)tot_riga.string(PICT),position); + if (_st_totr && aggiungi_perc) + { + position += t == 0 ? LARG_COLVAL : LARG_COLQTA; + set_row_atpos('R',row,(const char *)real(100).string(PICTURE_PERCENT),position); + } } } - // colonna con il totale di un "anno" - if (_st_tota && aggiungi_perc && (((c+1)%_col_anno)==0 || c== _numcol_dati-1)) - { - col++; - - position = POS_PRIMACOL+col*_largcol; - if (_st_val && _st_qta && t == 1) - { - position += LARG_COLVAL; - if (_st_totr) position += LARG_COLPERC; - } - set_row_atpos('R',row,(const char *)tot_riga.string(PICT),position); - if (_st_totr && aggiungi_perc) - { - position += t == 0 ? LARG_COLVAL : LARG_COLQTA; - set_row_atpos('R',row,(const char *)real(100).string(PICTURE_PERCENT),position); - } - } - } + } col++; } @@ -1185,14 +1261,14 @@ bool TStampa_stat::menu(MENU_TAG ) TMask& m = selmask(); TSheet_field& sheet = m.sfield(F_CHIAVE); TString tmp; - KEY k; + KEY k; + m.set(F_STAMPA_VAL, "X"); while ((k = m.run()) != K_QUIT) { _numcol_dati = m.get_int(F_PERIODO); - - const TString& tipodato = m.get(F_TIPODATO); - _st_val = tipodato != COLONNA_QTA; - _st_qta = tipodato != COLONNA_VALORE; + _st_val = m.get_bool(F_STAMPA_VAL); + _st_qta = m.get_bool(F_STAMPA_QTA); + _st_uni = m.get_bool(F_STAMPA_UNI); set_column_frequency(); _key.cut(0); @@ -1267,8 +1343,6 @@ bool TStampa_stat::menu(MENU_TAG ) return FALSE; } - - void TStampa_stat::fill_field_list(TMask& m) { // opzioni per il tipo di dato @@ -1349,17 +1423,13 @@ void TStampa_stat::set_frequency() TList_field& multiplo = (TList_field&)m.field(F_MULTIPLO); - TToken_string std_codes("G|S|Q|1|2|3|4|6|A"); - TToken_string std_descr("Giorni|Settimane|Quindicine|Mesi|" - "Bimestri|Trimestri|Quadrimestri|Semestri|Anni"); - TToken_string codes(8), descr(80); switch(_stats.frequency()) { - case fs_giornaliera : codes = std_codes; break; + case fs_giornaliera : codes = "G|S|Q|1|2|3|4|6|A"; break; case fs_settimanale : codes = "S|3|6|A"; break; - case fs_quindicinale : codes = std_codes.mid(4); break; - case fs_mensile : codes = std_codes.mid(6); break; + case fs_quindicinale : codes = "Q|1|2|3|4|6|A"; break; + case fs_mensile : codes = "1|2|3|4|6|A"; break; case fs_bimestrale : codes = "2|4|6|A"; break; case fs_trimestrale : codes = "3|6|A"; break; case fs_quadrimestrale: codes = "4|A"; break; @@ -1368,19 +1438,11 @@ void TStampa_stat::set_frequency() default :break; } - //TString tmp; for (const char* cod = codes.get(0); cod; cod = codes.get()) - { - //tmp = cod; - //const int pos = std_codes.get_pos(tmp); - //CHECK(pos >= 0, "Invalid frequency char"); - //std_descr.get(pos); descr.add(char2freqname(cod[0])); - } multiplo.replace_items(codes, descr); - if (_stats.frequency() == fs_settimanale) { if (m.focus_field().dlg() == F_MULTIPLO) @@ -1393,7 +1455,6 @@ void TStampa_stat::set_frequency() // setta la durata dell'anno //m.set(F_COL_ANNO, last_period(1992,_stats.frequency())); - } void TStampa_stat::on_config_change() @@ -1496,10 +1557,8 @@ void TStampa_stat::put_column(TRectype & statrec,int col, const TSVriep_record& if (col < 0 || col > SVS_NUMCOLONNE) return; - const bool valun = _msk->get_bool(F_VALORI_UNITARI); real qta; - - if (_st_qta || valun) + if (_st_qta || _st_uni) { const TString& umqta = statrec.get(SVR_UMQTA); if (umqta.not_empty()) @@ -1519,18 +1578,11 @@ void TStampa_stat::put_column(TRectype & statrec,int col, const TSVriep_record& } // no UM ? no valid data! } - if (_st_val) + if (_st_val || _st_uni) { TString16 colname; colname.format("%s%d", SVS_VALCOLNAME, col); real r = statrec.get_real(colname); real val = rieprec.get_real(SVR_VALORE); - if (valun) - { - if (qta.is_zero()) - val = ZERO; - else - val /= qta; - } r += val; statrec.put(colname, r); //statrec.put(SVS_TOTALERIGA, statrec.get_real(SVS_TOTALERIGA)+rieprec.get_real(SVR_VALORE)); diff --git a/sv/sv1200a.h b/sv/sv1200a.h index b51892cc2..8dca36e39 100755 --- a/sv/sv1200a.h +++ b/sv/sv1200a.h @@ -12,10 +12,11 @@ #define F_DATAFIN 209 #define F_DATARAF 210 #define F_TIPOART 211 -#define F_TIPODATO 212 -#define F_TIPOCALC 213 -#define F_COL_ANNO 214 -#define F_VALORI_UNITARI 215 +#define F_TIPOCALC 212 +#define F_COL_ANNO 213 +#define F_STAMPA_VAL 214 +#define F_STAMPA_QTA 215 +#define F_STAMPA_UNI 216 #define F_CHIAVE 222 diff --git a/sv/sv1200a.uml b/sv/sv1200a.uml index eb0de4abd..1eea40628 100755 --- a/sv/sv1200a.uml +++ b/sv/sv1200a.uml @@ -144,7 +144,7 @@ BEGIN WARNING "Il periodo di base deve essere di almento due colonne" END -GROUPBOX DLG_NULL 78 4 +GROUPBOX DLG_NULL 78 5 BEGIN PROMPT 1 11 "@bSelezione" END @@ -157,15 +157,19 @@ BEGIN ITEM "O|Omaggi" END -LIST F_TIPODATO 1 20 +BOOLEAN F_STAMPA_VAL BEGIN - PROMPT 32 12 "Tipo di dati " - ITEM "V|Valori" - MESSAGE ENABLE,F_VALORI_UNITARI - ITEM "Q|Quantita'" - MESSAGE CLEAR,F_VALORI_UNITARI - ITEM "E|Valori e Quantita'" - MESSAGE ENABLE,F_VALORI_UNITARI + PROMPT 32 12 "Stampa valori" +END + +BOOLEAN F_STAMPA_QTA +BEGIN + PROMPT 32 13 "Stampa quantita'" +END + +BOOLEAN F_STAMPA_UNI +BEGIN + PROMPT 32 14 "Stampa valori unitari" END LIST F_TIPOCALC 1 11 @@ -179,11 +183,6 @@ BEGIN MESSAGE ENABLE,F_COL_ANNO END -BOOLEAN F_VALORI_UNITARI -BEGIN - PROMPT 32 13 "Valori unitari" -END - ENDPAGE PAGE "Criteri Raggruppamento" -1 -1 78 19 diff --git a/ve/bolacq.src b/ve/bolacq.src index fdfeb0146..a915c04c9 100755 --- a/ve/bolacq.src +++ b/ve/bolacq.src @@ -11,7 +11,7 @@ MSKFILE=BOLACQ FRMFILE=VEBOL.FRM // modifica CAMPICALC=TOTMER|TOTPRE|SPESE|SPESIMB|SPESTRA|SPESINC|BOLLI|IMPONIBILI|IMPOSTE|TOTDOC|SCONTOD|SCONTOT|OMAGGI -CALCOLI=BASESCONTO +CALCOLI=* // Indica se il documento è indirizzato ad un cliente o ad un fornitore TIPOCF=F diff --git a/ve/bollac.src b/ve/bollac.src index 332907174..486773395 100755 --- a/ve/bollac.src +++ b/ve/bollac.src @@ -9,7 +9,7 @@ TYPE=Bolla di vendita // Dove sono le risorse per il documento // modifica CAMPICALC=TOTMER|TOTPRE|SPESE|SPESIMB|SPESTRA|SPESINC|BOLLI|IMPONIBILI|IMPOSTE|TOTDOC|SCONTOD|SCONTOT|OMAGGI|TOTPROVV -CALCOLI=BASESCONTO +CALCOLI=* TOTPROVV= // Indica se il documento è indirizzato ad un cliente o ad un fornitore TIPOCF=C diff --git a/ve/bollaf.src b/ve/bollaf.src index 8a4c0a8ab..6ad361c2a 100755 --- a/ve/bollaf.src +++ b/ve/bollaf.src @@ -11,7 +11,7 @@ MSKFILE=BOLLAF FRMFILE=BOLLAF.FRM // modifica CAMPICALC=TOTMER -CALCOLI= +CALCOLI=* TOTALE= BASESCONTO= SPESE= diff --git a/ve/fatacq.src b/ve/fatacq.src index ea1febb8c..0f7680f47 100755 --- a/ve/fatacq.src +++ b/ve/fatacq.src @@ -10,7 +10,7 @@ MSKFILE=fatacq FRMFILE=VEFAT.FRM // modifica CAMPICALC=TOTMER|TOTPRE|SPESE|SPESINC|SPESIMB|SPESTRA|BOLLI|IMPONIBILI|IMPOSTE|TOTDOC|SCONTOD|SCONTOT|OMAGGI|PROVVD -CALCOLI=BASESCONTO +CALCOLI=* TOTPROVV = // modifica // Indica se il documento è indirizzato ad un cliente o ad un fornitore diff --git a/ve/fatturaa.src b/ve/fatturaa.src index 89aa9f496..2cbf56960 100755 --- a/ve/fatturaa.src +++ b/ve/fatturaa.src @@ -8,7 +8,7 @@ TYPE=Fattura accompagnatoria // modifica CAMPICALC=TOTMER|TOTPRE|SPESE|SPESINC|SPESIMB|SPESTRA|BOLLI|IMPONIBILI|IMPOSTE|TOTDOC|SCONTOD|SCONTOT|OMAGGI|TOTPROVV -CALCOLI=BASESCONTO +CALCOLI=* TOTPROVV = // modifica // Indica se il documento è indirizzato ad un cliente o ad un fornitore diff --git a/ve/fatturac.src b/ve/fatturac.src index afe4ae8d9..48c7ffabe 100755 --- a/ve/fatturac.src +++ b/ve/fatturac.src @@ -7,7 +7,7 @@ TYPE=Fattura di vendita // modifica CAMPICALC=TOTMER|TOTPRE|SPESE|SPESINC|SPESIMB|SPESTRA|BOLLI|IMPONIBILI|IMPOSTE|TOTDOC|SCONTOD|SCONTOT|OMAGGI|TOTPROVV -CALCOLI=BASESCONTO +CALCOLI=* TOTPROVV = // modifica // Indica se il documento è indirizzato ad un cliente o ad un fornitore @@ -145,16 +145,7 @@ NCOLS=18 18=FR_CODDEPC [RIGHE] -NTIPIRIGA=9 -1=01 -2=02 -3=03 -4=04 -5=05 -6=06 -7=07 -8=08 -9=09 +NTIPIRIGA=* [HANDLERS] NHANDLER=0 diff --git a/ve/listadoc.frm b/ve/listadoc.frm index 8380e1b14..7d1327842 100755 --- a/ve/listadoc.frm +++ b/ve/listadoc.frm @@ -405,7 +405,7 @@ NUMBER 22 18 BEGIN KEY "Imponibile 1" PROMPT 26 5 "" - MESSAGE _RIEPILOGOIVA,1,IMP,0 + MESSAGE _RIEPILOGOIVA,31,IMP,0 PICTURE "###.###.###" END @@ -413,14 +413,14 @@ STRING 23 4 BEGIN KEY "Codice iva 1" PROMPT 44 5 "" - MESSAGE _RIEPILOGOIVA,1,COD,0 + MESSAGE _RIEPILOGOIVA,31,COD,0 END NUMBER 24 18 BEGIN KEY "Imposta 1" PROMPT 49 5 "" - MESSAGE _RIEPILOGOIVA,1,IVA,1 + MESSAGE _RIEPILOGOIVA,31,IVA,1 PICTURE "###.###.###" END @@ -428,7 +428,7 @@ NUMBER 25 18 BEGIN KEY "Imponibile 2" PROMPT 78 5 "" - MESSAGE _RIEPILOGOIVA,1,IMP,0 + MESSAGE _RIEPILOGOIVA,31,IMP,0 PICTURE "###.###.###" END @@ -436,14 +436,14 @@ STRING 26 4 BEGIN KEY "Codice iva 2" PROMPT 97 5 "" - MESSAGE _RIEPILOGOIVA,1,COD,0 + MESSAGE _RIEPILOGOIVA,31,COD,0 END NUMBER 27 18 BEGIN KEY "Imposta 2" PROMPT 102 5 "" - MESSAGE _RIEPILOGOIVA,1,IVA,1 + MESSAGE _RIEPILOGOIVA,31,IVA,1 PICTURE "###.###.###" END @@ -512,7 +512,8 @@ BEGIN KEY "Campo nascosto per il calcolo Totale documenti" PROMPT 1 7 "" MESSAGE _NUMEXPR,IF(((#12!=0)&&(#35==1));#36*#12;#36) - MESSAGE ADD,FL->16|_LISTADOC,STORE,#1 + MESSAGE _LISTADOC,STORE,#1 + MESSAGE _LISTADOC,ADDTOT,FL->16 FLAGS "H" END @@ -521,7 +522,7 @@ BEGIN KEY "Campo nascosto per il calcolo Totale imponibili" PROMPT 40 7 "" MESSAGE _NUMEXPR,IF(((#12!=0)&&(#35==1));#37*#12;#37) - MESSAGE ADD,FL->17 + MESSAGE _LISTADOC,ADDTOT,FL->17 FLAGS "H" END diff --git a/ve/ordbon.src b/ve/ordbon.src index ebf92b8a3..6a654b708 100755 --- a/ve/ordbon.src +++ b/ve/ordbon.src @@ -11,7 +11,7 @@ MSKFILE=ORDBON FRMFILE=ORDBON.FRM // modifica CAMPICALC= -CALCOLI=BASESCONTO +CALCOLI=* TOTPROVV= // Indica se il documento è indirizzato ad un cliente o ad un fornitore TIPOCF=F diff --git a/ve/ordinec.src b/ve/ordinec.src index 5949f10e0..49e253202 100755 --- a/ve/ordinec.src +++ b/ve/ordinec.src @@ -10,7 +10,7 @@ TYPE=Ordine Cliente // modifica CAMPICALC=TOTMER|TOTPRE|SPESE|SPESIMB|SPESTRA|SPESINC|BOLLI|IMPONIBILI|IMPOSTE|TOTDOC|SCONTOD|SCONTOT|OMAGGI|TOTPROVV -CALCOLI=BASESCONTO +CALCOLI=* TOTPROVV = // modifica // Procedure utente da chiamare per il documento ( preprocessarle? ) diff --git a/ve/ordinef.src b/ve/ordinef.src index bff1c9aaa..407e98721 100755 --- a/ve/ordinef.src +++ b/ve/ordinef.src @@ -9,7 +9,7 @@ TYPE=Ordine Fornitore CAMPICALC=TOTMER|TOTPRE|SPESE|SPESIMB|SPESTRA|SPESINC|BOLLI|IMPONIBILI|IMPOSTE|TOTDOC|SCONTOD|SCONTOT|OMAGGI -CALCOLI=BASESCONTO +CALCOLI=* // Dove sono le risorse per il documento NUOVO= diff --git a/ve/ordp.src b/ve/ordp.src new file mode 100755 index 000000000..75683b6fb --- /dev/null +++ b/ve/ordp.src @@ -0,0 +1,245 @@ +#include "veini.h" +#include "verig.h" +#include "veuml.h" +// Esempio di profilo documento : Profilo ordine cliente + +[MAIN] + +// Descrizione a caratteri del documento +TYPE=Ordine Cliente + +// modifica +CAMPICALC= +CALCOLI= +TOTPROVV = +// modifica +// Procedure utente da chiamare per il documento ( preprocessarle? ) +NUOVO= +MODIFICA= +CANCELLA= +STAMPA= +RAGGRUPPA= +USER= + +// Indica se il documento è indirizzato ad un cliente o ad un fornitore +TIPOCF=C + +[PROFILO] +// Si possono indicare, dopo il numero, PROMPT, HELP, WARNING cosi: +// 1|Prompt|Help|Warning + +OCCASEDIT = S_NORMALE //100 +OCFPI = S_DISABILITATO //100 +COFI = S_NORMALE //100 +STATOPAIV = S_NORMALE //100 +PAIVA = S_NORMALE //100 +GOLEM = S_NORMALE +GRRECAPITO = S_NORMALE //100 +INDCF = S_DISABILITATO //100 +CIVCF = S_DISABILITATO //100 +LOCALITACF = S_DISABILITATO //100 +CAPCF = S_DISABILITATO //100 +PROVCOM = S_DISABILITATO //100 +COMCF = S_DISABILITATO //100 +DENCOM = S_DISABILITATO //100 +STATOCF = S_DISABILITATO //100 +DESSTATOCF = S_DISABILITATO //100 +CODVAL1 = S_NORMALE //200 +CODVAL2 = S_NORMALE //200 +NOME_VAL1 = S_NORMALE //200 +NOME_VAL2 = S_NORMALE //200 +CAMBIO = S_NORMALE //200 +DATA_CAMBIO1 = S_NORMALE //200 +DATA_CAMBIO2 = S_NORMALE //200 +CODLIN = S_NORMALE //300 +DESLIN = S_NORMALE //300 +CODPAG = S_NASCOSTO //400 +DESCODPAG = S_NASCOSTO //400 +GRSCADENZE = S_NASCOSTO //500 +DATAINSC = S_NASCOSTO //500 +DATASCAD1 = S_NASCOSTO //500 +DATASCAD2 = S_NASCOSTO //500 +DATASCAD3 = S_NASCOSTO //500 +DATASCAD4 = S_NASCOSTO //500 +DATASCAD5 = S_NASCOSTO //500 +CODABIA = S_NASCOSTO //600 +CODCABA = S_NASCOSTO //600 +DESBANAPP = S_NASCOSTO //600 +CODABIP = S_NASCOSTO //700 +CODCABP = S_NASCOSTO //700 +DESBANPRE = S_NASCOSTO //700 +CATVEN = S_NASCOSTO //800 +DESCATVEN = S_NASCOSTO //800 +CODLIST1 = S_NASCOSTO //800 +CODLIST2 = S_NASCOSTO //800 +DESLIST = S_NASCOSTO //800 +CODCONT1 = S_NASCOSTO //810 +CODCONT2 = S_NASCOSTO //810 +DESCONT = S_NASCOSTO //810 +CODCAMP = S_NASCOSTO //820 +DESCAMP = S_NASCOSTO //820 +SCONTOPERC = S_NASCOSTO //830 +GRINDSPED = S_NORMALE //900 +CODINDSP = S_NORMALE //900 +RAGSOCSP = S_DISABILITATO //900 +INDSP = S_DISABILITATO //900 +CIVSP = S_DISABILITATO //900 +LOCALITASP = S_DISABILITATO //900 +CAPSP = S_DISABILITATO //900 +COMSP = S_DISABILITATO //900 +DENCOMSP = S_DISABILITATO //900 +PROVCOMSP = S_DISABILITATO //900 +STATOSP = S_DISABILITATO //900 +DESSTATOSP = S_DISABILITATO //900 +DATADOCRIF = S_NORMALE //1000 +NUMDOCRIF = S_NOCHECK //1000 +CODAG = S_NASCOSTO //1100 +DESAG = S_NASCOSTO //1100 +CODZON = S_NASCOSTO //1100 +DESZON = S_NASCOSTO //1100 +CODSPMEZZO = S_OBBLIGATORIO //1200 +DESSPMEZZO = S_NORMALE //1200 +CODPORTO = S_NORMALE //1210 +DESPORTO = S_NORMALE //1210 +CODNOTESP1 = S_NORMALE //1300 +DESNOTESP1 = S_NORMALE //1300 +CODNOTESP2 = S_NASCOSTO //1300 +DESNOTESP2 = S_NASCOSTO //1300 +CAUSTRASP = S_NORMALE //1400 +DENCAUSTRASP = S_NORMALE //1400 +CODVETT1 = S_NORMALE //1500 +CODVETT2 = S_NASCOSTO //1500 +CODVETT3 = S_NASCOSTO //1500 +NOMEVETT1 = S_NORMALE //1500 +NOMEVETT2 = S_NASCOSTO //1500 +NOMEVETT3 = S_NASCOSTO //1500 +NCOPIE = S_NASCOSTO //1600 +IMPPAGATO = S_NASCOSTO //1800 +ACCSALDO = S_NASCOSTO //1800 +DOC1 = S_NASCOSTO //1900 +DOC2 = S_NASCOSTO //1900 +DOC3 = S_NASCOSTO //1900 +ASPBENI1 = S_NASCOSTO //2100 +DESCRBENI1 = S_NASCOSTO //2100 +ASPBENI2 = S_NASCOSTO //2100 +DESCRBENI2 = S_NASCOSTO //2100 +IMPNETTI = S_NASCOSTO //2200 +RAGGR = S_NASCOSTO //2300 +RAGGREFF = S_NASCOSTO //2300 +SPESEINC = S_NASCOSTO //2400 +ADDBOLLI = S_NASCOSTO //2400 +CODNOTE = S_NORMALE //2500 +NOTECLI = S_NORMALE //2500 +CAUSMAG = S_OBBLIGATORIO //2900 +CAUSMAGC = S_DISABILITATO //2900 +DESCRMAG = S_NORMALE //2900 +DESCRMAGC = S_DISABILITATO //2900 +DATACONS = S_NORMALE //2000 +BLANK = S_DISABILITATO //4000 + +[DEFAULT] +NDEFAULTS=0 +// 1=F_CAUSTRASP|VEN + +[SHEET] +NCOLS=18 +1=FR_CODMAG +2=FR_CODDEP +3=FR_CODART +4=FR_LIV1 +5=FR_LIV2 +6=FR_LIV3 +7=FR_LIV4 +8=FR_DESCR +9=FR_UMQTA +10=FR_QTA +11=FR_QTAEVASA +12=FR_RIGAEVASA +13=FR_DATACONS +14=FR_CAUS +15=FR_CODMAGC +16=FR_CODDEPC +17=FR_IMPIANTO +18=FR_LINEA + +[RIGHE] +NTIPIRIGA=9 +1=01 +2=02 +3=03 +4=04 +5=05 +6=06 +7=07 +8=08 +9=09 + +// #include +[HANDLERS] +NHANDLER=0 +// S_DISABILITATO = F_ORAPART|1 + +[PROFILOGRUPPO] +101 = S_NASCOSTO +100 = S_NORMALE +200 = S_NASCOSTO +300 = S_NORMALE +400 = S_NORMALE +500 = S_NORMALE +600 = S_NORMALE +700 = S_NORMALE +800 = S_NASCOSTO +810 = S_NORMALE +820 = S_NORMALE +830 = S_NORMALE +900 = S_NORMALE +1000 = S_NORMALE +1100 = S_NORMALE +1200 = S_NORMALE +1210 = S_NORMALE +1300 = S_NORMALE +1400 = S_NORMALE +1500 = S_NORMALE +1600 = S_NASCOSTO +1800 = S_NORMALE +1900 = S_NORMALE +2000 = S_NORMALE +2100 = S_NORMALE +2200 = S_NORMALE +2300 = S_NORMALE +2400 = S_NORMALE +2500 = S_NORMALE +2900 = S_NORMALE +4000 = S_NORMALE + +[ORDINEGRUPPI] +NGROUPS=27 +1=100 +2=2500 +3=200 +4=300 +5=400 +6=500 +7=600 +8=700 +9=2400 +10=2300 +11=800 +12=810 +13=820 +14=830 +15=900 +16=1100 +17=1200 +18=1500 +19=1210 +20=1300 +21=1400 +22=2100 +23=1800 +24=2200 +25=1000 +26=2900 +27=2000 + + diff --git a/ve/sconti.cpp b/ve/sconti.cpp index 6ef28a17d..8c860d3bf 100755 --- a/ve/sconti.cpp +++ b/ve/sconti.cpp @@ -368,9 +368,13 @@ void TCond_vendita::ricerca(bool load_um_only, bool load_scagl_only) set_sconto(""); set_iva(""); set_provv(ZERO); + if (!load_um_only && !load_scagl_only && testa().doc().tipo().calcolo_lordo()) + riga().set(FR_LORDO, "X"); return; } - + else + riga().reset(FR_LORDO); + const TString16 umriga(riga().get(FR_UMQTA)); if (umriga.not_empty()) { diff --git a/ve/ve0100.cpp b/ve/ve0100.cpp index 3b054e0a7..1ef064543 100755 --- a/ve/ve0100.cpp +++ b/ve/ve0100.cpp @@ -92,11 +92,24 @@ void TMotore_application::init_modify_mode( TMask& m ) key << m.get_long(F_NDOC); // Non dare messaggi inutili durante la cancellazione automatica - if (autodeleting() != 0x3 && !doc().modificabile()) + if (autodeleting() != 0x3) { - if (key != __last_key) - warning_box("Documento non modificabile."); - m.disable(DLG_SAVEREC); + const bool no_mod = !doc().modificabile(); + const bool no_del = !doc().cancellabile(); + if (no_del || no_mod) + { + if (key != __last_key) + { + warning_box(format("Documento non %s%s%s.", + (no_mod ? "modificabile":""), + (no_mod && no_del ? " ne' ":""), + (no_del ? "cancellabile":""))); + } + } + if (no_mod) + m.disable(DLG_SAVEREC); + if (no_del) + m.disable(DLG_DELREC); } __last_key = key; } @@ -277,6 +290,34 @@ int TMotore_application::stato_corrente( ) return edit_mask().get_int(F_STATO); } +void TMotore_application::sheet2ini(TSheet_field &sheet,TConfig& ini) +{ + if (sheet.dlg()) + { + // scrive le righe degli sheet associati + TString16 defpar; + TString str(80); + TMask &m = sheet.mask(); + for (int r = 1 ; r <= sheet.items(); r++) + { + TString16 defpar = format("%d,%d",LF_RIGHEDOC,r); + const TMask& sm = sheet.sheet_mask(); + + for (int sf = 0; sf < sm.fields(); sf++) + { + TMask_field& campo = sm.fld(sf); + if (campo.shown() && campo.field()) + { + str = sheet.row(r-1).get(sheet.cid2index(campo.dlg())); + if (str.empty()) str = " "; + TString16 dbfname=campo.field()->name(); + ini.set(campo.field()->name(), str ,defpar); + } + } + } + } +} + void TMotore_application::ini2mask(TConfig& ini, TMask& msk, bool query) { TRelation_application::ini2mask(ini, msk, query); // Default processing diff --git a/ve/ve0100.h b/ve/ve0100.h index d3b92d92d..020ecae32 100755 --- a/ve/ve0100.h +++ b/ve/ve0100.h @@ -65,7 +65,8 @@ protected: static bool ndoc_handler( TMask_field& f, KEY key ); // caricamento Inifile - void ini2mask(TConfig& ini, TMask& m, bool query); + virtual void sheet2ini(TSheet_field& s, TConfig& ini); + virtual void ini2mask(TConfig& ini, TMask& m, bool query); public: virtual TRelation* get_relation( ) const { return _rel;} diff --git a/ve/ve1100.cpp b/ve/ve1100.cpp index 344c3d5f0..62002b8e7 100755 --- a/ve/ve1100.cpp +++ b/ve/ve1100.cpp @@ -91,7 +91,6 @@ class TDocumento_form : public TForm static TDocumento_form* _form; TDocisamfile* _docfile; TRDocisamfile* _rdocfile; - //TLocalisamfile *_tab; TTable *_tip; TSorted_cursor * _sorted_cur; // Valido solo per i form di lista documenti TRelation &_firmrel; // relazione di gestione dei dati della ditta corrente @@ -155,22 +154,17 @@ TDocumento_form::TDocumento_form(TRectype&/*TDocumentoEsteso**/ doc, TRelation& { _form = this; - //_doc = doc; _tip = new TTable("%TIP"); -// _tab = new TLocalisamfile(LF_TAB); TString nomeform; -// TFilename profilo; TString codnum(doc.get(DOC_CODNUM)); TString numdoc(doc.get(DOC_NDOC)); - // modificare ?? + _tip->put("CODTAB", doc.get(DOC_TIPODOC)); // posiziona la tabella dei tipi di documento int err=_tip->read(); // legge la tabella if (err==NOERR) { // se non ci sono errori procede con la stampa nomeform= _tip->get("S5"); // legge il nome del form di stampa TFilename test(nomeform); test.ext("frm"); -// profilo= _tip->get("S4"); // legge il nome del profilo di configurazione -// profilo.ext("ini"); // aggiunge l'estensione al nome del file del profilo if (/* profilo.empty() || */ fexist(nomeform)) { error_box("Nome form di stampa (%s) non valido per il tipo documento %s ", (const char *) nomeform, (const char *) ((TDocumento &)doc).tipo().codice()); @@ -188,9 +182,6 @@ TDocumento_form::TDocumento_form(TRectype&/*TDocumentoEsteso**/ doc, TRelation& read(nomeform); _cli_loaded= FALSE; -// _doc = new TDocumentoEsteso(doc, _condv); // istanzia TDocumentoEsteso -// _condv = new TCond_vendita(NULL); -// _condv->set_clifo(&_doc->clifor()); _doc = new TDocumentoEsteso(doc); // istanzia TDocumentoEsteso _docfile = new TDocisamfile(_doc); _rdocfile = new TRDocisamfile(_doc); @@ -238,7 +229,6 @@ TDocumento_form::TDocumento_form(TRectype&/*TDocumentoEsteso**/ doc, TRelation& TDocumento_form::TDocumento_form(const char* form, TRelation& rel): TForm(form), _firmrel(rel), _valid(FALSE) { _tip = new TTable("%TIP"); -// _tab = new TLocalisamfile(LF_TAB); _cli_loaded= FALSE; _doc = new TDocumentoEsteso; _docfile = new TDocisamfile(_doc); @@ -255,13 +245,9 @@ TDocumento_form::~TDocumento_form() // Membri di cui NON va fatta la delete: // _docfile : perche' viene fatta dal distruttore di TRelation // _rdocfile : perche' viene fatta dal distruttore di TRelation - // _doc : perche' viene fatto dal distruttore di TRelation quando elimina i suoi TLocalisamfile e quindi quando elimina i suoi _curr; - //if (_doc) delete _doc; + if (_doc) delete _doc; if (_sorted_cur) delete _sorted_cur; if (_tip) delete _tip; - //if (_tab) delete _tab; - //if (_docfile) delete _docfile; - //if (_rdocfile) delete _rdocfile; } void TDocumento_form::hide_sections() @@ -319,7 +305,7 @@ bool TDocumento_form::doc_arrange() _form->arrange_form(); } else - pr.set_offset(_form->offset_x(),_form->offset_y()); + pr.set_offset(_form->offset_y(), _form->offset_x()); return TRUE; } @@ -343,8 +329,6 @@ void TDocumento_form::print_documento() { _rdocfile->set_row(r); cursor()->next_match(LF_RIGHEDOC); - if (pr.rows_left() <= (body.height()+1)) // salto pagina - pr.formfeed(); if (!print_on_body(r)) continue; @@ -908,7 +892,7 @@ bool TDocumento_form::validate(TForm_item &cf, TToken_string &s) // se selettore vale 0 restituisce il tot. imponibili con le spese // vedi _RIEPILOGOIVA per la spiegazione dei filtri selettivi byte sel = atoi(s.get()); - real x = sel == 0 ? _doc->imponibile(TRUE): _doc->tot_imponibili(sel); + real x = sel == 0 ? _doc->imponibile(TRUE) : _doc->tot_imponibili(sel); cf.set(x.string()); return (TRUE); @@ -977,6 +961,20 @@ bool TDocumento_form::validate(TForm_item &cf, TToken_string &s) *v -= r; else *v += r; + } else + if (what == "ADDTOT") + { + const real r = cf.get(); + if (!r.is_zero()) + { + TForm_item& tot = cf.find_field(which); + real v = tot.get(); + if (_doc->is_nota_credito()) + v -= r; + else + v += r; + tot.set(v.string()); + } } else { diff --git a/ve/ve2400.uml b/ve/ve2400.uml index be5068ec3..e2da41029 100755 --- a/ve/ve2400.uml +++ b/ve/ve2400.uml @@ -165,7 +165,7 @@ END STRING F_PRESIDIO 20 BEGIN PROMPT 2 9 "Codice presidio m.s. " - FILED LF_ANAMAG->COD_PMS + FIELD LF_ANAMAG->COD_PMS FLAG "U" END @@ -180,8 +180,8 @@ BEGIN FLAGS "A" USE LF_CODCORR KEY NRIGA INPUT CODART F_CODART - ITEM "Cod. art.@20" - ITEM "Tipo@10" + ITEM "Cod. art.@20" + ITEM "Tipo@10" END TEXT DLG_NULL @@ -191,12 +191,12 @@ END SPREADSHEET F_SHEETDESLIN 71 4 BEGIN - PROMPT 2 16 "Descrizioni in lingua" + PROMPT 2 16 "Descrizioni in lingua" FLAGS "A" USE LF_DESLIN KEY NRIGA INPUT CODART F_CODART - ITEM "Cod. lingua" - ITEM "Descrizione@50" + ITEM "Cod. lingua" + ITEM "Descrizione@50" END ENDPAGE diff --git a/ve/ve5200.cpp b/ve/ve5200.cpp index b886ddf7f..ee250c645 100755 --- a/ve/ve5200.cpp +++ b/ve/ve5200.cpp @@ -62,6 +62,7 @@ void TStatus_change::main_loop() pi.addstatus(1); doc->put(DOC_STATO, finale); doc->rewrite(); + pi.addstatus(1L); } // Forza l'aggiornamento dell'indice del cursore diff --git a/ve/ve5200.uml b/ve/ve5200.uml index 3e8ec252a..d30aa591f 100755 --- a/ve/ve5200.uml +++ b/ve/ve5200.uml @@ -145,12 +145,12 @@ BEGIN FLAGS "D" END -BUTTON DLG_CANCEL 10 2 +BUTTON DLG_OK 10 2 BEGIN PROMPT -12 -1 "" END -BUTTON DLG_OK 10 2 +BUTTON DLG_CANCEL 10 2 BEGIN PROMPT -22 -1 "" END diff --git a/ve/ve6100.cpp b/ve/ve6100.cpp index 35eb5e40a..4f07211d1 100755 --- a/ve/ve6100.cpp +++ b/ve/ve6100.cpp @@ -200,47 +200,23 @@ void TContabilizzazione_app::build_num_sheet() } for (pos=0,num.first();num.good();num.next(),pos++) // scorre tutte le numerazioni possibili { - TToken_string t; + TToken_string t,z; t.add(" "); t.add(num.get("CODTAB")); t.add(num.get("S0")); _num_sheet->add(t); s2 = num.get("S2"); // reperisce i tipi documento validi per questa numerazione -/* tipon1 = s2.mid(0,4); - tipon2 = s2.mid(4,4); - tipon3 = s2.mid(8,4); - tipon4 = s2.mid(12,4); - tipon5 = s2.mid(16,4); - tipon6 = s2.mid(20,4); - tipon7 = s2.mid(24,4); - tipon8 = s2.mid(28,4); - tipon9 = s2.mid(32,4); - tipon10 = s2.mid(36,4); */ + + for (int x = 0; x <= s2.len(); x += 4) + z.add(s2.mid(x,4)); + bool found = FALSE; for (int i = _tipi_doc.last(); !found && i >= 0; i--) - found |= s2.find(((TToken_string &)_tipi_doc[i]).get(0)) >= 0; + found |= z.find(((TToken_string &)_tipi_doc[i]).get(0)) >= 0; if (found) _num_sheet->enable_row(pos); else _num_sheet->disable_row(pos); -/* const int n1 = s1.find(tipon1); - const int n2 = s1.find(tipon2); - const int n3 = s1.find(tipon3); - const int n4 = s1.find(tipon4); - const int n5 = s1.find(tipon5); - const int n6 = s1.find(tipon6); - const int n7 = s1.find(tipon7); - const int n8 = s1.find(tipon8); - const int n9 = s1.find(tipon9); - const int n10 = s1.find(tipon10); - if ((tipon1.empty() || n1<0) && (tipon2.empty() || n2<0) && - (tipon3.empty() || n3<0) && (tipon4.empty() || n4<0) && - (tipon5.empty() || n5<0) && (tipon6.empty() || n6<0) && - (tipon7.empty() || n7<0) && (tipon8.empty() || n8<0) && - (tipon9.empty() || n9<0) && (tipon10.empty() || n10<0)) - _num_sheet->disable_row(pos); - else - _num_sheet->enable_row(pos);*/ } } delete cont; @@ -317,31 +293,35 @@ bool TContabilizzazione_app::menu(MENU_TAG mt) void TContabilizzazione_app::contabilize() { - TRelation *doc_rel = new TRelation(LF_DOC); - TRectype *da = new TRectype(LF_DOC); - TRectype *a = new TRectype(LF_DOC); + TRelation doc_rel(LF_DOC); + TRectype da(LF_DOC); + TRectype a(LF_DOC); const long items = _num_sheet->items(); + long tot = 0L; int year_from = _data_ini.year(); int year_to = _data_fine.year(); + bool ok = TRUE; TString16 codnum; TString msg,filt_expr; - TLista_documenti lista_in,lista_out; - TContabilizzazione* cont = new TContabilizzazione(_cod_el); + TContabilizzazione cont(_cod_el); // Compone la lista dei documenti da elaborare - da->put("DATADOC",_data_ini); - da->put("PROVV","D"); - da->put("ANNO",year_from); - a->put("DATADOC",_data_fine); - a->put("PROVV","D"); - a->put("ANNO",year_to); + cont.set_auto(_auto_data); // Setta il flag per il settaggio automatico della data di registrazione del movimento + cont.set_nump(_nump_iva); // Setta il flag per il settaggio del numero di protocollo + + da.put("DATADOC",_data_ini); + da.put("PROVV","D"); + da.put("ANNO",year_from); + a.put("DATADOC",_data_fine); + a.put("PROVV","D"); + a.put("ANNO",year_to); for (long i=0L; ichecked(i)) // Se la numerazione corrente e' stata selezionata { // istanzia un cursore per la numerazione corrente, con i limiti di data codnum = _num_sheet->row(i).get(1); filt_expr = "CODNUM=\""; filt_expr << codnum << "\""; - TCursor doc_cur(doc_rel,filt_expr,3,da,a); + TCursor doc_cur(&doc_rel,filt_expr,3,&da,&a); const long cur_items = doc_cur.items(); // Scorre tutti i documenti che rientrano nell'intervallo selezionato if (cur_items == 0) { @@ -364,13 +344,22 @@ void TContabilizzazione_app::contabilize() for (;jread(doc_cur.curr()) == NOERR && // legge il documento codnum == doc->get("CODNUM") && // controlla che il tipo documento e lo stato siano coerenti con la ELD selezionata doc_tipo_stato_ok(doc)) + { lista_in.add(doc); // Viene aggiunto alla lista dei documenti + + if (!cont.elabora(lista_in,lista_out,_data_reg)) + cont.set_writeable(FALSE); + + tot += cont.docs(); + } else delete doc; } @@ -378,12 +367,9 @@ void TContabilizzazione_app::contabilize() if (p.iscancelled()) break; #endif } - - cont->set_auto(_auto_data); // Setta il flag per il settaggio automatico della data di registrazione del movimento - cont->set_nump(_nump_iva); // Setta il flag per il settaggio del numero di protocollo - cont->elabora(lista_in,lista_out,_data_reg); - if (cont->docs() > 0L) - message_box("Totale documenti contabilizzati: %ld",cont->docs()); + if (tot > 0L) + message_box("Totale documenti contabilizzati: %ld",tot); + xvt_statbar_set(""); } int ve6100 (int argc, char **argv) diff --git a/ve/ve6300.cpp b/ve/ve6300.cpp index ff882b095..23055018d 100755 --- a/ve/ve6300.cpp +++ b/ve/ve6300.cpp @@ -191,47 +191,23 @@ void TGenerazioneEffetti_app::build_num_sheet() } for (pos=0,num.first();num.good();num.next(),pos++) // scorre tutte le numerazioni possibili { - TToken_string t; + TToken_string t,z; t.add(" "); t.add(num.get("CODTAB")); t.add(num.get("S0")); _num_sheet->add(t); s2 = num.get("S2"); // reperisce i tipi documento validi per questa numerazione -/* tipon1 = s2.mid(0,4); - tipon2 = s2.mid(4,4); - tipon3 = s2.mid(8,4); - tipon4 = s2.mid(12,4); - tipon5 = s2.mid(16,4); - tipon6 = s2.mid(20,4); - tipon7 = s2.mid(24,4); - tipon8 = s2.mid(28,4); - tipon9 = s2.mid(32,4); - tipon10 = s2.mid(36,4); */ + + for (int x = 0; x <= s2.len(); x += 4) + z.add(s2.mid(x,4)); + bool found = FALSE; for (int i = _tipi_doc.last(); !found && i >= 0; i--) - found |= s2.find(((TToken_string &)_tipi_doc[i]).get(0)) >= 0; + found |= z.find(((TToken_string &)_tipi_doc[i]).get(0)) >= 0; if (found) _num_sheet->enable_row(pos); else _num_sheet->disable_row(pos); -/* const int n1 = s1.find(tipon1); - const int n2 = s1.find(tipon2); - const int n3 = s1.find(tipon3); - const int n4 = s1.find(tipon4); - const int n5 = s1.find(tipon5); - const int n6 = s1.find(tipon6); - const int n7 = s1.find(tipon7); - const int n8 = s1.find(tipon8); - const int n9 = s1.find(tipon9); - const int n10 = s1.find(tipon10); - if ((tipon1.empty() || n1<0) && (tipon2.empty() || n2<0) && - (tipon3.empty() || n3<0) && (tipon4.empty() || n4<0) && - (tipon5.empty() || n5<0) && (tipon6.empty() || n6<0) && - (tipon7.empty() || n7<0) && (tipon8.empty() || n8<0) && - (tipon9.empty() || n9<0) && (tipon10.empty() || n10<0)) - _num_sheet->disable_row(pos); - else - _num_sheet->enable_row(pos);*/ } } delete cont; @@ -425,33 +401,33 @@ void TGenerazioneEffetti_app::set_options() void TGenerazioneEffetti_app::generate() { - TRelation* doc_rel = new TRelation(LF_DOC); - TRectype *da = new TRectype(LF_DOC); - TRectype *a = new TRectype(LF_DOC); + TRelation doc_rel(LF_DOC); + TRectype da(LF_DOC); + TRectype a(LF_DOC); const long items = _num_sheet->items(); + long tot = 0L; int year_from = _data_ini.year(); int year_to = _data_fine.year(); TString16 codnum; TString msg,filt_expr; - TLista_documenti lista_in,lista_out; - TGenerazione_effetti* gen_eff = new TGenerazione_effetti(_cod_el); + TGenerazione_effetti gen_eff(_cod_el); TDate data; _group_array.destroy(); set_options(); - da->put("DATADOC",_data_ini); - da->put("PROVV","D"); - da->put("ANNO",year_from); - a->put("DATADOC",_data_fine); - a->put("PROVV","D"); - a->put("ANNO",year_to); + da.put("DATADOC",_data_ini); + da.put("PROVV","D"); + da.put("ANNO",year_from); + a.put("DATADOC",_data_fine); + a.put("PROVV","D"); + a.put("ANNO",year_to); for (long i=0L; ichecked(i)) // Se la numerazione corrente e' stata selezionata { // istanzia un cursore per la numerazione corrente, con i limiti di data codnum = _num_sheet->row(i).get(1); filt_expr = "CODNUM=\""; filt_expr << codnum << "\""; - TCursor doc_cur(doc_rel,filt_expr,3,da,a); + TCursor doc_cur(&doc_rel,filt_expr,3,&da,&a); const long cur_items = doc_cur.items(); // Scorre tutti i documenti che rientrano nell'intervallo selezionato if (cur_items == 0) { @@ -493,8 +469,16 @@ void TGenerazioneEffetti_app::generate() { const bool raggruppabile = doc->get_bool(DOC_RAGGREFF); if (!_raggruppa || (_raggruppa && !raggruppabile)) + { // Aggiunge alla lista degli effetti da generare singolarmente + TLista_documenti lista_in,lista_out; + lista_in.add(doc); + if (!gen_eff.elabora(lista_in,lista_out,data)) // La data non serve, cosi' come la lista documenti in uscita + gen_eff.set_writeable(FALSE); + + tot += gen_eff.bills(); + } else { add_to_group_list(doc); // Aggiorna la lista degli effetti da raggruppare @@ -517,14 +501,13 @@ void TGenerazioneEffetti_app::generate() #endif } - gen_eff->set_group(_group_array); // Setta l'elenco dei documenti per generare effetti raggruppati - gen_eff->elabora(lista_in,lista_out,data); // La data non serve, cosi' come la lista documenti in uscita - if (gen_eff->bills() > 0L) - message_box("Totale effetti generati: %ld",gen_eff->bills()); + // Ogni elemento di _group_array è una TToken_string. Ogni elemento della TToken_string contiene + // la chiave per identificare il documento che fa parte di quel raggruppamento + tot += gen_eff.group_bills(_group_array);// Setta l'elenco dei documenti per generare effetti raggruppati + + if (tot > 0L) + message_box("Totale effetti generati: %ld", tot); - delete doc_rel; - delete da; - delete a; xvt_statbar_set(""); } diff --git a/ve/veacc.frm b/ve/veacc.frm index 153d74780..018872155 100755 --- a/ve/veacc.frm +++ b/ve/veacc.frm @@ -4,15 +4,20 @@ JOIN 17 TO 33 INTO TIPOCF==TIPOCF CODCF==CODCF JOIN 20 TO 33 INTO TIPOCF==TIPOCF CODCF==CODCF JOIN 16 TO 33 INTO TIPOCF==TIPOCF CODCF==CODCF CODIND==CODINDSP JOIN 16 TO 17 ALIAS 116 INTO TIPOCF==TIPOCF CODCF==CODCF CODIND==CODINDSP -JOIN 47 INTO CODART==CODART +JOIN 47 TO 34 INTO CODART==CODART JOIN %CPG TO 33 ALIAS 201 INTO CODTAB==CODPAG -JOIN 122 TO 33 ALIAS 202 INTO CODAGE==CODAG +JOIN 122 TO 33 INTO CODAGE==CODAG JOIN %POR TO 33 ALIAS 203 INTO CODTAB==CODPORTO JOIN %BAN TO 33 ALIAS 204 INTO CODTAB==CODABIA+CODCABA JOIN %VET TO 33 ALIAS 205 INTO CODTAB==CODVETT1 JOIN %ABE TO 33 ALIAS 206 INTO CODTAB==ASPBENI1 +JOIN %CTR TO 33 ALIAS 207 INTO CODTAB==CAUSTRASP +JOIN %TIP TO 33 ALIAS 208 INTO CODTAB==TIPODOC +JOIN %BAN TO 33 ALIAS 209 INTO CODTAB==CODABIA +JOIN %NDO TO 33 ALIAS 210 INTO CODTAB==CODNOTESP1 END + DESCRIPTION BEGIN 34->* "Righe documenti di vendita" @@ -23,442 +28,673 @@ BEGIN 116@->* "Indirizzi di spedizione (destinatario)" 47->* "Anagrafica magazzino" 201@->* "Tabella condizioni di pagamento" - 202@->* "Tabella agenti" + 122->* "Archivio agenti" 203@->* "Tabella porto" 204@->* "Tabella banche" 205@->* "Tabella vettori" - 206@->* "Tabella apsetto beni" + 206@->* "Tabella aspetto beni" END GENERAL BEGIN OFFSET 0 0 - FONT "Courier New" - SIZE 12 - MODULE "BUFFETTI_FATTURA_ACCOMPAGNATORIA_01" - PRI_DECIMALS 0 3 + FONT "Roman 10cpi" + SIZE 10 + MODULE "BUFFETTI_FATTURA_8903 D 300" + PRI_DECIMALS 0 2 QTA_DECIMALS 3 3 - IMP_DECIMALS 0 3 + IMP_DECIMALS 0 2 EXCLUDE "08," END -SECTION HEADER ODD 27 -STRINGA 1 36 1 +SECTION HEADER ODD 25 + +STRINGA 200 1 BEGIN - KEY "nome ditta" - PROMPT 5 6 "" - MESSAGE _DITTA,!RAGSOC + KEY "abilita/disabilita stampa intestazione ditta " + PROMPT 1 1 "" + MESSAGE ENABLE,15@ + FLAGS "H" END -STRINGA 2 36 1 +STRINGA 1 35 1 +BEGIN + KEY "nome ditta" + PROMPT 3 4 "" + MESSAGE _DITTA,!RAGSOC + GROUP 15 + FLAGS "D" +END + +STRINGA 2 35 1 BEGIN KEY "indirizzo ditta" - PROMPT 5 7 "" + PROMPT 3 5 "" MESSAGE _DITTA,!IND + GROUP 15 + FLAGS "D" END STRINGA 3 5 1 BEGIN KEY "cap ditta" - PROMPT 5 8 "" + PROMPT 3 6 "" MESSAGE _DITTA,!CAP + GROUP 15 + FLAGS "D" END STRINGA 4 30 1 BEGIN KEY "comune ditta" - PROMPT 12 8 "" + PROMPT 10 6 "" MESSAGE _DITTA,!COM + GROUP 15 + FLAGS "D" END -STRINGA 5 5 1 +STRINGA 5 8 1 BEGIN - KEY "scritta p.iva" - PROMPT 5 9 "P.IVA" + KEY "scritta P.IVA" + PROMPT 3 7 "P.IVA IT" + GROUP 15 + FLAGS "D" END STRINGA 6 16 1 BEGIN KEY "partita iva ditta" - PROMPT 11 9 "" + PROMPT 12 7 "" MESSAGE _DITTA,!IVA + GROUP 15 + FLAGS "D" END -STRINGA 7 9 1 +STRINGA 7 12 1 BEGIN - KEY "scritta cod.fisc." - PROMPT 5 10 "COD.FISC" + KEY "scritta COD.FISC." + PROMPT 3 8 "COD.FISC. IT" + GROUP 15 + FLAGS "D" END STRINGA 8 16 1 BEGIN KEY "codice fiscale ditta" - PROMPT 15 10 "" + PROMPT 16 8 "" MESSAGE _DITTA,!CF -END - -NUMERO 9 30 1 -BEGIN - KEY "reg.soc.trib...." - PROMPT 5 11 "REG.SOC.TRIB.R.E. " - MESSAGE _DITTA,!REGSOC + GROUP 15 FLAGS "D" END -NUMERO 10 30 1 +LIST 9 1 1 BEGIN - KEY "c.c.i.a.a. 143011" - PROMPT 5 12 "C.C.I.A.A. " - MESSAGE _DITTA,!CCIAA - FLAGS "D" - END - -STRINGA 11 37 2 -BEGIN - KEY "Cliente ,rag.soc" - PROMPT 44 7 "" - MESSAGE _CLIENTE,!RAGSOC + KEY "fattura" + PROMPT 38 4 "" + FIELD 208@->I1 + ITEM "|" + ITEM "1| " + ITEM "2|X" + ITEM "3| " END -STRINGA 12 37 1 +LIST 10 1 1 BEGIN - KEY "Cliente, indirizzo" - PROMPT 44 9 "" - MESSAGE _CLIENTE,!INDNUM + KEY "d.d.t." + PROMPT 38 6 "" + FIELD 208@->I1 + ITEM "|" + ITEM "1|X" + ITEM "2| " + ITEM "3| " END -STRINGA 13 37 1 +DATA 11 8 1 BEGIN - KEY "cliente localita" - PROMPT 44 10 "" - MESSAGE _CLIENTE,LOCALITACF -END - -STRINGA 14 5 1 -BEGIN - KEY "Cliente, cap" - PROMPT 44 11 "" - MESSAGE _CLIENTE,!CAP -END - -STRINGA 15 30 2 -BEGIN - KEY "Cliente, comune" - PROMPT 50 11 "" - MESSAGE _CLIENTE,!COM->DENCOM -END - -STRINGA 16 2 1 -BEGIN - KEY "Cliente, provincia" - PROMPT 77 12 "" - MESSAGE _CLIENTE,!COM->PROVCOM -END - -STRING 17 37 2 -BEGIN - KEY "destinazione, rag.soc." - PROMPT 44 14 "" - FIELD 16->RAGSOC -END - -STRINGA 18 37 1 -BEGIN - KEY "destinazione, indirizzo" - PROMPT 44 16 "" - FIELD 16->INDIR -END - -STRINGA 19 35 1 -BEGIN - KEY "destinazione localita" - PROMPT 44 17 "" - FIELD 16->LOCALITA -END - -STRINGA 20 5 1 -BEGIN - KEY "destinazione, cap" - PROMPT 44 18 "" - FIELD 16->CAP -END - -STRINGA 21 50 1 -BEGIN - FLAGS "H" - PROMPT 1 1 "" - FIELD 16->COM -END - -STRINGA 22 30 2 -BEGIN - KEY "destinazione, comune" - PROMPT 50 18 "" - MESSAGE _ISAMREAD,13,COM=#21,DENCOM -END - -STRINGA 23 2 1 -BEGIN - KEY "destinazione, provincia" - PROMPT 77 19 "" - MESSAGE _ISAMREAD,13,COM=#21,PROVCOM -END - -STRINGA 24 3 1 -BEGIN - KEY "codice agente" - PROMPT 4 25 "" - FIELD CODAG -END - -STRINGA 25 7 1 -BEGIN - KEY "codice cliente" - PROMPT 8 25 "" - FIELD CODCF -END - -STRINGA 26 11 1 -BEGIN - KEY "partita iva cliente" - PROMPT 19 25 "" - MESSAGE _CLIENTE,PIVA -END - -STRINGA 27 16 1 -BEGIN - KEY "codice fiscale cliente" - PROMPT 31 25 "" - MESSAGE _CLIENTE,COFI -END - -DATA 28 8 1 -BEGIN - KEY "data documento" - PROMPT 60 21 "" - FIELD DATADOC + KEY "data fattura" + PROMPT 60 19 "" + FIELD 33->DATADOC FORMAT "1442-" END -STRINGA 29 7 +STRINGA 12 7 BEGIN - KEY "numero documento" - PROMPT 71 21 "" + KEY "numero fattura" + PROMPT 71 19 "" FIELD 33->NDOC END -STRINGA 30 2 +STRINGA 13 2 BEGIN KEY "Numero di pagina" - PROMPT 81 21 "" + PROMPT 80 19 "" MESSAGE _PAGENO END -STRINGA 31 48 1 +STRING 14 30 1 BEGIN - KEY "condizioni di pagamento" - PROMPT 4 23 "" - FIELD 201@->S0 + KEY "tipo di documento" + PROMPT 2 19 "" + FIELD 208@->S0 END -STRINGA 32 28 1 +STRINGA 15 5 BEGIN - KEY "banca d'appoggio" - PROMPT 54 23 "" - FIELD 204@->S0 + KEY "codice cliente" + PROMPT 2 21 "" + FIELD 33->CODCF END -NUMERO 33 7 1 +STRINGA 16 3 +BEGIN + KEY "codice agente" + PROMPT 8 21 "" + FIELD 33->CODAG +END + +NUMERO 17 6 BEGIN KEY "ordine" - PROMPT 4 21 "" + PROMPT 12 21 "" FIELD 33->NUMDOCRIF END -DATA 34 10 1 +DATA 18 8 BEGIN KEY "data conferma" - PROMPT 26 21 "" + PROMPT 19 21 "" FIELD 33->DATADOCRIF - FORMAT "1444-" + FORMAT "1442-" +END + +STRING 19 11 +BEGIN + KEY "copy partita iva" + PROMPT 1 1 "" + MESSAGE _CLIENTE,PAIV + MESSAGE COPY,20 + FLAGS "H" +END + +STRING 20 11 +BEGIN + KEY "test PIVA/CF" + PROMPT 1 1 "" + MESSAGE EMPTY ENABLE,22 + MESSAGE ENABLE,21 + FLAGS "H" +END + +STRING 21 11 +BEGIN + KEY "partita iva cliente" + PROMPT 37 21 "" + MESSAGE _CLIENTE,PAIV + FLAGS "D" +END + +STRING 22 16 1 +BEGIN + KEY "codice fiscale cliente" + PROMPT 35 21 "" + MESSAGE _CLIENTE,COFI + FLAGS "D" +END + +STRING 23 2 +BEGIN + KEY "codice iso iva cliente" + PROMPT 35 21 "" + MESSAGE _CLIENTE,STATOPAIV + FLAGS "D" +END + +STRINGA 24 14 +BEGIN + KEY "porto" + PROMPT 52 21 "" + FIELD 203@->S0 +END + +STRING 25 15 +BEGIN + KEY "causale di trasporto" + PROMPT 67 21 "" + FIELD 207@->S0 +END + +STRINGA 26 50 +BEGIN + KEY "condizioni di pagamento" + PROMPT 2 23 "" + FIELD 201@->S0 +END + +STRINGA 27 29 +BEGIN + KEY "banca d'appoggio istituto" + PROMPT 53 23 "" + FIELD 209@->S0 +END + +STRINGA 28 29 +BEGIN + KEY "banca d'appoggio agenzia" + PROMPT 53 23 "" + FIELD 204@->S0 + FLAGS "D" +END + +STRING 29 35 2 +BEGIN + KEY "destinatario, ditta" + PROMPT 44 12 "" + MESSAGE _CLIENTE,!RAGSOC +END + +STRING 30 35 2 +BEGIN + KEY "destinatario, indirizzo con numero civico" + PROMPT 44 14 "" + MESSAGE _CLIENTE,!INDNUM +END + +STRING 31 35 1 +BEGIN + KEY "destinatario, localita" + PROMPT 44 16 "" + MESSAGE _CLIENTE,LOCALITACF +END + +STRING 32 5 1 +BEGIN + KEY "destinatario, cap" + PROMPT 44 17 "" + MESSAGE _CLIENTE,!CAP +END + +STRING 33 30 1 +BEGIN + KEY "destinatario, comune" + PROMPT 50 17 "" + MESSAGE _CLIENTE,!COM->DENCOM + MESSAGE COPY,35 + FLAGS "H" +END + +STRING 34 2 +BEGIN + KEY "destinatario, provincia" + PROMPT 73 17 "" + MESSAGE _CLIENTE,!COM->PROVCOM + MESSAGE APPEND,35 + FLAGS "H" +END + +STRINGA 35 30 1 +BEGIN + KEY "cliente comune+prov." + PROMPT 50 17 "" +END + +STRING 36 5 +BEGIN + KEY "test indirizzo di spedizione" + PROMPT 1 1 "" + FLAGS "H" + FIELD CODINDSP + MESSAGE EMPTY ENABLE,10@|DISABLE,11@|DISABLE,48 + MESSAGE DISABLE,10@|ENABLE,11@|DISABLE,48 +END + +STRING 37 30 2 +BEGIN + KEY "destinazione, ragione sociale" + PROMPT 3 12 "" + FIELD 16->RAGSOC + GROUP 11 + FLAGS "D" +END + +STRING 38 30 2 +BEGIN + KEY "destinazione, indirizzo" + PROMPT 3 14 "" + FIELD 16->INDIR + MESSAGE COPY,40 + FLAGS "H" +END + +STRING 39 10 1 +BEGIN + KEY "destinazione, indirizzo" + PROMPT 3 14 "" + FIELD 16->CIV + MESSAGE APPEND,40 + FLAGS "H" +END + +STRING 40 35 2 +BEGIN + KEY "destinazione, indirizzo+N.civico" + PROMPT 3 14 "" + GROUP 11 + FLAGS "D" +END + +STRING 41 35 1 +BEGIN + KEY "destinazione, localita" + PROMPT 3 16 "" + FIELD 16->LOCALITA + GROUP 11 + FLAGS "D" +END + +STRING 42 5 +BEGIN + KEY "destinazione, cap" + PROMPT 3 17 "" + FIELD 16->CAP + GROUP 11 + FLAGS "D" +END + +STRING 43 5 +BEGIN + KEY "" + PROMPT 1 1 "" + FLAGS "H" + FIELD 16->COM +END + +STRING 44 21 2 +BEGIN + KEY "destinazione, comune" + PROMPT 9 17 "" + MESSAGE _ISAMREAD,13,COM=#43,DENCOM + MESSAGE COPY,46 + FLAGS "H" +END + +STRING 45 2 +BEGIN + KEY "destinazione, provincia" + PROMPT 31 17 "" + MESSAGE _ISAMREAD,13,COM=#43,PROVCOM + MESSAGE APPEND,46 + FLAGS "H" +END + +STRING 46 27 1 +BEGIN + KEY "destinazione, comune+provincia" + PROMPT 9 17 "" + GROUP 11 + FLAGS "D" +END + +STRING 48 30 1 +BEGIN + KEY "destinazione, idem" + PROMPT 3 12 "IDEM" + FLAGS "D" +END + +STRING 49 35 2 +BEGIN + KEY "destinatario, ditta dest" + PROMPT 3 12 "" + MESSAGE _CLIENTE,!RAGSOC + GROUP 10 + FLAGS "D" +END + +STRING 50 35 2 +BEGIN + KEY "destinatario, indirizzo con numero civico dest" + PROMPT 3 14 "" + MESSAGE _CLIENTE,!INDNUM + GROUP 10 + FLAGS "D" +END + +STRING 51 35 1 +BEGIN + KEY "destinatario, localita" + PROMPT 3 16 "" + MESSAGE _CLIENTE,LOCALITACF + GROUP 10 + FLAGS "D" +END + +STRING 52 5 1 +BEGIN + KEY "destinatario, cap dest" + PROMPT 3 17 "" + MESSAGE _CLIENTE,CAPCF + GROUP 10 + FLAGS "D" +END + +STRING 53 21 1 +BEGIN + KEY "destinatario, comune dest" + PROMPT 9 17 "" + MESSAGE _CLIENTE,!COM->DENCOM + FLAGS "H" + MESSAGE COPY,55 +END + +STRING 54 2 +BEGIN + KEY "destinatario, provincia dest" + PROMPT 31 17 "" + MESSAGE _CLIENTE,!COM->PROVCOM + FLAGS "H" + MESSAGE APPEND,55 +END + +STRING 55 21 1 +BEGIN + KEY "destinatario, comune dest + prov" + PROMPT 9 17 "" + FLAGS "D" + GROUP 10 +END + +STRINGA 56 3 1 +BEGIN + KEY "cliente codice stato" + PROMPT 44 17 "" + MESSAGE _CLIENTE,STATOCF + FLAGS "D" +END + +STRINGA 57 25 1 +BEGIN + KEY "cliente nome stato" + PROMPT 44 17 "" + MESSAGE _TABLEREAD,%STA,#26,S0 + FLAGS "D" END END SECTION BODY ODD 5 -STRINGA 51 12 1 +STRINGA 81 12 1 BEGIN KEY "codice articolo" - PROMPT 3 1 "" FIELD 34->CODART + PROMPT 2 1 "" END -STRINGA 52 18 20 +STRINGA 82 20 20 BEGIN KEY "descrizione articolo" - PROMPT 16 1 "" MESSAGE _DESCRIGA + PROMPT 16 1 "" END -STRINGA 53 2 +STRINGA 83 2 BEGIN KEY "unita' di misura" - PROMPT 36 1 "" + PROMPT 37 1 "" FIELD 34->UMQTA - MESSAGE _ALIGN,#52,BOTTOM + MESSAGE _ALIGN,#82,BOTTOM END -NUMBER 54 12 +NUMBER 84 9 BEGIN KEY "quantita'" - PROMPT 40 1 "" - PICTURE "###.###.###" - GROUP 30 + PROMPT 41 1 "" FIELD 34->QTA - MESSAGE _ALIGN,#52,BOTTOM + PICTURE "#########" + GROUP 30 + MESSAGE _ALIGN,#82,BOTTOM END -NUMBER 55 8 +NUMBER 85 12 BEGIN KEY "prezzo unitario" - PROMPT 57 1 "" - PICTURE "########" - GROUP 29 + PROMPT 51 1 "" FIELD 34->PREZZO - MESSAGE _ALIGN,#52,BOTTOM + PICTURE "###.###.###" + GROUP 29 + MESSAGE _ALIGN,#82,BOTTOM END -STRINGA 56 3 +STRINGA 86 3 BEGIN KEY "sconto" - PROMPT 66 1 "" + PROMPT 63 1 "" FIELD 34->SCONTO - MESSAGE _ALIGN,#52,BOTTOM + MESSAGE _ALIGN,#82,BOTTOM END -NUMBER 57 9 +NUMBER 87 12 BEGIN KEY "importo netto" - PROMPT 70 1 "" + PROMPT 67 1 "" + FIELD 34->IMPNN + PICTURE "###.###.###" GROUP 29 - FIELD 34->IMPNS - PICTURE "#.###.###" - MESSAGE _ALIGN,#52,BOTTOM + MESSAGE _ALIGN,#82,BOTTOM END -STRINGA 58 2 1 +STRINGA 88 3 BEGIN KEY "iva" - PROMPT 80 1 "" + PROMPT 80 1 "" FIELD 34->CODIVA - MESSAGE _ALIGN,#52,BOTTOM + MESSAGE _ALIGN,#82,BOTTOM END -NUMBER 59 15 +NUMBER 89 12 BEGIN KEY "prezzo unitario scontato" - PROMPT 68 1 "" - PICTURE "###.###.###.###" + PROMPT 67 1 "" + PICTURE "###.###.###" + FIELD 34->IMPNS GROUP 29 - FIELD 34->PREZZONS - MESSAGE _ALIGN,#52,BOTTOM + MESSAGE _ALIGN,#82,BOTTOM FLAGS "H" END -NUMBER 60 15 +NUMBER 90 15 BEGIN KEY "provvigione" PROMPT 68 1 "" PICTURE "###.###.###.###" - MESSAGE _ALIGN,#52,BOTTOM FIELD 34->PROVVR + MESSAGE _ALIGN,#82,BOTTOM GROUP 31 FLAGS "H" END -NUMBER 61 15 +NUMBER 91 15 BEGIN KEY "Imposta" PROMPT 68 1 "" PICTURE "###.###.###.###" - MESSAGE _ALIGN,#52,BOTTOM FIELD 34->IMPOSTA + MESSAGE _ALIGN,#82,BOTTOM GROUP 31 FLAGS "H" END END -SECTION FOOTER ODD -46 +SECTION FOOTER ODD -42 -STRINGA 81 5 1 +STRINGA 100 5 1 BEGIN - KEY "messaggio 'segue' in coda" - PROMPT 70 12 "SEGUE" + KEY "stampa 'segue' in coda" + PROMPT 73 13 "SEGUE" END END -SECTION FOOTER LAST -46 +SECTION FOOTER LAST -42 NUMBER 101 12 BEGIN KEY "totale importi netti (non scontati)" - PROMPT 4 3 "" + PROMPT 2 3 "" FIELD TOTMER PICTURE "###.###.###" GROUP 31 END -STRING 102 6 +STRINGA 102 7 BEGIN - KEY "sconto %" - PROMPT 20 3 "" + KEY "sconto percentuale" + PROMPT 19 3 "" FIELD 33->SCONTOPERC END -NUMBER 103 12 +NUMBER 103 11 BEGIN - KEY "totale sconto testa" - PROMPT 28 3 "" + KEY "totali sconti" + PROMPT 27 3 "" FIELD SCONTOT PICTURE "###.###.###" GROUP 31 END -NUMBER 104 12 +NUMBER 104 11 BEGIN KEY "spese di trasporto" - PROMPT 42 3 "" - FIELD SPESTRA + PROMPT 42 3 "" PICTURE "###.###.###" + FIELD SPESTRA GROUP 31 END -NUMBER 105 12 +NUMBER 105 11 BEGIN KEY "spese di imballo" - PROMPT 56 3 "" + PROMPT 55 3 "" + PICTURE "###.###.###" FIELD SPESIMB - PICTURE "###.###.###" GROUP 31 END -NUMBER 106 12 +NUMBER 106 11 BEGIN - KEY "Totale spese" - PROMPT 70 3 "" - FIELD SPESE + KEY "acconto" + PROMPT 55 6 "" PICTURE "###.###.###" - GROUP 31 + FIELD IMPPAGATO + GROUP 31 END -STRING 107 2 +STRING 107 3 BEGIN KEY "codice iva 1" - PROMPT 3 5 "" + PROMPT 2 5 "" MESSAGE _RIEPILOGOIVA,1,COD,0 END @@ -488,10 +724,10 @@ BEGIN GROUP 31 END -STRING 111 2 +STRING 111 3 BEGIN KEY "codice iva 2" - PROMPT 3 6 "" + PROMPT 2 6 "" MESSAGE _RIEPILOGOIVA,1,COD,0 END @@ -521,204 +757,274 @@ BEGIN GROUP 31 END -STRING 115 2 +STRING 115 3 BEGIN KEY "codice iva 3" - PROMPT 3 7 "" - MESSAGE _RIEPILOGOIVA,30,COD,0 + PROMPT 2 7 "" + MESSAGE _RIEPILOGOIVA,1,COD,0 END NUMBER 116 12 BEGIN KEY "imponibile 3" PROMPT 6 7 "" - MESSAGE _RIEPILOGOIVA,30,IMP,0 + MESSAGE _RIEPILOGOIVA,1,IMP,0 PICTURE "###.###.###" GROUP 31 END -STRINGA 117 45 +NUMBER 117 2 BEGIN - KEY "descrizione altri 3" - PROMPT 35 7 "" - MESSAGE _RIEPILOGOIVA,30,DES,1 + KEY "iva 3" + PROMPT 19 7 "" + MESSAGE _RIEPILOGOIVA,1,ALI,0 + PICTURE "##" END -STRING 118 2 +NUMBER 118 10 BEGIN - KEY "codice iva 4" - PROMPT 3 8 "" - MESSAGE _RIEPILOGOIVA,30,COD,0 + KEY "imposta 3" + PROMPT 22 7 "" + MESSAGE _RIEPILOGOIVA,1,IVA,1 + PICTURE "##.###.###" + GROUP 31 END NUMBER 119 12 BEGIN KEY "imponibile 4" - PROMPT 6 8 "" + PROMPT 6 9 "" MESSAGE _RIEPILOGOIVA,30,IMP,0 PICTURE "###.###.###" GROUP 31 END -STRINGA 120 45 +STRINGA 120 3 +BEGIN + KEY "codice iva 4" + PROMPT 2 9 "" + MESSAGE _RIEPILOGOIVA,30,COD,0 +END + +STRINGA 121 45 BEGIN KEY "descrizione altri 4" - PROMPT 35 8 "" + PROMPT 35 9 "" MESSAGE _RIEPILOGOIVA,30,DES,1 END -NUMBER 121 15 +NUMBER 122 12 BEGIN - KEY "totale imponibile" - PROMPT 3 10 "" - MESSAGE _TOTIMPONIBILI,29 - PICTURE "##.###.###.###" - GROUP 31 -END - -NUMBER 122 14 -BEGIN - KEY "totale imposta" - PROMPT 19 10 "" - FIELD IMPOSTE - PICTURE "#.###.###.###" - GROUP 31 -END - -NUMBER 123 10 -BEGIN - KEY "totale esenti" - PROMPT 35 10 "" - MESSAGE _TOTIMPONIBILI,28 - PICTURE "##.###.###" - GROUP 31 -END - -NUMBER 124 8 -BEGIN - KEY "spese di incasso" - PROMPT 54 10 "" - FIELD SPESINC - PICTURE "###.###" - GROUP 31 -END - -NUMBER 125 5 -BEGIN - KEY "spese bolli" - PROMPT 63 10 "" - FIELD BOLLI - PICTURE "#####" - GROUP 31 -END - -NUMBER 126 12 -BEGIN - KEY "totale fattura" - PROMPT 70 10 "" - FIELD TOTDOC + KEY "imponibile 5" + PROMPT 6 10 "" + MESSAGE _RIEPILOGOIVA,30,IMP,0 PICTURE "###.###.###" GROUP 31 END -DATA 127 8 +STRINGA 123 3 +BEGIN + KEY "codice iva 5" + PROMPT 2 10 "" + MESSAGE _RIEPILOGOIVA,30,COD,0 +END + +STRINGA 124 45 +BEGIN + KEY "descrizione altri 5" + PROMPT 35 10 "" + MESSAGE _RIEPILOGOIVA,30,DES,1 +END + +NUMBER 125 12 +BEGIN + KEY "totale imponibile" + PROMPT 6 13 "" + MESSAGE _TOTIMPONIBILI,29 + PICTURE "###.###.###" + GROUP 31 +END + +NUMBER 126 11 +BEGIN + KEY "totale imposta" + PROMPT 21 13 "" + FIELD IMPOSTE + PICTURE "###.###.###" + GROUP 31 +END + +NUMBER 127 11 +BEGIN + KEY "totale esenti" + PROMPT 35 13 "" + MESSAGE _TOTIMPONIBILI,28 + PICTURE "###.###.###" + GROUP 31 +END + +NUMBER 128 7 +BEGIN + KEY "spese di incasso" + PROMPT 55 13 "" + PICTURE "###.###" + FIELD SPESINC + GROUP 31 +END + +NUMBER 129 5 +BEGIN + KEY "spese bolli" + PROMPT 63 13 "" + PICTURE "#####" + FIELD BOLLI + GROUP 31 +END + +NUMBER 130 12 +BEGIN + KEY "totale fattura" + PROMPT 70 13 "" + FIELD TOTDOC + PICTURE "###.###.###" + GROUP 31 + MESSAGE COPY,133 +END + +NUMBER 131 17 +BEGIN + KEY "totale fattura in euro" + PROMPT 64 11 "EURO " + PICTURE "###.###,@@" + MESSAGE _NUMEXPR,(ROUND(IMPONIBILI/1936.27,2)+ROUND(IMPOSTE/1936.27,2)) + MESSAGE COPY,135 +END + +NUMBER 132 12 +BEGIN + KEY "acconto" + PROMPT 70 15 "" + FIELD 33->IMPPAGATO + PICTURE "###.###.###" + GROUP 31 + MESSAGE SUB,133 +END + +NUMBER 133 12 +BEGIN + KEY "netto a pagare" + PROMPT 70 20 "" + PICTURE "###.###.###" + GROUP 31 +END + +NUMBER 134 12 +BEGIN + KEY "Anticipo in euro" + PROMPT 69 6 "EU" + PICTURE "###.###,@@" + MESSAGE _NUMEXPR,ROUND(#106/1936.27,2) + MESSAGE SUB,135 +END + +NUMBER 135 15 +BEGIN + KEY "netto a pagare in EURO" + PROMPT 66 21 "EURO " + PICTURE "###.###,@@" +END + +DATA 136 8 BEGIN KEY "scadenza pagamento 1" - PROMPT 3 14 "" + PROMPT 2 25 "" MESSAGE _SCADENZE,DATA,0 FORMAT "1442-" END -NUMBER 128 11 +NUMBER 137 11 BEGIN KEY "importo scadenza 1" - PROMPT 12 14 "" + PROMPT 11 25 "" MESSAGE _SCADENZE,IMPORTO,1 PICTURE "###.###.###" GROUP 31 END -DATA 129 8 +DATA 138 8 BEGIN KEY "scadenza pagamento 2" - PROMPT 25 14 "" + PROMPT 23 25 "" MESSAGE _SCADENZE,DATA,0 FORMAT "1442-" END -NUMBER 130 11 +NUMBER 139 11 BEGIN KEY "importo scadenza 2" - PROMPT 34 14 "" + PROMPT 32 25 "" MESSAGE _SCADENZE,IMPORTO,1 PICTURE "###.###.###" GROUP 31 END -DATA 131 8 +DATA 140 8 BEGIN KEY "scadenza pagamento 3" - PROMPT 47 14 "" + PROMPT 44 25 "" MESSAGE _SCADENZE,DATA,0 FORMAT "1442-" END -NUMBER 132 11 +NUMBER 141 11 BEGIN KEY "importo scadenza 3" - PROMPT 56 14 "" + PROMPT 53 25 "" MESSAGE _SCADENZE,IMPORTO,1 PICTURE "###.###.###" GROUP 31 END -DATA 133 8 +DATA 142 8 BEGIN KEY "scadenza pagamento 4" - PROMPT 3 15 "" + PROMPT 65 25 "" MESSAGE _SCADENZE,DATA,0 FORMAT "1442-" END -NUMBER 134 11 +NUMBER 143 11 BEGIN KEY "importo scadenza 4" - PROMPT 12 15 "" + PROMPT 74 25 "" MESSAGE _SCADENZE,IMPORTO,1 PICTURE "###.###.###" GROUP 31 END -DATA 135 8 +DATA 144 8 BEGIN KEY "scadenza pagamento 5" - PROMPT 25 15 "" + PROMPT 23 26 "" MESSAGE _SCADENZE,DATA,0 FORMAT "1442-" + FLAGS "D" END -NUMBER 136 11 +NUMBER 145 11 BEGIN KEY "importo scadenza 5" - PROMPT 34 15 "" + PROMPT 32 26 "" MESSAGE _SCADENZE,IMPORTO,1 PICTURE "###.###.###" GROUP 31 + FLAGS "D" END -NUMBER 137 12 +LIST 146 1 1 BEGIN - KEY "netto a pagare" - PROMPT 70 15 "" - FIELD TOTDOC - PICTURE "###.###.###" - GROUP 31 -END - -LIST 138 1 1 -BEGIN - KEY "trasporto a cura del mitt." - PROMPT 4 17 "" + KEY "trasporto a cura del mittente" + PROMPT 3 16 "" FIELD CODSPMEZZO ITEM "|" MESSAGE DISABLE,6@|ENABLE,5@ ITEM "D| " @@ -726,10 +1032,10 @@ BEGIN ITEM "V| " END -LIST 139 1 1 +LIST 147 1 1 BEGIN - KEY "trasporto a cura del dest." - PROMPT 7 14 "" + KEY "trasporto a cura del destinatario" + PROMPT 11 16 "" FIELD CODSPMEZZO ITEM "|" MESSAGE DISABLE,6@|ENABLE,5@ ITEM "D|X" MESSAGE DISABLE,6@|ENABLE,5@ @@ -737,10 +1043,10 @@ BEGIN ITEM "V| " END -LIST 140 1 1 +LIST 148 1 1 BEGIN - KEY "trasporto a cura del vett." - PROMPT 25 25 "" + KEY "trasporto a cura del vettore" + PROMPT 20 16 "" FIELD CODSPMEZZO ITEM "|" // default ITEM "D| " @@ -748,57 +1054,85 @@ BEGIN ITEM "V|X" MESSAGE DISABLE,5@|ENABLE,6@ END -STRING 141 19 1 +STRING 149 20 1 BEGIN KEY "aspetto beni" - PROMPT 32 17 "" + PROMPT 31 16 "" FIELD 206@->S0 END -STRING 142 5 1 -BEGIN - KEY "colli" - PROMPT 52 17 "" - FIELD NCOLLI -END - -STRING 143 7 1 +STRING 150 7 1 BEGIN KEY "peso" - PROMPT 60 17 "" + PROMPT 62 16 "" FIELD PNETTO END -STRING 144 35 1 +STRING 151 5 1 +BEGIN + KEY "colli" + PROMPT 54 16 "" + FIELD NCOLLI +END + +STRING 152 35 1 BEGIN KEY "nome vettore" - PROMPT 3 19 "" + PROMPT 3 18 "" FIELD 205@->S0 END -STRING 145 35 1 +STRING 153 35 1 BEGIN + // nella versione 05 togliere MESSAGE COPY KEY "indirizzo vettore" - PROMPT 3 20 "" + PROMPT 3 19 "" FIELD 205@->S1[1,35] + MESSAGE COPY,156 + FLAGS "H" END -STRING 146 45 1 +STRING 154 35 1 +BEGIN + // nella versione 05 sostituire FLAGS "D" con FLAGS "H" + KEY "indirizzo vettore" + PROMPT 3 19 "" + MESSAGE _STREXPR,TRIM(#153) + FLAGS "D" + MESSAGE COPY,156 +END + +STRING 155 10 1 +BEGIN + KEY "num.civico vettore" + PROMPT 3 19 "" + FIELD 205@->S1[36,45] + MESSAGE APPEND,156 + FLAGS "H" +END + +STRING 156 35 1 +BEGIN + KEY "indirizzo vettore+num.civico" + PROMPT 3 19 "" +END + +STRING 157 35 1 BEGIN KEY "localita' vettore" - PROMPT 3 21 "" + PROMPT 3 20 "" FIELD 205@->S1[46,70] FLAGS "D" END -STRING 147 5 1 +STRING 158 5 BEGIN KEY "CAP vettore" - PROMPT 3 21 "" + PROMPT 3 20 "" FIELD 205@->S7 END -STRING 148 5 1 +STRING 159 5 1 BEGIN KEY "Codice comune vettore" PROMPT 1 1 "" @@ -806,41 +1140,80 @@ BEGIN FLAGS "H" END -STRING 149 25 1 +STRING 160 25 1 BEGIN KEY "Denominazione comune vettore" - PROMPT 9 21 "" - MESSAGE _ISAMREAD,13,COM=#148,DENCOM + PROMPT 9 20 "" + MESSAGE _ISAMREAD,13,COM=#159,DENCOM + MESSAGE COPY,162 + FLAGS "H" END -STRING 150 2 1 +STRING 161 2 BEGIN KEY "Provincia comune vettore" - PROMPT 37 21 "" - MESSAGE _ISAMREAD,13,COM=#148,PROVCOM + PROMPT 37 20 "" + MESSAGE _ISAMREAD,13,COM=#159,PROVCOM + MESSAGE APPEND,162 + FLAGS "H" END -DATA 151 8 + +STRING 162 25 1 BEGIN - KEY "data inizio trasporto" - PROMPT 40 19 "" + KEY "vettore, comune+provincia" + PROMPT 9 20 "" +END + +DATE 163 8 +BEGIN + KEY "data inizio trasporto/consegna" + PROMPT 38 18 "" FIELD DATAPART FORMAT "1442-" + GROUP 5 + FLAGS "D" END -STRING 152 5 1 +STRING 164 5 BEGIN - KEY "ora inizio trasporto" - PROMPT 49 19 "" - PICTURE "## ##" + KEY "ora inizio trasporto/consegna" + PROMPT 47 18 "" + PICTURE "##.##" FIELD ORAPART + GROUP 5 + FLAGS "D" +END + +DATE 165 8 +BEGIN + KEY "data ritiro" + PROMPT 38 18 "" + FIELD DATAPART + FORMAT "1442-" + FLAGS "D" + GROUP 6 +END + +STRING 166 5 +BEGIN + KEY "ora ritiro" + PROMPT 47 18 "" + PICTURE "##.##" + FIELD ORAPART + FLAGS "D" + GROUP 6 +END + +STRING 167 40 2 +BEGIN + KEY "note documento" + PROMPT 2 22 "" + FIELD 210@->S0 END END -END - - // NOTE SULLA COMPILAZIONE DEI FORM DI STAMPA // // SEZIONE GENERAL @@ -908,7 +1281,6 @@ END // dove: è un riferimento alla relazione di gestione dei dati della ditta (es. 113@->DENCOM è la denominazione del comune di residenza della ditta) // è uno delle macro seguenti: // !RAGSOC ragione sociale -// !CAP Codice Avviamento Postale (viene implementato un messaggio perche' sugli occasionali ha un nome campo diverso!!) // !IND indirizzo (fiscale se c'è, oppure di residenza) // !NUM numero civico (fiscale se c'è, oppure di residenza) // !CAP CAP (fiscale se c'è, oppure di residenza) @@ -934,9 +1306,11 @@ END // dove: è un riferimento alla relazione di gestione dei dati del cliente // è uno delle macro seguenti: // !RAGSOC ragione sociale +// !CAP Codice Avviamento Postale (viene implementato un messaggio perche' sugli occasionali ha un nome campo diverso!!) // !IND indirizzo // !NUM numero civico // !INDNUM indirizzo + numero civico +// !INDSPED indirizzo spedizione + numero civico // !TEL primo numero di telefono (con prefisso) // !TEL2 secondo numero di telefono (con prefisso) // !TEL3 terzo numero di telefono (con prefisso) diff --git a/ve/vebol.frm b/ve/vebol.frm index b077ed415..be72a4389 100755 --- a/ve/vebol.frm +++ b/ve/vebol.frm @@ -9,6 +9,8 @@ JOIN %BAN TO 33 ALIAS 204 INTO CODTAB==CODABIA+CODCABA JOIN %VET TO 33 ALIAS 205 INTO CODTAB==CODVETT1 JOIN %ABE TO 33 ALIAS 206 INTO CODTAB==ASPBENI1 JOIN %CTR TO 33 ALIAS 207 INTO CODTAB==CAUSTRASP +JOIN %BAN TO 33 ALIAS 208 INTO CODTAB==CODABIA +JOIN %NDO TO 33 ALIAS 209 INTO CODTAB==CODNOTESP1 END DESCRIPTION @@ -20,32 +22,44 @@ BEGIN 201@->* "Tabella condizioni di pagamento" 122->* "Archivio agenti" 203@->* "Tabella porto" - 204@->* "Tabella banche" + 204@->* "Tabella banche istituto" 205@->* "Tabella vettori" 206@->* "Tabella aspetto beni" 207@->* "Tabella causali di trasporto" + 208@->* "Tabella banche agenzia" + 209@->* "Tabella note documento" END GENERAL BEGIN OFFSET 0 0 - FONT "Courier New" + FONT "Roman 10cpi" SIZE 12 - MODULE "BUFFETTI_BOLLA_01" + MODULE "BUFFETTI_BOLLA_8903 D 300" PRI_DECIMALS 0 3 QTA_DECIMALS 3 3 IMP_DECIMALS 0 3 - EXCLUDE "," + EXCLUDE "08," END SECTION HEADER ODD 33 +STRINGA 200 1 +BEGIN + KEY "abilita/disabilita stampa intestazione ditta " + PROMPT 1 1 "" + MESSAGE ENABLE,15@ + FLAGS "H" +END + STRING 1 36 1 BEGIN KEY "nome ditta" PROMPT 5 5 "" MESSAGE _DITTA,!RAGSOC + GROUP 15 + FLAGS "D" END STRING 2 36 1 @@ -53,6 +67,8 @@ BEGIN KEY "indirizzo ditta" PROMPT 5 6 "" MESSAGE _DITTA,!IND + GROUP 15 + FLAGS "D" END STRING 3 5 1 @@ -60,6 +76,8 @@ BEGIN KEY "cap ditta" PROMPT 5 7 "" MESSAGE _DITTA,!CAP + GROUP 15 + FLAGS "D" END STRING 4 30 1 @@ -67,12 +85,16 @@ BEGIN KEY "comune ditta" PROMPT 12 7 "" MESSAGE _DITTA,!COM + GROUP 15 + FLAGS "D" END STRING 5 5 1 BEGIN KEY "scritta P.IVA" PROMPT 5 8 "P.IVA" + GROUP 15 + FLAGS "D" END STRING 6 16 1 @@ -80,12 +102,16 @@ BEGIN KEY "partita iva ditta" PROMPT 11 8 "" MESSAGE _DITTA,!IVA + GROUP 15 + FLAGS "D" END STRING 7 9 1 BEGIN KEY "scritta COD.FISC." PROMPT 5 9 "COD.FISC." + GROUP 15 + FLAGS "D" END STRING 8 16 1 @@ -93,97 +119,148 @@ BEGIN KEY "codice fiscale ditta" PROMPT 15 9 "" MESSAGE _DITTA,!CF + GROUP 15 + FLAGS "D" END -STRING 9 35 2 +STRINGA 9 2 +BEGIN + KEY "Numero di pagina" + PROMPT 80 25 "" + MESSAGE _PAGENO +END + +STRING 10 35 2 BEGIN KEY "destinatario, ditta" PROMPT 44 16 "" MESSAGE _CLIENTE,!RAGSOC END -STRING 10 35 2 +STRING 11 35 2 BEGIN KEY "destinatario, indirizzo con numero civico" PROMPT 44 18 "" MESSAGE _CLIENTE,!INDNUM END -STRING 11 5 1 +STRING 12 35 1 +BEGIN + KEY "destinatario, localita" + PROMPT 44 20 "" + MESSAGE _CLIENTE,LOCALITACF +END + +STRING 13 5 1 BEGIN KEY "destinatario, cap" - PROMPT 44 20 "" + PROMPT 44 21 "" MESSAGE _CLIENTE,!CAP END -STRING 12 30 2 +STRING 14 30 2 BEGIN KEY "destinatario, comune" - PROMPT 50 20 "" + PROMPT 50 21 "" MESSAGE _CLIENTE,!COM->DENCOM + MESSAGE COPY,16 + FLAGS "H" END -STRING 13 2 +STRING 15 2 BEGIN KEY "destinatario, provincia" - PROMPT 72 21 "" + PROMPT 72 22 "" MESSAGE _CLIENTE,!COM->PROVCOM + MESSAGE APPEND,16 + FLAGS "H" END -DATE 14 8 1 +STRING 16 30 2 +BEGIN + KEY "destinatario, comune + prov." + PROMPT 50 21 "" +END + +DATE 17 8 1 BEGIN KEY "data bolla" - PROMPT 59 25 "" + PROMPT 60 25 "" FIELD 33->DATADOC FORMAT "1442-" END -NUMBER 15 7 +NUMBER 18 7 BEGIN KEY "numero bolla" - PROMPT 70 25 "" + PROMPT 71 25 "" FIELD NDOC END -STRING 32 5 1 +STRING 19 5 1 BEGIN KEY "test indirizzo di spedizione" PROMPT 1 1 "" FLAGS "H" FIELD CODINDSP - MESSAGE EMPTY ENABLE,34|DISABLE,33 - MESSAGE DISABLE,34|ENABLE,33 + MESSAGE EMPTY ENABLE,10@|DISABLE,11@|DISABLE,30 + MESSAGE DISABLE,10@|ENABLE,11@|DISABLE,30 END -STRING 33 30 2 +STRING 20 35 2 BEGIN - KEY "destinazione, ragione sociale" + KEY "destinazione, Rag Sociale" PROMPT 3 16 "" FIELD 16->RAGSOC -END - -STRING 34 30 1 -BEGIN - KEY "destinazione, idem" - PROMPT 3 16 "IDEM" + GROUP 11 FLAGS "D" END -STRING 16 30 2 +STRING 21 35 1 BEGIN KEY "destinazione, indirizzo" - PROMPT 3 18 "" + PROMPT 3 18 "" FIELD 16->INDIR + MESSAGE COPY,23 + FLAGS "H" END -STRING 17 5 1 +STRING 22 10 1 +BEGIN + KEY "destinazione, indirizzo" + PROMPT 3 18 "" + FIELD 16->CIV + MESSAGE APPEND,23 + FLAGS "H" +END + +STRING 23 35 2 +BEGIN + KEY "destinazione, indirizzo+N.civico" + PROMPT 3 18 "" + GROUP 11 + FLAGS "D" +END + +STRING 24 35 1 +BEGIN + KEY "destinazione, localita" + PROMPT 3 20 "" + FIELD 16->LOCALITA + GROUP 11 + FLAGS "D" +END + +STRING 25 5 1 BEGIN KEY "destinazione, cap" - PROMPT 3 20 "" + PROMPT 3 21 "" FIELD 16->CAP + GROUP 11 + FLAGS "D" END -STRING 18 5 1 +STRING 26 5 1 BEGIN KEY "" PROMPT 1 1 "" @@ -191,28 +268,109 @@ BEGIN FIELD 16->COM END -STRING 19 21 2 +STRING 27 25 2 BEGIN KEY "destinazione, comune" - PROMPT 9 20 "" - MESSAGE _ISAMREAD,13,COM=#18,DENCOM + PROMPT 9 21 "" + MESSAGE _ISAMREAD,13,COM=#26,DENCOM + MESSAGE COPY,29 + FLAGS "H" END -STRING 20 2 1 +STRING 28 2 BEGIN KEY "destinazione, provincia" PROMPT 31 21 "" - MESSAGE _ISAMREAD,13,COM=#18,PROVCOM + MESSAGE _ISAMREAD,13,COM=#26,PROVCOM + MESSAGE APPEND,29 + FLAGS "H" END -NUMBER 21 +STRING 29 27 2 +BEGIN + KEY "destinazione, comune+provincia" + PROMPT 9 21 "" + GROUP 11 + FLAGS "D" +END + +STRING 30 30 1 +BEGIN + KEY "destinazione, idem" + PROMPT 3 16 "IDEM" + FLAGS "D" +END + +STRING 31 35 2 +BEGIN + KEY "destinatario, ditta dest" + PROMPT 3 16 "" + MESSAGE _CLIENTE,!RAGSOC + GROUP 10 + FLAGS "D" +END + +STRING 32 35 2 +BEGIN + KEY "destinatario, indirizzo con numero civico dest" + PROMPT 3 18 "" + MESSAGE _CLIENTE,!INDNUM + GROUP 10 + FLAGS "D" +END + +STRING 33 35 1 +BEGIN + KEY "destinatario, localita" + PROMPT 3 20 "" + MESSAGE _CLIENTE,LOCALITACF + GROUP 10 + FLAGS "D" +END + +STRING 34 5 1 +BEGIN + KEY "destinatario, cap dest" + PROMPT 3 21 "" + MESSAGE _CLIENTE,CAPCF + GROUP 10 + FLAGS "D" +END + +STRING 35 21 2 +BEGIN + KEY "destinatario, comune dest" + PROMPT 9 21 "" + MESSAGE _CLIENTE,!COM->DENCOM + FLAGS "H" + MESSAGE COPY,37 +END + +STRING 36 2 +BEGIN + KEY "destinatario, provincia dest" + PROMPT 31 22 "" + MESSAGE _CLIENTE,!COM->PROVCOM + FLAGS "H" + MESSAGE APPEND,37 +END + +STRING 37 21 2 +BEGIN + KEY "destinatario, comune dest + prov" + PROMPT 9 21 "" + FLAGS "D" + GROUP 10 +END + +STRING 38 10 BEGIN KEY "ordine" PROMPT 3 25 "" FIELD NUMDOCRIF END -DATE 22 8 1 +DATE 39 8 1 BEGIN KEY "data conferma" PROMPT 18 25 "" @@ -220,64 +378,91 @@ BEGIN FORMAT "1442-" END -STRING 23 48 1 +STRING 40 48 1 BEGIN KEY "condizioni pagamento" PROMPT 3 27 "" FIELD 201@->S0 END -STRING 24 29 1 +STRING 41 29 1 BEGIN - KEY "banca appoggio" + KEY "banca appoggio istituto" PROMPT 53 27 "" - FIELD 204@->S0 + FIELD 208@->S0 END -STRING 25 7 1 +STRING 42 29 1 +BEGIN + KEY "banca appoggio agenzia" + PROMPT 53 27 "" + FIELD 204@->S0 + FLAGS "D" +END + +STRING 43 7 1 BEGIN KEY "codice cliente" PROMPT 3 29 "" FIELD CODCF END -STRING 26 11 1 +STRING 44 11 1 +BEGIN + KEY "copy partita iva" + PROMPT 1 1 "" + MESSAGE _CLIENTE,PAIV + MESSAGE COPY,45 + FLAGS "H" +END + +STRING 45 11 1 +BEGIN + KEY "test PIVA/CF" + PROMPT 1 1 "" + MESSAGE EMPTY ENABLE,47 + MESSAGE ENABLE,46 + FLAGS "H" +END + +STRING 46 11 1 BEGIN KEY "partita iva cliente" PROMPT 12 29 "" MESSAGE _CLIENTE,PAIV + FLAGS "D" END -STRING 27 18 1 +STRING 47 16 1 +BEGIN + KEY "codice fiscale cliente" + PROMPT 10 29 "" + MESSAGE _CLIENTE,COFI + FLAGS "D" +END + +STRING 48 18 1 BEGIN KEY "porto" PROMPT 40 25 "" FIELD 203@->S0 END -NUMBER 28 +STRING 49 3 BEGIN KEY "codice agente" PROMPT 28 29 "" FIELD CODAG END -STRING 29 28 1 +STRING 50 28 1 BEGIN KEY "nome agente" PROMPT 33 29 "" - FIELD 202@->S0 - FLAGS "D" + FIELD 122->RAGSOC END -STRINGA 30 2 -BEGIN - KEY "Numero di pagina" - PROMPT 79 25 "" - MESSAGE _PAGENO -END - -STRING 31 18 +STRING 51 18 BEGIN KEY "causale" PROMPT 63 29 "" @@ -288,45 +473,45 @@ END SECTION BODY ODD 5 -STRING 51 13 1 +STRING 81 13 1 BEGIN KEY "codice articolo" PROMPT 3 1 "" FIELD 34->CODART END -STRING 52 38 20 +STRING 82 38 24 BEGIN KEY "descrizione articolo" PROMPT 23 1 "" MESSAGE _DESCRIGA END -STRING 53 2 +STRING 83 2 BEGIN KEY "unità di misura" PROMPT 62 1 "" FIELD 34->UMQTA - MESSAGE _ALIGN,#52,TOP + MESSAGE _ALIGN,#82,TOP END -NUMBER 54 15 +NUMBER 84 15 BEGIN KEY "quantita" PROMPT 66 1 "" PICTURE "###.###.###" GROUP 30 FIELD 34->QTA - MESSAGE _ALIGN,#52,TOP + MESSAGE _ALIGN,#82,TOP END -NUMBER 55 20 +NUMBER 85 20 BEGIN KEY "quantita' lettere" PROMPT 72 1 "" FIELD 34->QTA PICTURE "LETTERE" - MESSAGE _ALIGN,#52,BOTTOM + MESSAGE _ALIGN,#82,BOTTOM FLAGS "D" END @@ -334,10 +519,10 @@ END SECTION FOOTER ODD -57 -STRING 81 5 +STRING 100 5 BEGIN KEY "scritta SEGUE" - PROMPT 72 13 "SEGUE" + PROMPT 72 12 "SEGUE" END END @@ -377,85 +562,168 @@ BEGIN ITEM "V|X" MESSAGE DISABLE,5@|ENABLE,6@ END -STRING 113 8 1 +STRING 104 8 1 BEGIN - KEY "scritta COD.FISC." + KEY "scritta vettore" PROMPT 24 2 "Vettore" END -STRING 104 45 1 +STRING 105 45 1 BEGIN KEY "nome vettore" PROMPT 3 4 "" FIELD 205@->S0 END -STRING 105 45 1 +STRING 106 35 1 BEGIN + // nella versione 05 togliere MESSAGE COPY KEY "indirizzo vettore" - PROMPT 3 6 "" - FIELD 205@->S1 + PROMPT 3 5 "" + FIELD 205@->S1[1,35] + MESSAGE COPY,109 + FLAGS "H" END -DATE 106 8 1 +STRING 107 45 1 +BEGIN + // nella versione 05 sostituire FLAGS "D" con FLAGS "H" + KEY "indirizzo vettore" + PROMPT 3 5 "" + MESSAGE _STREXPR,TRIM(#106) + FLAGS "D" + MESSAGE COPY,109 +END + +STRING 108 10 1 +BEGIN + KEY "num.civico vettore" + PROMPT 3 5 "" + FIELD 205@->S1[36,45] + MESSAGE APPEND,109 + FLAGS "H" +END + +STRING 109 45 1 +BEGIN + KEY "indirizzo vettore+num.civico" + PROMPT 3 5 "" +END + +STRING 110 45 1 +BEGIN + KEY "localita vettore" + PROMPT 3 6 "" + FIELD 205@->S1[46,70] +END + +STRING 111 5 1 +BEGIN + KEY "vettore, cap" + PROMPT 3 7 "" + FIELD 205@->S7 +END + +STRING 112 5 1 +BEGIN + KEY "" + PROMPT 1 1 "" + FLAGS "H" + FIELD 205@->S9 +END + +STRING 113 35 1 +BEGIN + KEY "vettore, comune" + PROMPT 9 7 "" + MESSAGE _ISAMREAD,13,COM=#112,DENCOM + MESSAGE COPY,115 + FLAGS "H" +END + +STRING 114 2 1 +BEGIN + KEY "vettore, provincia" + PROMPT 45 7 "" + MESSAGE _ISAMREAD,13,COM=#112,PROVCOM + MESSAGE APPEND,115 + FLAGS "H" +END + +STRING 115 38 1 +BEGIN + KEY "vettore, comune+provincia" + PROMPT 9 7 "" +END + +DATE 116 8 1 BEGIN KEY "data inizio trasporto/consegna" - PROMPT 49 4 "" + PROMPT 50 4 "" FIELD DATAPART FORMAT "1442-" GROUP 5 + FLAGS "D" END -STRING 107 5 1 +STRING 117 5 1 BEGIN KEY "ora inizio trasporto/consegna" - PROMPT 58 4 "" - PICTURE "## ##" + PROMPT 60 4 "" + PICTURE "##.##" FIELD ORAPART GROUP 5 + FLAGS "D" END -DATE 108 8 1 +DATE 118 8 1 BEGIN KEY "data ritiro" - PROMPT 49 4 "" + PROMPT 50 4 "" FIELD DATAPART FORMAT "1442-" FLAGS "D" GROUP 6 END -STRING 109 5 1 +STRING 119 5 1 BEGIN KEY "ora ritiro" - PROMPT 58 4 "" - PICTURE "## ##" + PROMPT 60 4 "" + PICTURE "##.##" FIELD ORAPART FLAGS "D" GROUP 6 END -STRING 110 27 1 +STRING 120 27 1 BEGIN KEY "aspetto beni" PROMPT 37 2 "" FIELD 206@->S0 END -STRING 111 7 1 +STRING 121 7 1 BEGIN KEY "peso" PROMPT 73 2 "" FIELD PNETTO END -STRING 112 5 1 +STRING 122 5 1 BEGIN KEY "colli" PROMPT 66 2 "" FIELD NCOLLI END +STRING 123 50 1 +BEGIN + KEY "note documento" + PROMPT 2 10 "" + FIELD 209@->S0 +END + END END diff --git a/ve/vefat.frm b/ve/vefat.frm index bb576f46c..5df43e7d0 100755 --- a/ve/vefat.frm +++ b/ve/vefat.frm @@ -12,6 +12,7 @@ JOIN %BAN TO 33 ALIAS 204 INTO CODTAB==CODABIA+CODCABA JOIN %VET TO 33 ALIAS 205 INTO CODTAB==CODVETT1 JOIN %ASP TO 33 ALIAS 206 INTO CODTAB==ASPBENI1 JOIN %CTR TO 33 ALIAS 207 INTO CODTAB==CAUSTRASP +JOIN %BAN TO 33 ALIAS 208 INTO CODTAB==CODABIA END @@ -27,31 +28,43 @@ BEGIN 201@->* "Tabella condizioni di pagamento" 122->* "Archivio agenti" 203@->* "Tabella porto" - 204@->* "Tabella banche" + 204@->* "Tabella banche istituto" 205@->* "Tabella vettori" 206@->* "Tabella aspetto beni" + 207@->* "Tabella causale del trasporto" + 208@->* "Tabella banche agenzia" END GENERAL BEGIN OFFSET 0 0 - FONT "Courier New" + FONT "Roman 10cpi" SIZE 12 - MODULE "BUFFETTI_FATTURA_01" + MODULE "BUFFETTI_FATTURA_8904 M 200" PRI_DECIMALS 0 2 QTA_DECIMALS 3 3 IMP_DECIMALS 0 2 - EXCLUDE "," + EXCLUDE "08," END SECTION HEADER ODD 28 +STRINGA 200 1 +BEGIN + KEY "abilita/disabilita stampa intestazione ditta " + PROMPT 1 1 "" + MESSAGE ENABLE,15@ + FLAGS "H" +END + STRINGA 1 35 1 BEGIN KEY "nome ditta" PROMPT 3 4 "" MESSAGE _DITTA,!RAGSOC + GROUP 15 + FLAGS "D" END STRINGA 2 35 1 @@ -59,6 +72,8 @@ BEGIN KEY "indirizzo ditta" PROMPT 3 5 "" MESSAGE _DITTA,!IND + GROUP 15 + FLAGS "D" END STRINGA 3 5 1 @@ -66,6 +81,8 @@ BEGIN KEY "cap ditta" PROMPT 3 6 "" MESSAGE _DITTA,!CAP + GROUP 15 + FLAGS "D" END STRINGA 4 30 1 @@ -73,12 +90,16 @@ BEGIN KEY "comune ditta" PROMPT 10 6 "" MESSAGE _DITTA,!COM + GROUP 15 + FLAGS "D" END STRINGA 5 8 1 BEGIN KEY "scritta P.IVA" PROMPT 3 7 "P.IVA IT" + GROUP 15 + FLAGS "D" END STRINGA 6 16 1 @@ -86,12 +107,16 @@ BEGIN KEY "partita iva ditta" PROMPT 12 7 "" MESSAGE _DITTA,!IVA + GROUP 15 + FLAGS "D" END STRINGA 7 12 1 BEGIN KEY "scritta COD.FISC." PROMPT 3 8 "COD.FISC. IT" + GROUP 15 + FLAGS "D" END STRINGA 8 16 1 @@ -99,86 +124,88 @@ BEGIN KEY "codice fiscale ditta" PROMPT 16 8 "" MESSAGE _DITTA,!CF -END - -NUMERO 9 30 1 -BEGIN - KEY "reg.soc.trib...." - PROMPT 3 9 "REG.SOC.TRIB.R.E. " - MESSAGE _DITTA,!REGSOC + GROUP 15 FLAGS "D" END -NUMERO 10 30 1 +STRINGA 9 2 BEGIN - KEY "c.c.i.a.a. ....." - PROMPT 3 10 "C.C.I.A.A. " - MESSAGE _DITTA,!CCIAA - FLAGS "D" + KEY "Numero di pagina" + PROMPT 80 21 "" + MESSAGE _PAGENO END -STRINGA 11 10 1 +DATA 10 8 BEGIN KEY "data fattura" - PROMPT 58 21 "" + PROMPT 60 21 "" FIELD 33->DATADOC + FORMAT "1442-" END -STRINGA 12 7 +STRINGA 11 7 BEGIN KEY "numero fattura" - PROMPT 73 21 "" + PROMPT 71 21 "" FIELD 33->NDOC END -STRINGA 13 4 1 +STRINGA 12 5 BEGIN KEY "codice cliente" - PROMPT 3 23 "" + PROMPT 2 23 "" FIELD 33->CODCF END -STRINGA 14 2 1 +STRINGA 13 3 BEGIN KEY "codice agente" - PROMPT 9 23 "" + PROMPT 8 23 "" FIELD 33->CODAG END -STRINGA 15 14 1 +STRINGA 14 14 BEGIN KEY "porto" PROMPT 52 23 "" FIELD 203@->S0 END -NUMERO 16 7 1 +STRING 15 6 BEGIN KEY "ordine" PROMPT 12 23 "" FIELD 33->NUMDOCRIF END -DATA 17 10 1 +DATA 16 8 BEGIN KEY "data conferma" - PROMPT 20 23 "" + PROMPT 19 23 "" FIELD 33->DATADOCRIF - FORMAT "1444-" + FORMAT "1442-" END -STRINGA 18 49 1 +STRINGA 17 50 BEGIN KEY "condizioni di pagamento" - PROMPT 3 25 "" + PROMPT 2 25 "" FIELD 201@->S0 END -STRINGA 19 29 1 +STRINGA 18 29 BEGIN - KEY "banca d'appoggio" - PROMPT 54 25 "" + KEY "banca d'appoggio istituto" + PROMPT 53 25 "" + FIELD 208@->S0 +END + +STRINGA 19 29 +BEGIN + KEY "banca d'appoggio agenzia" + PROMPT 53 25 "" FIELD 204@->S0 + FLAGS "D" END STRINGA 20 38 2 @@ -195,35 +222,45 @@ BEGIN MESSAGE _CLIENTE,!INDNUM END -STRINGA 22 2 +STRING 22 35 1 BEGIN - KEY "Numero di pagina" - PROMPT 80 21 "" - MESSAGE _PAGENO + KEY "destinatario, localita" + PROMPT 44 15 "" + MESSAGE _CLIENTE,LOCALITACF END STRINGA 23 5 1 BEGIN KEY "cliente cap" - PROMPT 44 15 "" + PROMPT 44 16 "" MESSAGE _CLIENTE,!CAP END -STRINGA 24 30 1 +STRINGA 24 30 2 BEGIN KEY "cliente comune" - PROMPT 50 15 "" + PROMPT 50 16 "" MESSAGE _CLIENTE,!COM->DENCOM + MESSAGE COPY,26 + FLAGS "H" END STRINGA 25 2 1 BEGIN KEY "cliente provincia" - PROMPT 73 16 "" + PROMPT 73 17 "" MESSAGE _CLIENTE,!COM->PROVCOM + MESSAGE APPEND,26 + FLAGS "H" END -STRINGA 26 3 1 +STRINGA 26 30 2 +BEGIN + KEY "cliente comune+prov." + PROMPT 50 16 "" +END + +STRINGA 27 3 BEGIN KEY "cliente codice stato" PROMPT 44 17 "" @@ -231,28 +268,57 @@ BEGIN FLAGS "H" END -STRINGA 27 25 1 +STRINGA 28 25 BEGIN KEY "cliente nome stato" PROMPT 44 17 "" - MESSAGE _TABLEREAD,%STA,#26,S0 + MESSAGE _TABLEREAD,%STA,#27,S0 + FLAGS "D" END -STRING 28 11 1 +STRING 29 11 +BEGIN + KEY "copy partita iva" + PROMPT 1 1 "" + MESSAGE _CLIENTE,PAIV + MESSAGE COPY,30 + FLAGS "H" +END + +STRING 30 11 +BEGIN + KEY "test PIVA/CF" + PROMPT 1 1 "" + MESSAGE EMPTY ENABLE,32 + MESSAGE ENABLE,31 + FLAGS "H" +END + +STRING 31 11 BEGIN KEY "partita iva cliente" PROMPT 37 23 "" MESSAGE _CLIENTE,PAIV + FLAGS "D" END -STRING 29 2 1 +STRING 32 16 +BEGIN + KEY "codice fiscale cliente" + PROMPT 35 23 "" + MESSAGE _CLIENTE,COFI + FLAGS "D" +END + +STRING 33 2 BEGIN KEY "codice iso iva cliente" - PROMPT 34 23 "" + PROMPT 35 23 "" MESSAGE _CLIENTE,STATOPAIV + FLAGS "D" END -STRING 30 15 +STRING 34 15 BEGIN KEY "causale di trasporto" PROMPT 67 23 "" @@ -270,7 +336,7 @@ BEGIN PROMPT 2 1 "" END -STRINGA 52 20 20 +STRINGA 52 20 22 BEGIN KEY "descrizione articolo" MESSAGE _DESCRIGA @@ -288,7 +354,7 @@ END NUMBER 54 9 BEGIN KEY "quantita'" - PROMPT 40 1 "" + PROMPT 41 1 "" FIELD 34->QTA PICTURE "#########" GROUP 30 @@ -298,7 +364,7 @@ END NUMBER 55 12 BEGIN KEY "prezzo unitario" - PROMPT 49 1 "" + PROMPT 51 1 "" FIELD 34->PREZZO PICTURE "###.###.###" GROUP 29 @@ -308,17 +374,16 @@ END STRINGA 56 3 BEGIN KEY "sconto" - PROMPT 62 1 "" + PROMPT 63 1 "" FIELD 34->SCONTO MESSAGE _ALIGN,#52,BOTTOM - FLAGS "D" END NUMBER 57 12 BEGIN KEY "importo netto" - PROMPT 66 1 "" - FIELD 34->IMPNN + PROMPT 67 1 "" + FIELD 34->IMPNS PICTURE "###.###.###" GROUP 29 MESSAGE _ALIGN,#52,BOTTOM @@ -327,7 +392,7 @@ END STRINGA 58 3 BEGIN KEY "iva" - PROMPT 79 1 "" + PROMPT 80 1 "" FIELD 34->CODIVA MESSAGE _ALIGN,#52,BOTTOM END @@ -367,9 +432,9 @@ END END -SECTION FOOTER ODD -52 +SECTION FOOTER ODD -50 -STRINGA 81 5 1 +STRINGA 100 5 1 BEGIN KEY "stampa 'segue' in coda" PROMPT 73 13 "SEGUE" @@ -377,320 +442,383 @@ END END -SECTION FOOTER LAST -52 +SECTION FOOTER LAST -50 NUMBER 101 12 BEGIN - KEY "spese" - PROMPT 69 1 "" + KEY "totale importi netti (non scontati)" + PROMPT 2 3 "" + FIELD TOTMER PICTURE "###.###.###" - FIELD SPESE GROUP 31 END -NUMBER 102 15 +STRINGA 102 7 +BEGIN + KEY "% sconto" + PROMPT 19 3 "" + FIELD 33->SCONTOPERC +END + +NUMBER 103 11 +BEGIN + KEY "totale sconti" + PROMPT 27 3 "" + FIELD SCONTOT + PICTURE "###.###.###" + GROUP 31 +END + +NUMBER 104 11 BEGIN KEY "spese di trasporto" - PROMPT 56 1 "" + PROMPT 42 3 "" PICTURE "###.###.###" - FIELD SPESE - FLAGS "H" - GROUP 31 -END - -NUMBER 103 15 -BEGIN - KEY "spese di imballo" - PROMPT 56 1 "" - PICTURE "###.###.###" - FIELD SPESE - FLAGS "H" - GROUP 31 -END - -NUMBER 104 8 -BEGIN - KEY "spese di incasso" - PROMPT 55 11 "" - PICTURE "###.###" - FIELD SPESINC + FIELD SPESTRA GROUP 31 END NUMBER 105 11 BEGIN - KEY "spese bolli" - PROMPT 60 11 "" - FIELD BOLLI + KEY "spese di imballo" + PROMPT 55 3 "" + PICTURE "###.###.###" + FIELD SPESIMB GROUP 31 - FLAGS "D" END -STRING 106 3 +NUMBER 106 11 +BEGIN + KEY "acconto" + PROMPT 55 6 "" + FIELD 33->IMPPAGATO + PICTURE "###.###.###" + GROUP 31 +END + +STRING 107 3 BEGIN KEY "codice iva 1" - PROMPT 1 3 "" + PROMPT 2 5 "" MESSAGE _RIEPILOGOIVA,1,COD,0 END -NUMBER 107 12 +NUMBER 108 12 BEGIN KEY "imponibile 1" - PROMPT 6 3 "" - MESSAGE _RIEPILOGOIVA,1,IMP,0 - PICTURE "###.###.###" - GROUP 31 -END - -NUMBER 108 2 -BEGIN - KEY "iva 1" - PROMPT 18 3 "" - MESSAGE _RIEPILOGOIVA,1,ALI,0 - PICTURE "##" -END - -NUMBER 109 10 -BEGIN - KEY "imposta 1" - PROMPT 22 3 "" - MESSAGE _RIEPILOGOIVA,1,IVA,1 - PICTURE "##.###.###" - GROUP 31 -END - -STRING 110 3 -BEGIN - KEY "codice iva 2" - PROMPT 1 4 "" - MESSAGE _RIEPILOGOIVA,1,COD,0 -END - -NUMBER 111 12 -BEGIN - KEY "imponibile 2" - PROMPT 6 4 "" - MESSAGE _RIEPILOGOIVA,1,IMP,0 - PICTURE "###.###.###" - GROUP 31 -END - -NUMBER 112 2 -BEGIN - KEY "iva 2" - PROMPT 18 4 "" - MESSAGE _RIEPILOGOIVA,1,ALI,0 - PICTURE "##" -END - -NUMBER 113 10 -BEGIN - KEY "imposta 2" - PROMPT 22 4 "" - MESSAGE _RIEPILOGOIVA,1,IVA,1 - PICTURE "##.###.###" - GROUP 31 -END - -STRING 114 3 -BEGIN - KEY "codice iva 3" - PROMPT 1 5 "" - MESSAGE _RIEPILOGOIVA,1,COD,0 -END - -NUMBER 115 12 -BEGIN - KEY "imponibile 3" PROMPT 6 5 "" MESSAGE _RIEPILOGOIVA,1,IMP,0 PICTURE "###.###.###" GROUP 31 END -NUMBER 116 2 +NUMBER 109 2 BEGIN - KEY "iva 3" - PROMPT 18 5 "" + KEY "iva 1" + PROMPT 19 5 "" MESSAGE _RIEPILOGOIVA,1,ALI,0 PICTURE "##" END -NUMBER 117 10 +NUMBER 110 10 BEGIN - KEY "imposta 3" + KEY "imposta 1" PROMPT 22 5 "" MESSAGE _RIEPILOGOIVA,1,IVA,1 PICTURE "##.###.###" GROUP 31 END -NUMBER 118 12 +STRING 111 3 +BEGIN + KEY "codice iva 2" + PROMPT 2 6 "" + MESSAGE _RIEPILOGOIVA,1,COD,0 +END + +NUMBER 112 12 +BEGIN + KEY "imponibile 2" + PROMPT 6 6 "" + MESSAGE _RIEPILOGOIVA,1,IMP,0 + PICTURE "###.###.###" + GROUP 31 +END + +NUMBER 113 2 +BEGIN + KEY "iva 2" + PROMPT 19 6 "" + MESSAGE _RIEPILOGOIVA,1,ALI,0 + PICTURE "##" +END + +NUMBER 114 10 +BEGIN + KEY "imposta 2" + PROMPT 22 6 "" + MESSAGE _RIEPILOGOIVA,1,IVA,1 + PICTURE "##.###.###" + GROUP 31 +END + +STRING 115 3 +BEGIN + KEY "codice iva 3" + PROMPT 2 7 "" + MESSAGE _RIEPILOGOIVA,1,COD,0 +END + +NUMBER 116 12 +BEGIN + KEY "imponibile 3" + PROMPT 6 7 "" + MESSAGE _RIEPILOGOIVA,1,IMP,0 + PICTURE "###.###.###" + GROUP 31 +END + +NUMBER 117 2 +BEGIN + KEY "iva 3" + PROMPT 19 7 "" + MESSAGE _RIEPILOGOIVA,1,ALI,0 + PICTURE "##" +END + +NUMBER 118 10 +BEGIN + KEY "imposta 3" + PROMPT 22 7 "" + MESSAGE _RIEPILOGOIVA,1,IVA,1 + PICTURE "##.###.###" + GROUP 31 +END + +NUMBER 119 12 BEGIN KEY "imponibile 4" - PROMPT 6 7 "" + PROMPT 6 9 "" MESSAGE _RIEPILOGOIVA,30,IMP,0 PICTURE "###.###.###" GROUP 31 END -STRINGA 119 3 +STRINGA 120 3 BEGIN KEY "codice iva 4" - PROMPT 1 7 "" + PROMPT 2 9 "" MESSAGE _RIEPILOGOIVA,30,COD,0 END -STRINGA 120 45 +STRINGA 121 45 BEGIN KEY "descrizione altri 4" - PROMPT 33 7 "" + PROMPT 35 9 "" MESSAGE _RIEPILOGOIVA,30,DES,1 END -NUMBER 121 12 +NUMBER 122 12 BEGIN KEY "imponibile 5" - PROMPT 6 8 "" + PROMPT 6 10 "" MESSAGE _RIEPILOGOIVA,30,IMP,0 PICTURE "###.###.###" GROUP 31 END -STRINGA 122 3 +STRINGA 123 3 BEGIN KEY "codice iva 5" - PROMPT 1 8 "" + PROMPT 2 10 "" MESSAGE _RIEPILOGOIVA,30,COD,0 END -STRINGA 123 45 +STRINGA 124 45 BEGIN KEY "descrizione altri 5" - PROMPT 33 8 "" + PROMPT 35 10 "" MESSAGE _RIEPILOGOIVA,30,DES,1 END -NUMBER 124 15 +NUMBER 125 12 BEGIN KEY "totale imponibile" - PROMPT 4 11 "" + PROMPT 6 13 "" MESSAGE _TOTIMPONIBILI,29 PICTURE "###.###.###" GROUP 31 END -NUMBER 125 14 +NUMBER 126 11 BEGIN KEY "totale imposta" - PROMPT 18 11 "" + PROMPT 21 13 "" FIELD IMPOSTE PICTURE "###.###.###" GROUP 31 END -NUMBER 126 15 +NUMBER 127 11 BEGIN KEY "totale esenti" - PROMPT 35 11 "" + PROMPT 35 13 "" MESSAGE _TOTIMPONIBILI,28 PICTURE "###.###.###" GROUP 31 END -NUMBER 127 15 +NUMBER 128 7 BEGIN - KEY "totale importi netti (non scontati)" - PROMPT 2 1 "" - FIELD TOTMER - PICTURE "###.###.###" + KEY "spese di incasso" + PROMPT 55 13 "" + PICTURE "###.###" + FIELD SPESINC GROUP 31 END -NUMBER 128 12 +NUMBER 129 5 BEGIN - KEY "totale fattura" - PROMPT 69 11 "" - FIELD TOTDOC - PICTURE "###.###.###" + KEY "spese bolli" + PROMPT 63 13 "" + FIELD BOLLI + PICTURE "#####" GROUP 31 END -DATA 129 10 1 -BEGIN - KEY "scadenza pagamento 1" - PROMPT 1 13 "" - MESSAGE _SCADENZE,DATA,0 -END - NUMBER 130 12 +BEGIN + KEY "totale fattura" + PROMPT 70 13 "" + FIELD TOTDOC + PICTURE "###.###.###" + GROUP 31 + MESSAGE COPY,133 +END + +NUMBER 131 17 +BEGIN + KEY "totale fattura in euro" + PROMPT 64 12 "EURO " + PICTURE "###.###,@@" + MESSAGE _NUMEXPR,(ROUND(IMPONIBILI/1936.27,2)+ROUND(IMPOSTE/1936.27,2)) + MESSAGE COPY,135 +END + +NUMBER 132 11 +BEGIN + KEY "acconto" + PROMPT 46 16 "" + FIELD 33->IMPPAGATO + PICTURE "###.###.###" + GROUP 31 + MESSAGE SUB,133 +END + +NUMBER 133 12 +BEGIN + KEY "netto a pagare" + PROMPT 70 16 "" + PICTURE "###.###.###" + GROUP 31 +END + +NUMBER 134 17 +BEGIN + KEY "Anticipo in euro" + PROMPT 41 17 "EURO " + PICTURE "###.###,@@" + MESSAGE _NUMEXPR,ROUND(#106/1936.27,2) + MESSAGE SUB,135 +END + +NUMBER 135 10 +BEGIN + KEY "netto a pagare in EURO" + PROMPT 71 17 "" + PICTURE "###.###,@@" +END + +DATA 136 8 +BEGIN + KEY "scadenza pagamento 1" + PROMPT 2 15 "" + MESSAGE _SCADENZE,DATA,0 + FORMAT "1442-" +END + +NUMBER 137 12 BEGIN KEY "importo scadenza 1" - PROMPT 13 13 "" + PROMPT 12 15 "" MESSAGE _SCADENZE,IMPORTO,1 PICTURE "###.###.###" GROUP 31 END -DATA 131 10 1 +DATA 138 8 BEGIN KEY "scadenza pagamento 2" - PROMPT 27 13 "" + PROMPT 26 15 "" MESSAGE _SCADENZE,DATA,0 + FORMAT "1442-" END -NUMBER 132 12 +NUMBER 139 12 BEGIN KEY "importo scadenza 2" - PROMPT 39 13 "" + PROMPT 36 15 "" MESSAGE _SCADENZE,IMPORTO,1 PICTURE "###.###.###" GROUP 31 END -DATA 133 10 1 +DATA 140 8 1 BEGIN KEY "scadenza pagamento 3" - PROMPT 1 14 "" + PROMPT 2 16 "" MESSAGE _SCADENZE,DATA,0 + FORMAT "1442-" END -NUMBER 134 12 +NUMBER 141 12 BEGIN KEY "importo scadenza 3" - PROMPT 14 14 "" + PROMPT 12 16 "" MESSAGE _SCADENZE,IMPORTO,1 PICTURE "###.###.###" GROUP 31 END -DATA 135 10 1 +DATA 142 8 1 BEGIN KEY "scadenza pagamento 4" - PROMPT 27 14 "" + PROMPT 26 16 "" MESSAGE _SCADENZE,DATA,0 + FORMAT "1442-" END -NUMBER 136 12 +NUMBER 143 12 BEGIN KEY "importo scadenza 4" - PROMPT 39 14 "" + PROMPT 36 16 "" MESSAGE _SCADENZE,IMPORTO,1 PICTURE "###.###.###" GROUP 31 END -DATA 137 10 1 +DATA 144 8 1 BEGIN KEY "scadenza pagamento 5" - PROMPT 3 15 "" + PROMPT 2 17 "" MESSAGE _SCADENZE,DATA,0 + FORMAT "1442-" END -NUMBER 138 15 +NUMBER 145 12 BEGIN KEY "importo scadenza 5" - PROMPT 16 15 "" + PROMPT 12 17 "" MESSAGE _SCADENZE,IMPORTO,1 PICTURE "###.###.###" GROUP 31 diff --git a/ve/velib.h b/ve/velib.h index 55485d069..d245d98ca 100755 --- a/ve/velib.h +++ b/ve/velib.h @@ -520,6 +520,8 @@ class TDocumento : public TMultiple_rectype // velib03 TProvvigioni_agente* _provv_agente; TRiga_documento * _sconto; // Riga per lo sconto di testata TRiga_documento * _esenzione; // Riga per l' esenzione iva + + bool _dirty_deny; static TAssoc_array _tipi; static TAssoc_array _numerazioni; @@ -539,6 +541,8 @@ protected: long get_next_key(char provv, int anno, const char* codnum) const; virtual void put_str(const char* fieldname, const char* val); + virtual const TString & get_str(const char* fieldname) const ; + long renum_ndoc(long numdoc = 0); virtual bool key_complete() { return numero() > 0; } virtual bool renum() { return renum_ndoc() > 0;} @@ -591,6 +595,8 @@ public: int rewrite() const { return write(TRUE); } int remove() const { TLocalisamfile f(LF_DOC); return remove(f);} + void flush_rows(); + TProvvigioni_agente& calc_provvigioni(const bool generata = TRUE); int write_provvigioni() { return calc_provvigioni().write();} @@ -630,6 +636,7 @@ public: void set_riga_esenzione(); + void iva_esente(TString & codiva_es) const; real spese_incasso(real & imp, int ndec, TTipo_importo netto = _lordo) const ; real bolli(real & imp, int ndec, TTipo_importo netto = _lordo) const ; @@ -1009,7 +1016,7 @@ protected: // Funzione per aggiungere la riga iva al TAssoc_array _righe_iva error_type add_iva_row(const TBill&, const TRiga_documento&, const int); // Funzione atomica per aggiungere le righe di spese d'incasso e bolli al TAssoc_array _righe_iva - void calculate_spese(real&, real&, int, bool, bool); + void calculate_spese(real&, real&, int, bool, bool, const TString & ); // Funzione per aggiungere le righe di spese d'incasso e bolli al TAssoc_array _righe_iva (chiama calculate_spese()) error_type add_spese_inbo(TDocumento&, const int); // Aggiorna le righe di sconto importo o percentuale @@ -1057,6 +1064,7 @@ public: const TDate& data_elab, bool interattivo = FALSE); void set_auto(const bool a) { _auto_data = a; } void set_nump(const byte n) { _nump_iva = n; } + void set_writeable(const bool b) { _can_write = b; } const long docs() { return _total_docs; } TContabilizzazione(const char* cod); TContabilizzazione(const TRectype& rec); @@ -1093,10 +1101,6 @@ class TGenerazione_effetti : public TElaborazione // velib04c *_occas; TTable *_cpg; // tabella condizioni di pagamento TArray _effetti_array;//Array di effetti (TEffetto) da scrivere - TAssoc_array _group_array; // Assoc_array dei documenti da raggruppare. La chiave di ogni elemento - // e composta dagli stessi criteri di raggruppamento (vedi sotto) - // Ogni elemento e una TToken_string. Ogni elemento della TToken_string contiene - // la chiave per identificare il documento che fa parte di quel raggruppamento protected: // Visualizza l'ultimo errore rilevato void display_error(TDocumento& doc); @@ -1104,14 +1108,12 @@ protected: bool valid_type(int) const ; // Genera l'effetto void generate_bill(TDocumento&); - // Effettua il raggruppamento vero e proprio degli effetti (solo se ci sono elementi nell'assoc_array - void group_bills(TDocumento&); // Istanzia il pagamento corrente void calc_pagamento(TDocumento&); // Scrive i record array degli effetti raggruppati error_type write_groups(); // Cambia lo stato dei gruppi di documenti raggruppati in effetti - error_type change_group_status(TDocumento&); + error_type change_group_status(TDocumento&, TAssoc_array&); // Cambia lo stato del documento error_type change_doc_status(TDocumento&); // Verifica se non ci sono stati errori @@ -1120,8 +1122,11 @@ public: virtual bool elabora(TLista_documenti& doc_in, TLista_documenti& doc_out, const TDate& data_elab, bool interattivo = FALSE); + // Effettua il raggruppamento vero e proprio degli effetti (solo se ci sono elementi nell'assoc_array passato) + long group_bills(TAssoc_array&); long bills() const { return _total_bills; } - void set_group(TAssoc_array& a) { _group_array = a; } +// void set_group(TAssoc_array& a) { _group_array = a; } + void set_writeable(const bool b) { _can_write = b; } TGenerazione_effetti(const char* cod); TGenerazione_effetti(const TRectype& rec); diff --git a/ve/velib02.cpp b/ve/velib02.cpp index 88183c2b3..d2fa2ec0f 100755 --- a/ve/velib02.cpp +++ b/ve/velib02.cpp @@ -711,7 +711,14 @@ void TRiga_documento::autosave(TSheet_field & f) { TToken_string & row = f.row(num); - put( "STATORIGA", row.get( f.cid2index(FR_STATORIGA) ) ); +// put( "STATORIGA", row.get(f.cid2index(FR_STATORIGA))); + const int lordo_id = f.cid2index(FR_LORDO); + const bool lordo = strcmp(row.get(lordo_id), "X") == 0; + if (lordo) + { + row.add(" ", lordo_id); + f.sheet_mask().reset(FR_LORDO); + } put( "TIPORIGA", row.get( f.cid2index(FR_TIPORIGA )) ); TString16 codmag(row.get(f.cid2index(FR_CODMAG))); @@ -743,7 +750,19 @@ void TRiga_documento::autosave(TSheet_field & f) zero("DESCEST"); } - put( "PREZZO", row.get( f.cid2index(FR_PREZZO )) ); + const int prezzo_id = f.cid2index(FR_PREZZO); + real prezzo(row.get(prezzo_id)); + const TString16 codiva(row.get(f.cid2index(FR_CODIVA))); + if (lordo) + { + prezzo = lordo2netto(prezzo, codiva, doc().in_valuta()); + + const TString prezzo_str(prezzo.string()); + + row.add(prezzo_str, prezzo_id); + f.sheet_mask().set(FR_PREZZO, prezzo_str); + } + put( "PREZZO", prezzo); put( "UMQTA", row.get( f.cid2index(FR_UMQTA )) ); // TMask * m = ((TTipo_riga_documento &)tipo()).mask(); // const int pos = m->id2pos(FR_QTA); @@ -756,8 +775,9 @@ void TRiga_documento::autosave(TSheet_field & f) put( "DAEVADERE", row.get( f.cid2index(FR_DAEVADERE )) ); put( "SCONTO", row.get( f.cid2index(FR_SCONTO )) ); put( "PERCPROV", row.get( f.cid2index(FR_PERCPROV )) ); + put( "IMPFISUN", row.get( f.cid2index(FR_IMPFISUN )) ); put( "IMPFISSO", row.get( f.cid2index(FR_IMPFISSO )) ); - put( "CODIVA", row.get( f.cid2index(FR_CODIVA )) ); + put( "CODIVA", codiva); put( "ADDIVA", row.get( f.cid2index(FR_ADDIVA )) ); put( "ASPBENI", row.get( f.cid2index(FR_ASPBENI )) ); put( "CAUSMAG", row.get( f.cid2index(FR_CAUS )) ); @@ -786,7 +806,7 @@ void TRiga_documento::autoload(TSheet_field & f) TToken_string & row = f.row(num); row.cut(0); - row.add( get( "STATORIGA" ), f.cid2index(FR_STATORIGA )); +// row.add( get( "STATORIGA" ), f.cid2index(FR_STATORIGA )); row.add( get( "TIPORIGA" ), f.cid2index(FR_TIPORIGA )); const TString16 codmag(get("CODMAG")); row.add( codmag.left(3), f.cid2index(FR_CODMAG )); @@ -835,6 +855,7 @@ void TRiga_documento::autoload(TSheet_field & f) row.add( get( "DAEVADERE" ), f.cid2index(FR_DAEVADERE )); row.add( get( "SCONTO" ), f.cid2index(FR_SCONTO )); row.add( get( "PERCPROV" ), f.cid2index(FR_PERCPROV )); + row.add( get( "IMPFISUN" ), f.cid2index(FR_IMPFISUN )); row.add( get( "IMPFISSO" ), f.cid2index(FR_IMPFISSO )); row.add( get( "CODIVA" ), f.cid2index(FR_CODIVA )); row.add( get( "ADDIVA" ), f.cid2index(FR_ADDIVA )); diff --git a/ve/velib03.cpp b/ve/velib03.cpp index 50fa4b640..dcdbce29a 100755 --- a/ve/velib03.cpp +++ b/ve/velib03.cpp @@ -150,25 +150,25 @@ const TString_array& TTipo_documento::keys_descrs() if (numtr > 0) { - for ( int i = 1; i <= numtr; i ++ ) - { - var.format("%d", i); - tiporiga = prof.get(var, "RIGHE"); - tr.read(tiporiga); - k.add(tr.codice()); - d.add(tr.descrizione()); - } - } - else - { - TTable tri("%TRI"); - - for (int err = tri.first(); err == NOERR; err = tri.next()) - { - k.add(tri.get("CODTAB")); - d.add(tri.get("S0")); - } - } + for ( int i = 1; i <= numtr; i ++ ) + { + var.format("%d", i); + tiporiga = prof.get(var, "RIGHE"); + tr.read(tiporiga); + k.add(tr.codice()); + d.add(tr.descrizione()); + } + } + else + { + TTable tri("%TRI"); + + for (int err = tri.first(); err == NOERR; err = tri.next()) + { + k.add(tri.get("CODTAB")); + d.add(tri.get("S0")); + } + } } return _keys_descrs; @@ -250,17 +250,17 @@ void TTipo_documento::read_formule() if (calcoli == "*") { - TTable frd("%FRD"); - - for (int err = frd.first(); err == NOERR; err = frd.next()) - { - const TString & formula = frd.get("CODTAB"); - if (_formule.find(formula) < 0) - _formule.add(formula); - } + TTable frd("%FRD"); + + for (int err = frd.first(); err == NOERR; err = frd.next()) + { + const TString & formula = frd.get("CODTAB"); + if (_formule.find(formula) < 0) + _formule.add(formula); + } } else - _formule.add(calcoli); + _formule.add(calcoli); _totale = prof.get("TOTALE", "MAIN"); if (_totale.empty()) _totale = "TOTDOC"; @@ -809,12 +809,12 @@ void TExpr_documento::evaluate_user_func(int index, int nparms, TEval_stack & st break; case _pscontot: { - real val; - TString80 s; - - if (_doc && scontoexpr2perc(_doc->get(DOC_SCONTOPERC), FALSE, s, val) && val != ZERO) - val = 1 - val; - stack.push(val); + real val; + TString80 s; + + if (_doc && scontoexpr2perc(_doc->get(DOC_SCONTOPERC), FALSE, s, val) && val != ZERO) + val = 1 - val; + stack.push(val); } break; default: @@ -922,6 +922,7 @@ void TDocumento::init() _sconto = _esenzione = NULL; _stato_originale = ' '; + _dirty_deny = FALSE; for (int i = 3 ; i >= 0; i--) _liv_len[i] = 0; @@ -1059,18 +1060,43 @@ real TDocumento::spese_incasso(real & imp, int ndec, TTipo_importo t) const if (cambio == ZERO) cambio = 1.0; - - real iva_spese(iva(imp_spese, TRiga_documento::iva(codiva_spese()), ndec)); - if (t == _lordo) - imp_spese += iva_spese; - else - if (t == _imposta) - imp_spese = iva_spese; + + if (t == _lordo || t == _imposta) + { + TString16 codiva_es; + + iva_esente(codiva_es); + real iva_spese(iva(imp_spese, TRiga_documento::iva(codiva_es.not_empty() ? (const TString &) codiva_es : codiva_spese()), ndec)); + if (t == _lordo) + imp_spese += iva_spese; + else + if (t == _imposta) + imp_spese = iva_spese; + } imp_spese /= cambio; imp_spese.round(ndec); } return imp_spese; } + +void TDocumento::iva_esente(TString & codiva_es) const + +{ + int rows = physical_rows(); + + codiva_es.cut(0); + for (int r = 1; codiva_es.empty() && r <= rows; r++) + { + const TRiga_documento& riga = ((TDocumento*)this)->row(r); + const TIVA codiva(riga.get(RDOC_CODIVA)); + const TString & tipoiva = codiva.tipo(); + + if (tipoiva.empty()) + break; + if (tipoiva == "NI") + codiva_es = codiva.codice(); + } +} real TDocumento::bolli(real & imp, int ndec, TTipo_importo t) const { @@ -1124,18 +1150,20 @@ real TDocumento::bolli(real & imp, int ndec, TTipo_importo t) const const real imp_spese = sp_orig * cambio + tot_bolli - iva_bolli; const real imponibile = importo - imposte - imp_spese; tot_bolli = ZERO; - real imponibile_esente; - - for (int r = physical_rows(); r > 0; r--) - { - const TRiga_documento& riga = ((TDocumento*)this)->row(r); - const TIVA codiva(riga.get(RDOC_CODIVA)); - - if (codiva.tipo().not_empty()) - imponibile_esente += riga.imponibile(); - } - if (imponibile_esente >= impmin_bolli) - tot_bolli = bolli_es; + real imponibile_esente; + TString16 codiva_es; + + iva_esente(codiva_es); + for (int r = physical_rows(); r > 0; r--) + { + const TRiga_documento& riga = ((TDocumento*)this)->row(r); + const TIVA codiva(riga.get(RDOC_CODIVA)); + + if (codiva.tipo().not_empty()) + imponibile_esente += riga.imponibile(); + } + if (imponibile_esente >= impmin_bolli) + tot_bolli = bolli_es; pag.set_total(imponibile, imposte, imp_spese); pag.set_rate_auto(); @@ -1193,7 +1221,7 @@ real TDocumento::bolli(real & imp, int ndec, TTipo_importo t) const break; } } - iva_bolli = iva(tot_bolli, TRiga_documento::iva(codiva_bolli()), ndec); + iva_bolli = iva(tot_bolli, TRiga_documento::iva(codiva_es.not_empty() ? (const TString &) codiva_es : codiva_bolli()), ndec); importo += (tot_bolli + iva_bolli - old_bolli); } if (t == _lordo) @@ -1254,7 +1282,7 @@ void TDocumento::set_key(TRectype& rec, char provv, int anno, const char* codnum rec.put("PROVV", provv); rec.put("ANNO", anno); - rec.put("CODNUM", codnum); + rec.put("CODNUM", codnum); rec.put("NDOC", numdoc); } @@ -1488,15 +1516,19 @@ void TDocumento::set_riga_esenzione() void TDocumento::dirty_fields() { - for (TDocumento_variable_field * f = (TDocumento_variable_field *) first_variable_field(); - f != NULL; f = (TDocumento_variable_field *) succ_variable_field()) - f->set_dirty(); - dirty_tabella_iva(); - for (int i = loaded_rows(); i > 0; i--) + if (!_dirty_deny) { - TRiga_documento & r = (TRiga_documento &) row(i); - r.dirty_fields(FALSE); - } + for (TDocumento_variable_field * f = (TDocumento_variable_field *) first_variable_field(); + f != NULL; f = (TDocumento_variable_field *) succ_variable_field()) + f->set_dirty(); + dirty_tabella_iva(); + for (int i = loaded_rows(); i > 0; i--) + { + TRiga_documento & r = (TRiga_documento &) row(i); + r.dirty_fields(FALSE); + } + _dirty_deny = TRUE; + } } int TDocumento::write_rewrite(TBaseisamfile & f, bool re) const @@ -1569,7 +1601,7 @@ int TDocumento::write_rewrite(TBaseisamfile & f, bool re) const mov.put(MOVMAG_NUMREG, num); while (mov.read(m, _isequal, _testandlock) == _islocked) - message_box("Movimento di magazzino in uso da parte di un'altro utente"); + message_box("Movimento di magazzino n. %ld in uso da parte di un'altro utente", num); if (do_movmag) { TRecord_array & b = mov.body(); @@ -1651,6 +1683,8 @@ int TDocumento::write_rewrite(TBaseisamfile & f, bool re) const mov.add_magc(r.get("CODMAGC")); + rm.put(RMOVMAG_IMPIANTO, r.get("IMPIANTO"));; + rm.put(RMOVMAG_LINEA, r.get("LINEA")); rm.put(RMOVMAG_CODMAG, r.get("CODMAG")); rm.put(RMOVMAG_CODART, r.get("CODARTMAG")); rm.put(RMOVMAG_LIVGIAC, r.get("LIVELLO")); @@ -1803,6 +1837,11 @@ int TDocumento::remove(TBaseisamfile& f) const return TMultiple_rectype::remove(f); } +void TDocumento::flush_rows() +{ + remove_body(LF_RIGHEDOC); +} + TProvvigioni_agente& TDocumento::calc_provvigioni(const bool generata) { CHECK (_provv_agente, "Bad TProvvigione_agente object"); @@ -1833,6 +1872,7 @@ TProvvigioni_agente& TDocumento::calc_provvigioni(const bool generata) real totimposte = imposta(); real totimponibili = tot_doc - totimposte - totspese; + pag1.zap_rate(); if (is_nota_credito()) // Se il documento e' una nota di credito, cambia segno { tot_doc = -tot_doc; @@ -2086,7 +2126,7 @@ real TDocumento::imponibile(bool spese, int ndec) const for (TRiepilogo_iva * ri = (TRiepilogo_iva *) table.get(); ri != NULL; ri = (TRiepilogo_iva *) table.get()) val += ri->imponibile(spese); - val.round(ndec); + val.round(ndec); } return val; } @@ -2108,7 +2148,9 @@ void TDocumento::update_tabella_iva() real tot_sconti_perc; const bool doc_al_lordo = tipo().calcolo_lordo(); const int ndec = in_valuta() ? 3 : 0; - + TString16 codiva_es; + + iva_esente(codiva_es); for (int i = items; i > 0; i--) { const TRiga_documento& r = row(i); @@ -2129,7 +2171,6 @@ void TDocumento::update_tabella_iva() const TIVA & iva = r.iva(); const TString16 cod(iva.codice()); TRiepilogo_iva * aliquota = (TRiepilogo_iva *) table.objptr(cod); - if (aliquota == NULL) { aliquota = new TRiepilogo_iva(iva); @@ -2174,25 +2215,25 @@ void TDocumento::update_tabella_iva() if (doc_al_lordo) { - const real imposta(::iva(i, ci, ndec)); + const real imposta(::iva(i, ci, ndec)); - imponibile += imposta; - ri->sconto_imp() += imposta; - tot_doc += imposta; + imponibile += imposta; + ri->sconto_imp() += imposta; + tot_doc += imposta; } else { - const real imposta(::iva(i, ci, ALL_DECIMALS)); + const real imposta(::iva(i, ci, ALL_DECIMALS)); - iva += imposta; - ri->iva_sconto() = ::iva(i, ci, ndec); - tot_doc += imposta; - } + iva += imposta; + ri->iva_sconto() = ::iva(i, ci, ndec); + tot_doc += imposta; + } } } real val = spese_incasso(tot_doc, ALL_DECIMALS, _netto); - TString16 codiva(codiva_spese()); + TString16 codiva(codiva_es.not_empty() ? (const TString &) codiva_es : codiva_spese()); TRiepilogo_iva * ri = (TRiepilogo_iva *) table.objptr(codiva); if (val != ZERO) @@ -2207,16 +2248,16 @@ void TDocumento::update_tabella_iva() tot_doc += val; val = spese_incasso(tot_doc, ALL_DECIMALS, _imposta); if (doc_al_lordo) - ri->imp_spese() += val; - else - ri->iva_spese() += val; + ri->imp_spese() += val; + else + ri->iva_spese() += val; tot_doc += val; } val = bolli(tot_doc, ALL_DECIMALS, _netto); if (val != ZERO) { - codiva = codiva_bolli(); + codiva = codiva_es.not_empty() ? (const TString &) codiva_es : codiva_bolli(); ri = (TRiepilogo_iva *) table.objptr(codiva); if (ri == NULL) { @@ -2228,36 +2269,36 @@ void TDocumento::update_tabella_iva() tot_doc += val; val = bolli(tot_doc, ALL_DECIMALS, _imposta); if (doc_al_lordo) - ri->imp_spese() += val; - else - ri->iva_spese() += val; + ri->imp_spese() += val; + else + ri->iva_spese() += val; tot_doc += val; } // SCORPORO - if (doc_al_lordo) - { + if (doc_al_lordo) + { table.restart(); for (ri = (TRiepilogo_iva *) table.get(); ri != NULL; ri = (TRiepilogo_iva *) table.get()) { const TString16 codiva = ri->cod_iva().codice(); - real r = ::lordo2netto(ri->imp(), codiva, ndec); + real r = ::lordo2netto(ri->imp(), codiva, ndec); ri->iva() = ri->imp() - r; ri->imp() = r; - r = ::lordo2netto(ri->imp_spese(), codiva, ndec); - ri->iva_spese() = ri->imp_spese() - r; - ri->imp_spese() = r; - ri->imp_spese_row() = ::lordo2netto(ri->imp_spese_row(), codiva, ndec); + r = ::lordo2netto(ri->imp_spese(), codiva, ndec); + ri->iva_spese() = ri->imp_spese() - r; + ri->imp_spese() = r; + ri->imp_spese_row() = ::lordo2netto(ri->imp_spese_row(), codiva, ndec); - real i = ri->sconto_perc() + ri->sconto_imp(); + real i = ri->sconto_perc() + ri->sconto_imp(); - r = ::lordo2netto(i, codiva, ndec); + r = ::lordo2netto(i, codiva, ndec); ri->iva_sconto() = i - r; - ri->sconto_imp() -= ri->iva_sconto(); + ri->sconto_imp() -= ri->iva_sconto(); } - } + } } real TDocumento::imposta(bool spese, int ndec) const @@ -2346,9 +2387,11 @@ TPagamento& TDocumento::pagamento() _pag.read(); _pag.set_inizio(data_in /* , TRUE */); // Perche' rispetta rate TRUE? } - - if (data_in != _pag.get_inizio()) - _pag.set_inizio(data_in /* , TRUE */); // Perche' rispetta rate TRUE? + else + { + if (data_in != _pag.get_datadoc()) + _pag.set_inizio(data_in /* , TRUE */); // Perche' rispetta rate TRUE? + } return _pag; } @@ -2417,6 +2460,14 @@ void TDocumento::put_str(const char* fieldname, const char* val) } } +const TString& TDocumento::get_str(const char* fieldname) const +{ + if (_dirty_deny && variable_field(fieldname) != NULL) + (bool&) _dirty_deny = FALSE; + + return TMultiple_rectype::get_str(fieldname); +} + void TDocumento::zero(const char * fieldname) { if (strcmp(fieldname, "TIPODOC") == 0) diff --git a/ve/velib04.cpp b/ve/velib04.cpp index 11cd60f74..25d3f2d60 100755 --- a/ve/velib04.cpp +++ b/ve/velib04.cpp @@ -117,7 +117,10 @@ int TLista_documenti::write(bool re) const { int err = NOERR; for (int i = 0; i < _documenti.items() && err == NOERR; i++) + { err = doc(i).write(re); + ((TDocumento&)doc(i)).flush_rows(); + } return err; } diff --git a/ve/velib04a.cpp b/ve/velib04a.cpp index 2d8cbe64d..2e55e5944 100755 --- a/ve/velib04a.cpp +++ b/ve/velib04a.cpp @@ -223,8 +223,10 @@ bool TFatturazione_bolle::elabora(TLista_documenti& doc_in, TLista_documenti& do // Aggiungilo alla lista dei documenti in uscita od = doc_out.add(new_doc); } - + ok = raggruppa(campione, doc_out[od]); + + campione.flush_rows(); } const int tot = doc_out.items(); diff --git a/ve/velib04b.cpp b/ve/velib04b.cpp index c877303f0..05e6de8fd 100755 --- a/ve/velib04b.cpp +++ b/ve/velib04b.cpp @@ -449,14 +449,34 @@ TIVA_element& TIVA_element::add(const TRiga_documento& a, const bool sc, const i return *this; } +// Parametri da leggere all'inizio dell'elaborazione tramite load_parameters() static TBill _sco_perc_bill, _sco_imp_bill, // Conti per gli sconti a percentuale ed importi (dalla configurazione) _spin_billa, _spin_billv, _spbo_billa, _spbo_billv; static TBill _co_cliente, // conto clifo per movimento d'anticipo _co_controp; // conto di contropartita per il movimetno d'anticipo - -static bool _contsclor; // Contabilizza sconti al netto o al lordo (sconti suddiviso per ogni contropartita) -static TString16 _ivasto; // Codice IVA per storno articoli Omaggio + +static bool _nump_cfg; // se TRUE prende il numero rif. partita dal numero protocollo +static bool _sc_enabled; // se TRUE il saldaconto di ditta e' abilitato +static TToken_string + _search_seq; // Sequenza di ricerca del conto costo/ricavo la correttezza dell'ordinamento + // va controllata nel programma di modifica parametri: + // "" = fine ordinamento + // CF = cliente fornitore + // CA = causale + // AR = articolo (costo/ricavo) + // GM = gruppo merceologico + // SM = sottogruppo merceologico + // RF = raggruppamento fiscale + // CV = categoria di vendita + // CC = categoria contabile + // Gli utlimi 6 fanno parte della ricerca per costi ricavi, in particolare AR,GM,SM e RF + // non possono essere interrotti da CV o CC. Ad es. CA|CF|AR|CV|GM|CC|RF non e' valida come stringa + // di ricerca. +static TString16 _ivasto; // Codice IVA per storno articoli Omaggio +static bool _contsclor; // Contabilizza sconti al netto o al lordo (sconti suddiviso per ogni contropartita) +static bool _loaded = FALSE;// Flag per evitare di caricare i parametri più di una volta + static TEsercizi_contabili _esc; // Per sapere a quale esercizio appartiene il documento static TCausale *_caus = NULL; // causale del documento corrente static TMovimentoPN_VE *_movimento = NULL; // Movimento di prima nota documento vendita @@ -491,6 +511,11 @@ TContabilizzazione::TContabilizzazione(const char* cod) _cco = new TTable("CCO"); _clifo = new TRelation(LF_CLIFO); _clifo->add(LF_CFVEN,"TIPOCF=TIPOCF|CODCF=CODCF"); + + _can_write = TRUE; + _error = no_error; + _total_docs = 0L; + _caus = NULL; } TContabilizzazione::TContabilizzazione(const TRectype& rec) @@ -522,6 +547,11 @@ TContabilizzazione::TContabilizzazione(const TRectype& rec) _cco = new TTable("CCO"); _clifo = new TRelation(LF_CLIFO); _clifo->add(LF_CFVEN,"TIPOCF=TIPOCF|CODCF=CODCF"); + + _can_write = TRUE; + _error = no_error; + _total_docs = 0L; + _caus = NULL; } TContabilizzazione::~TContabilizzazione() @@ -554,6 +584,9 @@ TContabilizzazione::~TContabilizzazione() bool TContabilizzazione::load_parameters() { + if (_loaded) + return TRUE; + TConfig conf(CONFIG_DITTA); _search_seq = conf.get("RICERCACR","ve"); @@ -611,6 +644,8 @@ bool TContabilizzazione::load_parameters() _spin_cod = conf.get("SPINCODIVA","ve"); _spbo_cod = conf.get("SPBOCODIVA","ve"); + + _loaded = TRUE; return TRUE; } @@ -1133,13 +1168,13 @@ error_type TContabilizzazione::add_iva_row(const TBill& conto, const TRiga_docum return no_error; } -void TContabilizzazione::calculate_spese(real& spese, real& sp_iva, int ndec, bool is_incasso, bool is_cli) +void TContabilizzazione::calculate_spese(real& spese, real& sp_iva, int ndec, bool is_incasso, bool is_cli, const TString & codiva_es) { char tipo; int gr,co; long so; const TBill& zio = is_incasso ? (is_cli ? _spin_billv : _spin_billa) : (is_cli ? _spbo_billv : _spbo_billa); - TIVA sp_cod(is_incasso ? _spin_cod : _spbo_cod); + TIVA sp_cod(codiva_es.not_empty() ? codiva_es : (is_incasso ? (const TString &) _spin_cod : (const TString &) _spbo_cod)); TIVA_element el_tmp; TString key; @@ -1171,14 +1206,17 @@ error_type TContabilizzazione::add_spese_inbo(TDocumento& doc, const int ndec) // Aggiunge le spese d'incasso tot_netto = doc.totale_netto(); sp_incasso = doc.spese_incasso(tot_netto,ndec,_netto); + TString16 codiva_es; + + doc.iva_esente(codiva_es); if (sp_incasso != 0.0) - calculate_spese(sp_incasso,iva_sp_incasso,ndec,TRUE,is_cli); + calculate_spese(sp_incasso,iva_sp_incasso,ndec,TRUE,is_cli, codiva_es); // Aggiunge le spese bolli tot_netto += sp_incasso + iva_sp_incasso; sp_bolli = doc.bolli(tot_netto,ndec, _netto); if (sp_bolli != 0) - calculate_spese(sp_bolli,iva_sp_bolli,ndec,FALSE,is_cli); + calculate_spese(sp_bolli,iva_sp_bolli,ndec,FALSE,is_cli, codiva_es); return _error; } @@ -1481,35 +1519,24 @@ error_type TContabilizzazione::write_scadenze(TDocumento& doc) // Scrive le scadenze. Liberamente tratto da cg2104.cpp. { TRectype& head = _movimento->lfile().curr(); + const long nreg = head.get_long(MOV_NUMREG); - TPagamento& pag = doc.pagamento(); +// const real change(head.get_real(MOV_CAMBIO)); + int anno = head.get_int(MOV_ANNOIVA); + TString16 numpart = doc.get(DOC_NUMDOCRIF); - real totspese = doc.spese(); - real totimposte = doc.imposta(); - real totimponibili = doc.totale_doc() - totimposte - totspese; - const TString16 codval = head.get(MOV_CODVAL); - const bool valuta = codval.not_empty(); - if (valuta) + if (numpart.blank()) { - const real change(head.get_real(MOV_CAMBIO)); - //real val1 = totimponibili * change; - real val2 = totimposte * change; - real val3 = totspese * change; - real val1 = head.get_real(MOV_TOTDOC) - val2 - val3; // Cosi' corregge eventuali scompensi di poche lirette - pag.set_total_valuta( totimponibili, totimposte, totspese, change, val1, val2, val3, codval); + numpart = head.get(_nump_cfg ? MOV_PROTIVA : MOV_NUMDOC); } else - pag.set_total( totimponibili, totimposte, totspese ); - pag.set_rate_auto( ); - - const long nreg = head.get_long(MOV_NUMREG); - const int anno = head.get_int(MOV_ANNOIVA); - const TString16 numpart(head.get(_nump_cfg ? MOV_PROTIVA : MOV_NUMDOC)); + { + TDate ddr = doc.get(DOC_DATADOCRIF); + if (ddr.ok()) + anno = ddr.year(); + } TPartita* newgame = NULL; - - int nuova_riga = 0; - if (anno > 0 && !numpart.blank()) { const int tmov = _caus->tipomov(); @@ -1527,10 +1554,13 @@ error_type TContabilizzazione::write_scadenze(TDocumento& doc) const long codcf = head.get_long(MOV_CODCF); clifo.set(0,0,codcf,tipocf); newgame = new TPartita(clifo, anno, numpart); + newgame->allinea(); // Rispettare sempre l'allineamento del numero partita! - const int row = newgame->prima_fattura(nreg); // Riga fattura di questo movimento + int row = 0; + if (tmov == tm_fattura) + row = newgame->prima_fattura(nreg); // Riga fattura di questo movimento TRiga_partite& partita = row <= 0 ? newgame->new_row() : newgame->riga(row); - nuova_riga = partita.get_int(PART_NRIGA); + const int nuova_riga = partita.get_int(PART_NRIGA); // put data on partita partita.put(PART_TIPOMOV, tmov); @@ -1545,61 +1575,170 @@ error_type TContabilizzazione::write_scadenze(TDocumento& doc) partita.put(PART_PROTIVA, head.get_long(MOV_PROTIVA)); partita.put(PART_SEZ, sezione); - const real totdoc(head.get_real(MOV_TOTDOC)); + const real totdoc(head.get(MOV_TOTDOC)); + const real totdocval(head.get(MOV_TOTDOCVAL)); + const real td = doc.totale_doc(); + partita.put(PART_IMPTOTDOC, totdoc); cambio.put(partita); const bool in_valuta = cambio.in_valuta(); - if (in_valuta) - { - const real totdocval(head.get_real(MOV_TOTDOCVAL)); partita.put(PART_IMPTOTVAL,totdocval); - } - real imponibile, imponibile_val; - for (int i = pag.n_rate()-1; i >= 0; i--) - { - if (in_valuta) - imponibile_val += pag.tval_rata(i); - imponibile += pag.tlit_rata(i); - } + if (partita.is_fattura()) + { + TPagamento& pag = doc.pagamento(); + const real totspese = doc.spese(); + const real totimposte = doc.imposta(); + const real totimponibili = td - totimposte - totspese; + real anticipo = doc.get_real(DOC_IMPPAGATO); + + if (anticipo < td) + { + TGeneric_distrib d(anticipo, in_valuta ? 3 : 0); - partita.put(PART_IMPORTO, imponibile); - partita.put(PART_IMPORTOVAL, imponibile_val); - partita.put(PART_IMPOSTA, pag.imposta()); - partita.put(PART_SPESE, pag.spese()); - - const TString abipr(doc.get(DOC_CODABIP)), - cabpr(doc.get(DOC_CODCABP)), - abi(doc.get(DOC_CODABIA)), - cab(doc.get(DOC_CODCABA)); + d.add(totimponibili); + d.add(totimposte); + d.add(totspese); + + const real pagtotimponibili = totimponibili - d.get(); + const real pagtotimposte = totimposte - d.get(); + const real pagtotspese = totspese - d.get(); + + if (in_valuta) + { + const real change = cambio.cambio(); + //real val1 = totimponibili * change; + real val2 = pagtotimposte * change; val2.round(); + real val3 = pagtotspese * change; val3.round(); + real val1 = head.get_real(MOV_TOTDOC) - val2 - val3; // Cosi' corregge eventuali scompensi di poche lirette + pag.set_total_valuta( pagtotimponibili, pagtotimposte, pagtotspese, change, val1, val2, val3, doc.valuta()); + } + else + pag.set_total( pagtotimponibili, pagtotimposte, pagtotspese ); + pag.set_rate_auto( ); + } + else + pag.zap_rate(); + + if (anticipo > ZERO) + { + pag.add_rata(); + + TDate first_date(doc.data()); + + // Non devono esistere 2 rate con data uguale + if (pag.data_rata(0) == first_date) + --first_date; + + // Shift delle rate verso il basso + for (int k=pag.n_rate()-1; k>0; k--) + pag.rata(k) = pag.rata(k-1); + + // Sostituisce la prima rata con quella dell'anticipo + + // Se l'anticipo è più grande del totale, si crea una riga di scadenza + // con l'importo del totale doc. + if (anticipo >= td) + anticipo = td; + + const real anticipo_lit = ((real) (in_valuta ? anticipo * cambio.cambio() : anticipo)).round(); + const real anticipo_val = in_valuta ? anticipo : ZERO; + + // Crea una rimessa diretta con la data del documento per il valore dell'anticipo + pag.set_rata(0, anticipo_val, anticipo_lit, first_date, 1, "", FALSE); + } + + + real imponibile, imponibile_val; + for (int i = pag.n_rate()-1; i >= 0; i--) + { + if (in_valuta) + imponibile_val += pag.tval_rata(i); + imponibile += pag.tlit_rata(i); + } + partita.put(PART_IMPORTO, imponibile); + partita.put(PART_IMPORTOVAL, imponibile_val); + partita.put(PART_IMPOSTA, totimposte); + partita.put(PART_SPESE, totspese); + + partita.elimina_rata(-1); // Elimina tutte le rate eventuali + const TString abipr(doc.get(DOC_CODABIP)), cabpr(doc.get(DOC_CODCABP)), + abi(doc.get(DOC_CODABIA)), cab(doc.get(DOC_CODCABA)); - partita.elimina_rata(-1); // Elimina tutte le rate eventuali - const int nr = pag.n_rate(); + const int nr = pag.n_rate(); + const TString16 codpag(head.get(MOV_CODPAG)); + for (i = 0; i < nr; i++) + { + TRiga_scadenze& scadenza = partita.new_row(); + + scadenza.put(SCAD_CODPAG, codpag); // Codice pagamento + scadenza.put(SCAD_CODAG, agente); // Codice agente + + scadenza.put(SCAD_DATASCAD, pag.data_rata(i)); // Data scadenza + scadenza.put(SCAD_IMPORTO, pag.tlit_rata(i)); // Importo + if (in_valuta) + scadenza.put(SCAD_IMPORTOVAL, pag.tval_rata(i)); // Importo in valuta + scadenza.put(SCAD_TIPOPAG, pag.tipo_rata(i)); // Tipo pagamento + scadenza.put(SCAD_ULTCLASS, pag.ulc_rata(i)); // Ulteriore classificazione + scadenza.put(SCAD_CODABIPR, abipr); // Ns ABI + scadenza.put(SCAD_CODCABPR, cabpr); // Ns CAB + scadenza.put(SCAD_CODABI, abi); // Vs ABI + scadenza.put(SCAD_CODCAB, cab); // Vs CAB + // scadenza.put(SCAD_DESCR, ????); // Note + } + } // if fattura + else if (doc.is_nota_credito()) + { + TImporto residuoval(sezione, doc.totale_doc()); + partita.put(PART_DATAPAG, doc.get(DOC_DATADOC)); - const TString16 codpag(head.get(MOV_CODPAG)); - for (i = 0; i < nr; i++) - { - TRiga_scadenze& scadenza = partita.new_row(); - - scadenza.put(SCAD_CODPAG, codpag); // Codice pagamento - scadenza.put(SCAD_CODAG, agente); // Codice agente - - scadenza.put(SCAD_DATASCAD, pag.data_rata(i)); // Data scadenza - scadenza.put(SCAD_IMPORTO, pag.tlit_rata(i)); // Importo - if (in_valuta) - scadenza.put(SCAD_IMPORTOVAL, pag.tval_rata(i)); // Importo in valuta - scadenza.put(SCAD_TIPOPAG, pag.tipo_rata(i)); // Tipo pagamento - scadenza.put(SCAD_ULTCLASS, pag.ulc_rata(i)); // Ulteriore classificazione - scadenza.put(SCAD_CODABIPR, abipr); // Ns ABI - scadenza.put(SCAD_CODCABPR, cabpr); // Ns CAB - scadenza.put(SCAD_CODABI, abi); // Vs ABI - scadenza.put(SCAD_CODCAB, cab); // Vs CAB -// scadenza.put(SCAD_DESCR, ????); // Note + for (int p = newgame->prima_fattura(); p > 0 && p < nuova_riga; p++) + { + const TRiga_partite& fatt = newgame->riga(p); + for (int r = 1; r <= fatt.rate(); r++) + { + const TRiga_scadenze& rata = fatt.rata(r); + if (!rata.chiusa()) + { + const TImporto residuo = rata.residuo(TRUE); + TImporto pagval = residuoval; + const bool saldo = pagval.valore() >= residuo.valore(); + if (saldo) + pagval.valore() = residuo.valore(); + residuoval -= pagval; + + TRectype pag = newgame->pagamento(p, r, nuova_riga); + if (in_valuta) + { + pag.put(PAGSCA_IMPORTOVAL, pagval.valore()); + cambio.val2lit(pagval); + pag.put(PAGSCA_IMPORTO, pagval.valore()); + } + else + pag.put(PAGSCA_IMPORTO, pagval.valore()); + newgame->modifica_pagamento(pag, cambio, TRUE); + } + } + } + if (!residuoval.is_zero()) + { + // Pagamento non assegnato + TRectype unpag = newgame->pagamento(TPartita::UNASSIGNED, 0, nuova_riga); + if (in_valuta) + { + unpag.put(PAGSCA_IMPORTOVAL, residuoval.valore()); + cambio.val2lit(residuoval); + unpag.put(PAGSCA_IMPORTO, residuoval.valore()); + } + else + unpag.put(PAGSCA_IMPORTO, residuoval.valore()); + newgame->modifica_pagamento(unpag, cambio, TRUE); + } } } - + if (newgame != NULL) // Se non ho cancellato il numero partita ... { if (!newgame->write()) // Salva nuova partita @@ -2211,7 +2350,7 @@ void TContabilizzazione::display_error(TDocumento& doc) "Verificare l'esistenza del codice causale inserito.",(const char*)numerazione,numero); break; case counter_p_ant_error: - msg.format("Rilevato un errore cercando il conto di contropartita per il movimetno di anticipo relativamente al documento %s/%ld." + msg.format("Rilevato un errore cercando il conto di contropartita per il movimento di anticipo relativamente al documento %s/%ld." "Verificare l'esistenza la correttezza della causale specificata.",(const char*)numerazione,numero); break; case caus_error: @@ -2310,9 +2449,9 @@ bool TContabilizzazione::in_enabled() const bool TContabilizzazione::elabora(TLista_documenti& doc_in, TLista_documenti& doc_out, const TDate& data_elab, bool interattivo) { + TString msg; _error = no_error; - _can_write = TRUE; _total_docs = 0L; _caus = NULL; _data_reg = data_elab; @@ -2323,12 +2462,14 @@ bool TContabilizzazione::elabora(TLista_documenti& doc_in, TLista_documenti& doc return FALSE; const int items = doc_in.items(); // Numero dei documenti in questa elaborazione - TProgind p(items,"Contabilizzazione documenti",FALSE,TRUE,1); for (int i = 0; i < items ; i++) // Scorriamo tutti i documenti nella lista { - p.setstatus(i+1); TDocumento& doc = doc_in[i]; + msg.format("Contabilizzazione documento %s/%ld.", (const char*) doc.numerazione(), doc.numero()); + xvt_statbar_set(msg); + do_events(); + _movimento = new TMovimentoPN_VE(doc.in_valuta()); compile_head_mov(doc); @@ -2339,7 +2480,8 @@ bool TContabilizzazione::elabora(TLista_documenti& doc_in, TLista_documenti& doc if (write_all(doc) == no_error) // Se la scrittura e' andata ok... { if (doc.get_real(DOC_IMPPAGATO) != ZERO) - write_anticipo(doc); + if (write_anticipo(doc) != no_error) + _movimento->remove(); // Se si è verificato un errore nella scrittura dell'anticipo rimuove il movimento di prima nota if (good() && in_enabled()) write_intra(doc); diff --git a/ve/velib04c.cpp b/ve/velib04c.cpp index 4f09ba2e3..0382c9152 100755 --- a/ve/velib04c.cpp +++ b/ve/velib04c.cpp @@ -35,6 +35,10 @@ TGenerazione_effetti::TGenerazione_effetti(const char* cod) _efffile = new TLocalisamfile(LF_EFFETTI); _refffile = new TLocalisamfile(LF_REFFETTI); _cpg = new TTable("%CPG"); + + _can_write = TRUE; + _error = no_error; + _total_bills = 0L; } TGenerazione_effetti::TGenerazione_effetti(const TRectype& rec) @@ -56,6 +60,10 @@ TGenerazione_effetti::TGenerazione_effetti(const TRectype& rec) _efffile = new TLocalisamfile(LF_EFFETTI); _refffile = new TLocalisamfile(LF_REFFETTI); _cpg = new TTable("%CPG"); + + _can_write = TRUE; + _error = no_error; + _total_bills = 0L; } TGenerazione_effetti::~TGenerazione_effetti() @@ -127,17 +135,17 @@ error_type TGenerazione_effetti::change_doc_status(TDocumento& doc) return _error; } -error_type TGenerazione_effetti::change_group_status(TDocumento& doc) +error_type TGenerazione_effetti::change_group_status(TDocumento& doc, TAssoc_array& group_array) // Cambia lo stato dei documenti raggruppati { - const int items = _group_array.items(); + const int items = group_array.items(); if (items > 0) { _error = no_error; TToken_string * group_element; int i=0; // Ciclo sugli elementi dell'assoc_array - for (group_element = (TToken_string *) _group_array.first_item(); group_element != NULL && i < items; i++,group_element = (TToken_string*)_group_array.succ_item()) + for (group_element = (TToken_string *) group_array.first_item(); group_element != NULL && i < items; i++,group_element = (TToken_string*)group_array.succ_item()) { group_element->restart(); const int doc_items = group_element->items(); @@ -228,12 +236,15 @@ error_type TGenerazione_effetti::write_groups() // per l'effetto 5 vale la fattura 3. // Questo e' quanto ho appreso (Hope I'm right...) ;-) -void TGenerazione_effetti::group_bills(TDocumento& doc) +long TGenerazione_effetti::group_bills(TAssoc_array& group_array) { // Bail out if there aren't items... + const int items = group_array.items(); + if (!good() || items == 0) + return 0L; + + TDocumento doc; _error = no_error; - const int items = _group_array.items(); - if (items == 0) return; int i=0,j,n,offset=0; TString msg1,msg2; @@ -248,7 +259,7 @@ void TGenerazione_effetti::group_bills(TDocumento& doc) #endif TToken_string * group_element; // Ciclo sugli elementi dell'assoc_array - for (group_element = (TToken_string *) _group_array.first_item(); group_element != NULL && i < items; i++,group_element = (TToken_string*)_group_array.succ_item()) + for (group_element = (TToken_string *) group_array.first_item(); group_element != NULL && i < items; i++,group_element = (TToken_string*)group_array.succ_item()) { #ifdef DBG if (p.iscancelled()) break; @@ -280,7 +291,8 @@ void TGenerazione_effetti::group_bills(TDocumento& doc) if (_cpg->read()!= NOERR) { _error = codpag_error; - return; + display_error(doc); + return 0L; } const real totale_fatt = doc.totale_doc(); @@ -304,7 +316,8 @@ void TGenerazione_effetti::group_bills(TDocumento& doc) if (numrate < 1) { _error = scadenze_error; - return; + display_error(doc); + return 0L; } // Scorre le scadenze @@ -376,14 +389,21 @@ void TGenerazione_effetti::group_bills(TDocumento& doc) } // Ciclo sui gruppi // Cambia lo stato a tutti i documenti raggruppati - if (good() && _can_write) + long tot = 0L; + if (_can_write) + { + xvt_statbar_set("Scrittura effetti raggruppati in corso..."); + do_events(); if (write_groups() == no_error) { - _total_bills += _effetti_array.items(); - change_group_status(doc); + tot = _effetti_array.items(); + change_group_status(doc, group_array); } + } _effetti_array.destroy(); - _group_array.destroy(); + group_array.destroy(); + + return tot; } bool TGenerazione_effetti::valid_type(int pag) const @@ -396,51 +416,40 @@ void TGenerazione_effetti::calc_pagamento(TDocumento& doc) TPagamento& pag = doc.pagamento(); const real change = doc.cambio(); - real totspese = doc.spese(); - real totimposte = doc.imposta(); - real pagato = doc.get(DOC_IMPPAGATO); - real totimponibili = doc.totale_doc() - totimposte - totspese; - + const real totspese = doc.spese(); + const real totimposte = doc.imposta(); + const real totimponibili = doc.totale_doc() - totimposte - totspese; + const real anticipo = doc.get(DOC_IMPPAGATO); const bool valuta = doc.in_valuta(); + + //Riaggiusta le rate a seconda del valore gia' pagato + TGeneric_distrib d(anticipo, valuta ? 3 : 0); + + d.add(totimponibili); + d.add(totimposte); + d.add(totspese); + + const real pagtotimponibili = totimponibili - d.get(); + const real pagtotimposte = totimposte - d.get(); + const real pagtotspese = totspese - d.get(); + if (valuta) { - const TString16 codval = doc.valuta(); - real val1 = totimponibili * change; - real val2 = totimposte * change; - real val3 = totspese * change; - pag.set_total_valuta( totimponibili, totimposte, totspese, change, val1, val2 ,val3, doc.valuta()); + real val2 = pagtotimposte * change; val2.round(); + real val3 = pagtotspese * change; val3.round(); + real td = doc.totale_doc() * change; td.round(); + real val1 = td - val2 - val3; // Corregge eventuali scompensi di 1 2 lire + pag.set_total_valuta( pagtotimponibili, pagtotimposte, pagtotspese, change, val1, val2 ,val3, doc.valuta()); } else - pag.set_total( totimponibili, totimposte, totspese ); + pag.set_total( pagtotimponibili, pagtotimposte, pagtotspese ); pag.set_rate_auto(); - //Riaggiusta le rate a seconda del valore gia' pagato - real rata,v; - const int numrate = pag.n_rate( ); - for (int i = 0; i< numrate; i++) - { - rata = pag.importo_rata(i,valuta); - if (rata > pagato) - { - v = rata - pagato; - pagato = ZERO; - } - else - { - v = ZERO; - pagato -= rata; - } - pag.set_imprata(i, v, valuta); - if (valuta) - { - v *= change; - v.round(); - pag.set_imprata(i, v, FALSE); - } - } + const int numrate = pag.n_rate(); + // Scorre all'indietro per rimuovere le rate a 0, evitando fastidiose // complicazioni dovute al pack delle rate effettuato dalla remove_rate() - for (i=numrate-1; i>=0; i--) + for (int i=numrate-1; i>=0; i--) { if (pag.importo_rata(i,valuta) == ZERO) pag.remove_rata(i); @@ -575,31 +584,24 @@ void TGenerazione_effetti::generate_bill(TDocumento& doc) // bill in inglese sig bool TGenerazione_effetti::elabora(TLista_documenti& doc_in, TLista_documenti& doc_out, const TDate& data_elab, bool interattivo) { + TString msg; _error = no_error; - _can_write = TRUE; _total_bills = 0L; _cpg->setkey(1); // Setta per sicurezza la chiave 1 nel caso l'elaborazione sia invocata da VE0 const int items = doc_in.items(); // Numero dei documenti in questa elaborazione - TProgind p(items,"Generazione effetti",FALSE,TRUE,1); for (int i = 0; i < items ; i++) // Scorriamo tutti i documenti nella lista { - generate_bill(doc_in[i]); // Genera gli effetti corrispondenti - p.setstatus(i+1); - if (!good()) - display_error(doc_in[i]); - } + TDocumento& doc = doc_in[i]; + msg.format("Generazione effetti documento %s/%ld.", (const char*) doc.numerazione(), doc.numero()); + xvt_statbar_set(msg); + do_events(); - // Effettua il raggruppamento di eventuali documenti rimasti - TDocumento doc; - - if (good()) - group_bills(doc); - - // Mostra eventuali errori residui - if (!good()) - display_error(doc); + generate_bill(doc); // Genera gli effetti corrispondenti + if (!good()) + display_error(doc); + } return _can_write; } diff --git a/ve/velib05.cpp b/ve/velib05.cpp index d901dc277..0ce80a843 100755 --- a/ve/velib05.cpp +++ b/ve/velib05.cpp @@ -193,7 +193,7 @@ void TDocumentoEsteso::scadenze_recalc() } else pag.set_total( totimponibili, totimposte, totspese ); - pag.set_rate_auto( ); + pag.set_rate_auto(); const int numrate = pag.n_rate( ); real v,rata; for (int i = 0; i< numrate; i++) diff --git a/ve/velib06.cpp b/ve/velib06.cpp index 6d0018896..9f68c7a1e 100755 --- a/ve/velib06.cpp +++ b/ve/velib06.cpp @@ -241,8 +241,10 @@ void TDocumento_mask::configura_sheet(TSheet_field& sheet) colonne << ',' << size; } - to_delete.reset(0); + if (tdoc.calcolo_lordo()) + to_delete.reset(0); to_delete.reset(1); + if (!to_delete[sheet.cid2index(FR_CODDEP)]) sheet.enable_column(FR_CODDEP, _ges_dep && _ges_mag); @@ -324,6 +326,7 @@ bool TDocumento_mask::on_key(KEY key) // stato.enable(!stato.enabled()); stato.enable(); enable(DLG_SAVEREC); + enable(DLG_DELREC); return TRUE; } return TVariable_mask::on_key(key); @@ -841,14 +844,17 @@ bool TDocumento_mask::ss_notify( TSheet_field& ss, int r, KEY key ) else { s = m.get(F_CAUSMAG); - const TRectype & c=cache().get("%CAU", s); - if (!c.empty() && !c.get("S10").blank()) - s = c.get("S10"); - else + if (!s.blank()) { - s = m._std_mag; - s.left_just(3); - s << m._std_dep; + const TRectype & c=cache().get("%CAU", s); + if (!c.empty() && !c.get("S10").blank()) + s = c.get("S10"); + else + { + s = m._std_mag; + s.left_just(3); + s << m._std_dep; + } } } riga.put("CODMAG", s); diff --git a/ve/velib06a.cpp b/ve/velib06a.cpp index 892fe2383..c0e3eff36 100755 --- a/ve/velib06a.cpp +++ b/ve/velib06a.cpp @@ -33,6 +33,7 @@ #include "../mg/codcorr.h" #include "../mg/deslin.h" #include "../mg/umart.h" +#define MAX_VIS_RATE 5 bool ora_hndl( TMask_field& field, KEY key ) @@ -92,17 +93,17 @@ bool condpag_hndl( TMask_field& field, KEY key ) pag.set_total(100, 10, 10); pag.set_rate_auto(); - const int max_rate = 5; int numrate = pag.n_rate( ); - if (numrate > max_rate) - numrate = max_rate; - for(int i = 0; i < numrate; i++) + for(int i = 0; i < MAX_VIS_RATE; i++) { - m.show(F_DATASCAD1+i); - m.set(F_DATASCAD1+i, pag.data_rata(i).string()); + if (i < numrate) + { + m.show(F_DATASCAD1+i); + m.set(F_DATASCAD1+i, pag.data_rata(i)); + } + else + m.hide(F_DATASCAD1+i); } - for( ; i < max_rate; i++) - m.hide(F_DATASCAD1+i); } } return TRUE; @@ -125,7 +126,7 @@ bool note_hndl( TMask_field& f, KEY key ) if (note.read() != NOERR) note.zero(); } - if (m.doc().modificabile() || m.field(DLG_SAVEREC).enabled()) + if (m.doc().modificabile() && m.field(DLG_SAVEREC).enabled()) { const bool reg_disabled = note.get_bool("B0"); @@ -269,7 +270,7 @@ bool codmag_handler( TMask_field& f, KEY key ) TSheet_field& sf = *row_mask.get_sheet(); TDocumento_mask& docmask = (TDocumento_mask&)sf.mask(); - if (sf->column_enabled(sf.cid2index(FR_CODDEP))) + if (sf.column_enabled(sf.cid2index(FR_CODDEP))) { const int pos = row_mask.id2pos(FR_CODDEP); const TString & val = f.get(); @@ -337,11 +338,11 @@ void upd_colli_peso_tara(TMask & m, TRectype & a) real ppcollo = a.get_real(ANAMAG_PPCOLLO); if (ppcollo != ZERO) { - real ncolli = qta / ppcollo; - - ncolli.ceil(0); - m.fld(pos).set(ncolli.string()); - } + real ncolli = qta / ppcollo; + + ncolli.ceil(0); + m.fld(pos).set(ncolli.string()); + } } pos = m.id2pos(FR_TARA); if (pos >= 0) @@ -479,12 +480,12 @@ bool codart_handler(TMask_field& f, KEY key ) iva_handler(row_mask.fld(pos), 0); } else - if (key == K_F8 && !sh.sheet_mask().is_running()) + if (key == K_F8 && !sh.sheet_mask().is_running()) { static bool explode_db = 3; static bool valcomp = FALSE; static bool matbase = TRUE; - static int raggart = RAGGR_EXP_NONE; + static TExplosion_grouping raggart = RAGGR_EXP_NONE; static bool elrorig = FALSE; static int livello = 1; static int ordin = 0; @@ -496,7 +497,7 @@ bool codart_handler(TMask_field& f, KEY key ) explode_db = d.get_bool("EXPLODEDB", "ve"); valcomp = d.get_bool("VALCOMP", "ve"); matbase = d.get_bool("TIPOESPL", "ve"); - raggart = d.get_int("RAGGART", "ve"); + raggart = (TExplosion_grouping) d.get_int("RAGGART", "ve"); livello = d.get_int("LIVESPL", "ve"); elrorig = d.get_bool("ELRORIG", "ve"); ordin = d.get_int("ORDDB", "ve"); @@ -507,7 +508,7 @@ bool codart_handler(TMask_field& f, KEY key ) const TCodice_um um = row_mask.get(FR_UMQTA); real qta_fin = row_mask.get_real(FR_QTA); TQuantita qta(a, um, qta_fin); - qta.convert_to_base(); + qta.convert2umbase(); qta_fin = qta.val(); TDistinta_tree db; @@ -614,18 +615,18 @@ bool liv_handler( TMask_field& f, KEY key ) if (f.to_check(key, TRUE)) { - if (f.dlg() < FR_LIV4)) - { - TMask& row_mask = f.mask(); - TMask_field & next = row_mask.field(f.dlg() + 1); - if (f.get().not_empty()) - next.enable(); - else - { - next.reset(); - next.disable(); - } - next.on_hit(); + if (f.dlg() < FR_LIV4) + { + TMask& row_mask = f.mask(); + TMask_field & next = row_mask.field(f.dlg() + 1); + if (f.get().not_empty()) + next.enable(); + else + { + next.reset(); + next.disable(); + } + next.on_hit(); } TDocumento_mask& mask=(TDocumento_mask&)f.mask().get_sheet()->mask(); mask.update_giacenza(); @@ -762,7 +763,7 @@ bool descr_handler( TMask_field& f, KEY key ) if (s.find('\n') < 0) { // TLocalisamfile & anamag = ((TEdit_field &) row_mask.field(FR_CODART)).browse()->cursor()->file(); - TLocalisamfile anamag(LF_ANAMAG); + TLocalisamfile anamag(LF_ANAMAG); anamag.zero(); anamag.setkey(2); @@ -798,12 +799,12 @@ bool qtaart_handler( TMask_field& f, KEY key ) if (codart.not_empty()) { - TLocalisamfile anamag(LF_ANAMAG); - - anamag.put(ANAMAG_CODART, codart); - if (anamag.read() == NOERR) - upd_colli_peso_tara(row_mask, anamag.curr()); - } + TLocalisamfile anamag(LF_ANAMAG); + + anamag.put(ANAMAG_CODART, codart); + if (anamag.read() == NOERR) + upd_colli_peso_tara(row_mask, anamag.curr()); + } return qta_handler(f, key); } @@ -856,18 +857,32 @@ bool causmag_handler( TMask_field& f, KEY key ) TMask& row_mask = f.mask( ); TDocumento_mask & mask = (TDocumento_mask &) row_mask.get_sheet()->mask(); TString16 causmag(f.get()); - if (causmag.empty()) causmag = mask.get(F_CAUSMAG); - TTable c("%CAU"); - c.put("CODTAB", causmag); - - if (c.read() == NOERR) + TCausale_magazzino c(cache().get("%CAU", causmag)); + if (c.empty()) { - TString16 codmag(c.get("S10")); - row_mask.set(FR_CODMAG, codmag.left(3), TRUE); - row_mask.set(FR_CODDEP, codmag.mid(3), TRUE); + cache().discard("%CAU", causmag); + } else { + if (c.has_default_mag() && row_mask.get(FR_CODMAG).empty()) + { + row_mask.set(FR_CODMAG, c.default_mag(), TRUE); + row_mask.set(FR_CODDEPC, "", TRUE); + } + if (c.has_default_dep() && row_mask.get(FR_CODDEP).empty()) + row_mask.set(FR_CODDEP, c.default_dep(), TRUE); + if (!c.caus_collegata().empty()) + { + c = cache().get("%CAU", c.caus_collegata()); + if (c.has_default_mag() && row_mask.get(FR_CODMAGC).empty()) + { + row_mask.set(FR_CODMAGC, c.default_mag(), TRUE); + row_mask.set(FR_CODDEPC, "", TRUE); + } + if (c.has_default_dep() && row_mask.get(FR_CODDEPC).empty()) + row_mask.set(FR_CODDEPC, c.default_dep(), TRUE); + } } } return TRUE; diff --git a/ve/verig.h b/ve/verig.h index 2381286f7..9ca9785e3 100755 --- a/ve/verig.h +++ b/ve/verig.h @@ -2,7 +2,7 @@ #define __VERIG_H -#define FR_STATORIGA 101 +#define FR_LORDO 101 #define FR_TIPORIGA 102 #define FR_CODMAG 103 #define FR_CODDEP 104 @@ -72,7 +72,7 @@ #define FR_IMPIANTO 138 #define FR_LINEA 139 #define FR_END 140 -#define MAX_COLUMNS FR_END-FR_STATORIGA +#define MAX_COLUMNS FR_END-FR_LORDO #define FR_DESMAG 250 #define FR_DESDEP 251 diff --git a/ve/verig.uml b/ve/verig.uml index 11835106f..5cdf19fa4 100755 --- a/ve/verig.uml +++ b/ve/verig.uml @@ -32,11 +32,9 @@ ENDPAGE PAGE MASK_TITLE1 -1 -1 MASK_WIDTH MASK_HEIGHT -STRING FR_STATORIGA 2 +BOOLEAN FR_LORDO BEGIN - PROMPT 2 1 "Stato riga " - FLAGS "DG" - FIELD STATORIGA + PROMPT 2 1 "Lordo " END STRING FR_TIPORIGA 2 diff --git a/ve/verig01.uml b/ve/verig01.uml index 58aa12afc..80920fcc7 100755 --- a/ve/verig01.uml +++ b/ve/verig01.uml @@ -41,6 +41,10 @@ DEFINE_FIELD(CODMAGC) DEFINE_FIELD(DESMAGC) DEFINE_FIELD(CODDEPC) DEFINE_FIELD(DESDEPC) +DEFINE_FIELD(IMPIANTO) +DEFINE_FIELD(DESIMP) +DEFINE_FIELD(LINEA) +DEFINE_FIELD(DESLNP) #include "verig.uml"