#include #include #include 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 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 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 } } return err; }