diff --git a/ve/ve0100b.cpp b/ve/ve0100b.cpp index 8ec7d9b53..7ccc3c5e8 100755 --- a/ve/ve0100b.cpp +++ b/ve/ve0100b.cpp @@ -5,57 +5,66 @@ int numerazione_definitiva(TLocalisamfile& doc) { - int err= NOERR; // istanzia la variabile per il codice d'errore - TRectype &rec_doc= doc.curr(); // prende il record corrente dal file delle testate - TTable tabnum("NUM"); // istanzia la tabella delle numerazioni - - tabnum.put("CODTAB", rec_doc.get("CODNUM")); // posiziona la tabella - if ((err= tabnum.read(_isequal, _lock))==NOERR) - { // legge la tabella bloccandone il record - long newndoc= tabnum.get_long("I1"); // legge il nuovo numero di documento dalla tabella - - tabnum.put("I1", newndoc+1); // aggiorna il nuovo numero di documento nella tabella - doc.read(rec_doc, _isequal, _lock); // blocca il record corrente del file documenti - int anno = doc.get_int("ANNO"); // reperisce i primi 2 campi della chiave - TString codnum(doc.get("CODNUM")); - long ndoc = doc.get_long("NDOC"); - const bool is_provv = doc.get("PROVV") == "P"; - - if (!is_provv) - { - doc.reread(_unlock); - return NOERR; // Gia' rinumerata - } - - TRectype newrec_doc(rec_doc); // istanzia un nuovo record su quello corrente - TRectype rec_rdoc(LF_RIGHEDOC); // istanzia il record delle righe per effettuare la lettura + if (doc.curr().get("PROVV") == "D") + return NOERR; - newrec_doc.put("NDOC", newndoc); // scrive il nuovo numero di documento nel nuovo record - newrec_doc.put("PROVV", "D"); // aggiorna il flag di tipo di numerazione - - rec_rdoc.put("CODNUM",codnum); // compone la chiave per le righe - rec_rdoc.put("ANNO",anno); - rec_rdoc.put("NDOC", ndoc); - rec_rdoc.put("PROVV","P"); - TRecord_array arr_rdoc(LF_RIGHEDOC, "NRIGA"); // istanzia il record array per le righe - if ((err= arr_rdoc.read(rec_rdoc))==NOERR) - { // legge le righe del documento basandosi sul record con la vecchia chiave - TRecord_array newarr_rdoc(arr_rdoc); // crea una copia del record array per tenere le nuove righe + int err = NOERR; // istanzia la variabile per il codice d'errore + TRectype doc_rec(doc.curr()); + TRectype rec(doc.curr()); // record campione + + rec.zero(); + rec.put("CODNUM", doc.get("CODNUM")); + rec.put("ANNO", doc.get("ANNO")); + rec.put("PROVV", "D"); + + TRectype cmp_rec(rec); // record campione + + rec.put( "NDOC", 9999999L ); - for (int i=1; i<=newarr_rdoc.last_row(); i++) - { // ciclo sui record delle righe - TRectype &newrec_rdoc= newarr_rdoc.row(i, FALSE); // prende il record della riga corrente - - newrec_rdoc.put("NDOC", newndoc); // scrive il nuovo numero di documento - newrec_rdoc.put("PROVV", "D"); // aggiorna il flag di tipo di numerazione - } - newarr_rdoc.write(); // scrive le righe con la nuova numerazione - doc.write(newrec_doc); // scrive il nuovo record della testata - arr_rdoc.remove(); // rimuove le vecchie righe - doc.remove(rec_doc); // cancella (e sblocca) il vecchio record della testata - tabnum.rewrite(); // riscrive il record corrente della tabella... - tabnum.read(_isequal, _unlock); // ...e la sblocca - } + bool unlock = FALSE; + + if (doc.read(rec, _isgreat) == NOERR) + { + doc.prev(_lock); // blocca il record corrente del file documenti + unlock = TRUE; } + + long numdoc = ((doc.curr() == cmp_rec) ? doc.get_long( "NDOC" ) : 0) + 1; + cmp_rec = doc.curr(); + + TRectype newrec_doc(doc_rec); // istanzia un nuovo record su quello corrente + TRectype rec_rdoc(LF_RIGHEDOC); // istanzia il record delle righe per effettuare la lettura + + newrec_doc.put("NDOC", numdoc); // scrive il nuovo numero di documento nel nuovo record + newrec_doc.put("PROVV", "D"); // aggiorna il flag di tipo di numerazione + while ((err = doc.write(newrec_doc)) == _isreinsert) + { + numdoc++; + newrec_doc.put("NDOC", numdoc); + } + if (err != NOERR) + return err; + if (unlock) + doc.read(cmp_rec, _unlock); + + rec_rdoc.put("CODNUM",doc_rec.get("CODNUM")); // compone la chiave per le righe + rec_rdoc.put("ANNO",doc_rec.get("ANNO")); + rec_rdoc.put("NDOC", doc_rec.get("NDOC")); + rec_rdoc.put("PROVV","P"); + TRecord_array arr_rdoc(LF_RIGHEDOC, "NRIGA"); // istanzia il record array per le righe + arr_rdoc.read(rec_rdoc); + + TRecord_array newarr_rdoc(arr_rdoc); // crea una copia del record array per tenere le nuove righe + + for (int i=1; i<=newarr_rdoc.last_row(); i++) + { // ciclo sui record delle righe + TRectype &newrec_rdoc= newarr_rdoc.row(i, FALSE); // prende il record della riga corrente + + newrec_rdoc.put("NDOC", numdoc); // scrive il nuovo numero di documento + newrec_rdoc.put("PROVV", "D"); // aggiorna il flag di tipo di numerazione + } + if ((err = newarr_rdoc.write()) == NOERR && // scrive le righe con la nuova numerazione + (err = arr_rdoc.remove()) == NOERR) // rimuove le vecchie righe + doc.remove(doc_rec); // cancella il vecchio record della testata return err; }