// ve6100.cpp: modulo per la generazione delle fatture. #include "ve6retv.h" // valori di ritorno dalle varie funzioni class TCrea_fatture : public TElaborazioni { protected: virtual bool menu (MENU_TAG); virtual bool create () ; virtual bool destroy(); public: TCrea_fatture (void) {} // costruttore }; bool TCrea_fatture::create() { cod_elab = "01"; // imposta il codice elaborazione (per il riferimento alla tabella ELD) dispatch_e_menu(BAR_ITEM(1)); // chiama il metodo menu return TRUE; } bool TCrea_fatture::destroy() { delete _msk; return TRUE; } bool TCrea_fatture::menu(MENU_TAG) { int err; // errore ritornato dalle funzioni if (err = scan_doc()) // se durante la scansione c'è un errore, esci return !errore_fatale(err); switch (ordinamento) // in base all'ordinamento, lancia diverse procedure di creazione { case CLIENTE: // crea fatture raggruppando per cliente err = per_cliente(); break; case AGENTE: // crea fatture per agente break; case ZONA: // crea fatture per zona break; case DATA_NUMDOC: if (raggruppa) // crea fatture per data/numero documento else // crea una fattura per ogni cliente break; default: break; } if (err) while (!getchar()); // se c'è un errore, attende la pressione di invio return !errore_fatale(err) // ritorna FALSE se c'è stato un errore fatale } int per_cliente(void) { TLocalisamfile f(LF_DOC); TLocalisamfile rdoc(LF_RDOC); int current = 0; // chiave corrente TToken_string tempt; // ttoken string temporanea TString cliente; TRectype tempr (LF_DOC); TRectype temprdoc (LF_RDOC); TTable t("NUM"); // tabella numerazioni int nrdoc=0; // numero di riga della fattura do { // memorizza il record del documento pilota f.zero(); tempt = _chiavi->row(current); // rileva la chiave corrente codnum = tempt.get(0) f.put ("CODNUM", codnum); // memorizza i valori della chiave corrente nel record f.put ("ANNO", tempt.get()); f.put ("PROVV", tempt.get()); f.put ("NDOC", tempt.get()); if (!f.read (_isequal)) // cerca il record corrispondente alla chiave corrente { error_box ("TCrea_fatture::per_cliente() : errore %d durante la lettura su doc", err); return READ_ERROR; } tempr = f.curr(); // copia ilrecord del doc. pilota in tempr // imposta il numero documento per la fattura da creare t.zero(); t.put ("CODTAB", _elab.codnum); // codice numerazione per le fatture t.read (_isgteq); // legge il primo record con lo stesso codice di numerazione if (t.get("CODTAB") == _elab.codnum) // controlla che il codice numerazione sia effettivamente lo stesso { n = t.get("I1"); // legge l'ultimo numero di documento utilizzato (o il primo disponibile) // supponiamo che sia l'ultimo utilizzato n++; // ora n è il numero della mia fattura (da mettere in NDOC); } else n = 1; // se non esiste alcun documento con il codice numerazione specificato, allora la fattura corrente è la n° 1 // inserisce il record del documento pilota in doc f.curr() = tempr // tutti i campi della fattura sono uguali al documento pilota, tranne alcuni (impostati più sotto) f.put ("NDOC", n); // imposta il numero del documento f.put ("TIPODOC", _elab.tipo_doc_des); // imposta il tipo di documento f.put ("STATO", ???); // stato della fattura appena creata if ((err = f.write()) == NOERR) // se nonci sono problemi { t--; // si posiziona sul record precedente nella tabella numerazione t.put ("I1", n); // imposta nuovo numero del documento t.write(); // registra } else { switch (err) { case REINSERT: message_box ("ve6100: Errore fatale: il record con la chiave specificata esiste già: impossibile sovrascrivere"); break; default: message_box ("ve6100: Errore fatale: %d scrivendo sulla tabella NDOC", err); break; } return RECORD_WRITE_ERROR; // indica al chiamante un errore nella scrittura di un record } // cerca la prima riga del documento pilota in rdoc nrdoc = 1; // comincia dalla prima riga temprdoc.zero(); temprdoc.put ("CODNUM", tempr.get("CODNUM")); temprdoc.put ("ANNO", tempr.get ("ANNO")); temprdoc.put ("PROVV", tempr.get("PROVV")); temprdoc.put ("NDOC", tempr.get("NDOC")); TRecord_array doc_originale; doc_originale.read (temprdoc); // legge tutte le righe del documento originale // con la funzione doc_originale.row(i) ho l'i-esima riga del doc. originale TRecord_array doc_destinazione; temprdoc.put ("CODNUM", _elab.codnum); // imposta il codice numerazione per la fattura /* prendi la prima chiave ripeti cerca su doc il record corrispondente alla chiave corrente prendi il codcf (codice cliente) // costruzion file pilota per il cliente corrente prendi tutti i campi obbligatori // meglio: copia il record trovato in un oggetto record scrivi su doc il record relativo alla nuova fattura creata cerca su rdoc la prima riga del doc. pilota // inserimento del doc. pilota nella fattura copia le righe del doc. pilota nella fattura segna a[0] come processato per ogni chiave dell'array (dopo la prima) se non è processata cerca su doc il record corrispondente se codcf è uguale a codcf del doc. pilota // meglio: crea un record campione con codcf e campi obbligatori = a guelli del record pilota e cerca il allora se i campi obbligatori sono uguali a quelli del doc. pilota allora copia tutte le righe del doc. attuale nella fattura indica il record come processato prendi dall'array la prima chiave non processata finché la chiave corrente è oltre l'ultimo record. (chiave corrente == a.items() */ Per numerazione fatture: TTable t ("NUM"); metto in codtab il codice numerazione leggo il record con quel codice nel campi I1 c'è il numero del primo campo disponibile (o dell'ultimo utilizzato) } int ve6100 (int argc, char **argv) { TCrea_fatture a; a.run (argc, argv, "Fatturazione"); return 0; }