diff --git a/src/ps/ps0713.cpp b/src/ps/ps0713.cpp index 9fb4654d4..1260d876f 100755 --- a/src/ps/ps0713.cpp +++ b/src/ps/ps0713.cpp @@ -14,6 +14,7 @@ int main(int argc, char** argv) case 4: ps0713500(argc, argv); break; //Importazione spese case 5: ps0713600(argc, argv); break; //Importazione fatture fornitori / fatture da ricevere case 6: ps0713700(argc, argv); break; //Eliminazione conti non analitici dai movimenti + case 7: ps0713800(argc, argv); break; //Esportazione righe IVA con partita non chiusa e visualizzazione su sheet default: ps0713100(argc, argv); break; //Esportazione righe IVA } return 0; diff --git a/src/ps/ps0713.h b/src/ps/ps0713.h index c13c252f9..b8f3fb52b 100755 --- a/src/ps/ps0713.h +++ b/src/ps/ps0713.h @@ -4,4 +4,5 @@ int ps0713300(int argc, char* argv[]); int ps0713400(int argc, char* argv[]); int ps0713500(int argc, char* argv[]); int ps0713600(int argc, char* argv[]); -int ps0713700(int argc, char* argv[]); \ No newline at end of file +int ps0713700(int argc, char* argv[]); +int ps0713800(int argc, char* argv[]); \ No newline at end of file diff --git a/src/ps/ps0713800.cpp b/src/ps/ps0713800.cpp new file mode 100644 index 000000000..f5c0a8aa0 --- /dev/null +++ b/src/ps/ps0713800.cpp @@ -0,0 +1,578 @@ +#include +#include +#include +#include + +#include +#include + +#include "../ca/calib01.h" +#include "../ca/calib02.h" +#include "../cg/cgsaldac.h" + +#include "ps0713800a.h" + +/////////////////////////////////// +//// TEsportaIva_msk //// +/////////////////////////////////// + +//Classe TEsportaIva_msk +class TEsportaIva_msk : public TAutomask +{ + void createName(); + bool test_partita(const long numreg, TDate& last_data_pag, const TDate& data) const; + void fill(); +public: + virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); + bool testFields() const; + TEsportaIva_msk(); +}; + +//ON_FIELD_EVENT: metodo che gestisce i comportamenti dei vari campi della maschera +bool TEsportaIva_msk::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + switch (o.dlg()) + { + case F_DADATA: + if (e == fe_init) + o.set(ini_get_string(CONFIG_DITTA, "Esporta_Dati_IVA", "LastSend", "01-01-2017")); + break; + case F_ADATA: + case F_CODCF: + if (e == fe_modify || e == fe_close) + createName(); + break; + case B_FORNITORE: + if(get_bool(B_FORNITORE)) + { + enable(F_CODCF); + enable(F_RAGSOC); + } + else + { + disable(F_CODCF); + disable(F_RAGSOC); + set(F_CODCF, ""); + set(F_RAGSOC, ""); + createName(); + } + break; + case B_PRTAPE: + case B_PRTCHIU: + if(e == fe_init) + { + set(B_PRTAPE, "X"); + set(B_PRTCHIU, "X"); + } + break; + case DLG_RECALC: + if (e != fe_init) + fill(); + break; + default: break; + } + return true; +} + +void TEsportaIva_msk::createName() +{ + //setto il campo F_NAME a un valore fisso, e cioè: "CODF_data.txt" + TDate adata = get_date(F_ADATA); + TString16 name; + if(get(F_CODCF).full()) + name << get(F_CODCF); + + if(get(F_CODCF).full() && adata.ok()) // Solo se ci sono entrambi, sennò farebbe schifo + name << "_"; + + if(adata.ok()) + name << adata.date2ansi(); + if(name.full()) // Capita che venga chiamato per eliminare + name << ".txt"; + set(F_NAME, name); +} + +bool TEsportaIva_msk::testFields() const +{ + // Controllo presenza campi + if(!get_date(F_ADATA).ok() || !get_date(F_DADATA).ok()) + { + warning_box("Controllare le date"); + return false; + } + if(!get_bool(B_PRTAPE) && !get_bool(B_PRTCHIU)) + { + warning_box("Selezionare almeno un tipo di partita!"); + return false; + } + if(get_bool(B_FORNITORE) && get(F_CODCF).empty()) + { + warning_box("Selezionare il fornitore o togliere il filtro!"); + return false; + } + return true; +} + +//TEST_PARTITA: metodo che cerca l'ultima data pagamento delle partite relative ad un numreg (la maggiore) +//il metodo restiruisce true se esiste almeno una partita per il numreg indicato +bool TEsportaIva_msk::test_partita(const long numreg, TDate& last_data_pag, const TDate& data) const +{ + TPartite_array torneo; + //aggiungo all'array tutte le partite con quel numreg + torneo.add_numreg(numreg); + TPartita* partita = torneo.first(); + //se esiste almeno una partita ed è chiusa + if (partita != NULL && partita->chiusa()) + { + //scorro tutte le partite + for (int r = partita->last(); r > 0; r = partita->pred(r)) + { + //instanzio una riga_partite + const TRiga_partite& row = partita->riga(r); + const tipo_movimento tipo = row.tipo(); + //controllo il tipo_movimento; se è del tipo tm_pagamento o tm_pagamento_insoluto + //recupero la data del pagamento, e se questa è maggiore di quella già trovata, aggiorno + //quest'ultima + if (tipo == tm_pagamento || tipo == tm_pagamento_insoluto) + { + const TDate datadoc = row.get_date(PART_DATAPAG); + if (datadoc > last_data_pag) + last_data_pag = datadoc; + } + } + return last_data_pag <= data ? true : false; + } + return false; +} + +void TEsportaIva_msk::fill() +{ + // Controllo se i campi corretti + if(!testFields()) + return; + + // Preparo le date di interesse + const TDate adata(get_date(F_ADATA)); + const TDate dadata(get_date(F_DADATA)); + + // Preparo query su righe iva joinati ai mov + TString query("USE RMOVIVA SELECT BETWEEN(23.DATAREG,#DADATA,#ADATA)&&(23.INVIVA!=\"X\")&&(23.TIPO=\"F\")"); + if(get_bool(B_FORNITORE)) + { + query << "&&(23.CODCF=#CODCF)"; + } + query << "\n"; + + bool with_cms = get_int(F_JOB) == 1; + + query << "JOIN MOV INTO NUMREG==NUMREG\n" + << "JOIN %IVA ALIAS 101 INTO CODTAB==CODIVA\n" + << "JOIN CLIFO TO MOV INTO TIPOCF==TIPO CODCF==CODCF"; + + //instanzio il recordset + TISAM_recordset rmoviva(query); + rmoviva.set_var("#DADATA", dadata); + rmoviva.set_var("#ADATA", adata); + if(get_bool(B_FORNITORE)) + rmoviva.set_var("#CODCF", get(F_CODCF)); + + TSheet_field& sheet = sfield(S_RESULT); + TString_array& strarr = sheet.rows_array(); + + sheet.hide(); + sheet.destroy(); + + TProgress_monitor pi(rmoviva.items(), TR("Creazione sheet...")); + + bool all = get_bool(B_PRTAPE) && get_bool(B_PRTCHIU); + for (bool ok = rmoviva.move_first(); ok && !pi.is_cancelled(); ok = rmoviva.move_next()) + { + if (!pi.add_status()) + break; + + TCursor* i = rmoviva.cursor(); + int k = i->pos(); + + TDate last_data_pag; + const long numreg = rmoviva.get(RMI_NUMREG).as_int(); + TToken_string* row = new TToken_string; + + bool partita_chiusa; + if(!all) + partita_chiusa = test_partita(numreg, last_data_pag, adata); + + if (all || (get_bool(B_PRTAPE) && !partita_chiusa) || (get_bool(B_PRTCHIU) && partita_chiusa)) + { + if (with_cms) + { + TAnal_mov movana; + + movana.read_cgnum(numreg); + const int rows = movana.rows(); + + if (rows > 0) + { + for(int i = 1; i <= rows; i++) + { + row->cut(0); + const TRectype& rmovana = movana.body()[i]; + const TString80 codcms = rmovana.get("CODCMS"); + + row->add(codcms, 0); + row->add(rmoviva.get("23.CODCF").as_string()); + row->add(rmoviva.get("20.RAGSOC").as_string()); + char sez = rmovana.get_char("SEZIONE"); + TImporto importo(sez, rmovana.get_real("IMPORTO")); + importo.normalize('D'); + row->add(importo.valore()); + row->add(rmoviva.get("23.DATADOC").as_string()); + row->add(rmoviva.get("23.NUMDOC").as_string()); + row->add(last_data_pag); + row->add(rmoviva.get("25.GRUPPO").as_string()); + row->add(rmoviva.get("25.CONTO").as_string()); + row->add(rmoviva.get("25.SOTTOCONTO").as_string()); + strarr.add(row); + } + while (rmoviva.move_next()) + { + const long wnumreg = rmoviva.get(RMI_NUMREG).as_int(); + if (wnumreg != numreg) + { + rmoviva.move_prev(); + break; + } + } + + } + else + { + const TString & codcms = rmoviva.get("CODCMS").as_string(); + + if (codcms.full()) + { + row->cut(0); + row->add(codcms, 0); + row->add(rmoviva.get("23.CODCF").as_string()); + row->add(rmoviva.get("20.RAGSOC").as_string()); + row->add(rmoviva.get(RMI_IMPONIBILE).as_real()); + row->add(rmoviva.get("23.DATADOC").as_string()); + row->add(rmoviva.get("23.NUMDOC").as_string()); + row->add(last_data_pag); + row->add(rmoviva.get("25.GRUPPO").as_string()); + row->add(rmoviva.get("25.CONTO").as_string()); + row->add(rmoviva.get("25.SOTTOCONTO").as_string()); + strarr.add(row); + } + } + } + else + if (rmoviva.get("CODCMS").as_string().blank()) + { + row->cut(0); + row->add("", 0); + row->add(rmoviva.get("23.CODCF").as_string()); + row->add(rmoviva.get("20.RAGSOC").as_string()); + row->add(rmoviva.get(RMI_IMPONIBILE).as_real()); + row->add(rmoviva.get("23.DATADOC").as_string()); + row->add(rmoviva.get("23.NUMDOC").as_string()); + row->add(last_data_pag); + row->add(rmoviva.get("25.GRUPPO").as_string()); + row->add(rmoviva.get("25.CONTO").as_string()); + row->add(rmoviva.get("25.SOTTOCONTO").as_string()); + strarr.add(row); + } + } + } + sheet.force_update(); + sheet.show(); +} + +//metodo costruttore +TEsportaIva_msk::TEsportaIva_msk() : TAutomask("ps0713800a"){} + +/////////////////////////////////// +//// TEsportaIva_REC //// +/////////////////////////////////// + +//Classe TEsportaIva_rec (righe movimenti iva) +class TEsportaIva_rec : public TCSV_recordset +{ +public: + TEsportaIva_rec(); +}; + +//metodo costruttore +TEsportaIva_rec::TEsportaIva_rec() + : TCSV_recordset("CSV(\"\t\")") +{ +} + +/////////////////////////////////// +//// TEsportaIva_APP //// +/////////////////////////////////// + +//Classe TEsportaIva_app +class TEsportaIva_app : public TSkeleton_application +{ + friend class TEsportaIva_msk; +protected: + virtual bool check_autorization() const {return false;} + virtual const char * extra_modules() const {return "cg";} + virtual void main_loop(); + + bool test_partita(const long numreg, TDate& last_data_pag, const TDate& data) const; + +public: + void esporta_righe_iva(const TEsportaIva_msk& msk) const; + void set_inviva(TISAM_recordset& rmoviva, const TDate& data) const; +}; + +//TEST_PARTITA: metodo che cerca l'ultima data pagamento delle partite relative ad un numreg (la maggiore) +//il metodo restiruisce true se esiste almeno una partita per il numreg indicato +bool TEsportaIva_app::test_partita(const long numreg, TDate& last_data_pag, const TDate& data) const +{ + TPartite_array torneo; + //aggiungo all'array tutte le partite con quel numreg + torneo.add_numreg(numreg); + TPartita* partita = torneo.first(); + //se esiste almeno una partita ed è chiusa + if (partita != NULL && partita->chiusa()) + { + //scorro tutte le partite + for (int r = partita->last(); r > 0; r = partita->pred(r)) + { + //instanzio una riga_partite + const TRiga_partite& row = partita->riga(r); + const tipo_movimento tipo = row.tipo(); + //controllo il tipo_movimento; se è del tipo tm_pagamento o tm_pagamento_insoluto + //recupero la data del pagamento, e se questa è maggiore di quella già trovata, aggiorno + //quest'ultima + if (tipo == tm_pagamento || tipo == tm_pagamento_insoluto) + { + const TDate datadoc = row.get_date(PART_DATAPAG); + if (datadoc > last_data_pag) + last_data_pag = datadoc; + } + } + return last_data_pag <= data ? true : false; + } + return false; +} + +//ESPORTA_RIGHE_IVA: metodo che prepara il csv-recordset per essere esportato +void TEsportaIva_app::esporta_righe_iva(const TEsportaIva_msk& m) const +{ + // Controllo se i campi corretti + if(!m.testFields()) + return; + + //instanzio il TFilename e controllo la sua esistenza + TFilename path = m.get(F_PATH); + path.add(m.get(F_NAME)); + if (path.exist()) + { + TString str; + str << "ATTENZIONE! " << "Il file " << m.get(F_NAME) << "è già esistente.\n" + << "Se si procede sara' azzerato il file esistente!\nContinuare?"; + if (!yesno_box(str)) + return; + } + + //preparo le date di interesse + const TDate adata(m.get_date(F_ADATA)); + const TDate dadata(1, 1, adata.year() - 4); + + // Preparo query su righe iva joinati ai mov + TString query("USE RMOVIVA SELECT BETWEEN(23.DATAREG,#DADATA,#ADATA)&&(23.INVIVA!=\"X\")&&(23.TIPO=\"F\")"); + if(m.get_bool(B_FORNITORE)) + { + query << "&&(23.CODCF=#CODCF)"; + } + query << "\n"; + + bool with_cms = m.get_int(F_JOB) == 1; +/* if (m.get_int(F_JOB) == 1) + query << "&&(CODCMS!=\"\")\n"; + else + query << "&&(CODCMS=\"\")\n"; */ + + query << "JOIN MOV INTO NUMREG==NUMREG\n" + << "JOIN %IVA ALIAS 101 INTO CODTAB==CODIVA\n" + << "JOIN CLIFO TO MOV INTO TIPOCF==TIPO CODCF==CODCF"; + + //instanzio il recordset + TISAM_recordset rmoviva(query); + rmoviva.set_var("#DADATA", dadata); + rmoviva.set_var("#ADATA", adata); + + //instanzio il csv recordset + TEsportaIva_rec csv; + bool all = m.get_bool(B_PRTAPE) && m.get_bool(B_PRTCHIU); + TProgress_monitor pi(rmoviva.items(), TR("Estrazione dati...")); + for (bool ok = rmoviva.move_first(); ok && !pi.is_cancelled(); ok = rmoviva.move_next()) + { + if (!pi.add_status()) + break; + + TDate last_data_pag; + const long numreg = rmoviva.get(RMI_NUMREG).as_int(); + bool partita_chiusa; + if(!all) + partita_chiusa = test_partita(numreg, last_data_pag, adata); + + if (all || (m.get_bool(B_PRTAPE) && !partita_chiusa) || (m.get_bool(B_PRTCHIU) && partita_chiusa)) + { + if (with_cms) + { + TAnal_mov movana; + + movana.read_cgnum(numreg); + const int rows = movana.rows(); + + if (rows > 0) + { + for(int i = 1; i <= rows; i++) + { + csv.new_rec(""); + const TRectype& rmovana = movana.body()[i]; + const TString80 codcms = rmovana.get("CODCMS"); + + csv.set(0, codcms); + csv.set(1, rmoviva.get("23.CODCF")); + csv.set(2, rmoviva.get("20.RAGSOC")); + char sez = rmovana.get_char("SEZIONE"); + TImporto importo(sez, rmovana.get_real("IMPORTO")); + importo.normalize('D'); + csv.set(3, importo.valore()); + csv.set(6, rmoviva.get("23.DATADOC")); + csv.set(7, rmoviva.get("23.NUMDOC")); + csv.set(8, last_data_pag); + csv.set(9, rmoviva.get("25.GRUPPO")); + csv.set(10, rmoviva.get("25.CONTO")); + csv.set(11, rmoviva.get("25.SOTTOCONTO")); + } + while (rmoviva.move_next()) + { + const long wnumreg = rmoviva.get(RMI_NUMREG).as_int(); + if (wnumreg != numreg) + { + rmoviva.move_prev(); + break; + } + } + + } + else + { + const TString & codcms = rmoviva.get("CODCMS").as_string(); + + if (codcms.full()) + { + csv.new_rec(""); + csv.set(0, codcms); + csv.set(1, rmoviva.get("23.CODCF")); + csv.set(2, rmoviva.get("20.RAGSOC")); + csv.set(3, rmoviva.get(RMI_IMPONIBILE).as_real()); + csv.set(6, rmoviva.get("23.DATADOC")); + csv.set(7, rmoviva.get("23.NUMDOC")); + csv.set(8, last_data_pag); + csv.set(9, rmoviva.get("25.GRUPPO")); + csv.set(10, rmoviva.get("25.CONTO")); + csv.set(11, rmoviva.get("25.SOTTOCONTO")); + } + } + } + else + if (rmoviva.get("CODCMS").as_string().blank()) + { + csv.new_rec(""); + csv.set(0, ""); + csv.set(1, rmoviva.get("23.CODCF")); + csv.set(2, rmoviva.get("20.RAGSOC")); + csv.set(3, rmoviva.get(RMI_IMPONIBILE).as_real()); + csv.set(6, rmoviva.get("23.DATADOC")); + csv.set(7, rmoviva.get("23.NUMDOC")); + csv.set(8, last_data_pag); + csv.set(9, rmoviva.get("25.GRUPPO")); + csv.set(10, rmoviva.get("25.CONTO")); + csv.set(11, rmoviva.get("25.SOTTOCONTO")); + } + } + } + csv.save_as(path, fmt_text); + +#ifdef DBG + xvt_sys_goto_url(path, "open"); +#endif + + TString msg; + msg << TR("Si conferma l'esportazione definitiva dei movimenti IVA fino al ") << m.get(F_ADATA); + if (m.get_bool(B_PRTCHIU) && yesno_box(msg)) + set_inviva(rmoviva, adata); //mette il flag di "INVIVA" alla testata movimento + + // Salvo su file le impostazioni + ini_set_string(CONFIG_DITTA, "Esporta_Dati_IVA", "LastSend", m.get_date(F_DADATA)); +} + +//SET_INVIA: metodo che mette il flag di "INVIVA" alla testata movimento +void TEsportaIva_app::set_inviva(TISAM_recordset& rmoviva, const TDate& data) const +{ + return; //Test + long last_numreg = 0L; + + TProgind pi(rmoviva.items(), TR("Impostazione flag Inviata parte IVA..."), true, true); + TLocalisamfile mov(LF_MOV); + + //scorro il recordset che contiene le righe IVA joinate con i movimenti + for (bool ok = rmoviva.move_first(); ok; ok = rmoviva.move_next()) + { + if (!pi.addstatus(1)) + break; + + const long curr_numreg = rmoviva.get(RMI_NUMREG).as_int(); + //ad ogni cambio di numreg + if (curr_numreg != last_numreg) + { + TDate last_data_pag; + bool partita_chiusa = test_partita(curr_numreg, last_data_pag, data); + //controllo che la partita sia chiusa + if (partita_chiusa) + { + //leggo dal file LF_MOV quello che ha il numero di registrazione selezionato + mov.put(MOV_NUMREG, curr_numreg); + int err = mov.read(); + + //se riesco a leggerlo setto il flag di invio e aggiorno il movimento + if (err == NOERR) + { + mov.put(MOV_INVIVA, 'X'); + err = mov.rewrite(); + } + + //se non sono riuscito ne' a leggerlo ne' a scriverlo, lo segnalo + if (err != NOERR) + { + TString str; + str << TR("Impossibile aggiornare il movimento ") << curr_numreg; + error_box(str); + break; + } + } + last_numreg = curr_numreg; + } + } +} + +void TEsportaIva_app::main_loop() +{ + TEsportaIva_msk m; + while (m.run() == K_ENTER) + esporta_righe_iva(m); +} + +int ps0713800(int argc, char* argv[]) +{ + TEsportaIva_app app; + app.run(argc, argv, TR("Trasferimento dati IVA")); + return 0; +} diff --git a/src/ps/ps0713800a.h b/src/ps/ps0713800a.h new file mode 100644 index 000000000..1ab0ed53f --- /dev/null +++ b/src/ps/ps0713800a.h @@ -0,0 +1,23 @@ +//campi maschera ps0713800a +#define A_IDLAVORO 101 +#define A_CODF 102 +#define A_RAGSOC 103 +#define A_IMPORTO 104 +#define A_DATADOC 105 +#define A_NUMDOC 106 +#define A_GRUPPO 107 +#define A_CONTO 108 +#define A_SOTTOCONTO 109 + +#define F_PATH 201 +#define F_NAME 202 +#define F_DADATA 203 +#define F_ADATA 204 +#define F_JOB 205 +#define B_FORNITORE 206 +#define F_CODCF 207 +#define F_RAGSOC 208 +#define B_PRTAPE 209 +#define B_PRTCHIU 210 + +#define S_RESULT 301 \ No newline at end of file diff --git a/src/ps/ps0713800a.msk b/src/ps/ps0713800a.msk new file mode 100644 index 000000000..83bd35f2b --- /dev/null +++ b/src/ps/ps0713800a.msk @@ -0,0 +1,203 @@ +#include "ps0713800a.h" + +TOOLBAR "topbar" 0 0 0 2 + +BUTTON DLG_OK 2 2 +BEGIN + PROMPT 1 1 "Elabora" + PICTURE TOOL_ELABORA +END + +BUTTON DLG_RECALC 2 2 +BEGIN + PROMPT 1 1 "Aggiorna" + PICTURE TOOL_CONVERT +END + +#include + +ENDPAGE + +PAGE "Trasferimento dati IVA per ATS" -1 -1 80 10 + +STRING DLG_PROFILE 50 +BEGIN + PROMPT 9 -12 "Profilo " + PSELECT + FLAGS "H" +END + +STRING F_PATH 255 45 +BEGIN + PROMPT 0 1 "Cartella " + DSELECT + CHECKTYPE REQUIRED + FLAGS "M" + FIELD PATH +END + +STRING F_NAME 30 +BEGIN + PROMPT 60 1 "File " + FLAGS "D" + CHECKTYPE NORMAL + FIELD NAME +END + +DATE F_DADATA +BEGIN + PROMPT 0 2 "Da data " + CHECKTYPE REQUIRED + FIELD ADATA +END + +DATE F_ADATA +BEGIN + PROMPT 20 2 "A data " + CHECKTYPE REQUIRED + FIELD ADATA +END + +RADIOBUTTON F_JOB 12 +BEGIN + PROMPT 70 2 "ID lavoro" + ITEM "1|SI" + ITEM "2|NO" + FLAGS "Z" +END + +BOOLEAN B_FORNITORE +BEGIN + PROMPT 0 3 "Fornitore" +END + +NUMBER F_CODCF 6 +BEGIN + PROMPT 14 3 "Codice:" + USE LF_CLIFO + INPUT TIPOCF "F" SELECT + INPUT CODCF F_CODCF + DISPLAY "Codice" CODCF + DISPLAY "Ragione Sociale@50" RAGSOC + DISPLAY "Occasionale@C" OCCAS + DISPLAY "Codice Fiscale@16" COFI + DISPLAY "Partita IVA@15" PAIV + OUTPUT F_CODCF CODCF + OUTPUT F_RAGSOC RAGSOC + CHEKTYPE NORMAL + GROUP 1 + FLAGS "D" +END + +STRING F_RAGSOC 50 30 +BEGIN + PROMPT 30 3 "R.Soc: " + USE LF_CLIFO KEY 2 + INPUT TIPOCF "F" SELECT + INPUT RAGSOC F_RAGSOC + DISPLAY "Ragione Sociale@50" RAGSOC + DISPLAY "Codice" CODCF + DISPLAY "Codice Fiscale@16" COFI + DISPLAY "Partita IVA@15" PAIV + COPY OUTPUT F_CODCF + ADD RUN CG0 -1 + GROUP 1 + FLAGS "D" +END + +BOOLEAN B_PRTAPE +BEGIN + PROMPT 0 4 "Partita aperta" +END + +BOOLEAN B_PRTCHIU +BEGIN + PROMPT 20 4 "Partita chiusa" +END + +SPREADSHEET S_RESULT +BEGIN + PROMPT 0 5 "" + ITEM "ID Lavoro@10" + ITEM "Cod.\nFornitore@8" + ITEM "Rag. Soc.@30" + ITEM "Importo@10" + ITEM "Data\ndocumento@10" + ITEM "Numero\ndocumento@10" + ITEM "Gruppo@5" + ITEM "Conto@5" + ITEM "Sottoconto@10" + DEFAULT "*" // Impedisce il salvataggio su profilo .ini +END + +ENDPAGE +ENDMASK + +PAGE "Riga" -1 -1 69 10 + +NUMBER A_IDLAVORO 7 +BEGIN + PROMPT 1 0 "N.Movimento" + FLAGS "D" + FIELD PROGR +END + +STRING A_CODF 6 +BEGIN + PROMPT 1 0 "Codice Fornitore" + FLAGS "D" + FIELD PROGR +END + +STRING A_RAGSOC 50 +BEGIN + PROMPT 1 0 "Rag.Soc." + FLAGS "D" + FIELD PROGR +END + +NUMBER A_IMPORTO 18 3 +BEGIN + PROMPT 1 0 "Importo" + FLAGS "D" + FIELD PROGR +END + +DATE A_DATADOC +BEGIN + PROMPT 1 0 "Data Documento" + FLAGS "D" + FIELD PROGR +END + +STING A_NUMDOC 7 +BEGIN + PROMPT 1 0 "Numero Documento" + FLAGS "D" + FIELD PROGR +END + +NUMBER A_GRUPPO 3 +BEGIN + PROMPT 1 0 "Gruppo" + FLAGS "D" + FIELD PROGR +END + +NUMBER A_CONTO 3 +BEGIN + PROMPT 1 0 "Conto" + FLAGS "D" + FIELD PROGR +END + +NUMBER A_SOTTOCONTO 6 +BEGIN + PROMPT 1 0 "Sottoconto" + FLAGS "D" + FIELD PROGR +END + +ENDPAGE + +ENDMASK \ No newline at end of file