#include "dbcv.h" #include "dbcv09.h" #include "dbcv02a.h" #include #include #include #include #include "..\mg\anamag.h" #include "..\mg\mag.h" #include "..\include\doc.h" #include "..\include\rdoc.h" #include "..\db\dblib.h" typedef void (*SET_DOC_FUN)(TImport_file & import,TConfig &trans); typedef bool (*FILTER_FUN)(TImport_file & import); bool unevadi_orc(TMask &m, const TString & codimp) { TString8 codnum=codimp; codnum<< "OC"; TRelation *r= new TRelation(LF_DOC); r->add(LF_RIGHEDOC,"CODNUM==CODNUM|ANNO==ANNO|PROVV==PROVV|NDOC==NDOC"); TCursor c(r); TRectype frec(LF_DOC); frec.put("CODNUM",codnum); frec.put("PROVV","D"); frec.put("ANNO" ,"1999"); c.setregion(frec,frec); c.freeze(); const long items=c.items(); TProgind info(items,"Reset evasione commesse cliente...",FALSE,TRUE); for (long i= 0; i< items ; i++) { c=i; info.addstatus(1); TRelation *r =c.relation(); TLocalisamfile & righe = c.relation()->lfile(LF_RIGHEDOC); bool ok = r->is_first_match(LF_RIGHEDOC); while (ok) { if (righe.get_bool("RIGAEVASA") ||righe.get_real("QTAEVASA")!=ZERO ) { righe.put("RIGAEVASA"," "); righe.put("QTAEVASA","0.0"); righe .rewrite(); } ok = r->next_match(LF_RIGHEDOC); } } return TRUE; } bool evadi_orc(TCursor & c, TAssoc_array & evasioni) { const long items=c.items(); TProgind info(items,"Evasione commesse cliente...",FALSE,TRUE); for (long i= 0; i< items ; i++) { c=i; info.addstatus(1); TRelation *r =c.relation(); TLocalisamfile & righe = c.relation()->lfile(LF_RIGHEDOC); bool ok = r->is_first_match(LF_RIGHEDOC); while (ok) { const TString codprod = righe.get("CODARTMAG"); real *qta=NULL; if (evasioni.is_key(codprod)) qta=(real*)evasioni.objptr(codprod); if (!righe.get_bool("RIGAEVASA") && qta!=NULL) { real q(righe.get_real("QTA")); real qevasa(righe.get_real("QTAEVASA")); if (*qta>ZERO && q>qevasa) { if (q-qevasa>*qta) { qevasa+=*qta; *qta = 0; } else { *qta -= q; qevasa=q; righe.put("RIGAEVASA","X"); } righe.put("QTAEVASA",qevasa); righe .rewrite(); } } ok = r->next_match(LF_RIGHEDOC); } } return TRUE; } bool evadi_orc(TMask & m, const TString & codimp) { if (!yesno_box("I movimenti 00 e T-04 sul mag. 25 verranno usati per evadere le commesse. Procedo?")) return FALSE; TFilename source(m.get(S_MOVMAG_FILE)); if (source.blank()) source=BPCS_MOVMAG; TDate fromdate(m.get(S_MOVMAG_FROMD)); TDate todate(m.get(S_MOVMAG_TOD)); TImport_file movmag(m.get(F_PATH),source); bool ok = TRUE; if (noyes_box("Attenzione: l'operazione non e' ripetibile;assicurarsi che la situazione del pending delle commesse sia relativa alla bolla indicata. Procedo?")) { const int expmag= codimp == "SE" ? 25 : 27; TString8 codnum=codimp; codnum<< "OC"; TRelation *r= new TRelation(LF_DOC); r->add(LF_RIGHEDOC,"CODNUM==CODNUM|ANNO==ANNO|PROVV==PROVV|NDOC==NDOC"); TCursor c(r,"!DOCEVASO"); TRectype frec(LF_DOC); frec.put("CODNUM",codnum); frec.put("PROVV","D"); frec.put("ANNO" ,"1999"); c.setregion(frec,frec); c.freeze(); long lastbolla(m.get_int(S_LASTBOLLA)),nobolla; TProgind info(movmag.items(),"Estrazione ultime consegne...",FALSE,TRUE); TAssoc_array evasioni; movmag.first(); while(!movmag.eof()) { info.addstatus(1); const TDate dmov = movmag.get_date("TTDTE"); if (movmag.get_int("TWHS")==expmag && (!fromdate.ok() || dmov >= fromdate) && (!todate.ok() || dmov <= todate) ) { TString codprod(movmag.get("TPROD")); real qta(movmag.get_real("TQTY")); TString com(movmag.get("TCOM")); nobolla = -1; if (movmag.get("TTYPE")=="T") { if (movmag.get("TRES")=="04" && com.len()==15) nobolla=atol(com.mid(7)); else if (yesno_box("Includo il trasferimento del %s, %s per %s,\n '%s'", (const char *)dmov,(const char *)codprod,(const char *)qta.string(),(const char *)com)) nobolla=lastbolla+1; // non so come filtrarla !!! } else if (movmag.get("TTYPE")=="00") { if (yesno_box("Includo il carico da terzi del %s, %s per %s,\n '%s'", (const char *)dmov,(const char *)codprod,(const char *)qta.string(),(const char *)com)) nobolla=lastbolla+1; // non so come filtrarla !!! } if (nobolla>lastbolla) { // evadi if (evasioni.is_key(codprod)) qta+=(real&)evasioni.find(codprod); evasioni.add(codprod, qta, TRUE); } } movmag.next(); } ok = evadi_orc(c, evasioni); } return FALSE; return ok; } void crea_mag3() { TString codmag;TString desc; TTable mag("MAG"); mag.put("CODTAB","SE1"); mag.put("B0","X"); mag.put("S0","Magazzino di Segrate (ex mag. 26,91 e 93)"); force_write(mag); mag.put("CODTAB","TS1"); mag.put("B0","X"); mag.put("S0","Magazzino di Trieste (ex mag. 28 e 92)"); force_write(mag); mag.put("CODTAB","PR1"); mag.put("B0","X"); mag.put("S0","Magazzino di Parma"); force_write(mag); mag.put("CODTAB","PD1"); mag.put("B0","X"); mag.put("S0","Magazzino di Padova"); force_write(mag); const char *codimp[] = {"SE","TS","PR","PD"}; const char *descimp[] = {"Segrate","Trieste","Parma","Padova"}; for (int t=0 ; t<99;t++) for (int i=0 ; i<4;i++) { mag.zero(); long l=-1; if (t==0) { codmag.format("%s1PF", codimp[i]); desc = "Deposito prodotti finiti "; desc << descimp[i]; l=0; } else if (i<2) { l = method2location(t); desc=descr_method(t); desc << " (ex locazione " << l << ")"; codmag.format("%s1%02d", codimp[i], t); } if (l >= 0) { mag.put("CODTAB",codmag); mag.put("S0",desc); force_write(mag); } } } void crea_linee3() { TTable lnp("LNP"); TString8 code; TString8 codimp; for (int imp=0; imp<4; imp++) { switch (imp) { case 0: codimp ="SE"; break; case 1: codimp ="TS"; break; case 2: codimp ="PD"; break; case 3: codimp ="PR"; break; } for (int terz=1; terz<99; terz++) { code =format("X%02d",terz); code << codimp; lnp.put("CODTAB",code); if (lnp.read()==NOERR) { lnp.put("S0",format("%s (%s)",descr_method(terz), (const char *)codimp)) ; lnp.rewrite(); } } } } bool find_wrongcycle() { TIndwin iw(80, "Ricerca errori sui cicli di lavoro ...",FALSE,FALSE); bool some_done=FALSE; int err; long distno=1L; TString cod=""; TLocalisamfile umart(LF_UMART); TRelation r(new TLocalisamfile(LF_RDIST)); r.add(LF_DIST,"CODDIST==CODDIST"); r.add(LF_UMART,"CODART==CODDIST|UM=UM",2,LF_DIST); r.add(LF_UMART,"CODART==CODDIST",1,LF_DIST,LF_UMART); err = r.first(); while (err == NOERR) { if ((distno%TICK)==1) { iw.set_text(format("Ricerca errori riga n. %ld", distno)); do_events(); } distno++; if (r.lfile().get("TIPO")=="L" ) { long expr=atol(r.lfile().get("EXPR")), newexpr; bool ask=FALSE; if (r.update()==NOERR) { long divisore=r.lfile(LF_UMART).get_long("FC"); TString lav(r.lfile().get("CODCOMP")); if (expr < divisore && lav.left(5)!="ACQUA") { TString codice(r.lfile().get("CODDIST")); // caso sospetto TString4 main_um(r.lfile(-LF_UMART).get("UM")); int formato=lav.find(format("_X")); if (formato<0) formato=lav.find(format(".X")); if (formato<0) formato=lav.find(format(" X12")); newexpr=divisore; if (formato>0) { // lav in casse int pzxca=atoi(lav.sub(formato+2)); if (pzxca>0) { if (main_um=="PZ") newexpr/=atoi(lav.sub(formato+2)); ask=TRUE; } } else { if (main_um=="PZ") ask=TRUE; } if (ask) { if (yesno_box("Il codice %s espresso in '%s'(=%ld %s) \ncontiene la lavorazione %s in quantita' %ld; \nsostituisco con %ld?", (const char *)codice, (const char *)r.lfile(LF_DIST).get("UM"), divisore, (const char *)main_um, (const char *)lav, expr,newexpr)) { r.lfile().put("EXPR",newexpr); r.lfile().rewrite(); } } else { message_box("Il codice %s espresso in '%s'(=%ld %s) \ncontiene la lavorazione %s in quantita' %ld", (const char *)codice, (const char *)r.lfile(LF_DIST).get("UM"), divisore, (const char *)main_um, (const char *)lav, expr,newexpr); } } } } err = r.next(); } return TRUE; } class TMov_diff_inv : public TConfig { int _nriga; TDate _al; bool _use_giac_al; TArticolo_giacenza_data _art; public: void set_header(const char *imp_filter); int righe () {return _nriga;} bool max_righe () {return _nriga > 99 ;} void locate_bpcs_stock(const TString &codice , int mag , const TString &location, TImport_file &mag_bpcs, real &giac) ; int compare_stocks(TLocalisamfile &mag, const real & bpcs_stock, bool giac); TMov_diff_inv (int num, const char * al, bool giac_al); ~TMov_diff_inv() {} } ; TMov_diff_inv::TMov_diff_inv (int num, const char * al, bool giac_al) : TConfig (format("ND_%05d.ini",num)) , _nriga(0), _al(al), _use_giac_al(giac_al), _art() {} void TMov_diff_inv::locate_bpcs_stock(const TString &codice , int mag , const TString &location, TImport_file &mag_bpcs, real & giac) { long diff = 0; /* int direction = 0; do { diff = codice.compare(mag_bpcs.get("CODICE")); if (diff == 0) diff = mag - mag_bpcs.get_int("MAG"); if (diff == 0) diff = location.compare(mag_bpcs.get("LOC")); if (diff > 0 && direction != -1) { direction = +1; if (mag_bpcs.next()!=NOERR) direction = 0; } if (diff < 0 && direction != 1) { direction = -1; if (mag_bpcs.prev()!=NOERR) direction = 0; } } while (diff*direction>0 && direction != 0 ); */ mag_bpcs.zero(); mag_bpcs.put("MAG", format("%d",mag)); mag_bpcs.put("LOC", location); mag_bpcs.put("CODICE", codice); diff = mag_bpcs.read(_isequal); if (diff != 0) giac = ZERO; else giac = mag_bpcs.get_real("QTY"); } int TMov_diff_inv::compare_stocks(TLocalisamfile &mag, const real & val_bpcs, bool giac) { if (!giac) return _nriga; /* TRectype newmag = mag.curr(); if (mag.read() != NOERR) mag.curr() = newmag; real val(mag.get_real("GIAC")); if (!giac) val = (mag.get_real("VEN")); real diff = (val_bpcs - val); diff.round(3); */ real val; if (_use_giac_al) { _art.read(mag.get("CODART")); TString16 codmag(mag.get("CODMAG")); TString16 annoes(mag.get("ANNOES")); _art.al(_al, codmag); const int i = _art.find_mag(annoes, codmag); TRectype & mag1 = _art.mag(annoes)[i]; val = mag1.get_real("GIAC"); if (!giac) val = (mag1.get_real("VEN")); } else { TRectype newmag = mag.curr(); if (mag.read() != NOERR) mag.curr() = newmag; val = mag.get_real("GIAC"); if (!giac) val = (mag.get_real("VEN")); } real diff = (val_bpcs - val); diff.round(3); const real piotta = "900000.0"; while (diff >= 0.001 || diff <= -0.001) { real newqtadoc = diff; if (diff>piotta) newqtadoc = piotta; if (diff<-piotta) newqtadoc = -piotta; set_paragraph(format("34,%d", ++_nriga)); set("TIPORIGA", "01"); set("CODART", mag.get("CODART")); set("CODARTMAG", mag.get("CODART")); set("DESCR", cache().get(LF_ANAMAG,mag.get("CODART")).get("DESCR")); set("CODMAG", mag.get("CODMAG")); TToken_string um_key(mag.get("CODART")); um_key.add("1"); set("UMQTA", cache().get(LF_UMART,um_key).get("UM")); set("QTA", newqtadoc.string()); set("CODCAUS", giac ? "CAR" : ""); diff = diff - newqtadoc; } return _nriga; } void TMov_diff_inv::set_header(const char * imp_filter) { // TDate today(TODAY); set_paragraph("Transaction"); set("Action","INSERT"); set("Mode","AUTO"); set_paragraph("33"); TString8 codimp = imp_filter ; codimp << "DI"; set("CODNUM",codimp); set("CAUSMAG",""); set("NOTE","\"Differenze inventariali rilevate per confronto con gli archivi di BPCS\""); //set("DATADOC",today.string()); set("DATADOC",_al.string()); } void sinchro_stock(const TMask & m, const char * imp_filter) { if (!yesno_box(format("Confermi l'allineamento giacenze per %s dal file %s?", imp_filter, BPCS_STOCK))) return ; const bool launch_ve0 = yesno_box("Devo registrare immediatamente i documenti?"); TDate day(TODAY); TString16 data(m.get(S_GIAC_AL)); if (data.not_empty()) day = data; const bool use_al = m.get_bool(S_USE_AL); TIndwin info(60,format("Allineamento giacenze per %s...",imp_filter),FALSE,FALSE); TImport_file mag_bpcs(m.get(F_PATH),BPCS_STOCK); TLocalisamfile mag(LF_MAG); TLocalisamfile anamag(LF_ANAMAG); TString codart,codmag, coddep, codimp; TString codlocation; int nummag, movimenti = 0; bool ok; delete_files("ND_*.ini"); TMov_diff_inv *action; action = new TMov_diff_inv(movimenti++,day, use_al); action->set_header(imp_filter); // Crea i mag di eurocampo eventualemnte mancanti mag.setkey(2); ok = mag_bpcs.first()==NOERR; while (ok) { codart = mag_bpcs.get("CODICE"); nummag = mag_bpcs.get_int("MAG"); num_mag2main_imp(nummag, codimp); if (codimp == imp_filter) { TString16 loc = mag_bpcs.get("LOC"); imploc2codmagdep(codimp, loc, codmag); //num_mag2cod_imp(nummag, codmag); mag.put("ANNOES", day.year()); mag.put("CODART", codart); mag.put("CODMAG", codmag); if (mag.read()!=NOERR) { anamag.put("CODART", codart); int err=NOERR; bool skip = FALSE; while (TRUE) { err = anamag.read(_isequal, _testandlock); if (err == NOERR) break; if (err == _islocked) { if (yesno_box("Articolo %s bloccato: termina allineamento ?", (const char * )codart)) return ; if (yesno_box("Tralascio l'articolo %s?", (const char * )codart)) skip = TRUE ; } if (err != _islocked) { if (yesno_box("Articolo %s sconosciuto: termina allineamento ?", (const char * )codart)) return ; skip = TRUE ; inserisci_articolo(codart,mag_bpcs.get("UM")); } } if (!skip) { int nriga = 0; mag.put("ANNOES", day.year()); mag.put("CODART", codart); mag.put("NRIGA", ++nriga); mag.setkey(1); while (mag.read()==NOERR) mag.put("NRIGA", ++nriga); mag.zero(' '); mag.put("ANNOES", day.year()); mag.put("CODART", codart); mag.put("NRIGA", nriga); mag.put("CODMAG", codmag); mag.write(); mag.setkey(2); anamag.read(_isequal, _unlock); } } } ok = mag_bpcs.next()==NOERR; } real bpcsstock; mag_bpcs.first(); mag.setkey(1); mag.zero(); mag.put("ANNOES", day.year()); ok = mag.read(_isgteq)==NOERR; // magazzino Eurocampo vs mag BPCS while (ok) { codart = mag.get("CODART"); codmag = mag.get("CODMAG"); codimp = codmag.left(2); nummag = cod_mag2num_mag(codmag); coddep = codmag.sub(3); codmag.cut(3); anamag.put("CODART", codart); int err = NOERR; bool skip = FALSE; while (TRUE) { err = anamag.read(_isequal, _testandlock); if (err == NOERR) break; if (err == _islocked) { if (yesno_box("Articolo %s bloccato: termina allineamento ?", (const char * )codart)) break ; if (yesno_box("Tralascio l'articolo %s?", (const char * )codart)) skip = TRUE ; } if (err != _islocked) { if (!noyes_box("Articolo %s sconosciuto: termina allineamento ?", (const char * )codart)) skip = TRUE ; inserisci_articolo(codart,mag_bpcs.get("UM")); break ; } } if (!skip) { if (err != NOERR) break; if ((((codimp == "SE1" || codimp == "TS1") && coddep == "07") || codimp == imp_filter ) && nummag>0) { coddep2location(codmag, coddep, codlocation, nummag); if (codmag == "SE1" && coddep == "07") nummag = 91; if (codmag == "TS1" && coddep == "07") nummag = 92; action->locate_bpcs_stock(codart, nummag, codlocation, mag_bpcs, bpcsstock); action->compare_stocks(mag, bpcsstock, TRUE); /*if (FALSE && nummag < 30) // elimina { action->locate_bpcs_stock( codart, nummag-1 ,0 , mag_bpcs, bpcsstock); action->compare_stocks(mag, bpcsstock, FALSE); }*/ } if (codmag == "SE3" || codmag == "TS3" /*|| coddep == "07"*/) { // elimina vecchimagazzini SE3/TS3 e la vecchia codifica del magazzino di padova/parma bpcsstock = ZERO; action->compare_stocks(mag, bpcsstock, TRUE); } if (action->max_righe()) { TString80 filename(action->name()); delete action; if (launch_ve0) { TExternal_app gestdoc(format("ve0.exe -1 -i%s",(const char *)filename)); gestdoc.run(); } action = new TMov_diff_inv(movimenti++, day, use_al); action->set_header(imp_filter); } } ok = mag.next()==NOERR; anamag.read(_isequal, _unlock); } if (action->righe()) { TString80 filename(action->name()); delete action; if (launch_ve0) { TExternal_app gestdoc(format("ve0.exe -1 -i%s",(const char *)filename)); gestdoc.run(); } } } void unlink_numdoc(const char *codnum, int anno) { TRelation *r = new TRelation(LF_DOC); r->add(LF_RIGHEDOC,"PROVV==PROVV|ANNO==ANNO|CODNUM==CODNUM|NDOC==NDOC"); TCursor c(r); TRectype from(LF_DOC),to(LF_DOC); from.put("PROVV","D"); from.put("ANNO",anno); from.put("CODNUM",codnum); to = from; c.setregion(from,to); const long items=c.items(); TProgind info(items,format("Scollegamento documenti %s anno %d...",codnum,anno),FALSE,TRUE); for (long i=items-1; i>=0 ; i--) { c = i; info.addstatus(1); TLocalisamfile &doc=r->lfile(); TLocalisamfile &rdoc=r->lfile(LF_RIGHEDOC); if (doc.get_long("MOVMAG")!=0L) { doc.put("MOVMAG",0); doc.rewrite(); } if (r->is_first_match(LF_RIGHEDOC)) do { if (rdoc.get_long("MOVMAG")!=0L) { rdoc.put("MOVMAG",0); rdoc.rewrite(); } } while (r->next_match(LF_RIGHEDOC)); } } void unlink_docs() { unlink_numdoc("SEBA",1998); unlink_numdoc("SEBA",1999); unlink_numdoc("SEBE",1998); unlink_numdoc("SEBE",1999); unlink_numdoc("SEBP",1998); unlink_numdoc("SEBP",1999); unlink_numdoc("SEBT",1998); unlink_numdoc("SEBT",1999); unlink_numdoc("SEBU",1998); unlink_numdoc("SEBU",1999); unlink_numdoc("SEBV",1998); unlink_numdoc("SEBV",1999); unlink_numdoc("SEDI",1998); unlink_numdoc("SEDI",1999); unlink_numdoc("SEFA",1998); unlink_numdoc("SEFA",1999); unlink_numdoc("SEMM",1998); unlink_numdoc("SEMM",1999); unlink_numdoc("SEMP",1998); unlink_numdoc("SEMP",1999); unlink_numdoc("SEOC",1998); unlink_numdoc("SEOC",1999); unlink_numdoc("SEOF",1998); unlink_numdoc("SEOF",1999); unlink_numdoc("SEOP",1998); unlink_numdoc("SEOP",1999); unlink_numdoc("SERF",1998); unlink_numdoc("SERF",1999); } void kill_blank_mag(const TMask & m, const char * codmag) { TLocalisamfile mag(LF_MAG),mag2(LF_MAG); mag2.setkey(2); TString codart; int anno; int err = mag.first(); while (err==NOERR) { anno = mag.get_int("ANNOES"); codart = mag.get("CODART"); mag2.put("ANNOES",anno); mag2.put("CODMAG",codmag); mag2.put("CODART",codart); if (mag2.read()==NOERR) { } else { } err= mag.next(); } } bool unify_magcode(const char * field, TLocalisamfile & file, bool only3=FALSE) { TString codmag = file.get(field); if (codmag.blank()) return FALSE; int coddep = atoi(codmag.sub(3)); if (coddep == 7) { TString codmagazz = codmag.left(3); if (codmagazz == "SE1") codmag = "PR1"; if (codmagazz == "TS1") codmag = "PD1"; codmag.overwrite("PF",3); // deposito produzione finiti } else if (!only3 && codmag[2]=='1' && codmag[3]=='\0') { codmag.overwrite("PF",3); // deposito produzione finiti } else if (codmag[2]=='3'&& codmag[3]!='\0') { codmag[2]='1'; } else if (codmag==" PF") { codmag=""; } else return FALSE; if (codmag==file.get(field)) return FALSE; file.put(field,codmag); int err; if ((err=file.rewrite())!=NOERR) err = file.write(); if (err!= NOERR) message_box("Impossibile scrivere il record %d del file %d",file.recno(), file.num()); do_events(); return TRUE; } void unify_mags_reset_bar(TProgind & pi, const char * msg2, long max) { const char * msg = "Unificazione magazzini interni e terzisti: "; pi.set_text(format("%s%s",msg,msg2)); pi.setstatus(0); pi.setmax(max ? max : 1); } void check_movmags(const TMask & m) { TString codmag; int err; TLocalisamfile mag(LF_MAG), rmovmag(LF_RMOVMAG), movmag(LF_MOVMAG); TProgind info(80,"",FALSE,TRUE); TLocalisamfile doc(LF_DOC),rdoc(LF_RIGHEDOC); TString8 caumag; TString16 codnum; long ndoc; int anno; bool remove; bool rewrite; unify_mags_reset_bar(info, "Correzione stringa di rif.doc. sui mov mag", movmag.items()); err=movmag.first(); while (err==NOERR) { TString descr=movmag.get("DESCR"); rewrite = FALSE; if (descr.left(5)==" n.ro") { codnum = movmag.get("CODNUM"); anno = movmag.get_int("ANNODOC"); ndoc = movmag.get_long("NUMDOC"); if (ndoc) { doc.put(DOC_PROVV,"D") ; doc.put(DOC_CODNUM,codnum); doc.put(DOC_ANNO,anno); doc.put(DOC_NDOC,ndoc); err = doc.read(); if (err == NOERR) { descr = codnum; descr << " n. " << ndoc << " del " << doc.get("DATADOC"); rewrite = TRUE; } } } if (rewrite) { movmag.put("DESCR",descr); while ((err=movmag.rewrite())!=NOERR) yesno_box("Errore %d nella scrittura del movimento %ld.\nRiprovo ?",err, rdoc.get_long("NUMREG") ); } info.addstatus(1); err = movmag.next(); } unify_mags_reset_bar(info, "Correzione date reg e comp errate", movmag.items()); err=movmag.first(); while (err==NOERR) { TDate datareg=movmag.get_date("DATAREG"); TDate datacomp=movmag.get_date("DATACOMP"); rewrite = FALSE; if (!datacomp.ok()) { datacomp=datareg; rewrite = datacomp.ok(); } if (!datacomp.ok()) { codnum = movmag.get("CODNUM"); anno = movmag.get_int("ANNODOC"); ndoc = movmag.get_long("NUMDOC"); if (ndoc) { doc.put(DOC_PROVV,"D") ; doc.put(DOC_CODNUM,codnum); doc.put(DOC_ANNO,anno); doc.put(DOC_NDOC,ndoc); err = doc.read(); if (err == NOERR) { datacomp = doc.get("DATADOC"); rewrite = TRUE; } } } if (!datacomp.ok()) warning_box("Data di competenza non valida sul movimento di magazzino %ld", movmag.get_long("NUMREG")); else if (rewrite) { movmag.put("DATACOMP",datacomp); movmag.put("DATAREG",datacomp); while ((err=movmag.rewrite())!=NOERR) yesno_box("Errore %d nella scrittura del movimento %ld.\nRiprovo ?",err, rdoc.get_long("NUMREG") ); } info.addstatus(1); err = movmag.next(); } unify_mags_reset_bar(info, "Distruzione righe mov.mag. non da documento", movmag.items()); err=movmag.first(); while (err==NOERR) { codnum = movmag.get("CODNUM"); anno = movmag.get_int("ANNODOC"); ndoc = movmag.get_long("NUMDOC"); doc.put(DOC_PROVV,"D") ; doc.put(DOC_CODNUM,codnum); doc.put(DOC_ANNO,anno); doc.put(DOC_NDOC,ndoc); remove = FALSE; err = doc.read(); if (err == _iskeynotfound || err ==_iseof) remove = TRUE; else remove = doc.get(DOC_CAUSMAG).blank(); if (!remove) { remove = movmag.get("NUMREG")!=doc.get("MOVMAG"); if (remove) { doc.put("MOVMAG",0); while ((err=doc.rewrite())!=NOERR) yesno_box("Errore %d nella scrittura del documento %s %d %ld.\nRiprovo ?",err, (const char *)rdoc.get(RDOC_CODNUM),rdoc.get_int(RDOC_ANNO),rdoc.get_long(RDOC_NDOC) ); } } caumag=doc.get(DOC_CAUSMAG); if (remove) movmag.remove(); info.addstatus(1); err = movmag.next(); } unify_mags_reset_bar(info, "Distruzione righe mov.mag. orfane", rmovmag.items()); err=rmovmag.first(); while (err==NOERR) { movmag.put("NUMREG",rmovmag.get("NUMREG")); err = movmag.read(); if (err == _iskeynotfound || err ==_iseof) rmovmag.remove(); info.addstatus(1); err = rmovmag.next(); } return; } void unify_mags(const TMask & m) { TTable impianti("IMP"), linee("LNP"),tabmag("MAG"),caumag("%CAU"); TString codmag; int err; TLocalisamfile mag(LF_MAG), rmovmag(LF_RMOVMAG), movmag(LF_MOVMAG); TProgind info(80,"",TRUE,TRUE); unify_mags_reset_bar(info, "tabella causali mag", caumag.items()); err = caumag.first(); while (err==NOERR) { unify_magcode("S10", caumag); err = caumag.next(); info.addstatus(1); if (info.iscancelled()) return; } message_box("Modificare a mano la tabella magazzini"); unify_mags_reset_bar(info, "tabella impianti", impianti.items()); impianti.setkey(2); err = impianti.first(); while (err==NOERR) { unify_magcode("S7", impianti); unify_magcode("S8", impianti); err = impianti.next(); info.addstatus(1); if (info.iscancelled()) return; } unify_mags_reset_bar(info, "tabella linee di produzione", linee.items()); linee.setkey(2); err = linee.first(); while (err==NOERR) { unify_magcode("S7", linee); unify_magcode("S8", linee); err = linee.next(); info.addstatus(1); if (info.iscancelled()) return; } unify_mags_reset_bar(info, "giacenze", mag.items()); err = mag.first(); while (err==NOERR) { unify_magcode("CODMAG", mag); err = mag.next(); info.addstatus(1); if (info.iscancelled()) return; } unify_mags_reset_bar(info, "movimenti di magazzino", rmovmag.items()); err = rmovmag.first(); movmag.zero(); while (err==NOERR) { unify_magcode("CODMAG", rmovmag); err = rmovmag.next(); info.addstatus(1); if (info.iscancelled()) return; } TLocalisamfile doc(LF_DOC),rdoc(LF_RIGHEDOC); unify_mags_reset_bar(info, "righe documenti", rdoc.items()); err = rdoc.first(); doc.zero(); TString16 codnum; long ndoc; int anno; while (err==NOERR) { codnum = rdoc.get(RDOC_CODNUM); anno = rdoc.get_int(RDOC_ANNO); ndoc = rdoc.get_long(RDOC_NDOC); do { if (err != NOERR || doc.get(DOC_CODNUM)!=codnum || doc.get_int(DOC_ANNO)!=anno || doc.get_long(DOC_NDOC)!=ndoc) { doc.put(DOC_PROVV,"D") ; doc.put(DOC_CODNUM,codnum); doc.put(DOC_ANNO,anno); doc.put(DOC_NDOC,ndoc); err = doc.read(); } } while (err != NOERR && yesno_box("Errore nella lettura del documento %s %d %ld.\nRiprovo ?",(const char *)rdoc.get(RDOC_CODNUM),rdoc.get_int(RDOC_ANNO),rdoc.get_long(RDOC_NDOC) )); if (err == NOERR) { unify_magcode("CODMAG", rdoc); unify_magcode("CODMAGC", rdoc); } err = rdoc.next(); info.addstatus(1); if (info.iscancelled()) return; } } void checkexplosions(const TMask & m) { TLocalisamfile movmag(LF_MOVMAG), rmovmag(LF_RMOVMAG); TArray boom; TAssoc_array movs, arts; TDistinta_tree search; TString desc,codcaus,key, grmerc; TLocalisamfile anamag(LF_ANAMAG); int err = rmovmag.last(); TProgind info(rmovmag.items(),"Controllo scarichi errati da esplosioni distinte",FALSE,TRUE); while (err==NOERR) { movmag.put("ANNOES","1999"); movmag.put("NUMREG",rmovmag.get("NUMREG")); movmag.read(); desc = movmag.get("DESCR"); codcaus = rmovmag.get("CAUS"); if (codcaus.blank()) codcaus = movmag.get("CODCAUS"); key = rmovmag.get("CODART"); anamag.put("CODART",key); if (!arts.is_key(key)) { if (anamag.read()!=NOERR) { message_box("Articolo '%s' mancante ", (const char *)rmovmag.get("CODART")); arts.add(key, grmerc); grmerc = "~"; } else grmerc = anamag.get("GRMERC"); } else grmerc = (TString &)arts[key]; if (grmerc[0] == '~' || codcaus.left(3)=="SCC") { if (grmerc[0] == '~' || grmerc[0]=='F') { if (!arts.is_key(key)) { if (search.set_root(key)) { search.explode(boom,FALSE, RAGGR_EXP_NONE, 1, "A"); if (boom.items() <= 0) message_box("Distinta di %s priva di componenti", (const char *)key); } else message_box("Distinta di %s mancante ", (const char *)key); arts.add(key, grmerc); } key = format("%ld",rmovmag.get_long("NUMREG")); if (!movs.is_key(key)) { message_box("Errore nel movimento %ld (%s)", rmovmag.get_long("NUMREG"), (const char *)desc ); movs.add(key,key); } } } err = rmovmag.prev(); info.addstatus(1); } } // rimuove le unità di misura errate void remove_wrong_um(const TMask & m) { const bool vars = noyes_box("Vuoi eliminare tutte le unità di misura delle varianti di produzione?"); const bool var3 = vars ? 1 : yesno_box("Vuoi eliminare le unità di misura degli articoli tipo 'xxxxx__SE3xx' o 'xxxx__TS3xx'?"); TLocalisamfile umart(LF_UMART); int err = umart.last(); TProgind info(umart.items(),"Eliminazione unità di misura",FALSE,TRUE); TString code; while (err==NOERR) { code = umart.get("CODART"); if ( (var3 && (code.find("__SE3")>=0 ||code.find("__TS3")>=0)) || (vars && code.find("__")>=3)) umart.remove(); err = umart.prev(); info.addstatus(1); } } bool sum_giacfield(TRectype & dest, const TRectype & source, const char * filedname) { dest.put(filedname, dest.get_real(filedname)+source.get_real(filedname)); return !source.get_real(filedname).is_zero(); } bool sum_giacrecord(TRectype & dest, const TRectype & source) { bool some=FALSE; some|=sum_giacfield(dest, source, "RIM"); some|=sum_giacfield(dest, source, "VALRIM"); some|=sum_giacfield(dest, source, "ACQ"); some|=sum_giacfield(dest, source, "VALACQ"); some|=sum_giacfield(dest, source, "ENT"); some|=sum_giacfield(dest, source, "VALENT"); some|=sum_giacfield(dest, source, "VEN"); some|=sum_giacfield(dest, source, "VALVEN"); some|=sum_giacfield(dest, source, "USC"); some|=sum_giacfield(dest, source, "VALUSC"); some|=sum_giacfield(dest, source, "GIAC"); some|=sum_giacfield(dest, source, "ORDF"); some|=sum_giacfield(dest, source, "VALORDF"); some|=sum_giacfield(dest, source, "ORDC"); some|=sum_giacfield(dest, source, "VALORDC"); some|=sum_giacfield(dest, source, "INCL"); some|=sum_giacfield(dest, source, "ACL"); some|=sum_giacfield(dest, source, "PRODCOMP"); some|=sum_giacfield(dest, source, "PRODFIN"); some|=sum_giacfield(dest, source, "NLABEL"); some|=sum_giacfield(dest, source, "NDIST"); some|=sum_giacfield(dest, source, "SCARTI"); return some; } // rimuove le unità di misura errate void unify_giacrecords(const TMask & m) { TLocalisamfile anamag(LF_ANAMAG); TLocalisamfile mag(LF_MAG); TString last_art; TToken_string key; TAssoc_array giacrows; int err = mag.first (); TProgind info(mag.items(),"Rimozione righe di giacenza doppie",FALSE,TRUE); while (err == NOERR) { if (last_art.blank() || last_art != mag.get("CODART")) { last_art = mag.get("CODART"); anamag.put("CODART",last_art); while (anamag.read(_excllock) != NOERR) { error_box("Record di anagrafica %s bloccato",(const char *)last_art); } giacrows.destroy(); } int curr_riga = mag.get_int("NRIGA"); if (mag.get("ANNOES") == "0") mag.remove(); else { key.add(mag.get("ANNOES"),0); key.add(mag.get("CODART"),1); key.add(mag.get("CODMAG"),2); key.add(mag.get("LIVELLO"),3); if (giacrows.is_key(key)) { // giacenza duplicata! int last_riga = atoi((TString &)giacrows[key]); TRectype dup(mag.curr()); mag.put("NRIGA",last_riga); mag.read(); if (sum_giacrecord(mag.curr(), dup)) mag.rewrite(); mag.put("NRIGA",curr_riga); mag.remove(); } else { // giacrows.add(key, new TString(mag.get("NRIGA"))); } } mag.put("NRIGA",++curr_riga); err = mag.read(_isgteq); info.addstatus(1); } anamag.read(); rinumera_mags(); } // rimuove le unità di misura errate void find_wrong_um(const TMask & m) { TLocalisamfile dist(LF_DIST); TLocalisamfile rdist(LF_RDIST); TLocalisamfile umart(LF_UMART); int err = dist.last(); TProgind info(dist.items(),"Ricerca unità di misura di distinta errate",FALSE,TRUE); TString coddist, codeum, code; while (err==NOERR) { coddist = dist.get("CODDIST"); codeum = dist.get("UM"); umart.setkey(2); umart.put("CODART",coddist); umart.put("UM",codeum); if (umart.read()!=NOERR) codeum = ""; umart.setkey(1); if (codeum.blank()) { umart.put("CODART",coddist); umart.put("NRIGA",1); if (umart.read()==NOERR) { dist.put("UM", umart.get("UM")); err = dist.rewrite(); } else { int pos = coddist.find("__"); if (pos >= 0) { umart.put("CODART",coddist.left(pos)); umart.put("NRIGA","1"); if (umart.read()==NOERR) { codeum = umart.get("UM"); umart.put("CODART",coddist); umart.put("NRIGA","1"); err = umart.write(); } } if (codeum.blank()) if (yesno_box("Unità di misura nulla per %s. Aggiungo", (const char *)coddist)) { umart.put("CODART",coddist); umart.put("NRIGA","2"); umart.put("UM",dist.get("UM")); umart.put("FC",1); err = umart.write(); if (err != NOERR) warning_box("Errore in scrittura UM"); } } } else if (coddist.find("__")>=0) { // variante di prod, probabilmente da esprimere in batch di prod bool chk_ricetta = FALSE; bool chk_distinta = FALSE; real bp=ZERO; if (codeum != "BP") // oh, guarda, la UM non è uguale a batch, caso sospetto! { umart.setkey(2); umart.put("CODART",coddist); umart.put("UM","BP"); if ((err = umart.read())==NOERR) bp = umart.get_real("FC"); umart.setkey(1); if (bp.is_zero() || bp == 1.0) chk_distinta = TRUE; } else { umart.setkey(2); umart.put("CODART",coddist); umart.put("UM","BP"); if ((err = umart.read())==NOERR) bp = umart.get_real("FC"); umart.setkey(1); umart.put("CODART",coddist); umart.put("NRIGA","1"); err = umart.read(); if (err==NOERR) if (umart.get("UM")=="KG") chk_ricetta = TRUE; else if (bp == 1.0) chk_distinta = TRUE; } if (chk_distinta) { real total= ZERO; rdist.zero(); rdist.put("CODDIST", coddist); if (rdist.read()) { int newbp=0; while (bp <= 1.0 && coddist == rdist.get("CODDIST") // && (rdist.get("TIPO")!="V")) { code = rdist.get("CODCOMP"); real expr = rdist.get_real("EXPR"); if (!expr.is_zero()) { if (rdist.get("UM") != "KG" && rdist.get("UM") != "GR") { total = ZERO; if (expr == 1.0 || (expr < 10.0 && expr == (int)expr.integer())) bp = 1.0; else { expr /= 1000.0; newbp = (int)expr.integer(); if (expr == newbp) newbp = 1000; else { expr *= 10.0; newbp = (int)expr.integer(); if (expr == newbp) newbp = 100; else { expr *= 100.0; newbp = (int)expr.integer(); if (expr == newbp) newbp = 1; else newbp = 0; } } } if (bp>1.0 && code.find("__")<0) { if (bp != newbp) bp = -1.0; } else bp = newbp ? newbp : bp; } else total += expr; } rdist.next(); } } if (bp==0 && !total.is_zero()) if (total > 1000) bp = 10000.0; else if (total > 100) bp = 1000.0; else if (total > 10) bp = 100.0; if (bp>1.0 && !yesno_box("Imposto la UM di distinta per %s a %s %s ?", (const char *)coddist, bp.string(), (const char *)codeum)) bp = ZERO; if (bp<1.0) if (!number_box(format("Batch di distinta per %s ", (const char *)coddist),bp)) bp = 1.0; if (bp>1.0) { umart.zero(); umart.put("CODART",coddist); umart.put("NRIGA","2"); umart.put("UM","BP"); umart.put("FC",bp); if ((err = umart.write())!=NOERR) { umart.rewrite(); } dist.put("UM","BP"); err = dist.rewrite(); } else { if (bp != 1) warning_box("UM di distinta per %s %s", (const char *)coddist, (const char *)codeum); } } if (chk_ricetta) { real totale_ricetta = ZERO; rdist.zero(); rdist.put("CODDIST", coddist); rdist.read(_isgteq+_nolock); while (coddist == rdist.get("CODDIST")) { code = rdist.get("CODCOMP"); real expr = rdist.get_real("EXPR"); if (rdist.get("UM") == "KG") totale_ricetta = totale_ricetta + expr; if (rdist.get("UM") == "GR") totale_ricetta = totale_ricetta + (expr/1000.0); rdist.next(); } if (bp != totale_ricetta && (((bp-totale_ricetta) >0.001 ) || ((totale_ricetta-bp) >0.001 )) ) { TString ts(totale_ricetta.string()); if ((totale_ricetta == 10000.0 || totale_ricetta == 1000.0 )) { if (yesno_box("Batch di produzione per %s a %s; lo porto a %s", (const char *)coddist, (const char *)bp.string(), (const char *)ts)) { umart.put("CODART",coddist); umart.put("UM","BP"); umart.put("FC", totale_ricetta); umart.rewrite(); } }// else // warning_box("Batch di produzione per %s a %s, totale componenti %s", // (const char *)coddist, (const char *)bp.string(), (const char *)ts); } } } info.addstatus(1); err = dist.prev(); } } class TCover_services : public TSkeleton_application { protected: virtual void main_loop() ; }; class TService_mask : public TAutomask { protected: virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); public: TService_mask() :TAutomask("dbcv02a.msk"){} }; bool TService_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) { switch (o.dlg()) { case DLG_OK: if (e == fe_button) { switch (get_int(F_SERVICE)) { case 1: if (noyes_box("Confermi la cancellazione del file degli articoli da escludere ?")) { TSupport_file morti(LF_DIST, ANAGRAFICA_MORTI); morti.zap(); } break; case 2: crea_mag3(); break; case 3: crea_linee3(); break; case 4: if (noyes_box("Rinumero le righe delle distinte?")) rinumera_dist(); break; case 5: if (noyes_box("Rinumero le unita' di misura?")) rinumera_ums(); break; case 6: if (noyes_box("Le lavorazioni presenti sui finiti verrano spostate sulle varianti di impianto. Confermi?")) if (sposta_lavs() && yesno_box("Rinumero le righe di lavorazione?")) rinumera_dist(); break; case 7: build2levmsp(); break; case 8: setformulavar(); break; case 9: //check_mag_locations(get(F_PATH),source); break; case 10: evadi_orc(*this, get(S_CODIMP)); break; case 11: unevadi_orc(*this, get(S_CODIMP)); break; case 12: find_wrongcycle(); break; case 13: sinchro_stock(*this, "SE"); sinchro_stock(*this, "TS"); break; case 14: unlink_docs(); break; case 15: kill_blank_mag(*this,"SE1"); break; case 16: unify_mags(*this); break; case 17: checkexplosions(*this); case 18: remove_wrong_um(*this); break; case 19: find_wrong_um(*this); break; case 20: check_movmags(*this); break; case 21: unify_giacrecords(*this); break; case 22: if (noyes_box("Rinumero le righe di giacenza?")) rinumera_mags(); break; case 100: if (noyes_box("Esporto le lavorazioni?")) //exportlavs(); break; } } } return TRUE; } void converti_magazzino(TLocalisamfile & file, const char *campo, const char *campovecchio , const char *camponuovo) { file.first(); while (!file.eof()) { if (file.get(campo) == campovecchio) { file.put(campo,camponuovo); file.rewrite(); } file.next(); do_events(); } } void uniscimag(const char *campovecchio , const char *camponuovo) { TLocalisamfile file(LF_MAG), nfile(LF_MAG);; TString codart= ""; real qentr, qusc, qacq, qven , qrimin, qgiac; real vqentr, vqusc, vqacq, vqven , vqrimin; int nriga = 1; int annoes; bool done=TRUE; file.first(); while (!file.eof()) { if (codart == "") { codart = file.get("CODART"); annoes= file.get_int("ANNOES"); done = TRUE; } if (file.get("CODMAG") == campovecchio) { qentr = file.get_real("ENT"); qusc = file.get_real("USC"); qacq = file.get_real("ACQ"); qven = file.get_real("VEN"); qrimin = file.get_real("RIM"); vqentr = file.get_real("VALENT"); vqusc = file.get_real("VALUSC"); vqacq = file.get_real("VALACQ"); vqven = file.get_real("VALVEN"); vqrimin = file.get_real("VALRIM"); qgiac = file.get_real("GIAC"); file.put("ENT", ZERO); file.put("USC", ZERO); file.put("ACQ",ZERO); file.put("VEN",ZERO); file.put("RIM",ZERO); file.put("VALENT",ZERO); file.put("VALUSC",ZERO); file.put("VALACQ",ZERO); file.put("VALVEN",ZERO); file.put("VALRIM",ZERO); file.put("GIAC",ZERO); // file.remove(); can' remove without renumbering //file.rewrite(); done = FALSE; } else if (file.get("CODMAG") == camponuovo && !done) { qentr += file.get_real("ENT"); qusc += file.get_real("USC"); qacq += file.get_real("ACQ"); qven += file.get_real("VEN"); qrimin += file.get_real("RIM"); vqentr += file.get_real("VALENT"); vqusc += file.get_real("VALUSC"); vqacq += file.get_real("VALACQ"); vqven += file.get_real("VALVEN"); vqrimin += file.get_real("VALRIM"); qgiac += file.get_real("GIAC"); file.put("ENT", qentr); file.put("USC", qusc); file.put("ACQ",qacq); file.put("VEN",qven); file.put("RIM",qrimin); file.put("VALENT",vqentr); file.put("VALUSC",vqusc); file.put("VALACQ",vqacq); file.put("VALVEN",vqven); file.put("VALRIM",vqrimin); file.put("GIAC",qgiac); file.put("CODMAG",camponuovo); //file.rewrite(); done = TRUE; } nriga = file. get_int("NRIGA"); file.next(); if (file.eof() || codart != file.get("CODART")) { if (!done) { nfile.zero(); nfile.put("ENT", qentr); nfile.put("USC", qusc); nfile.put("ACQ",qacq); nfile.put("VEN",qven); nfile.put("RIM",qrimin); nfile.put("VALENT",vqentr); nfile.put("VALUSC",vqusc); nfile.put("VALACQ",vqacq); nfile.put("VALVEN",vqven); nfile.put("VALRIM",vqrimin); nfile.put("GIAC",qgiac); nfile.put("CODMAG",camponuovo); nfile.put("CODART", codart); nfile.put("ANNOES", codart); nfile.put("NRIGA", nriga+1); //nfile.write(); } codart = file.get("CODART"); annoes= file.get_int("ANNOES"); done = TRUE; qentr = qusc = qacq = qven = qrimin = vqentr = vqusc = vqacq = vqven = vqrimin = qgiac = ZERO; } do_events(); } } void TCover_services::main_loop() { TLocalisamfile rdoc(LF_RIGHEDOC), rmovmag(LF_RMOVMAG), mag(LF_MAG); //converti_magazzino(rdoc, "CODMAG", "COMSE", "SE1X0"); //converti_magazzino(rdoc, "CODMAGC", "COMSE", "SE1X0"); //converti_magazzino(rmovmag, "CODMAG", "COMSE", "SE1X0"); //uniscimag("COM", "SE1X0"); TService_mask m; while (m.run()!=K_QUIT); } int dbcv02(int argc, char* argv[]) { TString name; TCover_services dt; dt.run(argc, argv, "Utilita' di conversione BPCS"); return 0; }