/* ----------------------------------------------------------------------------------
    KEME-Contabilidad; aplicación para llevar contabilidades

    Copyright (C)  José Manuel Díez Botella

    Este programa es software libre: usted puede redistribuirlo y/o modificarlo 
    bajo los términos de la Licencia Pública General GNU publicada 
    por la Fundación para el Software Libre, ya sea la versión 3 
    de la Licencia, o (a su elección) cualquier versión posterior.

    Este programa se distribuye con la esperanza de que sea útil, pero 
    SIN GARANTÍA ALGUNA; ni siquiera la garantía implícita 
    MERCANTIL o de APTITUD PARA UN PROPÓSITO DETERMINADO. 
    Consulte los detalles de la Licencia Pública General GNU para obtener 
    una información más detallada. 

    Debería haber recibido una copia de la Licencia Pública General GNU 
    junto a este programa. 
    En caso contrario, consulte <http://www.gnu.org/licenses/>.
  ----------------------------------------------------------------------------------*/

#include "calcestado.h"
#include <QSqlQuery>
#include "introci.h"
#include "funciones.h"
#include "referencias.h"
#include "aritmetica.h"
#include "basedatos.h"
#include "grafico.h"
#include <QMessageBox>
#include <QProgressDialog>


calcestado::calcestado() : QDialog() {
  ui.setupUi(this);

  comadecimal=haycomadecimal();
  decimales=haydecimales();
  QSqlQuery query = basedatos::instancia()->selectCodigoejerciciosordercodigo();
  QStringList ej1,ej2;
  ej2 << noejercicio();
  if ( query.isActive() ) {
          while ( query.next() )
              {
                ej1 << query.value(0).toString();
                ej2 << query.value(0).toString();
	      }
	  }
  ui.Ejercicio1comboBox->addItems(ej1);
  ui.Ejercicio2comboBox->addItems(ej2);

  QDate fechaini=inicioejercicio(ui.Ejercicio1comboBox->currentText());
  QDate fechafin=finejercicio(ui.Ejercicio1comboBox->currentText());

  ui.ini_ej1_dateEdit->setDate(fechaini);
  ui.fin_ej1_dateEdit->setDate(fechafin);

  ui.fechas_ej2_groupBox->setEnabled(false);

  condesglose=false;
  condesglosectas=false;
  hay_analitica_tabla=basedatos::instancia()->analitica_tabla();

  connect(ui.cilineEdit,SIGNAL(textChanged(QString)),this,SLOT(fijadescripciones()));
  connect(ui.buscapushButton,SIGNAL(clicked()),this,SLOT(buscapulsado()));
  connect(ui.referenciaspushButton,SIGNAL(clicked()), this, SLOT(procesareferencias()));
  connect(ui.CalcularpushButton,SIGNAL(clicked()), this, SLOT(calculaestado()));
  connect(ui.ConsultapushButton,SIGNAL(clicked()), this, SLOT (consulta( void )));
  connect(ui.ImprimirpushButton,SIGNAL(clicked()),this,SLOT(imprime()));
  connect(ui.copiarpushButton,SIGNAL(clicked()),this,SLOT(copia()));
  connect(ui.graficopushButton,SIGNAL(clicked()),this,SLOT(generagrafico()));

  connect(ui.Ejercicio1comboBox,SIGNAL(currentIndexChanged (QString)),this,SLOT(actualizacomboej1()));
  connect(ui.Ejercicio2comboBox,SIGNAL(currentIndexChanged (QString)),this,SLOT(actualizacomboej2()));

  connect(ui.ini_ej1_dateEdit,SIGNAL(dateChanged (QDate)),this,SLOT(fecha_ej1_ini_cambiada()));
  connect(ui.fin_ej1_dateEdit,SIGNAL(dateChanged (QDate)),this,SLOT(fecha_ej1_fin_cambiada()));
  connect(ui.ini_ej2_dateEdit,SIGNAL(dateChanged (QDate)),this,SLOT(fecha_ej2_ini_cambiada()));
  connect(ui.fin_ej2_dateEdit,SIGNAL(dateChanged (QDate)),this,SLOT(fecha_ej2_fin_cambiada()));
  connect(ui.latexpushButton,SIGNAL(clicked()),SLOT(latex()));
  connect(ui.xmlpushButton,SIGNAL(clicked()),SLOT(genera_xml()));

  msj_calculado=true;

#ifdef NOEDITTEX
 ui.latexpushButton->hide();
#endif

}


void calcestado::no_msj_calculado()
{
  msj_calculado=false;
}

void calcestado::pasaejercicio1(QString ejercicio)
{
    if (!ejercicio.isEmpty())
       {
        int indice=0;
        while (indice<ui.Ejercicio1comboBox->count())
           {
             if (ui.Ejercicio1comboBox->itemText(indice)==ejercicio) break;
             indice++;
           }
        if (indice>ui.Ejercicio1comboBox->count()) indice--;
        ui.Ejercicio1comboBox->setCurrentIndex(indice);
       }

}

void calcestado::pasaejercicio2(QString ejercicio)
{
    if (!ejercicio.isEmpty())
       {
        int indice=0;
        while (indice<ui.Ejercicio2comboBox->count())
           {
             if (ui.Ejercicio2comboBox->itemText(indice)==ejercicio) break;
             indice++;
           }
        if (indice>ui.Ejercicio2comboBox->count()) indice--;
        ui.Ejercicio2comboBox->setCurrentIndex(indice);
       }

}

void calcestado::fecha_ej1_ini_cambiada()
{
 QDate fecha=ui.ini_ej1_dateEdit->date();
 if (fecha < inicioejercicio(ui.Ejercicio1comboBox->currentText()))
    ui.ini_ej1_dateEdit->setDate(inicioejercicio(ui.Ejercicio1comboBox->currentText()));

 if (fecha > finejercicio(ui.Ejercicio1comboBox->currentText()))
    ui.ini_ej1_dateEdit->setDate(inicioejercicio(ui.Ejercicio1comboBox->currentText()));

}

void calcestado::fecha_ej1_fin_cambiada()
{
 QDate fecha=ui.fin_ej1_dateEdit->date();
 if (fecha < inicioejercicio(ui.Ejercicio1comboBox->currentText()))
    ui.fin_ej1_dateEdit->setDate(finejercicio(ui.Ejercicio1comboBox->currentText()));

 if (fecha > finejercicio(ui.Ejercicio1comboBox->currentText()))
    ui.fin_ej1_dateEdit->setDate(finejercicio(ui.Ejercicio1comboBox->currentText()));

}

void calcestado::fecha_ej2_ini_cambiada()
{
 QDate fecha=ui.ini_ej2_dateEdit->date();
 if (fecha < inicioejercicio(ui.Ejercicio2comboBox->currentText()))
    ui.ini_ej2_dateEdit->setDate(inicioejercicio(ui.Ejercicio2comboBox->currentText()));

 if (fecha > finejercicio(ui.Ejercicio2comboBox->currentText()))
    ui.ini_ej2_dateEdit->setDate(inicioejercicio(ui.Ejercicio2comboBox->currentText()));

}

void calcestado::fecha_ej2_fin_cambiada()
{
 QDate fecha=ui.fin_ej2_dateEdit->date();
 if (fecha < inicioejercicio(ui.Ejercicio2comboBox->currentText()))
    ui.fin_ej2_dateEdit->setDate(finejercicio(ui.Ejercicio2comboBox->currentText()));

 if (fecha > finejercicio(ui.Ejercicio2comboBox->currentText()))
    ui.fin_ej2_dateEdit->setDate(finejercicio(ui.Ejercicio2comboBox->currentText()));
}


void calcestado::actualizacomboej1()
{
  QDate fechaini=inicioejercicio(ui.Ejercicio1comboBox->currentText());
  QDate fechafin=finejercicio(ui.Ejercicio1comboBox->currentText());

  ui.ini_ej1_dateEdit->setDate(fechaini);
  ui.fin_ej1_dateEdit->setDate(fechafin);
}

void calcestado::actualizacomboej2()
{
  if (ui.Ejercicio2comboBox->currentText()==noejercicio())
    {
     ui.fechas_ej2_groupBox->setEnabled(false);
     return;
    }

  ui.fechas_ej2_groupBox->setEnabled(true);
  QDate fechaini=inicioejercicio(ui.Ejercicio2comboBox->currentText());
  QDate fechafin=finejercicio(ui.Ejercicio2comboBox->currentText());

  ui.ini_ej2_dateEdit->setDate(fechaini);
  ui.fin_ej2_dateEdit->setDate(fechafin);
}


QString calcestado::noejercicio()
{
  return tr("- -");
}


void calcestado::cargaestado( QString titulo )
{
   QDate lafecha;
   QSqlQuery query = basedatos::instancia()->selectCabeceraestadostitulo(titulo);
   if ( (query.isActive()) &&  (query.first()) ){
       ui.titulolabel->setText(query.value(0).toString());
	   QString ejercicio1,ejercicio2;
	   ejercicio1 = query.value(1).toString();
	   if (ejercicio1.length()==0)
	      {
	        QString apertura = basedatos::instancia()->selectMaxaperturaejercicios();
	        ejercicio1 = basedatos::instancia()->selectCodigoejercicioapertura(apertura);;
	      }
	   int indice=0;
	   while (indice<ui.Ejercicio1comboBox->count())
	      {
	        if (ui.Ejercicio1comboBox->itemText(indice)==ejercicio1) break;
	        indice++;
	      }
	   if (indice>ui.Ejercicio1comboBox->count()) indice--;
	   ui.Ejercicio1comboBox->setCurrentIndex(indice);
	   
	   ejercicio2=query.value(2).toString();
           if (ejercicio2.length()==0)
		ejercicio2=noejercicio();
	   indice=0;
	   while (indice<ui.Ejercicio2comboBox->count())
	      {
	        if (ui.Ejercicio2comboBox->itemText(indice)==ejercicio2) break;
	        indice++;
	      }
	   if (indice>ui.Ejercicio2comboBox->count()) indice--;
	   ui.Ejercicio2comboBox->setCurrentIndex(indice);
	   
	   lafecha=query.value(3).toDate();
	   if (lafecha.year()>2000)
	       ui.FechadateEdit->setDate(lafecha);
           QString linea=query.value(4).toString();
           int ndiarios=linea.count(' ')+1;
           for (int veces=0;veces<ndiarios;veces++)
               {
                QString trozo=linea.section(' ',veces,veces);
                ui.diariolistWidget->addItem(trozo);
               }
           // if (query.value(4).toBool()) ui.aperturalabel->setEnabled(true);
           // if (query.value(5).toBool()) ui.generallabel->setEnabled(true);
           // if (query.value(6).toBool()) ui.regularizacionlabel->setEnabled(true);
           if (query.value(5).toBool()) 
              {
               ui.medioslabel->setText("SALDOS MEDIOS");
               consaldosmedios=true;
               ui.fechas_ej1_groupBox->setEnabled(false);
               ui.fechas_ej2_groupBox->setEnabled(false);
              }
              else {ui.medioslabel->setText("SALDOS NORMALES");consaldosmedios=false;}
           if (query.value(6).toBool()) 
              {
               ui.analiticagroupBox->setEnabled(true);
               ui.cilineEdit->setText(query.value(7).toString());
              }
              else ui.analiticagroupBox->setDisabled(true);
           if (!query.value(8).toBool()) ui.referenciaspushButton->setEnabled(false);
           if (query.value(10).toBool() || query.value(13).toBool())
               {
                if (query.value(10).toBool())
                   {
                    condesglose=true;
                    ui.desgloselabel->setText("DETALLE AUXILIARES");
                   }
                if (query.value(13).toBool())
                   {
                    condesglosectas=true;
                    ui.desgloselabel->setText("DETALLE CUENTAS");
                   }
                ui.Ejercicio2comboBox->setEnabled(false);
                ui.ejercicio2textLabel->setEnabled(false);
                ui.fechas_ej2_groupBox->setEnabled(false);
               }
               else
                    {
                     ui.desgloselabel->setText("SIN DETALLE");
                    }
           if (query.value(5).toBool())
               {
                ui.diariolistWidget->setDisabled(true);
                // ui.aperturalabel->setDisabled(true);
                // ui.generallabel->setDisabled(true);
                // ui.regularizacionlabel->setDisabled(true);
               }
           if (query.value(11).toBool())
              ui.graficopushButton->setEnabled(true);
           ui.horalineEdit->setText(query.value(12).toString());
	  }
}



void calcestado::buscapulsado()
{
 introci *c = new introci();
 c->hazparafiltro();
 c->pasaci(ui.cilineEdit->text());
 c->exec();
 ui.cilineEdit->setText(c->cadenaci());
 delete(c);
}


void calcestado::fijadescripciones()
{

  QString codigo=ui.cilineEdit->text();
  QString cadena,descripcion;
  QString qnivel=0;
  ui.nivel1lineEdit->setText("");
  ui.nivel2lineEdit->setText("");
  ui.nivel3lineEdit->setText("");

 if (codigo.length()==0) return;

  if (codigo.startsWith("???"))
      {
       ui.nivel1lineEdit->setText(tr("CUALQUIERA"));
      }
      else
           {
            bool encontrada=buscaci(codigo.left(3),&descripcion,&qnivel);
            if (encontrada && qnivel.toInt()==1)
                ui.nivel1lineEdit->setText(descripcion);
           }

 if (codigo.length()<=3) return;

 if (codigo.mid(3,3)==QString("???")) ui.nivel2lineEdit->setText(tr("CUALQUIERA"));
     else
          {
           bool encontrada=buscaci(codigo.mid(3,3),&descripcion,&qnivel);
           int elnivel=qnivel.toInt();
           if (encontrada && elnivel==2)
              ui.nivel2lineEdit->setText(descripcion);
          }

 if (codigo.length()<=6) return;

 if (codigo.length()==7 && codigo[6]=='*')  ui.nivel3lineEdit->setText(tr("CUALQUIERA"));
    else
         {
          bool encontrada=buscaci(codigo.right(codigo.length()-6),&descripcion,&qnivel);
          if (encontrada && qnivel.toInt()==3)
             ui.nivel3lineEdit->setText(descripcion);
         }

}

void calcestado::procesareferencias()
{
 referencias *r = new referencias();
 r->cargaestado( ui.titulolabel->text() );
 r->exec();
 delete(r);

}


bool calcestado::haymedias()
{
    return basedatos::instancia()->calcestadohaymedias( ui.titulolabel->text() );
}


bool calcestado::saldosmediosbloqueados()
{
    if ( basedatos::instancia()->selectBloqsaldosmedios() )
    {
        QMessageBox::warning( this, tr("Estados Contables"),tr("IMPOSIBLE EL CÁLCULO, OTRO TERMINAL ESTÁ REALIZANDO OPERACIONES CON SALDOS MEDIOS"));
        return true;
    }
    return false;
}

void calcestado::bloqueasaldosmedios()
{
    basedatos::instancia()->updateConfiguracionbloqsaldosmedios(true);
}


void calcestado::desbloqueasaldosmedios()
{
    basedatos::instancia()->updateConfiguracionbloqsaldosmedios(false);
}


void calcestado::calculasaldosmediosperiodo(bool ejercicio1)
{
  QString cadquery;
  QString cadsubquery;
  QSqlQuery subquery;
  QSqlQuery query3;
  QString cadquery3;
  QString ejercicio="";
  QDate fechaini,fechafin;
  // asignamos ejercicio ...
  if (ejercicio1) ejercicio=ui.Ejercicio1comboBox->currentText();
     else ejercicio=ui.Ejercicio2comboBox->currentText();

    fechaini = basedatos::instancia()->selectAperturaejercicios(ejercicio);
    fechafin = basedatos::instancia()->selectCierreejercicios(ejercicio);
  
  QDate fechainicial;
  double saldoinicial=0;
  double numerador=0;
  double resultado=0;
  int denominador=0;
  int dias=0;
  QString cadnum;
  int cuentas = basedatos::instancia()->selectCountcodigosaldossubcuenta();

  ui.progressBar->reset();
  ui.progressBar->setMaximum(cuentas);
  QSqlQuery query = basedatos::instancia()->selectCodigosaldossubcuenta();
  int proceso=0;
  if ( query.isActive() ) {
          while ( query.next() ) {
            subquery = basedatos::instancia()->selectFechadebehaberdiariocuentafechasnocierreorderfecha( query.value(0).toString() , fechaini,fechafin);

	    if (subquery.isActive())
	       {
	         fechainicial=fechaini;
		 saldoinicial=0; numerador=0; denominador=0;
	         while (subquery.next())
		   {
		    QString cc;
		    dias=fechainicial.daysTo(subquery.value(0).toDate());
		    cc.setNum(dias);
		    cc.setNum(saldoinicial,'f');
		    fechainicial=subquery.value(0).toDate();
		    numerador+=saldoinicial*dias;
		    denominador+=dias;
		    saldoinicial+=subquery.value(1).toDouble()-subquery.value(2).toDouble();
		   }
		 dias=fechainicial.daysTo(fechafin);
		 numerador+=saldoinicial*dias;
		 denominador+=dias;
		 if (denominador>0) resultado=numerador/denominador;
		    else resultado=0;
		 cadnum.setNum(resultado,'f',2);

		 if (ejercicio1) basedatos::instancia()->updateSaldossubcuentasaldomedio1codigo(cadnum, query.value(0).toString() );
		    else basedatos::instancia()->updateSaldossubcuentasaldomedio2codigo(cadnum, query.value(0).toString() );

	       }
              proceso++;
              ui.progressBar->setValue(proceso);
              QApplication::processEvents();
          }
     }
   ui.progressBar->reset();
   ui.progressBar->setMaximum(100);
}



void calcestado::calculaestado()
{
   cargarinfo();
   if ( !cifiltrook(ui.cilineEdit->text()) && ui.cilineEdit->text().length()>0)
       {
	 QMessageBox::warning( this, tr("Estados Contables"),
          tr("ERROR: CÓDIGO DE IMPUTACIÓN INCORRECTO"));
	 return;
       }
   ui.progressBar->reset();
   ui.progressBar->setMaximum(100);
   if (consaldosmedios || haymedias())
      { 
        // calcestadomedio();
        // return;
       if (saldosmediosbloqueados()) return;
       bloqueasaldosmedios();
       calculasaldosmediosperiodo(true);
       if (ui.Ejercicio2comboBox->currentText()!=noejercicio()) calculasaldosmediosperiodo(false);
      }
   ui.progressBar->setValue(10);
   QApplication::processEvents();
   bool estadosmedios=consaldosmedios;
   //  ------------------------------------------------------------------------------------------------
    basedatos::instancia()->updateEstadoscalculadotitulo(false,ui.titulolabel->text());

  ui.progressBar->setValue(20);
  QApplication::processEvents();

 QSqlQuery query = basedatos::instancia()->select5Estadostituloordernodo(ui.titulolabel->text());
 QString qnodo,qformula;
 double resultado1=0;
 double resultado2=0;
 bool parte1;
 bool yacalculado=false;

 if (ui.desglose_mes_checkBox->isChecked())
 {
     if ( query.isActive() ) {
        while ( query.next() )
              {
               resultado2=0;
               parte1=query.value(0).toBool();
               qnodo=query.value(2).toString();
               qformula=query.value(3).toString();
               // lo hacemos en dos pasadas, primero evitamos los puntos con
               // totales de apartados con llaves
               if (qformula.contains('{')) continue;
               resultado1=calculapartado(qformula,ui.Ejercicio1comboBox->currentText(),&yacalculado,estadosmedios,
                                        ui.fechas_ej1_groupBox->isChecked(),
                                        ui.ini_ej1_dateEdit->date(),
                                        ui.fin_ej1_dateEdit->date());
               basedatos::instancia()->updateEstadoscalcularestado( resultado1, resultado2, true, parte1, qnodo, ui.titulolabel->text() );

               QDate inicio;
               QDate fin;
               double m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12;
               int anyo=inicioejercicio(ui.Ejercicio1comboBox->currentText()).year();
               inicio.setDate(anyo,1,1);
               fin.setDate(anyo,1,31);

               m1=calculapartado(qformula,ui.Ejercicio1comboBox->currentText(),
                                         &yacalculado,estadosmedios,
                                          true, // acotación
                                          inicio,
                                          fin,1);

               inicio.setDate(anyo,2,1);
               fin.setDate(anyo,3,1);
               fin=fin.addDays(-1);
               m2=calculapartado(qformula,ui.Ejercicio1comboBox->currentText(),
                                         &yacalculado,estadosmedios,
                                          true, // acotación
                                          inicio,
                                          fin,2);

               inicio.setDate(anyo,3,1);
               fin.setDate(anyo,3,31);
               m3=calculapartado(qformula,ui.Ejercicio1comboBox->currentText(),
                                         &yacalculado,estadosmedios,
                                          true, // acotación
                                          inicio,
                                          fin,3);

               inicio.setDate(anyo,4,1);
               fin.setDate(anyo,4,30);
               m4=calculapartado(qformula,ui.Ejercicio1comboBox->currentText(),
                                         &yacalculado,estadosmedios,
                                          true, // acotación
                                          inicio,
                                          fin,4);
               // ------------------------------------------------------------------
               inicio.setDate(anyo,5,1);
               fin.setDate(anyo,5,31);
               m5=calculapartado(qformula,ui.Ejercicio1comboBox->currentText(),
                                         &yacalculado,estadosmedios,
                                          true, // acotación
                                          inicio,
                                          fin,5);
               // ------------------------------------------------------------------
               inicio.setDate(anyo,6,1);
               fin.setDate(anyo,6,30);
               m6=calculapartado(qformula,ui.Ejercicio1comboBox->currentText(),
                                         &yacalculado,estadosmedios,
                                          true, // acotación
                                          inicio,
                                          fin,6);
               // ------------------------------------------------------------------
               inicio.setDate(anyo,7,1);
               fin.setDate(anyo,7,31);
               m7=calculapartado(qformula,ui.Ejercicio1comboBox->currentText(),
                                         &yacalculado,estadosmedios,
                                          true, // acotación
                                          inicio,
                                          fin,7);
               // ------------------------------------------------------------------
               inicio.setDate(anyo,8,1);
               fin.setDate(anyo,8,31);
               m8=calculapartado(qformula,ui.Ejercicio1comboBox->currentText(),
                                         &yacalculado,estadosmedios,
                                          true, // acotación
                                          inicio,
                                          fin,8);
               // ------------------------------------------------------------------
               inicio.setDate(anyo,9,1);
               fin.setDate(anyo,9,30);
               m9=calculapartado(qformula,ui.Ejercicio1comboBox->currentText(),
                                         &yacalculado,estadosmedios,
                                          true, // acotación
                                          inicio,
                                          fin,9);
               // ------------------------------------------------------------------
               inicio.setDate(anyo,10,1);
               fin.setDate(anyo,10,31);
               m10=calculapartado(qformula,ui.Ejercicio1comboBox->currentText(),
                                         &yacalculado,estadosmedios,
                                          true, // acotación
                                          inicio,
                                          fin,10);
               // ------------------------------------------------------------------
               inicio.setDate(anyo,11,1);
               fin.setDate(anyo,11,30);
               m11=calculapartado(qformula,ui.Ejercicio1comboBox->currentText(),
                                         &yacalculado,estadosmedios,
                                          true, // acotación
                                          inicio,
                                          fin,11);
               // ------------------------------------------------------------------
               inicio.setDate(anyo,12,1);
               fin.setDate(anyo,12,31);
               m12=calculapartado(qformula,ui.Ejercicio1comboBox->currentText(),
                                         &yacalculado,estadosmedios,
                                          true, // acotación
                                          inicio,
                                          fin,12);
               // ------------------------------------------------------------------

                      // queda grabar los resultados
               basedatos::instancia()->actu_rdos_mes( m1, m2, m3, m4, m5, m6, m7, m8, m9, m10,
                                                      m11, m12,
                                                      true, parte1, qnodo,
                                                      ui.titulolabel->text() );
              }

     }
 }

 if (!ui.desglose_mes_checkBox->isChecked())
  if ( query.isActive() ) {
     while ( query.next() ) 
           {
    	    resultado2=0;
    	    parte1=query.value(0).toBool();
    	    qnodo=query.value(2).toString();
    	    qformula=query.value(3).toString();
    	    // lo hacemos en dos pasadas, primero evitamos los puntos con
    	    // totales de apartados con llaves
    	    if (qformula.contains('{')) continue;
    	    resultado1=calculapartado(qformula,ui.Ejercicio1comboBox->currentText(),&yacalculado,estadosmedios,
                                     ui.fechas_ej1_groupBox->isChecked(),
                                     ui.ini_ej1_dateEdit->date(),
                                     ui.fin_ej1_dateEdit->date());
    	    if (ui.Ejercicio2comboBox->currentText()!=noejercicio())
    	     resultado2=calculapartado(qformula,ui.Ejercicio2comboBox->currentText(),&yacalculado,estadosmedios,
                                     ui.fechas_ej2_groupBox->isChecked(),
                                     ui.ini_ej2_dateEdit->date(),
                                     ui.fin_ej2_dateEdit->date());
                 // queda grabar los resultados
            basedatos::instancia()->updateEstadoscalcularestado( resultado1, resultado2, true, parte1, qnodo, ui.titulolabel->text() );
           }
 }


 ui.progressBar->setValue(50);
 QApplication::processEvents();
 //  QMessageBox::warning( this, tr("Estados Contables"),tr("AQUÍ ESTAMOS"));
 // hacemos otro barrido para calcular las funciones
int barridos=0; 
bool todoscalculados=true;

// hacer esto especial si hay desglose por mes
// solo para ejercicio1
if (ui.desglose_mes_checkBox->isChecked())
  {
    while (barridos<=20)
    {
    todoscalculados=true;
    query = basedatos::instancia()->select5Estadostituloordernodo(ui.titulolabel->text());
    if ( query.isActive() ) {
        while ( query.next() )
           {
             resultado2=0;
             parte1=query.value(0).toBool();
             qnodo=query.value(2).toString();
             qformula=query.value(3).toString();
             // lo hacemos en segunda pasada,
             // para totales de apartados con llaves
             if (qformula.contains('{')==0) continue;

             resultado1=calculapartado(qformula,ui.Ejercicio1comboBox->currentText(),
                                       &yacalculado,estadosmedios,
                                      ui.fechas_ej1_groupBox->isChecked(),
                                      ui.ini_ej1_dateEdit->date(),
                                      ui.fin_ej1_dateEdit->date());
             if (!yacalculado) todoscalculados=false;
                  // queda grabar los resultados
             basedatos::instancia()->updateEstadoscalcularestado( resultado1, resultado2,
                                                                  yacalculado, parte1,
                                                                  qnodo,
                                                                  ui.titulolabel->text() );


             QDate inicio;
             QDate fin;
             double m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12;
             int anyo=inicioejercicio(ui.Ejercicio1comboBox->currentText()).year();
             inicio.setDate(anyo,1,1);
             fin.setDate(anyo,1,31);

             m1=calculapartado(qformula,ui.Ejercicio1comboBox->currentText(),
                                       &yacalculado,estadosmedios,
                                        true, // acotación
                                        inicio,
                                        fin,1);
             if (!yacalculado) todoscalculados=false;

             inicio.setDate(anyo,2,1);
             fin.setDate(anyo,3,1);
             fin=fin.addDays(-1);
             m2=calculapartado(qformula,ui.Ejercicio1comboBox->currentText(),
                                       &yacalculado,estadosmedios,
                                        true, // acotación
                                        inicio,
                                        fin,2);
             if (!yacalculado) todoscalculados=false;

             inicio.setDate(anyo,3,1);
             fin.setDate(anyo,3,31);
             m3=calculapartado(qformula,ui.Ejercicio1comboBox->currentText(),
                                       &yacalculado,estadosmedios,
                                        true, // acotación
                                        inicio,
                                        fin,3);
             if (!yacalculado) todoscalculados=false;

             inicio.setDate(anyo,4,1);
             fin.setDate(anyo,4,30);
             m4=calculapartado(qformula,ui.Ejercicio1comboBox->currentText(),
                                       &yacalculado,estadosmedios,
                                        true, // acotación
                                        inicio,
                                        fin,4);
             if (!yacalculado) todoscalculados=false;
             // ------------------------------------------------------------------
             inicio.setDate(anyo,5,1);
             fin.setDate(anyo,5,31);
             m5=calculapartado(qformula,ui.Ejercicio1comboBox->currentText(),
                                       &yacalculado,estadosmedios,
                                        true, // acotación
                                        inicio,
                                        fin,5);
             if (!yacalculado) todoscalculados=false;
             // ------------------------------------------------------------------
             inicio.setDate(anyo,6,1);
             fin.setDate(anyo,6,30);
             m6=calculapartado(qformula,ui.Ejercicio1comboBox->currentText(),
                                       &yacalculado,estadosmedios,
                                        true, // acotación
                                        inicio,
                                        fin,6);
             if (!yacalculado) todoscalculados=false;
             // ------------------------------------------------------------------
             inicio.setDate(anyo,7,1);
             fin.setDate(anyo,7,31);
             m7=calculapartado(qformula,ui.Ejercicio1comboBox->currentText(),
                                       &yacalculado,estadosmedios,
                                        true, // acotación
                                        inicio,
                                        fin,7);
             if (!yacalculado) todoscalculados=false;
             // ------------------------------------------------------------------
             inicio.setDate(anyo,8,1);
             fin.setDate(anyo,8,31);
             m8=calculapartado(qformula,ui.Ejercicio1comboBox->currentText(),
                                       &yacalculado,estadosmedios,
                                        true, // acotación
                                        inicio,
                                        fin,8);
             if (!yacalculado) todoscalculados=false;
             // ------------------------------------------------------------------
             inicio.setDate(anyo,9,1);
             fin.setDate(anyo,9,30);
             m9=calculapartado(qformula,ui.Ejercicio1comboBox->currentText(),
                                       &yacalculado,estadosmedios,
                                        true, // acotación
                                        inicio,
                                        fin,9);
             if (!yacalculado) todoscalculados=false;
             // ------------------------------------------------------------------
             inicio.setDate(anyo,10,1);
             fin.setDate(anyo,10,31);
             m10=calculapartado(qformula,ui.Ejercicio1comboBox->currentText(),
                                       &yacalculado,estadosmedios,
                                        true, // acotación
                                        inicio,
                                        fin,10);
             if (!yacalculado) todoscalculados=false;
             // ------------------------------------------------------------------
             inicio.setDate(anyo,11,1);
             fin.setDate(anyo,11,30);
             m11=calculapartado(qformula,ui.Ejercicio1comboBox->currentText(),
                                       &yacalculado,estadosmedios,
                                        true, // acotación
                                        inicio,
                                        fin,11);
             if (!yacalculado) todoscalculados=false;
             // ------------------------------------------------------------------
             inicio.setDate(anyo,12,1);
             fin.setDate(anyo,12,31);
             m12=calculapartado(qformula,ui.Ejercicio1comboBox->currentText(),
                                       &yacalculado,estadosmedios,
                                        true, // acotación
                                        inicio,
                                        fin,12);
             if (!yacalculado) todoscalculados=false;
             // ------------------------------------------------------------------

                    // queda grabar los resultados
             basedatos::instancia()->actu_rdos_mes( m1, m2, m3, m4, m5, m6, m7, m8, m9, m10,
                                                    m11, m12,
                                                    yacalculado, parte1, qnodo,
                                                    ui.titulolabel->text() );
           }
    }
       barridos++;
       if (todoscalculados) break;
    }


  }

if (!ui.desglose_mes_checkBox->isChecked())
{
 while (barridos<=20)
 {
 todoscalculados=true;
 query = basedatos::instancia()->select5Estadostituloordernodo(ui.titulolabel->text());
 if ( query.isActive() ) {
     while ( query.next() ) 
        {
	    resultado2=0;
	    parte1=query.value(0).toBool();
	    qnodo=query.value(2).toString();
	    qformula=query.value(3).toString();
	    // lo hacemos en segunda pasada,
	    // para totales de apartados con llaves
	    if (qformula.contains('{')==0) continue;
	    resultado1=calculapartado(qformula,ui.Ejercicio1comboBox->currentText(),&yacalculado,estadosmedios,
                                     ui.fechas_ej1_groupBox->isChecked(),
                                     ui.ini_ej1_dateEdit->date(),
                                     ui.fin_ej1_dateEdit->date());
        if (!yacalculado) todoscalculados=false;
	    if (ui.Ejercicio2comboBox->currentText()!=noejercicio())
	     resultado2=calculapartado(qformula,ui.Ejercicio2comboBox->currentText(),&yacalculado,estadosmedios,
                                     ui.fechas_ej2_groupBox->isChecked(),
                                     ui.ini_ej2_dateEdit->date(),
                                     ui.fin_ej2_dateEdit->date());
        if (!yacalculado) todoscalculados=false;
                 // queda grabar los resultados
            basedatos::instancia()->updateEstadoscalcularestado( resultado1, resultado2, yacalculado, parte1, qnodo, ui.titulolabel->text() );
        }
 }
    barridos++;
    if (todoscalculados) break;
 }
}


 ui.progressBar->setValue(90);
 QApplication::processEvents();
 if (!todoscalculados)
   {
     QMessageBox::warning( this, tr("Estados Contables"),tr("ERROR en el cálculo, ¿referencia circular?"));
     desbloqueasaldosmedios();
     ui.progressBar->reset();
     return;
   }

 // Queda grabar la cabecera del estado contable

 grabacabeceraestado();
 
 // calculamos fórmula base  porcentaje
 // campo valorbasepor
 QString formulabasepor = basedatos::instancia()->selectFormulabaseporcabeceraestadostitulo(ui.titulolabel->text());
     if ( formulabasepor.length()>0 )
           {
             resultado1=calculapartado(formulabasepor,ui.Ejercicio1comboBox->currentText(),
                        &yacalculado,estadosmedios,
                        ui.fechas_ej1_groupBox->isChecked(),
                        ui.ini_ej1_dateEdit->date(),
                        ui.fin_ej1_dateEdit->date());
             if (ui.Ejercicio2comboBox->currentText()!=noejercicio())
                resultado2=calculapartado(formulabasepor,ui.Ejercicio2comboBox->currentText(),
                      &yacalculado,estadosmedios,
                      ui.fechas_ej2_groupBox->isChecked(),
                      ui.ini_ej2_dateEdit->date(),
                      ui.fin_ej2_dateEdit->date());
    
             basedatos::instancia()->updateCabeceraestadosvalorbaseportitulo(resultado1,resultado2, ui.titulolabel->text() );
            }
   desbloqueasaldosmedios();
   ui.progressBar->setValue(100);
   QApplication::processEvents();
   if (msj_calculado)
      QMessageBox::information( this, tr("Cálculo de Estado Contable"),
       tr("Se han realizado todos los cálculos para el Estado" ));
   ui.progressBar->reset();
   return;
}


double calcestado::calculapartado( QString formula, QString ejercicio, bool *calculado, bool estadosmedios,
                                   bool acotacion, QDate fecha1, QDate fecha2, int mes )
{
  //empezamos por reemplazar corchetes de cuentas
  if (formula.length()==0) return 0;
  QString cadpru;
  QString extract;
  QString cadval;
  bool solopositivo=false;
  cadpru=formula;
  // eliminamos espacios de cadpru
  cadpru.remove(' ');
  if (cadpru.contains(cadpositivo()))
     {
       solopositivo=true;
       cadpru.remove(cadpositivo());
     }
  double valor;
  int final;
  int inicio;
  int indice=0;
  while (indice<cadpru.length())
      {
         *calculado=true;
         if (cadpru[indice]=='[')
           {
              inicio=indice;
              final=inicio;
              while (final<cadpru.length() && cadpru[final]!=']') final++;
              // extraemos la cadena de la cuenta sin corchetes
              extract=cadpru.mid(inicio+1,final-inicio-1);
              // habría que calcular el valor de la cuenta
              // QMessageBox::warning( this, tr("Estados Contables"),extract);
              // -------------------------------------------------------------------------------------
              if (extract.contains(':')==1) valor=cuentaespec(extract,ejercicio,acotacion,fecha1,fecha2);
               else
                if (extract.contains(';')==1) valor=calculacuentaci(extract,ejercicio,acotacion,fecha1,fecha2);
                else
	            {
                      if (!estadosmedios)
                         {
                          if (mes==0)
                            {
                             if (ejercicio==ui.Ejercicio1comboBox->currentText())
                               valor=saldo_cuenta_lista_ej1(extract);
                             else
                               valor=saldo_cuenta_lista_ej2(extract);
                            }
                            else valor=saldo_cuenta_lista_mes(extract, mes);
                         }
	                 else
	                     {
	                       if (ui.Ejercicio1comboBox->currentText()==ejercicio)
                             valor=calculamediacuenta(extract,true);
                           else
                             valor=calculamediacuenta(extract,false);
	                     }
	            }
	     if (valor>-0.004 && valor < 0.005) valor=0;
             cadval.setNum(valor,'f',2);
             if (valor<0 && inicio>=1 && cadpru[inicio-1]=='+' ) inicio--;
             if (valor<0 && inicio>=1 && cadpru[inicio-1]=='-' )
               {cadpru[inicio-1]='+'; cadval.setNum(valor*-1,'f',2); }
             cadpru.remove(inicio,final-inicio+1);
             cadpru.insert(inicio,cadval);
             continue;
           }
      if (cadpru[indice]=='{')
           {
              inicio=indice;
              final=inicio;
              while (final<cadpru.length() && cadpru[final]!='}') final++;
              // extraemos la cadena de la cuenta sin llaves
              extract=cadpru.mid(inicio+1,final-inicio-1);
              // habría que calcular el valor de la fórmula
              // QMessageBox::warning( this, tr("Estados Contables"),extract);
              int ejercicio1=0;
              if (ejercicio==ui.Ejercicio1comboBox->currentText()) ejercicio1=1;
               // QMessageBox::warning( this, tr("Estados Contables"),ejercicio+extract);
              valor=calculaformula(extract,ejercicio1,calculado,mes);
               // QMessageBox::warning( this, tr("Estados Contables"),ejercicio);
              if (!*calculado) return 0;
              cadval.setNum(valor,'f',2);
               if (valor<0 && inicio>=1 && cadpru[inicio-1]=='+' ) inicio--;
               if (valor<0 && inicio>=1 && cadpru[inicio-1]=='-' ) 
	        {
	         cadpru[inicio-1]='+';
	         cadval.setNum(valor*-1,'f',2);
	        }
              cadpru.remove(inicio,final-inicio+1);
              cadpru.insert(inicio,cadval);
              continue;
           }
       indice++;
      }
  int okeval;
  exparitmetica expresion;
  if (cadpru[0]=='+') { cadpru[0]=' '; cadpru.remove(' ');}
  if (cadpru[0]=='-' && cadpru[1]=='(') cadpru=cadpru.insert(1,"1*");
  cadpru.left(-1).replace("(+","(");
  // QMessageBox::warning( this, tr("Estados Contables"),cadpru);
  expresion.inicializa(cadpru);
  valor=expresion.resultado(&okeval);
  if (solopositivo) if (valor<0) valor=0;
  if (!okeval) valor=0;
 cadval.setNum(valor,'f',2);
  // QMessageBox::warning( this, tr("Estados Contables"),cadval);
  // QMessageBox::warning( this, tr("Estados Contables"),/*formula*/cadval+" "+ cadpru);
 return valor; // ojo hay que cambiar
}

void calcestado::cargarinfo()
{
    // cargamos samadebe y sumahaber
    // ejercicio1
    auxiliares.clear();
    saldos.clear();
    auxiliares2.clear();
    saldos2.clear();

    QDate fechaini,fechafin;

    fechaini = basedatos::instancia()->selectAperturaejercicios(ui.Ejercicio1comboBox->currentText());
    fechafin = basedatos::instancia()->selectCierreejercicios(ui.Ejercicio1comboBox->currentText());

    if (ui.fechas_ej1_groupBox->isChecked())
       {
        fechaini=ui.ini_ej1_dateEdit->date();
        fechafin=ui.fin_ej1_dateEdit->date();
       }

    QString subcadena="";
    // ESPECIFICAMOS DIARIOS SEGÚN CONTENIDO DE LA LISTA
    int numdiarios=ui.diariolistWidget->count();
    QString primer_diario;
    for (int veces=0;veces<numdiarios;veces++)
       {
        if (subcadena=="") subcadena=subcadena+" and (";
          else subcadena=subcadena+" or ";
        subcadena+="diario='";
        ui.diariolistWidget->setCurrentRow(veces);
        QString caddia=ui.diariolistWidget->currentItem()->text();
        if (veces==0) primer_diario=ui.diariolistWidget->currentItem()->text();
        if (caddia!=diario_no_asignado())
           subcadena+=caddia;
        subcadena+="'";
       }
    if (subcadena.length()>0) subcadena+=")";

    QSqlQuery q;
    if (!ui.analiticagroupBox->isEnabled())
       {
        if (numdiarios==1 && primer_diario==diario_apertura())
            q=basedatos::instancia()->cuentas_saldo_estados_apertura(fechaini, fechafin, subcadena, "");
          else
            q=basedatos::instancia()->cuentas_saldo_estados (fechaini, fechafin, subcadena, "");
       }
       else
           {
             if (!hay_analitica_tabla) q=basedatos::instancia()->cuentas_saldo_estados (fechaini, fechafin, subcadena, ui.cilineEdit->text());
               else q=basedatos::instancia()->cuentas_saldo_estados_ci (fechaini, fechafin, subcadena, ui.cilineEdit->text());
           }

    if (q.isActive())
        while (q.next())
          {
            auxiliares << q.value(0).toString();
            saldos << q.value(1).toDouble();
          }

    // ejercicio2
   if (ui.Ejercicio2comboBox->currentText()!=noejercicio())
    {
    // cargamos listas de segundo ejercicio
    fechaini = basedatos::instancia()->selectAperturaejercicios(ui.Ejercicio2comboBox->currentText());
    fechafin = basedatos::instancia()->selectCierreejercicios(ui.Ejercicio2comboBox->currentText());

    if (ui.fechas_ej2_groupBox->isChecked())
       {
        fechaini=ui.ini_ej2_dateEdit->date();
        fechafin=ui.fin_ej2_dateEdit->date();
       }

    if (!ui.analiticagroupBox->isEnabled())
       {
        q=basedatos::instancia()->cuentas_saldo_estados (fechaini, fechafin, subcadena, "");
       }
       else
           {
             if (!hay_analitica_tabla) q=basedatos::instancia()->cuentas_saldo_estados (fechaini, fechafin, subcadena, ui.cilineEdit->text());
               else q=basedatos::instancia()->cuentas_saldo_estados_ci (fechaini, fechafin, subcadena, ui.cilineEdit->text());
           }

    if (q.isActive())
        while (q.next())
          {
            auxiliares2 << q.value(0).toString();
            saldos2 << q.value(1).toDouble();
          }
   } // fin ejercicio 2

    // cargamos saldos mensuales si procede
    if (!ui.desglose_mes_checkBox->isChecked()) return;

    // auxm1.clear(); auxm2.clear(); auxm3.clear(); auxm4.clear(); auxm5.clear(); auxm6.clear(); auxm7.clear();
    // auxm8.clear(); auxm9.clear(); auxm10.clear(); auxm11.clear(); auxm12.clear();

    // saldosm1.clear(); saldosm2.clear(); saldosm3.clear(); saldosm4.clear(); saldosm5.clear(); saldosm6.clear();
    //saldosm7.clear(); saldosm8.clear(); saldosm9.clear(); saldosm10.clear(); saldosm11.clear(); saldosm12.clear();
    for (int veces=0;veces<12;veces++)
       {
        auxm[veces].clear();
        saldosm[veces].clear();
       }
    int anyo=inicioejercicio(ui.Ejercicio1comboBox->currentText()).year();
    fechaini.setDate(anyo,1,1);
    fechafin.setDate(anyo,1,31);

    q=consulta_aux_saldo(fechaini, fechafin, subcadena);

    if (q.isActive())
        while (q.next())
          {
            auxm[0] << q.value(0).toString();
            saldosm[0] << q.value(1).toDouble();
          }

    fechaini.setDate(anyo,2,1);
    fechafin.setDate(anyo,3,1);
    fechafin=fechafin.addDays(-1);

    q=consulta_aux_saldo(fechaini, fechafin, subcadena);

    if (q.isActive())
        while (q.next())
          {
            auxm[1] << q.value(0).toString();
            saldosm[1] << q.value(1).toDouble();
            //QMessageBox::warning( this, tr("Estados Contables"),q.value(0).toString() + " "+ q.value(1).toString()+" ");
          }
    //QMessageBox::warning(this,tr("estados"),auxm[1].at(2));

    fechaini.setDate(anyo,3,1);
    fechafin.setDate(anyo,3,31);
    q=consulta_aux_saldo(fechaini, fechafin, subcadena);

    if (q.isActive())
        while (q.next())
          {
            auxm[2] << q.value(0).toString();
            saldosm[2] << q.value(1).toDouble();
          }

    fechaini.setDate(anyo,4,1);
    fechafin.setDate(anyo,4,30);
    q=consulta_aux_saldo(fechaini, fechafin, subcadena);

    if (q.isActive())
        while (q.next())
          {
            auxm[3] << q.value(0).toString();
            saldosm[3] << q.value(1).toDouble();
          }
    // ------------------------------------------------------------------
    fechaini.setDate(anyo,5,1);
    fechafin.setDate(anyo,5,31);
    q=consulta_aux_saldo(fechaini, fechafin, subcadena);

    if (q.isActive())
        while (q.next())
          {
            auxm[4] << q.value(0).toString();
            saldosm[4] << q.value(1).toDouble();
          }
    // ------------------------------------------------------------------
    fechaini.setDate(anyo,6,1);
    fechafin.setDate(anyo,6,30);
    q=consulta_aux_saldo(fechaini, fechafin, subcadena);

    if (q.isActive())
        while (q.next())
          {
            auxm[5] << q.value(0).toString();
            saldosm[5] << q.value(1).toDouble();
          }
    // ------------------------------------------------------------------
    fechaini.setDate(anyo,7,1);
    fechafin.setDate(anyo,7,31);
    q=consulta_aux_saldo(fechaini, fechafin, subcadena);

    if (q.isActive())
        while (q.next())
          {
            auxm[6] << q.value(0).toString();
            saldosm[6] << q.value(1).toDouble();
          }
    // ------------------------------------------------------------------
    fechaini.setDate(anyo,8,1);
    fechafin.setDate(anyo,8,31);
    q=consulta_aux_saldo(fechaini, fechafin, subcadena);

    if (q.isActive())
        while (q.next())
          {
            auxm[7] << q.value(0).toString();
            saldosm[7] << q.value(1).toDouble();
          }
    // ------------------------------------------------------------------
    fechaini.setDate(anyo,9,1);
    fechafin.setDate(anyo,9,30);
    q=consulta_aux_saldo(fechaini, fechafin, subcadena);

    if (q.isActive())
        while (q.next())
          {
            auxm[8] << q.value(0).toString();
            saldosm[8] << q.value(1).toDouble();
          }
    // ------------------------------------------------------------------
    fechaini.setDate(anyo,10,1);
    fechafin.setDate(anyo,10,31);
    q=consulta_aux_saldo(fechaini, fechafin, subcadena);

    if (q.isActive())
        while (q.next())
          {
            auxm[9] << q.value(0).toString();
            saldosm[9] << q.value(1).toDouble();
          }
    // ------------------------------------------------------------------
    fechaini.setDate(anyo,11,1);
    fechafin.setDate(anyo,11,30);
    q=consulta_aux_saldo(fechaini, fechafin, subcadena);

    if (q.isActive())
        while (q.next())
          {
            auxm[10] << q.value(0).toString();
            saldosm[10] << q.value(1).toDouble();
          }
    // ------------------------------------------------------------------
    fechaini.setDate(anyo,12,1);
    fechafin.setDate(anyo,12,31);
    q=consulta_aux_saldo(fechaini, fechafin, subcadena);

    if (q.isActive())
        while (q.next())
          {
            auxm[11] << q.value(0).toString();
            saldosm[11] << q.value(1).toDouble();
          }

}


QSqlQuery calcestado::consulta_aux_saldo(QDate fechaini, QDate fechafin, QString subcadena)
{
    QSqlQuery q;
    if (!ui.analiticagroupBox->isEnabled())
       {
        q=basedatos::instancia()->cuentas_saldo_estados (fechaini, fechafin, subcadena, "");
       }
       else
           {
             if (!hay_analitica_tabla) q=basedatos::instancia()->cuentas_saldo_estados (fechaini, fechafin, subcadena, ui.cilineEdit->text());
               else q=basedatos::instancia()->cuentas_saldo_estados_ci (fechaini, fechafin, subcadena, ui.cilineEdit->text());
           }
     return q;
}

double calcestado::saldo_cuenta_lista_mes(QString codigo, int mes)
{
    bool positivo=false;
    bool negativo=false;
    positivo=codigo.contains('+');
    negativo=codigo.contains('-');
    if (positivo && negativo) return 0;
    if (positivo) codigo.remove('+');
    if (negativo) codigo.remove('-');
    double resultado=0;
    for (int veces=0; veces<auxm[mes-1].count(); veces++)
        {
         if (auxm[mes-1].at(veces).startsWith(codigo))
            {
             if (!positivo && !negativo) resultado+=saldosm[mes-1].at(veces);
             if (positivo && saldosm[mes-1].at(veces)>0) resultado+=saldosm[mes-1].at(veces);
             if (negativo && saldosm[mes-1].at(veces)<0) resultado+=saldosm[mes-1].at(veces);
            }
        }
    return resultado;

}

double calcestado::saldo_cuenta_lista_ej1(QString codigo)
{
    bool positivo=false;
    bool negativo=false;
    positivo=codigo.contains('+');
    negativo=codigo.contains('-');
    if (positivo && negativo) return 0;
    if (positivo) codigo.remove('+');
    if (negativo) codigo.remove('-');
    double resultado=0;
    for (int veces=0; veces<auxiliares.count(); veces++)
        {
         if (auxiliares.at(veces).startsWith(codigo))
            {
             if (!positivo && !negativo) resultado+=saldos.at(veces);
             if (positivo && saldos.at(veces)>0) resultado+=saldos.at(veces);
             if (negativo && saldos.at(veces)<0) resultado+=saldos.at(veces);
            }
        }
    return resultado;
}

double calcestado::saldo_cuenta_lista_ej2(QString codigo)
{
    bool positivo=false;
    bool negativo=false;
    positivo=codigo.contains('+');
    negativo=codigo.contains('-');
    if (positivo && negativo) return 0;
    if (positivo) codigo.remove('+');
    if (negativo) codigo.remove('-');
    double resultado=0;
    for (int veces=0; veces<auxiliares2.count(); veces++)
        {
         if (auxiliares2.at(veces).startsWith(codigo))
            {
             if (!positivo && !negativo) resultado+=saldos2.at(veces);
             if (positivo && saldos2.at(veces)>0) resultado+=saldos2.at(veces);
             if (negativo && saldos2.at(veces)<0) resultado+=saldos2.at(veces);
            }
        }
    return resultado;

}

double calcestado::calculacuenta(QString codigo, QString ejercicio, bool acotacion,
                                 QDate fecha1, QDate fecha2, QString const & ciAdd)
{
  bool positivo=false;
  bool negativo=false;
  positivo=codigo.contains('+');
  negativo=codigo.contains('-');
  if (positivo && negativo) return 0;
  if (positivo) codigo.remove('+');
  if (negativo) codigo.remove('-');
  if (ui.previsiones->isChecked())
     {
      double valor=prevision(codigo,ejercicio);
      if (positivo && valor<0) return 0;
      if (negativo && valor>0) return 0;
      return valor;
     }
  if (!ui.diariolistWidget->isEnabled() ) return 0;
  QDate fechaini,fechafin;

  fechaini = basedatos::instancia()->selectAperturaejercicios(ejercicio);
  fechafin = basedatos::instancia()->selectCierreejercicios(ejercicio);

  if (acotacion)
     {
      fechaini=fecha1;
      fechafin=fecha2;
     }

  double resultado=0;

  QString subcadena="";
  // ESPECIFICAMOS DIARIOS SEGÚN CONTENIDO DE LA LISTA
  int numdiarios=ui.diariolistWidget->count();
  for (int veces=0;veces<numdiarios;veces++)
     {
      if (subcadena=="") subcadena=subcadena+" and (";
        else subcadena=subcadena+" or ";
      subcadena+="diario='";
      ui.diariolistWidget->setCurrentRow(veces);
      QString caddia=ui.diariolistWidget->currentItem()->text();
      if (caddia!=diario_no_asignado())
         subcadena+=caddia;
      subcadena+="'";
     }
  if (subcadena.length()>0) subcadena+=")";
  //jsala
  // subcadena += ciWhere;
  //jsala
  // vemos donde puede casar ciAdd
  QString pasarci;
  if (!ciAdd.isEmpty()) pasarci=ciAdd;
     else pasarci=ui.cilineEdit->text();
  QSqlQuery query;
  if (!ui.analiticagroupBox->isEnabled())
  // if (!hay_analitica_tabla || (hay_analitica_tabla && !es_cuenta_para_analitica(codigo)))
      query = basedatos::instancia()->selectCuentadebehaberdiariocuentafechasgroupcuenta(codigo,
                                       fechaini, fechafin, subcadena, pasarci );
   else
     {
       if (!hay_analitica_tabla)
           query = basedatos::instancia()->selectCuentadebehaberdiariocuentafechasgroupcuenta(codigo,
                                            fechaini, fechafin, subcadena, pasarci );
         else
          query = basedatos::instancia()->debehaber_ci(codigo, fechaini, fechafin, subcadena,
                                                   pasarci );
     }

  if ( query.isActive() ) {
     while ( query.next() ) 
           {
            if (positivo || negativo)
               {
                if (positivo && query.value(1).toDouble()>0) resultado+=query.value(1).toDouble();
                if (negativo && query.value(1).toDouble()<0) resultado+=query.value(1).toDouble();
               }
               else
	           resultado+=query.value(1).toDouble();
           }
     }
  return resultado;
}




double calcestado::calculaformula( QString codigo, int ejercicio1,bool *calculado, int mes=0)
{
  // tenemos un código de nodo con indicación de parte del estado
 // 1 ó 2 entre paréntesis
 // intentamos conocer la parte del estado (1 derecha, 2 izquierda)
    int pos;
    int izquierdo;
    QString extract="";
    *calculado=0;
    if (codigo.indexOf('(')<0) return 0;
    pos=codigo.indexOf('(');
    if (pos+1>=codigo.length()) return 0;
    if (codigo[pos+1]=='1') izquierdo=1; 
       else { if (codigo[pos+1]=='2') izquierdo=0; else return 0;   }
   // aislamos código de nodo
    extract=codigo.left(pos);
    // consultamos estados en busca del nodo extract 

 QSqlQuery query;
 if (mes==0)
  {
   if (ejercicio1)
    query= basedatos::instancia()->selectImporte1calculadonodoparte1titulo(extract,
        izquierdo,ui.titulolabel->text());
   else
    query=basedatos::instancia()->selectImporte2calculadonodoparte1titulo(extract,izquierdo,
        ui.titulolabel->text());
  }
  else
      {
       // total de mes X de ejercicio1
      query= basedatos::instancia()->selectImporte1calculadonodoparte1titulo(extract,
          izquierdo,ui.titulolabel->text(),mes);
      }

 double resultado=0;
 if ( query.isActive() ) {
     while ( query.next() ) 
           {
	    resultado=query.value(0).toDouble();
	    *calculado=query.value(1).toBool();
           }
    }
 return resultado;
}


void calcestado::grabacabeceraestado()
{
 QDate fechaactual;
 QString cadena;
 QSqlQuery query;
 fechaactual=QDate::currentDate();
 ui.FechadateEdit->setDate(fechaactual);
 QTime hora=QTime::currentTime();
 QString cadhora=hora.toString("hh:mm:ss");
 ui.horalineEdit->setText(cadhora);
 basedatos::instancia()->updateCabeceraestadosfechacalculoejercicio1ciejercicio2titulo( fechaactual, ui.Ejercicio1comboBox->currentText() , ui.cilineEdit->text() , ui.Ejercicio2comboBox->currentText() , ui.titulolabel->text() );

}


double calcestado::calculamediacuenta(QString codigo,bool ejercicio1)
{
  bool positivo=false;
  bool negativo=false;
  positivo=codigo.contains('+');
  negativo=codigo.contains('-');
  if (positivo && negativo) return 0;
  if (positivo) codigo.remove('+');
  if (negativo) codigo.remove('-');

    return basedatos::instancia()->selectSumsaldomediosaldossubcuentacodigo(ejercicio1,codigo,positivo,negativo);
}

double calcestado::cuentaespec( QString extract, QString ejercicio, bool acotacion, QDate fecha1, QDate fecha2 )
{
   double resultado=0;
  // separamos código de cuenta y especificador
   QString codigo=extract.section(':',0,0);
   QString espec=extract.section(':',1,1);
   if (espec==cadenamedia()) 
      {
        if (ui.Ejercicio1comboBox->currentText()==ejercicio)  resultado=calculamediacuenta(codigo,true);
	else resultado=calculamediacuenta(codigo,false);
      }
      else
          {
           resultado=calculacuentadiario(codigo,ejercicio,espec,acotacion,fecha1,fecha2);
          }
   return resultado;
}


double calcestado::calculacuentadiario( QString codigo, QString ejercicio, QString qdiario,
                                        bool acotacion,
                                        QDate fecha1, QDate fecha2 )
{
    double resultado=0;
    bool positivo=false;
    bool negativo=false;
    positivo=codigo.contains('+');
    negativo=codigo.contains('-');
    if (positivo && negativo) return 0;
    if (positivo) codigo.remove('+');
    if (negativo) codigo.remove('-');
    if (qdiario==previsiones())
    {
        if (positivo) return previsionsegunsaldo(codigo,ejercicio,true);
        if (negativo) return previsionsegunsaldo(codigo,ejercicio,false);
        return prevision(codigo,ejercicio);;
    }
    if (!ui.diariolistWidget->isEnabled() ) return 0;
    QDate fechaini,fechafin;

    fechaini = basedatos::instancia()->selectAperturaejercicios(ejercicio);
    fechafin = basedatos::instancia()->selectCierreejercicios(ejercicio);

    if (acotacion)
       {
        fechaini=fecha1;
        fechafin=fecha2;
       }

    QString subcadena = " and diario='";
    if (qdiario != diario_no_asignado())
    subcadena += qdiario.left(-1).replace("'","''");
    subcadena += "' ";

    QSqlQuery query = basedatos::instancia()->selectCuentadebehaberdiariocuentafechasgroupcuenta(codigo, fechaini, fechafin, subcadena, "");

    resultado = 0;
    if ( query.isActive() ) {
        while ( query.next() ) 
        {
            if (positivo || negativo)
            {
                if (positivo && query.value(1).toDouble()>0) resultado += query.value(1).toDouble();
                if (negativo && query.value(1).toDouble()<0) resultado += query.value(1).toDouble();
            }
            else
	            resultado += query.value(1).toDouble();
        }
    }
    return resultado;
}


void calcestado::generalatex()
{
    if (ui.desglose_mes_checkBox->isChecked())
       { generalatex_meses(); return;}
    if (condesglose || condesglosectas) { generalatex2(); return; }
    QString ejercicio1="";
    QString ejercicio2="";
    QString parte1="";
    QString parte2="";
    QString formulabasepor;
    QString observaciones;
    QString cabecera;
    double valorbasepor1=0;
    double valorbasepor2=0;
    // bool estadosmedios=false;
    bool analitica,haycolref;
    QString ci,colref;
    QSqlQuery query = basedatos::instancia()->select14Cabeceraestadostitulo( ui.titulolabel->text() );

    if ( (query.isActive()) && (query.first()) ) {
       parte1=query.value(0).toString();
	   parte2=query.value(1).toString();
	   ejercicio1=query.value(2).toString();
	   ejercicio2=query.value(3).toString();
       //estadosmedios=query.value(4).toBool();
	   formulabasepor=query.value(5).toString();
	   valorbasepor1=query.value(6).toDouble();
	   valorbasepor2=query.value(7).toDouble();
	   observaciones=query.value(8).toString();
           analitica=query.value(9).toBool();
           ci=query.value(10).toString();
           haycolref=query.value(11).toBool();
           colref=query.value(12).toString();
           cabecera=query.value(13).toString();
       } else return;
    bool hayporcentajes=false;
    double porcentaje=0;
    QString cadpor;
    if (formulabasepor.length()>0 && (valorbasepor1>0.001 || valorbasepor1<0.001)
    && (valorbasepor2>0.001 || valorbasepor2<0.001)) hayporcentajes=true;
   QString qfichero=dirtrabajo();
   qfichero.append(QDir::separator());
   if (ui.texlineEdit->text().length()==0)
      qfichero=qfichero+tr("estadocontable.tex");
   else
         {
            qfichero=qfichero+ui.texlineEdit->text();
            if (ui.texlineEdit->text().right(4)!=".tex") qfichero=qfichero+".tex";
         }
   // QMessageBox::warning( this, tr("Estados Contables"),qfichero);
   QString pasa;
   if (eswindows()) pasa=QFile::encodeName(qfichero);
       else pasa=qfichero;
   QFile fichero(pasa);
    if (! fichero.open( QIODevice::WriteOnly ) ) return;
    QTextStream stream( &fichero );
    stream.setCodec("UTF-8");

    stream << cabeceralatex();
    stream << margen_extra_latex();

    // Generamos primera parte del Estado Contable
    stream << "\\begin{center}" << "\n";
    stream << "{\\Large \\textbf {";
    stream << filtracad(nombreempresa()) << "}}";
    stream << "\\end{center}";

    if (ui.previsiones->isChecked())
      {
       stream << "\\begin{center}" << "\n";
       stream << "{\\Large \\textbf {";
       stream << " ** PREVISIONES ** }}";
       stream << "\\end{center}";
      }

    if (analitica && ci.length()>0)
        {
         stream << "\\begin{center}" << "\n";
         stream << "{\\normalsize \\textbf {" << tr("CÓDIGO DE IMPUTACIÓN: ") << ci <<  "}}" << "\n";
         stream << "\\end{center}" << "\n";

         QString codigo=ci;
         QString descripcion;
         QString qnivel=0;

         stream << "\\begin{center}" << "\n";
         stream << "{\\normalsize {" ;

         if (codigo.startsWith("???"))
            {
             stream << tr("CUALQUIERA");
            }
         else
           {
            bool encontrada=buscaci(codigo.left(3),&descripcion,&qnivel);
            if (encontrada && qnivel.toInt()==1)
                stream << descripcion;
           }
         if (codigo.length()>3) stream << " - ";
         if (codigo.length()>3 && codigo.mid(3,3)==QString("???")) stream << tr("CUALQUIERA");
         else
          {
           bool encontrada=buscaci(codigo.mid(3,3),&descripcion,&qnivel);
           int elnivel=qnivel.toInt();
           if (encontrada && elnivel==2)
              stream << descripcion;
          }

         if (codigo.length()>6) stream << " - ";
         if (codigo.length()==7 && codigo[6]=='*')  stream << tr("CUALQUIERA");
         else
           {
             bool encontrada=buscaci(codigo.right(codigo.length()-6),&descripcion,&qnivel);
             if (encontrada && qnivel.toInt()==3)
             stream << descripcion;
           }
         stream << "}}" << "\n";
         stream << "\\end{center}" << "\n";
        }

    if (ui.fechas_ej1_groupBox->isChecked())
       {
        stream << "\\begin{center}" << "\n";
        stream << "{\\textbf {";
        stream << tr("Ejercicio: ") << filtracad(ui.Ejercicio1comboBox->currentText()) << tr(" - FECHAS: ");
        stream << ui.ini_ej1_dateEdit->date().toString("dd/MM/yyyy") << tr(" a ");
        stream << ui.fin_ej1_dateEdit->date().toString("dd/MM/yyyy");
        stream << "}}";
        stream << "\\end{center}";
       }

    if (ui.fechas_ej2_groupBox->isEnabled() && ui.fechas_ej2_groupBox->isChecked())
       {
        stream << "\\begin{center}" << "\n";
        stream << "{\\textbf {";
        stream << tr("Ejercicio: ") << filtracad(ui.Ejercicio2comboBox->currentText()) << tr(" - FECHAS: ");
        stream << ui.ini_ej2_dateEdit->date().toString("dd/MM/yyyy") << tr(" a ");
        stream << ui.fin_ej2_dateEdit->date().toString("dd/MM/yyyy");
        stream << "}}";
        stream << "\\end{center}";
       }

    stream << tr("\\begin{center}") << "\n";
    if (ejercicio2.length()>0)
       {
          if (hayporcentajes)
             {
              if (haycolref) stream << "\\begin{longtable}{|p{8cm}|p{1.3cm}|r|r|r|r|}" << "\n";
              else stream << "\\begin{longtable}{|p{10cm}|r|r|r|r|}" << "\n";
             }
	  else
               {
                 if (haycolref) stream << "\\begin{longtable}{|p{11cm}|p{1.3cm}|r|r|}" << "\n";
                  else stream << "\\begin{longtable}{|p{12cm}|r|r|}" << "\n";
               }
       }
    else 
           {
	     if (!hayporcentajes) 
               {
                if (haycolref) stream << "\\begin{longtable}{|p{10cm}|p{1.3cm}|r|}" << "\n";
                 else stream << "\\begin{longtable}{|p{12cm}|r|}" << "\n";
               }
	       else
                {
	         if (haycolref) stream << "\\begin{longtable}{|p{10cm}|p{1.3cm}|r|r|}" << "\n";
                  else stream << "\\begin{longtable}{|p{12cm}|r|r|}" << "\n";
                }
           }
    stream << "\\hline" << "\n";
   stream << "\\multicolumn{";
   if (ejercicio2.length()>0) 
      { 
        if(hayporcentajes) 
           {
            if (haycolref) stream <<  tr("6");
            else stream <<  tr("5");
           }
        else 
           { 
            if (haycolref) stream <<  tr("4");
            else stream <<  tr("3");
           }
      }
   else
        { 
          if (hayporcentajes)
            { 
             if (haycolref) stream << tr("4");
             else stream <<  tr("3"); 
            }
           else 
             {
              if (haycolref) stream <<  tr("3") ;
              else stream <<  tr("2") ;
             }
         }

    stream << "}{|c|} {\\textbf{ ";
    stream << cabecera <<  "}} \\\\";
    stream << "\\hline" << "\n";
    // ---------------------------------------------------------------------------------------

    stream << "{\\textbf{" << parte1 << "}} & ";
    if (haycolref)
        stream << "{\\scriptsize{ " << colref << "}} & ";
    if (hayporcentajes) stream << "{\\textbf{ \\% }} & ";
    stream << "{\\textbf {" << filtracad(ejercicio1) <<"}";
    // ----------------------------------------------------------------------------------------
    if (ejercicio2.length()>0)
      {
         stream << "} & ";
         if (hayporcentajes) stream << "{\\textbf{ \\% }} & ";
         stream <<  "{\\textbf {" << filtracad(ejercicio2)  <<"}";
      }
    stream << "} \\\\" << "\n";
    stream << "\\hline" << "\n";
    stream << "\\endfirsthead";
    // -------------------------------------------------------------------------------------------------------
    stream << "\\hline" << "\n";
    stream << "{\\textbf{ " << filtracad(parte1) << "}} & ";
    if (haycolref)
        stream << "{\\scriptsize{ " << filtracad(colref) << "}} & ";
    if (hayporcentajes) stream << "{\\textbf{ \\% }} & ";
    stream << "{\\textbf{ " << filtracad(ejercicio1) << "}";
    if (ejercicio2.length()>0)
       {
         stream <<  "} & ";
         if (hayporcentajes) stream << "{\\textbf{ \\% }} & ";
         stream << " {\\textbf{ " << filtracad(ejercicio2) << "}" ;
       }
    stream << "} \\\\" << "\n";
    stream << "\\hline" << "\n";
    stream << "\\endhead" << "\n";
    stream << "\\hline" << "\n";
    
    QSqlQuery query2 = basedatos::instancia()->select5Estadostituloparte1ordernodo( ui.titulolabel->text() , true );
    int veces;
    if ( query2.isActive() ) {
             while ( query2.next() ) {
	       if (query2.value(0).toString().contains("LINEA")>0)
		 {
		   stream << "\\hline\n";
		   continue;
	         }
               // ----------------------------------------------------------------------
               if (ui.importescheckBox->isChecked()
                    && query2.value(2).toDouble()<0.0001 
                    && query2.value(2).toDouble()>-0.0001
                    && ejercicio2.length()==0) continue;
               // ----------------------------------------------------------------------
               if (ui.importescheckBox->isChecked()
                    && query2.value(2).toDouble()<0.0001 
                    && query2.value(2).toDouble()>-0.0001
                    && query2.value(3).toDouble()<0.0001 
                    && query2.value(3).toDouble()>-0.0001
                    && ejercicio2.length()>0) continue;
               // ----------------------------------------------------------------------
	       for (veces=1;veces<=query2.value(0).toString().count('.');veces++)
		   stream << "\\hspace{0.5cm} ";
	       // if (query2.value(0).toString().contains("TOTAL")==0) 
	      //	   stream << query2.value(0).toString() << " " ;
	       stream << "{\\scriptsize {" << filtracad(query2.value(1).toString()) << "}} & ";
               if (haycolref) 
                  stream << "{\\scriptsize {" << filtracad(query2.value(4).toString()) << "}} & ";
	       if (hayporcentajes)
	                 {
   	                   if (query2.value(2).toDouble()>0.001 ||
                                query2.value(2).toDouble()<-0.001)
		              {
	                          porcentaje=query2.value(2).toDouble()/valorbasepor1*100;
		                  stream << "{\\scriptsize {" << 
                                     formateanumerosep(porcentaje,comadecimal,decimales) << "}}";
	                      }
                                   stream << " & ";
	                 }
                       //---------------------------------------------
	       if (query2.value(2).toDouble()>0.001 || query2.value(2).toDouble()<-0.001)
	             stream << "{\\scriptsize {" << 
                        formateanumerosep(query2.value(2).toDouble(),comadecimal,decimales) << "}}";
	       if (ejercicio2.length()>0) 
	            {
		     stream << " & ";
		     if (hayporcentajes)
		      {
 		         if (query2.value(3).toDouble()>0.001 || query2.value(3).toDouble()<-0.001)
		              {
	                         porcentaje=query2.value(3).toDouble()/valorbasepor2*100;
		                 cadpor.setNum(porcentaje,'f',2);
		                 stream << "{\\scriptsize {" << 
                                    formateanumerosep(cadpor.toDouble(),comadecimal,decimales) << "}}";
		              }
                         stream << " & ";
		      }
		   if (query2.value(3).toDouble()>0.001 || query2.value(3).toDouble()<-0.001)
		       stream << "{\\scriptsize {" << 
                         formateanumerosep(query2.value(3).toDouble(),comadecimal,decimales) << "}}";
	            }
	       stream << " \\\\" << "\n";
	     }
           }
    stream << "\\hline" << "\n";
    stream << "\\end{longtable}" << "\n";
    stream << "\\end{center}" << "\n";
 if (parte2.length()>0)
    {
    stream << "\\newpage" << "\n";
    
    // Generamos segunda parte
    stream << "\\begin{center}" << "\n";
    stream << "{\\Large \\textbf {";
    stream << filtracad(nombreempresa()) << "}}";
    stream << "\\end{center}";

    if (ui.previsiones->isChecked())
      {
       stream << "\\begin{center}" << "\n";
       stream << "{\\Large \\textbf {";
       stream << " ** PREVISIONES ** }}";
       stream << "\\end{center}";
      }

    stream << "\\begin{center}"  << "\n";  // vamos por aquí

    if (ejercicio2.length()>0)
       {
          if (hayporcentajes)
             {
              if (haycolref) stream << "\\begin{longtable}{|p{8cm}|p{1.3cm}|r|r|r|r|}" << "\n";
              else stream << "\\begin{longtable}{|p{10cm}|r|r|r|r|}" << "\n";
             }
	  else
               {
                 if (haycolref) stream << "\\begin{longtable}{|p{11cm}|p{1.3cm}|r|r|}" << "\n";
                  else stream << "\\begin{longtable}{|p{12cm}|r|r|}" << "\n";
               }
       }
    else 
           {
	     if (!hayporcentajes) 
               {
                if (haycolref) stream << "\\begin{longtable}{|p{10cm}|p{1.3cm}|r|}" << "\n";
                 else stream << "\\begin{longtable}{|p{12cm}|r|}" << "\n";
               }
	       else
                {
	         if (haycolref) stream << "\\begin{longtable}{|p{10cm}|p{1.3cm}|r|r|}" << "\n";
                  else stream << "\\begin{longtable}{|p{12cm}|r|r|}" << "\n";
                }
           }


// -------------------------------------------------------------------------------------------------------    
   stream << "\\hline" << "\n";
   stream << "\\multicolumn{";
   if (ejercicio2.length()>0) 
      { 
        if(hayporcentajes) 
           {
            if (haycolref) stream <<  tr("6");
            else stream <<  tr("5");
           }
        else 
           { 
            if (haycolref) stream <<  tr("4");
            else stream <<  tr("3");
           }
      }
   else
        { 
          if (hayporcentajes)
            { 
             if (haycolref) stream << tr("4");
             else stream <<  tr("3"); 
            }
           else 
             {
              if (haycolref) stream <<  tr("3") ;
              else stream <<  tr("2") ;
             }
         }


    stream << "}{|c|} {\\textbf{";
    stream << cabecera <<  "}} \\\\";
    stream << "\\hline" << "\n";
    // -----------------------------------------------------------------------------------------------------
    stream << "{\\textbf{" << parte2 << "}} & ";
    if (haycolref)
        stream << "{\\scriptsize{ " << colref << "}} & ";
    if (hayporcentajes) stream << "{\\textbf{ \\% }} & ";
    stream << "{\\textbf {" << ejercicio1 <<"}";
    // -----------------------------------------------------------------------------------------------------
    if (ejercicio2.length()>0)
      {
         stream << "} & ";
         if (hayporcentajes) stream << "{\\textbf{ \\% }} & ";
         stream <<  "{\\textbf {" << ejercicio2 << "}";
      }
        
    stream << "} \\\\" << "\n";
    stream << "\\hline" << "\n";
    stream << "\\endfirsthead";
    stream << "\\hline" << "\n";
    
    // ------------------------------------------------------------------------------------------------------
    stream << "{\\textbf{" << parte2 << "}} & ";
    if (haycolref)
        stream << "{\\scriptsize{ " << colref << "}} & ";
    if (hayporcentajes) stream << "{\\textbf{ \\% }} & ";
    stream << "{\\textbf {" << ejercicio1 << "}";
    if (ejercicio2.length()>0)
      {
         stream << "} & ";
         if (hayporcentajes) stream << "{\\textbf{ \\% }} & ";
	 stream <<  "{\\textbf {" << ejercicio2 << "}";
      }
    stream << "} \\\\" << "\n";
    stream << "\\hline" << "\n";
    stream << "\\endhead" << "\n";
    stream << "\\hline" << "\n";
    
    query2 = basedatos::instancia()->select5Estadostituloparte1ordernodo( ui.titulolabel->text() , false );
    if ( query2.isActive() ) {
             while ( query2.next() ) {
	       if (query2.value(0).toString().contains("LINEA")>0)
		 {
		   stream << "\\hline\n";
		   continue;
	         }
               // ----------------------------------------------------------------------
               if (ui.importescheckBox->isChecked()
                    && query2.value(2).toDouble()<0.0001 
                    && query2.value(2).toDouble()>-0.0001
                    && ejercicio2.length()==0) continue;
               // ----------------------------------------------------------------------
               if (ui.importescheckBox->isChecked()
                    && query2.value(2).toDouble()<0.0001 
                    && query2.value(2).toDouble()>-0.0001
                    && query2.value(3).toDouble()<0.0001 
                    && query2.value(3).toDouble()>-0.0001
                    && ejercicio2.length()>0) continue;
               // ----------------------------------------------------------------------
	       for (veces=1;veces<=query2.value(0).toString().count('.');veces++)
		   stream << "\\hspace{0.5cm} ";
	       // if (query2.value(0).toString().contains("TOTAL")==0) 
		//   stream << query2.value(0).toString() << " " ;
	       stream << "{\\scriptsize {" << filtracad(query2.value(1).toString()) << "}} & ";
               if (haycolref) 
                  stream << "{\\scriptsize {" << filtracad(query2.value(4).toString()) << "}} & ";
	       if (hayporcentajes)
	                 {
   	                   if (query2.value(2).toDouble()>0.001 || query2.value(2).toDouble()<-0.001)
		                {
	                          porcentaje=query2.value(2).toDouble()/valorbasepor1*100;
		                  stream << "{\\scriptsize {" << 
                                     formateanumero(porcentaje,comadecimal,decimales) << "}}";
	                        }
                           stream << " & ";
	                 }
	       if (query2.value(2).toDouble()>0.001 || query2.value(2).toDouble()<-0.001)
		   stream << "{\\scriptsize {" <<
                      formateanumerosep(query2.value(2).toDouble(),comadecimal,decimales) << "}}";
	       if (ejercicio2.length()>0) 
	            {
		     stream << " & ";
		     if (hayporcentajes)
		       {
 		         if (query2.value(3).toDouble()>0.001 || query2.value(3).toDouble()<-0.001)
		              {
	                         porcentaje=query2.value(3).toDouble()/valorbasepor2*100;
		                 stream << "{\\scriptsize {" << 
                                   formateanumerosep(porcentaje,comadecimal,decimales) << "}}";
		              }
                         stream << " & ";
		       }
		     if (query2.value(3).toDouble()>0.001 || query2.value(3).toDouble()<-0.001)
		       stream << "{\\scriptsize {" << 
                          formateanumerosep(query2.value(3).toDouble(),comadecimal,decimales) << "}}";
	            }
	       stream << " \\\\" << "\n";
	     }
           }
    stream << "\\hline" << "\n";
    stream << "\\end{longtable}" << "\n";
    stream << "\\end{center}" << "\n";
}
    stream << observaciones << "\n";
    stream << "% FIN_CUERPO\n";
    stream << "\\end{document}" << "\n";
    
    fichero.close();
    
}


void calcestado::consulta( void )
{
   QString qfichero;
   if (ui.texlineEdit->text().length()==0)
      qfichero=tr("estadocontable");
   else
         {
            qfichero=ui.texlineEdit->text();
            if (ui.texlineEdit->text().right(4)==".tex") qfichero=qfichero.left(qfichero.length()-4);
         }

    generalatex();

   int valor=consultalatex2(qfichero);
   if (valor==1)
       QMessageBox::warning( this, tr("Consulta estado contable"),tr("PROBLEMAS al llamar a Latex"));
   if (valor==2)
       QMessageBox::warning( this, tr("Consulta estado contable"),
                             tr("PROBLEMAS al llamar a ")+visordvi());


}



void calcestado::imprime()
{

   QString qfichero;
   if (ui.texlineEdit->text().length()==0)
      qfichero=tr("estadocontable");
   else
         {
            qfichero=ui.texlineEdit->text();
            if (ui.texlineEdit->text().right(4)==".tex") qfichero=qfichero.left(qfichero.length()-4);
         }

    generalatex();


   int valor=imprimelatex2(qfichero);
   if (valor==1)
       QMessageBox::warning( this, tr("Consulta de estado contable"),tr("PROBLEMAS al llamar a Latex"));
   if (valor==2)
       QMessageBox::warning( this, tr("Consulta de estado contable"),
                                tr("PROBLEMAS al llamar a 'dvips'"));
   if (valor==3)
       QMessageBox::warning( this, tr("Consulta de estado contable"),
                             tr("PROBLEMAS al llamar a ")+programa_imprimir());

}



void calcestado::copia()
{
   if (condesglose) { copia2(); return; }

   QClipboard *cb = QApplication::clipboard();
   QString global;

    QString ejercicio1="";
    QString ejercicio2="";
    QString parte1="";
    QString parte2="";
    QString formulabasepor;
    QString observaciones;
    // double valorbasepor1=0;
    // double valorbasepor2=0;
    // bool estadosmedios=false;
    bool analitica,haycolref;
    QString ci,colref;
    QSqlQuery query = basedatos::instancia()->select14Cabeceraestadostitulo( ui.titulolabel->text() );

    if ( query.isActive() ) {
           query.first();
           parte1=query.value(0).toString();
	   parte2=query.value(1).toString();
	   ejercicio1=query.value(2).toString();
	   ejercicio2=query.value(3).toString();
       //estadosmedios=query.value(4).toBool();
	   formulabasepor=query.value(5).toString();
       //valorbasepor1=query.value(6).toDouble();
       // valorbasepor2=query.value(7).toDouble();
	   observaciones=query.value(8).toString();
           analitica=query.value(9).toBool();
	   ci=query.value(10).toString();
           haycolref=query.value(11).toBool();
           colref=query.value(12).toString();
       } else return;
    
    // Generamos primera parte del Estado Contable
    global=nombreempresa();
    global+="\n\n";
    if (ui.previsiones->isChecked())
      {
       global+="** PREVISIONES **\n\n";
      }


    // ---------------------------------------------------------------------------------------------
    if (analitica && ci.length()>0)
        {
         global+=tr("CÓDIGO DE IMPUTACIÓN\t");
         global+=ci;
         global+="\n";
         QString codigo=ci;
         QString descripcion;
         QString qnivel=0;


         if (codigo.startsWith("???"))
            {
             global+= tr("CUALQUIERA");
            }
         else
           {
            bool encontrada=buscaci(codigo.left(3),&descripcion,&qnivel);
            if (encontrada && qnivel.toInt()==1)
                global+= descripcion;
           }
         if (codigo.length()>3) global+="\t";
         if (codigo.length()>3 && codigo.mid(3,3)==QString("???")) global+= tr("CUALQUIERA");
         else
          {
           bool encontrada=buscaci(codigo.mid(3,3),&descripcion,&qnivel);
           int elnivel=qnivel.toInt();
           if (encontrada && elnivel==2)
              global += descripcion;
          }

         if (codigo.length()>6) global+="\t";
         if (codigo.length()==7 && codigo[6]=='*')  global+= tr("CUALQUIERA");
         else
           {
             bool encontrada=buscaci(codigo.right(codigo.length()-6),&descripcion,&qnivel);
             if (encontrada && qnivel.toInt()==3)
             global+=descripcion;
           }
         global+= "\n";
        }

    // -----------------------------------------------------------------------------------------------------
    global+= parte1;
    global+="\t";
    if (haycolref) { global+=colref; global+="\t"; }
    global+= ejercicio1;
    // -----------------------------------------------------------------------------------------------------
    if (ejercicio2.length()>0 && !ui.desglose_mes_checkBox->isChecked())
         {
            global+="\t";
            global+=ejercicio2;
         }
    if (ui.desglose_mes_checkBox->isChecked())
        global+="\tM1\tM2\tM3\tM4\tM5\tM6\tM7\tM8\tM9\tM10\tM11\tM12";
    global += "\n";
    // ------------------------------------------------------------------------------------------------------
    
    QSqlQuery query2 = basedatos::instancia()->select5Estadostituloparte1ordernodo( ui.titulolabel->text() , true);
     if ( query2.isActive() ) {
             while ( query2.next() ) {
	       if (query2.value(0).toString().contains("LINEA")>0)
		 {
		   continue;
	                 }
	       //for (veces=1;veces<=query2.value(0).toString().contains('.');veces++)
		//   stream << "\\hspace{0.5cm} ";
	       // if (query2.value(0).toString().contains("TOTAL")==0) 
	      //	   stream << query2.value(0).toString() << " " ;
	       global+=  query2.value(1).toString() ;
	       global+= "\t";
               if (haycolref)
                   {
	            global+=  query2.value(4).toString() ;
	            global+= "\t";
                   }
               //---------------------------------------------
	       if (query2.value(2).toDouble()>0.001 || query2.value(2).toDouble()<-0.001)
                  global+=formateanumero(query2.value(2).toDouble(),comadecimal,decimales);
           if (ejercicio2.length()>0 && !ui.desglose_mes_checkBox->isChecked())
	            {
                  global += "\t";
                  if (query2.value(3).toDouble()>0.001 || query2.value(3).toDouble()<-0.001)
                        global+=formateanumero(query2.value(3).toDouble(),comadecimal,decimales);
	            }
           if (ui.desglose_mes_checkBox->isChecked())
             {
               global += "\t";
               global+=formateanumero(query2.value(5).toDouble(),comadecimal,decimales);
               global += "\t";
               global+=formateanumero(query2.value(6).toDouble(),comadecimal,decimales);
               global += "\t";
               global+=formateanumero(query2.value(7).toDouble(),comadecimal,decimales);
               global += "\t";
               global+=formateanumero(query2.value(8).toDouble(),comadecimal,decimales);
               global += "\t";
               global+=formateanumero(query2.value(9).toDouble(),comadecimal,decimales);
               global += "\t";
               global+=formateanumero(query2.value(10).toDouble(),comadecimal,decimales);
               global += "\t";
               global+=formateanumero(query2.value(11).toDouble(),comadecimal,decimales);
               global += "\t";
               global+=formateanumero(query2.value(12).toDouble(),comadecimal,decimales);
               global += "\t";
               global+=formateanumero(query2.value(13).toDouble(),comadecimal,decimales);
               global += "\t";
               global+=formateanumero(query2.value(14).toDouble(),comadecimal,decimales);
               global += "\t";
               global+=formateanumero(query2.value(15).toDouble(),comadecimal,decimales);
               global += "\t";
               global+=formateanumero(query2.value(16).toDouble(),comadecimal,decimales);
             }
	       global+="\n";
	     }
       }
    global+= "\n\n\n";
    
 if (parte2.length()>0)
    {
     global+=ui.titulolabel->text();
     global+= "\n\n";
    // -------------------------------------------------------------------------------------------------------
    global+= parte2 ;
    global+="\t";
    if (haycolref) { global+=colref; global+="\t"; }
    global+=ejercicio1;
    // -------------------------------------------------------------------------------------------------------
    if (ejercicio2.length()>0 && !ui.desglose_mes_checkBox->isChecked())
      {
         global+="\t";
         global+= ejercicio2 ;
      }

    global+="\n";

    query2 = basedatos::instancia()->select5Estadostituloparte1ordernodo(ui.titulolabel->text(),false);
    if ( query2.isActive() ) {
             while ( query2.next() ) {
	       if (query2.value(0).toString().contains("LINEA")>0)
		 {
		   continue;
	         }
	       // for (veces=1;veces<=query2.value(0).toString().contains('.');veces++)
		   // stream << "\\hspace{0.5cm} ";
	       // if (query2.value(0).toString().contains("TOTAL")==0) 
		//   stream << query2.value(0).toString() << " " ;
	       global+= query2.value(1).toString();
	       global+="\t";
               if (haycolref)
                   {
	            global+=  query2.value(4).toString() ;
	            global+= "\t";
                   }
	       if (query2.value(2).toDouble()>0.001 || query2.value(2).toDouble()<-0.001)
                  global+=formateanumero(query2.value(2).toDouble(),comadecimal,decimales);
           if (ejercicio2.length()>0 && !ui.desglose_mes_checkBox->isChecked())
	            {
                 global+= "\t";
                 if (query2.value(3).toDouble()>0.001 || query2.value(3).toDouble()<-0.001)
                        global+=formateanumero(query2.value(3).toDouble(),comadecimal,decimales);
	            }
           if (ui.desglose_mes_checkBox->isChecked())
             {
               global += "\t";
               global+=formateanumero(query2.value(5).toDouble(),comadecimal,decimales);
               global += "\t";
               global+=formateanumero(query2.value(6).toDouble(),comadecimal,decimales);
               global += "\t";
               global+=formateanumero(query2.value(7).toDouble(),comadecimal,decimales);
               global += "\t";
               global+=formateanumero(query2.value(8).toDouble(),comadecimal,decimales);
               global += "\t";
               global+=formateanumero(query2.value(9).toDouble(),comadecimal,decimales);
               global += "\t";
               global+=formateanumero(query2.value(10).toDouble(),comadecimal,decimales);
               global += "\t";
               global+=formateanumero(query2.value(11).toDouble(),comadecimal,decimales);
               global += "\t";
               global+=formateanumero(query2.value(12).toDouble(),comadecimal,decimales);
               global += "\t";
               global+=formateanumero(query2.value(13).toDouble(),comadecimal,decimales);
               global += "\t";
               global+=formateanumero(query2.value(14).toDouble(),comadecimal,decimales);
               global += "\t";
               global+=formateanumero(query2.value(15).toDouble(),comadecimal,decimales);
               global += "\t";
               global+=formateanumero(query2.value(16).toDouble(),comadecimal,decimales);
             }

	       global+= "\n";
	     }
           }
 }
    global+="\n";
    global+=observaciones;
    global+="\n";

    cb->setText(global);
    QMessageBox::information( this, tr("Cálculo de Estado Contable"),
                             tr("Se ha pasado el contenido al portapapeles") );

}


void calcestado::generalatex2()
{
    // con desglose
    // forzamos cálculo de estado
    // ya que los saldos de las cuentas se cogerán del diario
    if (auxiliares.count()==0) calculaestado();
    QString ejercicio1="";
    QString parte1="";
    QString parte2="";
    QString observaciones;
    QString cabecera;
    QString descabecera;
    QString despie;
    // bool estadosmedios=false;
    bool analitica;
    QString ci;

    QSqlQuery query = basedatos::instancia()->select16Cabeceraestadostitulo( ui.titulolabel->text() );
    if ( query.isActive() ) {
           query.first();
           parte1=query.value(0).toString();
	   parte2=query.value(1).toString();
	   ejercicio1=query.value(2).toString();
       // estadosmedios=query.value(4).toBool();
	   observaciones=query.value(8).toString();
           analitica=query.value(9).toBool();
           ci=query.value(10).toString();
           cabecera=query.value(13).toString();
           descabecera=query.value(14).toString();
           despie=query.value(15).toString();
       } else return;
   QString qfichero=dirtrabajo();
   qfichero.append(QDir::separator());
   if (ui.texlineEdit->text().length()==0)
      qfichero=qfichero+tr("estadocontable.tex");
   else
         {
            qfichero=qfichero+ui.texlineEdit->text();
            if (ui.texlineEdit->text().right(4)!=".tex") qfichero=qfichero+".tex";
         }
   // QMessageBox::warning( this, tr("Estados Contables"),qfichero);
   QFile fichero(QFile::encodeName(qfichero));
    if (! fichero.open( QIODevice::WriteOnly ) ) return;
    QTextStream stream( &fichero );
    stream.setCodec("UTF-8");

    stream << cabeceralatex();
    stream << margen_extra_latex();
    
    // Generamos primera parte del Estado Contable
    stream << "\\begin{center}" << "\n";
    stream << "{\\Large \\textbf {";
    stream << filtracad(nombreempresa()) << "}}";
    stream << "\\end{center}";
    if (ui.previsiones->isChecked())
      {
       stream << "\\begin{center}" << "\n";
       stream << "{\\Large \\textbf {";
       stream << " ** PREVISIONES ** }}";
       stream << "\\end{center}";
      }

    if (analitica && ci.length()>0)
        {
         stream << "\\begin{center}" << "\n";
         stream << "{\\normalsize \\textbf {" << tr("CÓDIGO DE IMPUTACIÓN: ") << ci <<  "}}" << "\n";
         stream << "\\end{center}" << "\n";

         QString codigo=ci;
         QString descripcion;
         QString qnivel=0;

         stream << "\\begin{center}" << "\n";
         stream << "{\\normalsize {" ;

         if (codigo.startsWith("???"))
            {
             stream << tr("CUALQUIERA");
            }
         else
           {
            bool encontrada=buscaci(codigo.left(3),&descripcion,&qnivel);
            if (encontrada && qnivel.toInt()==1)
                stream << descripcion;
           }
         if (codigo.length()>3) stream << " - ";
         if (codigo.length()>3 && codigo.mid(3,3)==QString("???")) stream << tr("CUALQUIERA");
         else
          {
           bool encontrada=buscaci(codigo.mid(3,3),&descripcion,&qnivel);
           int elnivel=qnivel.toInt();
           if (encontrada && elnivel==2)
              stream << descripcion;
          }

         if (codigo.length()>6) stream << " - ";
         if (codigo.length()==7 && codigo[6]=='*')  stream << tr("CUALQUIERA");
         else
           {
             bool encontrada=buscaci(codigo.right(codigo.length()-6),&descripcion,&qnivel);
             if (encontrada && qnivel.toInt()==3)
             stream << descripcion;
           }
         stream << "}}" << "\n";
         stream << "\\end{center}" << "\n";
        }

    if (ui.fechas_ej1_groupBox->isChecked())
       {
        stream << "\\begin{center}" << "\n";
        stream << "{\\textbf {";
        stream << tr("Ejercicio: ") << ui.Ejercicio1comboBox->currentText() << tr(" - FECHAS: ");
        stream << ui.ini_ej1_dateEdit->date().toString("dd/MM/yyyy") << tr(" a ");
        stream << ui.fin_ej1_dateEdit->date().toString("dd/MM/yyyy");
        stream << "}}";
        stream << "\\end{center}";
       }

    if (ui.fechas_ej2_groupBox->isEnabled() && ui.fechas_ej2_groupBox->isChecked())
       {
        stream << "\\begin{center}" << "\n";
        stream << "{\\textbf {";
        stream << tr("Ejercicio: ") << ui.Ejercicio2comboBox->currentText() << tr(" - FECHAS: ");
        stream << ui.ini_ej2_dateEdit->date().toString("dd/MM/yyyy") << tr(" a ");
        stream << ui.fin_ej2_dateEdit->date().toString("dd/MM/yyyy");
        stream << "}}";
        stream << "\\end{center}";
       }

    stream << "\\begin{center}" << "\n";

    stream << "\\begin{longtable}{|p{10cm}|r|r|r|}" << "\n";
    stream << "\\hline" << "\n";
    stream << "\\multicolumn{4";
    stream << "}{|c|} {\\textbf{ ";
    stream << cabecera <<  "}} \\\\";
    stream << "\\hline" << "\n";
    // ---------------------------------------------------------------------------------------

    stream << "{\\textbf {" << parte1 << "}} & ";
    stream << "{\\scriptsize {" << tr("DETALLE") << "}} &";
    stream << "{\\scriptsize {" << tr("CUENTAS") <<"}} &";
    stream << "{\\scriptsize {" << ejercicio1 <<"}}";
    stream << " \\\\" << "\n";
    stream << "\\hline" << "\n";
    stream << "\\endfirsthead";
    // -------------------------------------------------------------------------------------------------------
    stream << "\\hline" << "\n";

    stream << "{\\textbf{" << parte1 << "}} & ";
    stream << "{\\scriptsize {" << tr("DETALLE") <<"}} &";
    stream << "{\\scriptsize {" << tr("CUENTAS") <<"}} &";
    stream << "{\\scriptsize {" << ejercicio1 <<"}}";
    stream << " \\\\" << "\n";
    stream << "\\hline" << "\n";
    stream << "\\endhead" << "\n";
    stream << "\\hline" << "\n";
    
    QSqlQuery query2 = basedatos::instancia()->select6Estadostituloparte1ordernodo( ui.titulolabel->text() , true );
    int veces;
    if ( query2.isActive() ) {
             while ( query2.next() ) {
	       if (query2.value(0).toString().contains("LINEA")>0)
		 {
		   stream << "\\hline\n";
		   continue;
	         }
               // ----------------------------------------------------------------------
               if (ui.importescheckBox->isChecked()
                    && query2.value(2).toDouble()<0.0001 
                    && query2.value(2).toDouble()>-0.0001
                    ) continue;
	       for (veces=1;veces<=query2.value(0).toString().count('.');veces++)
		   stream << "\\hspace{0.5cm} ";
	       // if (query2.value(0).toString().contains("TOTAL")==0) 
	      //	   stream << query2.value(0).toString() << " " ;
	       stream << "{\\scriptsize {" << filtracad(query2.value(1).toString()) << "}} & ";
 	       stream << " & ";
 	       stream << " & ";
	       if (query2.value(2).toDouble()>0.001 || query2.value(2).toDouble()<-0.001)
	             stream << "{\\scriptsize {" << 
                        formateanumerosep(query2.value(2).toDouble(),comadecimal,decimales) << "}}";
	       stream << " \\\\" << "\n";
               // desglosamos el campo fórmula que no contenga {
               QString cadpru=query2.value(5).toString();
               if (cadpru.contains('{')) continue;

               int indice=0;
               int inicio,final;
               QString ejercicio=ui.Ejercicio1comboBox->currentText();
               bool acotado=ui.fechas_ej1_groupBox->isChecked();
               QDate fecha1=ui.ini_ej1_dateEdit->date();
               QDate fecha2=ui.fin_ej1_dateEdit->date();
               bool estadosmedios=consaldosmedios;
               double valor;
               QString extract;
               while (indice<cadpru.length())
                   {
                    if (cadpru[indice]=='[')
                        {
                         inicio=indice;
                         final=inicio;
                         while (final<cadpru.length() && cadpru[final]!=']') final++;
                         // extraemos la cadena de la cuenta sin corchetes
                         extract=cadpru.mid(inicio+1,final-inicio-1);
                        // habría que calcular el valor de la cuenta
                        // QMessageBox::warning( this, tr("Estados Contables"),extract);
                        // -------------------------------------------------------------------------------------
                        if (extract.contains(':')==1) valor=cuentaespec(extract,ejercicio,acotado,fecha1,fecha2);
                           else
	                      {
                             if (!estadosmedios) valor=saldo_cuenta_lista_ej1(extract);
                              else
		                      valor=calculamediacuenta(extract,true);
	                      }
	                // if (valor>-0.004 && valor < 0.005) continue;
                        if (inicio-1>=0 && cadpru[inicio-1]=='-') valor=-1*valor;
                        // imprimimos cadena formada por código de cuenta y descripción
                        bool positivo=false;
                        bool negativo=false;
                        positivo=extract.contains('+');
                        negativo=extract.contains('-');
                        extract.remove('+');
                        extract.remove('-');
     	                if (valor>0.001 || valor<-0.001)
                           {
                            stream << "{\\tiny {" << extract << " " << filtracad(descripcioncuenta(extract))
                                      << "}} & &";
                            stream << "{\\tiny {" << formateanumerosep(valor,comadecimal,decimales) << "}} & ";
                            stream << " \\\\" << "\n";
                            // QMessageBox::warning( this, tr("Estados Contables"),extract);
                            // seguimos aquí con el desglose de todas las cuentas
                            // ojo si aparece el signo + ó menos en extract
                            // habría que quitarlo y añadirlo a cada selección
                            if (condesglose)
                            {
                             QSqlQuery q;
                             if (!cod_longitud_variable())
                               {
                                q = basedatos::instancia()->selectCodigoplancontablecodigolength(extract);
                               }
                               else
                                   {
                                    q = basedatos::instancia()->selectCodigoplancontablecodigoauxiliar(extract);
                                   }
                              while (q.next())
                                 {
                                   QString extract2=q.value(0).toString();
                                   QString extract2sig=extract2;
                                   if (positivo) extract2sig.append('+');
                                   if (negativo) extract2sig.append('-');
                                   if (extract.contains(':')==1) valor=cuentaespec_aux(extract2sig,ejercicio,
                                                                       acotado,fecha1,fecha2);
                                   else
                                       {
                                         if (!estadosmedios) valor=saldo_cuenta_lista_ej1(extract2sig);
                                         else
                                           valor=calculamediacuenta_aux(extract2sig,true);
                                       }
                                   if (valor>0.001 || valor <-0.001)
                                       {
                                         stream << "\\hspace{0.5cm} ";
                                         stream << "{\\tiny {" << extract2 << " " << 
                                             filtracad(descripcioncuenta(extract2)) << "}} &";
                                         if (inicio-1>=0 && cadpru[inicio-1]=='-') valor=-1*valor;
                                         stream << "{\\tiny {" << formateanumerosep(valor,comadecimal,decimales)
                                              << "}} & &";
                                         stream << " \\\\" << "\n";
                                       }
                                  }
                               } // fin del condesglose
                           }
                       }
                    indice++;
                   }
	     } // final del while query
           }
    stream << "\\hline" << "\n";
    stream << "\\end{longtable}" << "\n";
    stream << "\\end{center}" << "\n";

 if (parte2.length()>0)
    {
    stream << "\\newpage" << "\n";
    stream << "\\begin{center}" << "\n";

    stream << "\\begin{longtable}{|p{10cm}|r|r|r|}" << "\n";
    stream << "\\hline" << "\n";
    stream << "\\multicolumn{4";
    stream << "}{|c|} {\\textbf{ ";
    stream << cabecera <<  "}} \\\\";
    stream << "\\hline" << "\n";
    // ---------------------------------------------------------------------------------------

    stream << "{\\textbf{" << parte2 << "}} & ";
    stream << "{\\scriptsize {" << tr("DETALLE") <<"}} &";
    stream << "{\\scriptsize {" << tr("CUENTAS") <<"}} &";
    stream << "{\\scriptsize {" << ejercicio1 <<"}}";
    stream << " \\\\" << "\n";
    stream << "\\hline" << "\n";
    stream << "\\endfirsthead";
    // -------------------------------------------------------------------------------------------------------
    stream << "\\hline" << "\n";

    stream << "{\\textbf{" << parte2 << "}} & ";
    stream << "{\\scriptsize {" << tr("DETALLE") << "}} &";
    stream << "{\\scriptsize {" << tr("CUENTAS") << "}} &";
    stream << "{\\scriptsize {" << ejercicio1 << "}}";
    stream << " \\\\" << "\n";
    stream << "\\hline" << "\n";
    stream << "\\endhead" << "\n";
    stream << "\\hline" << "\n";
    
    QSqlQuery query2 = basedatos::instancia()->select6Estadostituloparte1ordernodo( ui.titulolabel->text() , false);
    int veces;
    if ( query2.isActive() ) {
             while ( query2.next() ) {
	       if (query2.value(0).toString().contains("LINEA")>0)
		 {
		   stream << "\\hline\n";
		   continue;
	         }
               // ----------------------------------------------------------------------
               if (ui.importescheckBox->isChecked()
                    && query2.value(2).toDouble()<0.0001 
                    && query2.value(2).toDouble()>-0.0001
                   ) continue;
	       for (veces=1;veces<=query2.value(0).toString().count('.');veces++)
		   stream << "\\hspace{0.5cm} ";
	       // if (query2.value(0).toString().contains("TOTAL")==0) 
	      //	   stream << query2.value(0).toString() << " " ;
	       stream << "{\\scriptsize {" << filtracad(query2.value(1).toString()) << "}} & ";
 	       stream << " & ";
 	       stream << " & ";
	       if (query2.value(2).toDouble()>0.001 || query2.value(2).toDouble()<-0.001)
	             stream << "{\\scriptsize {" << 
                        formateanumerosep(query2.value(2).toDouble(),comadecimal,decimales) << "}}";
	       stream << " \\\\" << "\n";
               // tendríamos que desglosar las fórmulas (las que no contengan {)
               // desglosamos el campo fórmula que no contenga {
               QString cadpru=query2.value(5).toString();
               if (cadpru.contains('{')) continue;

               int indice=0;
               int inicio,final;
               QString ejercicio=ui.Ejercicio1comboBox->currentText();
               bool acotado=ui.fechas_ej1_groupBox->isChecked();
               QDate fecha1=ui.ini_ej1_dateEdit->date();
               QDate fecha2=ui.fin_ej1_dateEdit->date();
               bool estadosmedios=consaldosmedios;
               double valor;
               QString extract;
               while (indice<cadpru.length())
                   {
                    if (cadpru[indice]=='[')
                        {
                         inicio=indice;
                         final=inicio;
                         while (final<cadpru.length() && cadpru[final]!=']') final++;
                         // extraemos la cadena de la cuenta sin corchetes
                         extract=cadpru.mid(inicio+1,final-inicio-1);
                        // habría que calcular el valor de la cuenta
                        // QMessageBox::warning( this, tr("Estados Contables"),extract);
                        // -------------------------------------------------------------------------------------
                        if (extract.contains(':')==1) valor=cuentaespec(extract,ejercicio,acotado,fecha1,fecha2);
                           else
	                      {
                               if (!estadosmedios) valor=saldo_cuenta_lista_ej1(extract);
	                         else
		                      valor=calculamediacuenta(extract,true);
	                      }
	                // if (valor>-0.004 && valor < 0.005) continue;
                        if (inicio-1>=0 && cadpru[inicio-1]=='-') valor=-1*valor;
                        // imprimimos cadena formada por código de cuenta y descripción
                        bool positivo=false;
                        bool negativo=false;
                        positivo=extract.contains('+');
                        negativo=extract.contains('-');
                        extract.remove('+');
                        extract.remove('-');
     	                if (valor>0.001 || valor<-0.001)
                           {
                            stream << "{\\tiny {" << extract << " " << filtracad(descripcioncuenta(extract))
                                                 << "}} & &";
                            stream << "{\\tiny {" << formateanumerosep(valor,comadecimal,decimales) << "}} & ";
                            stream << " \\\\" << "\n";
                            // seguimos aquí con el desglose de todas las cuentas
                            if (condesglose)
                            {
                             QSqlQuery q;
                             if (!cod_longitud_variable())
                               {
                                q = basedatos::instancia()->selectCodigoplancontablecodigolength(extract);
                               }
                               else
                                   {
                                    q = basedatos::instancia()->selectCodigoplancontablecodigoauxiliar(extract);
                                   }
                             while (q.next())
                                 {
                                   QString extract2=q.value(0).toString();
                                   QString extract2sig=extract2;
                                   if (positivo) extract2sig.append('+');
                                   if (negativo) extract2sig.append('-');
                                   if (extract.contains(':')==1) valor=cuentaespec_aux(extract2sig,ejercicio,
                                                                           acotado,fecha1,fecha2);
                                   else
                                      {
                                       if (!estadosmedios) valor=saldo_cuenta_lista_ej1(extract2sig);
                                         else
                                       valor=calculamediacuenta_aux(extract2sig,true);
                                      }
                                   if (valor>0.001 || valor <-0.001)
                                       {
                                         stream << "\\hspace{0.5cm} ";
                                         stream << "{\\tiny {" << extract2 << " " << 
                                             filtracad(descripcioncuenta(extract2)) << "}} &";
                                         if (inicio-1>=0 && cadpru[inicio-1]=='-') valor=-1*valor;
                                         stream << "{\\tiny {" << formateanumerosep(valor,comadecimal,decimales)
                                              << "}} & &";
                                         stream << " \\\\" << "\n";
                                       }
                                  }
                              }
                           }
                       }
                    indice++;
                   }
	     }
           }
     stream << "\\hline" << "\n";
     stream << "\\end{longtable}" << "\n";
     stream << "\\end{center}" << "\n";
    }

    stream << observaciones << "\n";
    stream << "% FIN_CUERPO\n";
    stream << "\\end{document}" << "\n";

    fichero.close();

}




void calcestado::copia2()
{
    if (auxiliares.count()==0) calculaestado();
    QString ejercicio1="";
    QString parte1="";
    QString parte2="";
    QString observaciones;
    QString cabecera;
    QString descabecera;
    QString despie;
    // bool estadosmedios=false;
    bool analitica;
    QString ci;

    QSqlQuery query = basedatos::instancia()->select16Cabeceraestadostitulo( ui.titulolabel->text() );
    if ( query.isActive() ) {
           query.first();
           parte1=query.value(0).toString();
	   parte2=query.value(1).toString();
	   ejercicio1=query.value(2).toString();
       // estadosmedios=query.value(4).toBool();
	   observaciones=query.value(8).toString();
           analitica=query.value(9).toBool();
           ci=query.value(10).toString();
           cabecera=query.value(13).toString();
           descabecera=query.value(14).toString();
           despie=query.value(15).toString();
       } else return;


    QProgressDialog progreso(tr("Generando Informe ..."), 0, 0, 3);
    progreso.setWindowTitle("Estados Contables");

    progreso.setValue(1);
    QApplication::processEvents();

   QClipboard *cb = QApplication::clipboard();
   QString global;

    // Generamos primera parte del Estado Contable
    global=nombreempresa();
    global+="\n\n";
    if (ui.previsiones->isChecked())
      {
       global+="** PREVISIONES **\n\n";
      }

    // ---------------------------------------------------------------------------------------------
    if (analitica && ci.length()>0)
        {
         global+=tr("CÓDIGO DE IMPUTACIÓN\t");
         global+=ci;
         global+="\n";
         QString codigo=ci;
         QString cadena,descripcion;
         QString qnivel=0;


         if (codigo.startsWith("???"))
            {
             global+= tr("CUALQUIERA");
            }
         else
           {
            bool encontrada=buscaci(codigo.left(3),&descripcion,&qnivel);
            if (encontrada && qnivel.toInt()==1)
                global+= descripcion;
           }
         if (codigo.length()>3) global+="\t";
         if (codigo.length()>3 && codigo.mid(3,3)==QString("???")) global+= tr("CUALQUIERA");
         else
          {
           bool encontrada=buscaci(codigo.mid(3,3),&descripcion,&qnivel);
           int elnivel=qnivel.toInt();
           if (encontrada && elnivel==2)
              global += descripcion;
          }

         if (codigo.length()>6) global+="\t";
         if (codigo.length()==7 && codigo[6]=='*')  global+= tr("CUALQUIERA");
         else
           {
             bool encontrada=buscaci(codigo.right(codigo.length()-6),&descripcion,&qnivel);
             if (encontrada && qnivel.toInt()==3)
             global+=descripcion;
           }
         global+= "\n";
        }

    global+="\n";
    global+= cabecera;
    global+= "\n";
    global+= "\n";
    // ---------------------------------------------------------------------------------------

    global+= parte1;
    global+= "\t";;
    global+=tr("DETALLE");
    global+= "\t";
    global+= tr("CUENTAS");
    global+= "\t";
    global+=ejercicio1;
    global+="\n";
    
    QSqlQuery query2 = basedatos::instancia()->select6Estadostituloparte1ordernodo( ui.titulolabel->text() , true);
    int veces;
    if ( query2.isActive() ) {
             while ( query2.next() ) {
	       if (query2.value(0).toString().contains("LINEA")>0)
		 {
		   continue;
	         }
               // ----------------------------------------------------------------------
               if (ui.importescheckBox->isChecked()
                    && query2.value(2).toDouble()<0.0001 
                    && query2.value(2).toDouble()>-0.0001
                    ) continue;
	       for (veces=1;veces<=query2.value(0).toString().count('.');veces++)
		   global+= "  ";
	       global+=filtracad(query2.value(1).toString());
               global+= "\t";
 	       global+= "\t";
 	       global+= "\t";
	       if (query2.value(2).toDouble()>0.001 || query2.value(2).toDouble()<-0.001)
	             global+=formateanumero(query2.value(2).toDouble(),comadecimal,decimales);
           // -------------------------------------------------------------------------------------------
           if (ui.desglose_mes_checkBox->isChecked())
             {
               global += "\t";
               global+=formateanumero(query2.value(5).toDouble(),comadecimal,decimales);
               global += "\t";
               global+=formateanumero(query2.value(6).toDouble(),comadecimal,decimales);
               global += "\t";
               global+=formateanumero(query2.value(7).toDouble(),comadecimal,decimales);
               global += "\t";
               global+=formateanumero(query2.value(8).toDouble(),comadecimal,decimales);
               global += "\t";
               global+=formateanumero(query2.value(9).toDouble(),comadecimal,decimales);
               global += "\t";
               global+=formateanumero(query2.value(10).toDouble(),comadecimal,decimales);
               global += "\t";
               global+=formateanumero(query2.value(11).toDouble(),comadecimal,decimales);
               global += "\t";
               global+=formateanumero(query2.value(12).toDouble(),comadecimal,decimales);
               global += "\t";
               global+=formateanumero(query2.value(13).toDouble(),comadecimal,decimales);
               global += "\t";
               global+=formateanumero(query2.value(14).toDouble(),comadecimal,decimales);
               global += "\t";
               global+=formateanumero(query2.value(15).toDouble(),comadecimal,decimales);
               global += "\t";
               global+=formateanumero(query2.value(16).toDouble(),comadecimal,decimales);
             }
           global+="\n";
               // desglosamos el campo fórmula que no contenga {
               QString cadpru=query2.value(5).toString();
               if (cadpru.contains('{')) continue;

               int indice=0;
               int inicio,final;
               QString ejercicio=ui.Ejercicio1comboBox->currentText();
               bool acotado=ui.fechas_ej1_groupBox->isChecked();
               QDate fecha1=ui.ini_ej1_dateEdit->date();
               QDate fecha2=ui.fin_ej1_dateEdit->date();
               bool estadosmedios=consaldosmedios;
               double valor;
               QString extract;
               while (indice<cadpru.length())
                   {
                    QApplication::processEvents();
                    if (cadpru[indice]=='[')
                        {
                         inicio=indice;
                         final=inicio;
                         while (final<cadpru.length() && cadpru[final]!=']') final++;
                         // extraemos la cadena de la cuenta sin corchetes
                         extract=cadpru.mid(inicio+1,final-inicio-1);
                        // habría que calcular el valor de la cuenta
                        // QMessageBox::warning( this, tr("Estados Contables"),extract);
                        // -------------------------------------------------------------------------------------
                        if (extract.contains(':')==1) valor=cuentaespec(extract,ejercicio,acotado,fecha1,fecha2);
                           else
	                      {
                            if (!estadosmedios) valor=saldo_cuenta_lista_ej1(extract);
	                         else
		                      valor=calculamediacuenta(extract,true);
	                      }
	                // if (valor>-0.004 && valor < 0.005) continue;
                        if (inicio-1>=0 && cadpru[inicio-1]=='-') valor=-1*valor;
                        // imprimimos cadena formada por código de cuenta y descripción
                        bool positivo=false;
                        bool negativo=false;
                        positivo=extract.contains('+');
                        negativo=extract.contains('-');
                        //extract.remove('+');
                        //extract.remove('-');
     	                if (valor>0.001 || valor<-0.001)
                           {
                            global+=extract;
                            global+=" ";
                            global+= descripcioncuenta(extract);
                            global+= "\t\t";
                            global+=formateanumero(valor,comadecimal,decimales);
                            global+= "\t";

                            // -----------------------------------------------------------------------------
                            // repetimos esto para cada mes
                            QDate finicio;
                            QDate fin;
                           double m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12;
                           m1=m2=m3=m4=m5=m6=m7=m8=m9=m10=m11=m12=0;
                           int anyo=inicioejercicio(ui.Ejercicio1comboBox->currentText()).year();
                            if (ui.desglose_mes_checkBox->isChecked())
                            {

                            finicio.setDate(anyo,1,1);
                            fin.setDate(anyo,1,31);
                            if (extract.contains(':')==1) m1=cuentaespec(extract,ejercicio,true,
                                                                         finicio,fin);
                               else
                                   m1=saldo_cuenta_lista_mes(extract,1);


                            finicio.setDate(anyo,2,1);
                            fin.setDate(anyo,3,1);
                            fin=fin.addDays(-1);
                            if (extract.contains(':')==1) m2=cuentaespec(extract,ejercicio,true,
                                                                         finicio,fin);
                               else
                                   m2=saldo_cuenta_lista_mes(extract,2);

                            finicio.setDate(anyo,3,1);
                            fin.setDate(anyo,3,31);
                            if (extract.contains(':')==1) m3=cuentaespec(extract,ejercicio,true,
                                                                         finicio,fin);
                               else
                                  m3=saldo_cuenta_lista_mes(extract,3);


                            finicio.setDate(anyo,4,1);
                            fin.setDate(anyo,4,30);
                            if (extract.contains(':')==1) m4=cuentaespec(extract,ejercicio,true,
                                                                         finicio,fin);
                               else
                                   m4=saldo_cuenta_lista_mes(extract,4);


                            finicio.setDate(anyo,5,1);
                            fin.setDate(anyo,5,31);
                            if (extract.contains(':')==1) m5=cuentaespec(extract,ejercicio,true,
                                                                         finicio,fin);
                               else
                                   m5=saldo_cuenta_lista_mes(extract,5);

                            finicio.setDate(anyo,6,1);
                            fin.setDate(anyo,6,30);
                            if (extract.contains(':')==1) m6=cuentaespec(extract,ejercicio,true,
                                                                         finicio,fin);
                               else
                                   m6=saldo_cuenta_lista_mes(extract,6);

                            finicio.setDate(anyo,7,1);
                            fin.setDate(anyo,7,31);
                            if (extract.contains(':')==1) m7=cuentaespec(extract,ejercicio,true,
                                                                         finicio,fin);
                               else
                                   m7=saldo_cuenta_lista_mes(extract,7);

                            finicio.setDate(anyo,8,1);
                            fin.setDate(anyo,8,31);
                            if (extract.contains(':')==1) m8=cuentaespec(extract,ejercicio,true,
                                                                         finicio,fin);
                               else
                                   m8=saldo_cuenta_lista_mes(extract,8);

                            finicio.setDate(anyo,9,1);
                            fin.setDate(anyo,9,30);
                            if (extract.contains(':')==1) m9=cuentaespec(extract,ejercicio,true,
                                                                         finicio,fin);
                               else
                                   m9=saldo_cuenta_lista_mes(extract,9);


                            finicio.setDate(anyo,10,1);
                            fin.setDate(anyo,10,31);
                            if (extract.contains(':')==1) m10=cuentaespec(extract,ejercicio,true,
                                                                         finicio,fin);
                               else
                                   m10=saldo_cuenta_lista_mes(extract,10);


                            finicio.setDate(anyo,11,1);
                            fin.setDate(anyo,11,30);
                            if (extract.contains(':')==1) m11=cuentaespec(extract,ejercicio,true,
                                                                         finicio,fin);
                               else
                                   m11=saldo_cuenta_lista_mes(extract,11);


                            finicio.setDate(anyo,12,1);
                            fin.setDate(anyo,12,31);
                            if (extract.contains(':')==1) m12=cuentaespec(extract,ejercicio,true,
                                                                         finicio,fin);
                               else
                                   m12=saldo_cuenta_lista_mes(extract,12);

                            if (inicio-1>=0 && cadpru[inicio-1]=='-') m1=-1*m1;
                            if (inicio-1>=0 && cadpru[inicio-1]=='-') m2=-1*m2;
                            if (inicio-1>=0 && cadpru[inicio-1]=='-') m3=-1*m3;
                            if (inicio-1>=0 && cadpru[inicio-1]=='-') m4=-1*m4;
                            if (inicio-1>=0 && cadpru[inicio-1]=='-') m5=-1*m5;
                            if (inicio-1>=0 && cadpru[inicio-1]=='-') m6=-1*m6;
                            if (inicio-1>=0 && cadpru[inicio-1]=='-') m7=-1*m7;
                            if (inicio-1>=0 && cadpru[inicio-1]=='-') m8=-1*m8;
                            if (inicio-1>=0 && cadpru[inicio-1]=='-') m9=-1*m9;
                            if (inicio-1>=0 && cadpru[inicio-1]=='-') m10=-1*m10;
                            if (inicio-1>=0 && cadpru[inicio-1]=='-') m11=-1*m11;
                            if (inicio-1>=0 && cadpru[inicio-1]=='-') m12=-1*m12;
                            // if (valor>-0.004 && valor < 0.005) continue;
                            // if (inicio-1>=0 && cadpru[inicio-1]=='-') valor=-1*valor;
                            // imprimimos cadena formada por código de cuenta y descripción
                                // ahora todos los meses
                             // global+="\t\t";
                             global+= "\t" + formateanumerosep(m1,comadecimal,decimales);
                             global+= "\t" + formateanumerosep(m2,comadecimal,decimales);
                             global+= "\t" + formateanumerosep(m3,comadecimal,decimales);
                             global+= "\t" + formateanumerosep(m4,comadecimal,decimales);
                             global+= "\t" + formateanumerosep(m5,comadecimal,decimales);
                             global+= "\t" + formateanumerosep(m6,comadecimal,decimales);
                             global+= "\t" + formateanumerosep(m7,comadecimal,decimales);
                             global+= "\t" + formateanumerosep(m8,comadecimal,decimales);
                             global+= "\t" + formateanumerosep(m9,comadecimal,decimales);
                             global+= "\t" + formateanumerosep(m10,comadecimal,decimales);
                             global+= "\t" + formateanumerosep(m11,comadecimal,decimales);
                             global+= "\t" + formateanumerosep(m12,comadecimal,decimales);
                            }
                            // -----------------------------------------------------------------------------
                            global+= "\n";
                            // seguimos aquí con el desglose de todas las cuentas
                            QSqlQuery q;
                            if (!cod_longitud_variable())
                               {
                                q = basedatos::instancia()->selectCodigoplancontablecodigolength(extract);
                               }
                               else
                                   {
                                    q = basedatos::instancia()->selectCodigoplancontablecodigoauxiliar(extract);
                                   }
                            while (q.next())
                                 {
                                   QString extract2=q.value(0).toString();
                                   QString extract2sig=extract2;
                                   if (positivo) extract2sig.append('+');
                                   if (negativo) extract2sig.append('-');
                                   if (extract.contains(':')==1) valor=cuentaespec_aux(extract2sig,ejercicio,
                                                                                  acotado,fecha1,fecha2);
                                   else
                                     {
                                     if (!estadosmedios) valor=saldo_cuenta_lista_ej1(extract2sig);
                                      else
                                        valor=calculamediacuenta_aux(extract2sig,true);
                                     }
                                   // --------------------------------------------------------------------------
                                   if (ui.desglose_mes_checkBox->isChecked())
                                   {
                                    finicio.setDate(anyo,1,1);
                                    fin.setDate(anyo,1,31);
                                    if (extract2sig.contains(':')==1) m1=cuentaespec(extract2sig,ejercicio,true,
                                                                                finicio,fin);
                                      else
                                          m1=saldo_cuenta_lista_mes(extract2sig,1);


                                   finicio.setDate(anyo,2,1);
                                   fin.setDate(anyo,3,1);
                                   fin=fin.addDays(-1);
                                   if (extract2sig.contains(':')==1) m2=cuentaespec(extract2sig,ejercicio,true,
                                                                                finicio,fin);
                                      else
                                          m2=saldo_cuenta_lista_mes(extract2sig,2);


                                   finicio.setDate(anyo,3,1);
                                   fin.setDate(anyo,3,31);
                                   if (extract2sig.contains(':')==1) m3=cuentaespec(extract2sig,ejercicio,true,
                                                                                finicio,fin);
                                      else
                                          m3=saldo_cuenta_lista_mes(extract2sig,3);


                                   finicio.setDate(anyo,4,1);
                                   fin.setDate(anyo,4,30);
                                   if (extract2sig.contains(':')==1) m4=cuentaespec(extract2sig,ejercicio,true,
                                                                                finicio,fin);
                                      else
                                          m4=saldo_cuenta_lista_mes(extract2sig,4);


                                   finicio.setDate(anyo,5,1);
                                   fin.setDate(anyo,5,31);
                                   if (extract2sig.contains(':')==1) m5=cuentaespec(extract2sig,ejercicio,true,
                                                                                finicio,fin);
                                      else
                                          m5=saldo_cuenta_lista_mes(extract2sig,5);

                                   finicio.setDate(anyo,6,1);
                                   fin.setDate(anyo,6,30);
                                   if (extract2sig.contains(':')==1) m6=cuentaespec(extract2sig,ejercicio,true,
                                                                                finicio,fin);
                                      else
                                          m6=saldo_cuenta_lista_mes(extract2sig,6);

                                   finicio.setDate(anyo,7,1);
                                   fin.setDate(anyo,7,31);
                                   if (extract2sig.contains(':')==1) m7=cuentaespec(extract2sig,ejercicio,true,
                                                                                finicio,fin);
                                      else
                                          m7=saldo_cuenta_lista_mes(extract2sig,7);

                                   finicio.setDate(anyo,8,1);
                                   fin.setDate(anyo,8,31);
                                   if (extract2sig.contains(':')==1) m8=cuentaespec(extract2sig,ejercicio,true,
                                                                                finicio,fin);
                                      else
                                          m8=saldo_cuenta_lista_mes(extract2sig,8);


                                   finicio.setDate(anyo,9,1);
                                   fin.setDate(anyo,9,30);
                                   if (extract2sig.contains(':')==1) m9=cuentaespec(extract2sig,ejercicio,true,
                                                                                finicio,fin);
                                      else
                                          m9=saldo_cuenta_lista_mes(extract2sig,9);


                                   finicio.setDate(anyo,10,1);
                                   fin.setDate(anyo,10,31);
                                   if (extract2sig.contains(':')==1) m10=cuentaespec(extract2sig,ejercicio,true,
                                                                                finicio,fin);
                                      else
                                          m10=saldo_cuenta_lista_mes(extract2sig,10);


                                   finicio.setDate(anyo,11,1);
                                   fin.setDate(anyo,11,30);
                                   if (extract2sig.contains(':')==1) m11=cuentaespec(extract2sig,ejercicio,true,
                                                                                finicio,fin);
                                      else
                                          m11=saldo_cuenta_lista_mes(extract2sig,11);


                                   finicio.setDate(anyo,12,1);
                                   fin.setDate(anyo,12,31);
                                   if (extract2sig.contains(':')==1) m12=cuentaespec(extract2sig,ejercicio,true,
                                                                                finicio,fin);
                                      else
                                          m12=saldo_cuenta_lista_mes(extract2sig,12);

                                   }
                                   if (valor>0.001 || valor <-0.001)
                                       {
                                         global += extract2 + " " +
                                             filtracad(descripcioncuenta(extract2)) + "\t";
                                         if (inicio-1>=0 && cadpru[inicio-1]=='-') valor=-1*valor;
                                         global += formateanumerosep(valor,comadecimal,decimales) + "\t ";
                                         // ahora todos los meses
                                         if (ui.desglose_mes_checkBox->isChecked())
                                         {
                                         if (inicio-1>=0 && cadpru[inicio-1]=='-') m1=-1*m1;
                                         if (inicio-1>=0 && cadpru[inicio-1]=='-') m2=-1*m2;
                                         if (inicio-1>=0 && cadpru[inicio-1]=='-') m3=-1*m3;
                                         if (inicio-1>=0 && cadpru[inicio-1]=='-') m4=-1*m4;
                                         if (inicio-1>=0 && cadpru[inicio-1]=='-') m5=-1*m5;
                                         if (inicio-1>=0 && cadpru[inicio-1]=='-') m6=-1*m6;
                                         if (inicio-1>=0 && cadpru[inicio-1]=='-') m7=-1*m7;
                                         if (inicio-1>=0 && cadpru[inicio-1]=='-') m8=-1*m8;
                                         if (inicio-1>=0 && cadpru[inicio-1]=='-') m9=-1*m9;
                                         if (inicio-1>=0 && cadpru[inicio-1]=='-') m10=-1*m10;
                                         if (inicio-1>=0 && cadpru[inicio-1]=='-') m11=-1*m11;
                                         if (inicio-1>=0 && cadpru[inicio-1]=='-') m12=-1*m12;
                                         global += "\t\t";
                                         global += formateanumerosep(m1,comadecimal,decimales) + "\t ";
                                         global += formateanumerosep(m2,comadecimal,decimales) + "\t ";
                                         global += formateanumerosep(m3,comadecimal,decimales) + "\t ";
                                         global += formateanumerosep(m4,comadecimal,decimales) + "\t ";
                                         global += formateanumerosep(m5,comadecimal,decimales) + "\t ";
                                         global += formateanumerosep(m6,comadecimal,decimales) + "\t ";
                                         global += formateanumerosep(m7,comadecimal,decimales) + "\t ";
                                         global += formateanumerosep(m8,comadecimal,decimales) + "\t ";
                                         global += formateanumerosep(m9,comadecimal,decimales) + "\t ";
                                         global += formateanumerosep(m10,comadecimal,decimales) + "\t ";
                                         global += formateanumerosep(m11,comadecimal,decimales) + "\t ";
                                         global += formateanumerosep(m12,comadecimal,decimales);
                                         }
                                         global += "\n";
                                       }
                                   // --------------------------------------------------------------------------
                                  }
                           }
                       }
                    indice++;
                   }
	     } // final del while query
           }
    global+="\n\n";


    progreso.setValue(2);
    QApplication::processEvents();

 if (parte2.length()>0)
   {
    global+=cabecera;
    global+="\n\n";

    global+= parte2;
    global+= "\t";
    global+=tr("DETALLE");
    global+="\t";
    global+=tr("CUENTAS");
    global+="\t";
    global+= ejercicio1;
    global+="\n";
    
    QSqlQuery query2 = basedatos::instancia()->select6Estadostituloparte1ordernodo( ui.titulolabel->text() , false);
    int veces;
    if ( query2.isActive() ) {
             while ( query2.next() ) {
	       if (query2.value(0).toString().contains("LINEA")>0)
             {
              continue;
	         }
               // ----------------------------------------------------------------------
               if (ui.importescheckBox->isChecked()
                    && query2.value(2).toDouble()<0.0001 
                    && query2.value(2).toDouble()>-0.0001
                   ) continue;
	       for (veces=1;veces<=query2.value(0).toString().count('.');veces++)
		   global+="  ";
	       global+=filtracad(query2.value(1).toString());
               global+="\t";
 	       global+="\t";
 	       global+="\t";
	       if (query2.value(2).toDouble()>0.001 || query2.value(2).toDouble()<-0.001)
	             global+=formateanumero(query2.value(2).toDouble(),comadecimal,decimales);
           // -----------------------------------------------------------------------------------------
           if (ui.desglose_mes_checkBox->isChecked())
             {
               global += "\t";
               global+=formateanumero(query2.value(5).toDouble(),comadecimal,decimales);
               global += "\t";
               global+=formateanumero(query2.value(6).toDouble(),comadecimal,decimales);
               global += "\t";
               global+=formateanumero(query2.value(7).toDouble(),comadecimal,decimales);
               global += "\t";
               global+=formateanumero(query2.value(8).toDouble(),comadecimal,decimales);
               global += "\t";
               global+=formateanumero(query2.value(9).toDouble(),comadecimal,decimales);
               global += "\t";
               global+=formateanumero(query2.value(10).toDouble(),comadecimal,decimales);
               global += "\t";
               global+=formateanumero(query2.value(11).toDouble(),comadecimal,decimales);
               global += "\t";
               global+=formateanumero(query2.value(12).toDouble(),comadecimal,decimales);
               global += "\t";
               global+=formateanumero(query2.value(13).toDouble(),comadecimal,decimales);
               global += "\t";
               global+=formateanumero(query2.value(14).toDouble(),comadecimal,decimales);
               global += "\t";
               global+=formateanumero(query2.value(15).toDouble(),comadecimal,decimales);
               global += "\t";
               global+=formateanumero(query2.value(16).toDouble(),comadecimal,decimales);
             }
	       global+= "\n";
               // tendríamos que desglosar las fórmulas (las que no contengan {)
               // desglosamos el campo fórmula que no contenga {
               QString cadpru=query2.value(5).toString();
               if (cadpru.contains('{')) continue;

               int indice=0;
               int inicio,final;
               QString ejercicio=ui.Ejercicio1comboBox->currentText();
               bool acotado=ui.fechas_ej1_groupBox->isChecked();
               QDate fecha1=ui.ini_ej1_dateEdit->date();
               QDate fecha2=ui.fin_ej1_dateEdit->date();
               bool estadosmedios=consaldosmedios;
               double valor;
               QString extract;
               while (indice<cadpru.length())
                   {
                    if (cadpru[indice]=='[')
                        {
                         inicio=indice;
                         final=inicio;
                         while (final<cadpru.length() && cadpru[final]!=']') final++;
                         // extraemos la cadena de la cuenta sin corchetes
                         extract=cadpru.mid(inicio+1,final-inicio-1);
                        // habría que calcular el valor de la cuenta
                        // QMessageBox::warning( this, tr("Estados Contables"),extract);
                        // -------------------------------------------------------------------------------------
                        if (extract.contains(':')==1) valor=cuentaespec(extract,ejercicio,
                                                                    acotado,fecha1,fecha2);
                           else
	                      {
                               if (!estadosmedios) valor=saldo_cuenta_lista_ej1(extract);
	                         else
                                      valor=calculamediacuenta(extract,true);
	                      }
                        if (inicio-1>=0 && cadpru[inicio-1]=='-') valor=-1*valor;
                        bool positivo=false;
                        bool negativo=false;
                        positivo=extract.contains('+');
                        negativo=extract.contains('-');
                        //extract.remove('+');
                        //extract.remove('-');
     	                if (valor>0.001 || valor<-0.001)
                           {
                            global+=  extract;
                            global+= " ";
                            global+=  descripcioncuenta(extract);
                            global+= "\t\t";
                            global+= formateanumero(valor,comadecimal,decimales);
                            global+= "\t";
                            // -----------------------------------------------------------------------------

                            // -----------------------------------------------------------------------------
                            // repetimos esto para cada mes
                            QDate finicio;
                            QDate fin;
                            double m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12;
                            int anyo=inicioejercicio(ui.Ejercicio1comboBox->currentText()).year();
                            m1=m2=m3=m4=m5=m6=m7=m8=m9=m10=m11=m12=0;
                           if (ui.desglose_mes_checkBox->isChecked())
                           {
                            // QDate finicio;
                            // QDate fin;
                            // double m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12;
                            // int anyo=inicioejercicio(ui.Ejercicio1comboBox->currentText()).year();

                            finicio.setDate(anyo,1,1);
                            fin.setDate(anyo,1,31);
                            if (extract.contains(':')==1) m1=cuentaespec(extract,ejercicio,true,
                                                                         finicio,fin);
                               else
                                   m1=saldo_cuenta_lista_mes(extract,1);


                            finicio.setDate(anyo,2,1);
                            fin.setDate(anyo,3,1);
                            fin=fin.addDays(-1);
                            if (extract.contains(':')==1) m2=cuentaespec(extract,ejercicio,true,
                                                                         finicio,fin);
                               else
                                   m2=saldo_cuenta_lista_mes(extract,2);


                            finicio.setDate(anyo,3,1);
                            fin.setDate(anyo,3,31);
                            if (extract.contains(':')==1) m3=cuentaespec(extract,ejercicio,true,
                                                                         finicio,fin);
                               else
                                   m3=saldo_cuenta_lista_mes(extract,3);


                            finicio.setDate(anyo,4,1);
                            fin.setDate(anyo,4,30);
                            if (extract.contains(':')==1) m4=cuentaespec(extract,ejercicio,true,
                                                                         finicio,fin);
                               else
                                   m4=saldo_cuenta_lista_mes(extract,4);


                            finicio.setDate(anyo,5,1);
                            fin.setDate(anyo,5,31);
                            if (extract.contains(':')==1) m5=cuentaespec(extract,ejercicio,true,
                                                                         finicio,fin);
                               else
                                   m5=saldo_cuenta_lista_mes(extract,5);


                            finicio.setDate(anyo,6,1);
                            fin.setDate(anyo,6,30);
                            if (extract.contains(':')==1) m6=cuentaespec(extract,ejercicio,true,
                                                                         finicio,fin);
                               else
                                   m6=saldo_cuenta_lista_mes(extract,6);


                            finicio.setDate(anyo,7,1);
                            fin.setDate(anyo,7,31);
                            if (extract.contains(':')==1) m7=cuentaespec(extract,ejercicio,true,
                                                                         finicio,fin);
                               else
                                   m7=saldo_cuenta_lista_mes(extract,7);


                            finicio.setDate(anyo,8,1);
                            fin.setDate(anyo,8,31);
                            if (extract.contains(':')==1) m8=cuentaespec(extract,ejercicio,true,
                                                                         finicio,fin);
                               else
                                   m8=saldo_cuenta_lista_mes(extract,8);


                            finicio.setDate(anyo,9,1);
                            fin.setDate(anyo,9,30);
                            if (extract.contains(':')==1) m9=cuentaespec(extract,ejercicio,true,
                                                                         finicio,fin);
                               else
                                   m9=saldo_cuenta_lista_mes(extract,9);


                            finicio.setDate(anyo,10,1);
                            fin.setDate(anyo,10,31);
                            if (extract.contains(':')==1) m10=cuentaespec(extract,ejercicio,true,
                                                                         finicio,fin);
                               else
                                   m10=saldo_cuenta_lista_mes(extract,10);


                            finicio.setDate(anyo,11,1);
                            fin.setDate(anyo,11,30);
                            if (extract.contains(':')==1) m11=cuentaespec(extract,ejercicio,true,
                                                                         finicio,fin);
                               else
                                   m11=saldo_cuenta_lista_mes(extract,11);


                            finicio.setDate(anyo,12,1);
                            fin.setDate(anyo,12,31);
                            if (extract.contains(':')==1) m12=cuentaespec(extract,ejercicio,true,
                                                                         finicio,fin);
                               else
                                   m12=saldo_cuenta_lista_mes(extract,12);



                            // if (valor>-0.004 && valor < 0.005) continue;
                            // if (inicio-1>=0 && cadpru[inicio-1]=='-') valor=-1*valor;
                            // imprimimos cadena formada por código de cuenta y descripción
                                // ahora todos los meses
                             if (inicio-1>=0 && cadpru[inicio-1]=='-') m1=-1*m1;
                             if (inicio-1>=0 && cadpru[inicio-1]=='-') m2=-1*m2;
                             if (inicio-1>=0 && cadpru[inicio-1]=='-') m3=-1*m3;
                             if (inicio-1>=0 && cadpru[inicio-1]=='-') m4=-1*m4;
                             if (inicio-1>=0 && cadpru[inicio-1]=='-') m5=-1*m5;
                             if (inicio-1>=0 && cadpru[inicio-1]=='-') m6=-1*m6;
                             if (inicio-1>=0 && cadpru[inicio-1]=='-') m7=-1*m7;
                             if (inicio-1>=0 && cadpru[inicio-1]=='-') m8=-1*m8;
                             if (inicio-1>=0 && cadpru[inicio-1]=='-') m9=-1*m9;
                             if (inicio-1>=0 && cadpru[inicio-1]=='-') m10=-1*m10;
                             if (inicio-1>=0 && cadpru[inicio-1]=='-') m11=-1*m11;
                             if (inicio-1>=0 && cadpru[inicio-1]=='-') m12=-1*m12;
                             global+= "\t" + formateanumerosep(m1,comadecimal,decimales);
                             global+= "\t" + formateanumerosep(m2,comadecimal,decimales);
                             global+= "\t" + formateanumerosep(m3,comadecimal,decimales);
                             global+= "\t" + formateanumerosep(m4,comadecimal,decimales);
                             global+= "\t" + formateanumerosep(m5,comadecimal,decimales);
                             global+= "\t" + formateanumerosep(m6,comadecimal,decimales);
                             global+= "\t" + formateanumerosep(m7,comadecimal,decimales);
                             global+= "\t" + formateanumerosep(m8,comadecimal,decimales);
                             global+= "\t" + formateanumerosep(m9,comadecimal,decimales);
                             global+= "\t" + formateanumerosep(m10,comadecimal,decimales);
                             global+= "\t" + formateanumerosep(m11,comadecimal,decimales);
                             global+= "\t" + formateanumerosep(m12,comadecimal,decimales);
                            }
                            // -----------------------------------------------------------------------------

                            global+= "\n";
                            // seguimos aquí con el desglose de todas las cuentas
                            QSqlQuery q;
                            if (!cod_longitud_variable())
                               {
                                q = basedatos::instancia()->selectCodigoplancontablecodigolength(extract);
                               }
                                else
                                     {
                                   q = basedatos::instancia()->selectCodigoplancontablecodigoauxiliar(extract);
                                     }
                            while (q.next())
                                 {
                                   QString extract2=q.value(0).toString();
                                   QString extract2sig=extract2;
                                   if (positivo) extract2sig.append('+');
                                   if (negativo) extract2sig.append('-');
                                   if (extract.contains(':')==1) valor=cuentaespec_aux(extract2sig,ejercicio,
                                                                        acotado,fecha1,fecha2);
                                   else
                                     {
                                      if (!estadosmedios) valor=saldo_cuenta_lista_ej1(extract2sig);
                                       else
                                         valor=calculamediacuenta_aux(extract2sig,true);
                                     }
                                   // --------------------------------------------------------------------------
                                   if (ui.desglose_mes_checkBox->isChecked())
                                   {
                                    finicio.setDate(anyo,1,1);
                                    fin.setDate(anyo,1,31);
                                    if (extract2sig.contains(':')==1) m1=cuentaespec(extract2sig,ejercicio,true,
                                                                                finicio,fin);
                                      else
                                          m1=saldo_cuenta_lista_mes(extract2sig,1);



                                   finicio.setDate(anyo,2,1);
                                   fin.setDate(anyo,3,1);
                                   fin=fin.addDays(-1);
                                   if (extract2sig.contains(':')==1) m2=cuentaespec(extract2sig,ejercicio,true,
                                                                                finicio,fin);
                                      else
                                          m2=saldo_cuenta_lista_mes(extract2sig,2);


                                   finicio.setDate(anyo,3,1);
                                   fin.setDate(anyo,3,31);
                                   if (extract2sig.contains(':')==1) m3=cuentaespec(extract2sig,ejercicio,true,
                                                                                finicio,fin);
                                      else
                                          m3=saldo_cuenta_lista_mes(extract2sig,3);


                                   finicio.setDate(anyo,4,1);
                                   fin.setDate(anyo,4,30);
                                   if (extract2sig.contains(':')==1) m4=cuentaespec(extract2sig,ejercicio,true,
                                                                                finicio,fin);
                                      else
                                          m4=saldo_cuenta_lista_mes(extract2sig,4);


                                   finicio.setDate(anyo,5,1);
                                   fin.setDate(anyo,5,31);
                                   if (extract2sig.contains(':')==1) m5=cuentaespec(extract2sig,ejercicio,true,
                                                                                finicio,fin);
                                      else
                                          m5=saldo_cuenta_lista_mes(extract2sig,5);


                                   finicio.setDate(anyo,6,1);
                                   fin.setDate(anyo,6,30);
                                   if (extract2sig.contains(':')==1) m6=cuentaespec(extract2sig,ejercicio,true,
                                                                                finicio,fin);
                                      else
                                          m6=saldo_cuenta_lista_mes(extract2sig,6);


                                   finicio.setDate(anyo,7,1);
                                   fin.setDate(anyo,7,31);
                                   if (extract2sig.contains(':')==1) m7=cuentaespec(extract2sig,ejercicio,true,
                                                                                finicio,fin);
                                      else
                                          m7=saldo_cuenta_lista_mes(extract2sig,7);


                                   finicio.setDate(anyo,8,1);
                                   fin.setDate(anyo,8,31);
                                   if (extract2sig.contains(':')==1) m8=cuentaespec(extract2sig,ejercicio,true,
                                                                                finicio,fin);
                                      else
                                          m8=saldo_cuenta_lista_mes(extract2sig,8);


                                   finicio.setDate(anyo,9,1);
                                   fin.setDate(anyo,9,30);
                                   if (extract2sig.contains(':')==1) m9=cuentaespec(extract2sig,ejercicio,true,
                                                                                finicio,fin);
                                      else
                                          m9=saldo_cuenta_lista_mes(extract2sig,9);


                                   finicio.setDate(anyo,10,1);
                                   fin.setDate(anyo,10,31);
                                   if (extract2sig.contains(':')==1) m10=cuentaespec(extract2sig,ejercicio,true,
                                                                                finicio,fin);
                                      else
                                          m10=saldo_cuenta_lista_mes(extract2sig,10);


                                   finicio.setDate(anyo,11,1);
                                   fin.setDate(anyo,11,30);
                                   if (extract2sig.contains(':')==1) m11=cuentaespec(extract2sig,ejercicio,true,
                                                                                finicio,fin);
                                      else
                                          m11=saldo_cuenta_lista_mes(extract2sig,11);

                                   finicio.setDate(anyo,12,1);
                                   fin.setDate(anyo,12,31);
                                   if (extract2sig.contains(':')==1) m12=cuentaespec(extract2sig,ejercicio,true,
                                                                                finicio,fin);
                                      else
                                          m12=saldo_cuenta_lista_mes(extract2sig,12);

                                   }
                                   if (valor>0.001 || valor <-0.001)
                                       {
                                         global += extract2 + " " +
                                             filtracad(descripcioncuenta(extract2)) + "\t";
                                         if (inicio-1>=0 && cadpru[inicio-1]=='-') valor=-1*valor;
                                         global += formateanumerosep(valor,comadecimal,decimales) + "\t ";
                                         // ahora todos los meses
                                         if (ui.desglose_mes_checkBox->isChecked())
                                         {
                                         if (inicio-1>=0 && cadpru[inicio-1]=='-') m1=-1*m1;
                                         if (inicio-1>=0 && cadpru[inicio-1]=='-') m2=-1*m2;
                                         if (inicio-1>=0 && cadpru[inicio-1]=='-') m3=-1*m3;
                                         if (inicio-1>=0 && cadpru[inicio-1]=='-') m4=-1*m4;
                                         if (inicio-1>=0 && cadpru[inicio-1]=='-') m5=-1*m5;
                                         if (inicio-1>=0 && cadpru[inicio-1]=='-') m6=-1*m6;
                                         if (inicio-1>=0 && cadpru[inicio-1]=='-') m7=-1*m7;
                                         if (inicio-1>=0 && cadpru[inicio-1]=='-') m8=-1*m8;
                                         if (inicio-1>=0 && cadpru[inicio-1]=='-') m9=-1*m9;
                                         if (inicio-1>=0 && cadpru[inicio-1]=='-') m10=-1*m10;
                                         if (inicio-1>=0 && cadpru[inicio-1]=='-') m11=-1*m11;
                                         if (inicio-1>=0 && cadpru[inicio-1]=='-') m12=-1*m12;
                                         global += "\t\t";
                                         global += formateanumerosep(m1,comadecimal,decimales) + "\t ";
                                         global += formateanumerosep(m2,comadecimal,decimales) + "\t ";
                                         global += formateanumerosep(m3,comadecimal,decimales) + "\t ";
                                         global += formateanumerosep(m4,comadecimal,decimales) + "\t ";
                                         global += formateanumerosep(m5,comadecimal,decimales) + "\t ";
                                         global += formateanumerosep(m6,comadecimal,decimales) + "\t ";
                                         global += formateanumerosep(m7,comadecimal,decimales) + "\t ";
                                         global += formateanumerosep(m8,comadecimal,decimales) + "\t ";
                                         global += formateanumerosep(m9,comadecimal,decimales) + "\t ";
                                         global += formateanumerosep(m10,comadecimal,decimales) + "\t ";
                                         global += formateanumerosep(m11,comadecimal,decimales) + "\t ";
                                         global += formateanumerosep(m12,comadecimal,decimales);
                                         }
                                         global += "\n";
                                       }
                                   // --------------------------------------------------------------------------
                                  }
                           }
                       }
                    indice++;
                   }
	     }
           }
    }

    global+="\n";
    global+= observaciones;

    cb->setText(global);
    QMessageBox::information( this, tr("Cálculo de Estado Contable"),
                             tr("Se ha pasado el contenido al portapapeles") );
}


void calcestado::generagrafico()
{
 QStringList etiquetas_parte1; // activo
 QStringList etiquetas_parte2; // pasivo
 QList<double> valores_parte1; // activo
 QList<double> valores_parte2; // pasivo

 QSqlQuery query2 = basedatos::instancia()->select4Estadostituloordernodo( ui.titulolabel->text() , true);

 if (query2.isActive())
 while (query2.next())
    {
     if (query2.value(0).toString().contains('.')) continue;
     etiquetas_parte1 << query2.value(1).toString();
     valores_parte1 << query2.value(2).toDouble();
    }

 query2 = basedatos::instancia()->select5Estadostituloparte1ordernodo( ui.titulolabel->text() , false);
 while (query2.next())
    {
     if (query2.value(0).toString().contains('.')) continue;
     etiquetas_parte2 << query2.value(1).toString();
     valores_parte2 << query2.value(2).toDouble();
    }


 QSqlQuery query = basedatos::instancia()->select4Estadostitulo( ui.titulolabel->text() );

 QString nombreEmpresa;
 QString ejercicio;
 QString titulo1;
 QString titulo2;
 if (query.next())
    {
     nombreEmpresa=nombreempresa();
     ejercicio=query.value(2).toString();
     titulo1=query.value(0).toString();
     titulo2=query.value(1).toString();
    }
 grafico qgraf(nombreEmpresa,ejercicio,titulo1,titulo2,etiquetas_parte1,etiquetas_parte2,
                valores_parte1,valores_parte2,ui.titulolabel->text());
 qgraf.exec();

}



double calcestado::cuentaespec_aux( QString extract, QString ejercicio,
                                   bool acotacion, QDate fecha1, QDate fecha2 )
{
   double resultado=0;
  // separamos código de cuenta y especificador
   QString codigo=extract.section(':',0,0);
   QString espec=extract.section(':',1,1);
   if (espec==cadenamedia()) 
      {
        if (ui.Ejercicio1comboBox->currentText()==ejercicio)  resultado=calculamediacuenta_aux(codigo,true);
	else resultado=calculamediacuenta_aux(codigo,false);
      }
      else
          {
           resultado=calculacuentadiario_aux(codigo,ejercicio,espec,acotacion,fecha1,fecha2);
          }
   return resultado;
}


double calcestado::calculacuenta_aux(QString codigo, QString ejercicio,
                                     bool acotacion, QDate fecha1, QDate fecha2)
{
  bool positivo=false;
  bool negativo=false;
  positivo=codigo.contains('+');
  negativo=codigo.contains('-');
  if (positivo && negativo) return 0;
  if (positivo) codigo.remove('+');
  if (negativo) codigo.remove('-');
  if (ui.previsiones->isChecked())
     {
      double valor=prevision(codigo,ejercicio);
      if (positivo && valor<0) return 0;
      if (negativo && valor>0) return 0;
      return valor;
     }
  if (!ui.diariolistWidget->isEnabled() ) return 0;
  QDate fechaini,fechafin;

  fechaini = basedatos::instancia()->selectAperturaejercicios( ejercicio );
  fechafin = basedatos::instancia()->selectCierreejercicios( ejercicio );

  if (acotacion)
     {
      fechaini=fecha1;
      fechafin=fecha2;
     }

  QString cadena;
  double resultado=0;

  QString subcadena="";
  // ESPECIFICAMOS DIARIOS SEGÚN CONTENIDO DE LA LISTA
  int numdiarios=ui.diariolistWidget->count();
  for (int veces=0;veces<numdiarios;veces++)
     {
      if (subcadena=="") subcadena=subcadena+" and (";
        else subcadena=subcadena+" or ";
      subcadena+="diario='";
      ui.diariolistWidget->setCurrentRow(veces);
      QString caddia=ui.diariolistWidget->currentItem()->text();
      if (caddia!=diario_no_asignado())
         subcadena+=caddia.left(-1).replace("'","''");
      subcadena+="'";
     }
  if (subcadena.length()>0) subcadena+=")";

  QSqlQuery query = basedatos::instancia()->selectCuentadebehaberdiariocuentaigualfechasgroupcuenta( codigo, fechaini, fechafin, subcadena, ui.cilineEdit->text() );;
  if ( query.isActive() ) {
     while ( query.next() ) 
           {
            if (positivo || negativo)
               {
                if (positivo && query.value(1).toDouble()>0) resultado+=query.value(1).toDouble();
                if (negativo && query.value(1).toDouble()<0) resultado+=query.value(1).toDouble();
               }
               else
	           resultado+=query.value(1).toDouble();
           }
     }
  return resultado;
}


double calcestado::calculamediacuenta_aux(QString codigo,bool ejercicio1)
{
  bool positivo=false;
  bool negativo=false;
  positivo=codigo.contains('+');
  negativo=codigo.contains('-');
  if (positivo && negativo) return 0;
  if (positivo) codigo.remove('+');
  if (negativo) codigo.remove('-');

    return basedatos::instancia()->selectSumsaldomediosaldossubcuentaigualcodigo(ejercicio1,codigo,positivo,negativo);
}


double calcestado::calculacuentadiario_aux( QString codigo, QString ejercicio, QString qdiario,
                                           bool acotacion, QDate fecha1, QDate fecha2 )
{
  double resultado=0;
  bool positivo=false;
  bool negativo=false;
  positivo=codigo.contains('+');
  negativo=codigo.contains('-');
  if (positivo && negativo) return 0;
  if (positivo) codigo.remove('+');
  if (negativo) codigo.remove('-');
  if (qdiario==previsiones())
     {
      if (positivo) return previsionsegunsaldo_aux(codigo,ejercicio,true);
      if (negativo) return previsionsegunsaldo_aux(codigo,ejercicio,false);
      return prevision(codigo,ejercicio);;
     }
  if (!ui.diariolistWidget->isEnabled() ) return 0;
  QDate fechaini,fechafin;

  fechaini = basedatos::instancia()->selectAperturaejercicios(ejercicio);
  fechafin = basedatos::instancia()->selectCierreejercicios(ejercicio);

  if (acotacion)
     {
      fechaini=fecha1;
      fechafin=fecha2;
     }

    QString subcadena = "' and diario='";
    if (qdiario!=diario_no_asignado())
        subcadena += qdiario.left(-1).replace("'","''");
    subcadena += "'";

    QSqlQuery query = basedatos::instancia()->selectCuentadebehaberdiariocuentaigualfechasgroupcuenta(codigo, fechaini, fechafin, subcadena,"");


  resultado=0;
  if ( query.isActive() ) {
     while ( query.next() ) 
           {
            if (positivo || negativo)
               {
                if (positivo && query.value(1).toDouble()>0) resultado+=query.value(1).toDouble();
                if (negativo && query.value(1).toDouble()<0) resultado+=query.value(1).toDouble();
               }
               else
	           resultado+=query.value(1).toDouble();
           }
     }
  return resultado;
}


void calcestado::latex()
{

    QString qfichero;
    if (ui.texlineEdit->text().length()==0)
       qfichero=tr("estadocontable");
    else
          {
             qfichero=ui.texlineEdit->text();
             if (ui.texlineEdit->text().right(4)==".tex") qfichero=qfichero.left(qfichero.length()-4);
          }

     generalatex();

    int valor=editalatex(qfichero);
    if (valor==1)
        QMessageBox::warning( this, tr("ESTADOS CONTABLES"),tr("PROBLEMAS al llamar al editor Latex"));

}



// jsala
double calcestado::calculacuentaci(QString const & codigo, QString const & ejercicio,
                                   bool acotacion,
                                 QDate const & fecha1, QDate const & fecha2)
{
  // separamos código en cuenta y ci
   QString cuenta=codigo.section(';',0,0);
   QString ci=codigo.section(';',1,1);
   return calculacuenta(cuenta,ejercicio,acotacion,fecha1,fecha2,ci);
}


void calcestado::genera_xml()
{
    QProgressDialog progreso(tr("Generando Informe ..."), 0, 0, 3);
    progreso.setWindowTitle("Estados Contables");

    QApplication::processEvents();

    // if (condesglose || condesglosectas) { generalatex2(); return; }
    if (auxiliares.count()==0)
       if (condesglose || condesglosectas) { calculaestado(); }

    progreso.setValue(1);
    QApplication::processEvents();

    QString ejercicio1="";
    QString ejercicio2="";
    QString parte1="";
    QString parte2="";
    QString formulabasepor;
    QString observaciones;
    QString cabecera;
    double valorbasepor1=0;
    double valorbasepor2=0;
    // bool estadosmedios=false;
    bool analitica,haycolref;
    QString ci,colref;
    QSqlQuery query = basedatos::instancia()->select14Cabeceraestadostitulo( ui.titulolabel->text() );

    if ( (query.isActive()) && (query.first()) ) {
       parte1=query.value(0).toString();
           parte2=query.value(1).toString();
           ejercicio1=query.value(2).toString();
           ejercicio2=query.value(3).toString();
           // estadosmedios=query.value(4).toBool();
           formulabasepor=query.value(5).toString();
           valorbasepor1=query.value(6).toDouble();
           valorbasepor2=query.value(7).toDouble();
           observaciones=query.value(8).toString();
           analitica=query.value(9).toBool();
           ci=query.value(10).toString();
           haycolref=query.value(11).toBool();
           colref=query.value(12).toString();
           cabecera=query.value(13).toString();
       } else return;
    bool hayporcentajes=false;
    double porcentaje=0;

    if (formulabasepor.length()>0 && (valorbasepor1>0.001 || valorbasepor1<0.001)
        && (valorbasepor2>0.001 || valorbasepor2<0.001)) hayporcentajes=true;


    QDomDocument doc("Estado");
    QDomElement root = doc.createElement("Estado");
    doc.appendChild(root);

    addElementoTextoDom(doc,root,"NombreEmpresa",filtracadxml(nombreempresa()));
    QDomElement tag = doc.createElement("Cabecera");
    root.appendChild(tag);
    addElementoTextoDom(doc,tag,"Titulo",filtracadxml(ui.titulolabel->text()));
    addElementoTextoDom(doc,tag,"Parte1",filtracadxml(parte1));
    addElementoTextoDom(doc,tag,"Parte2",filtracadxml(parte2));
    addElementoTextoDom(doc,tag,"Ejercicio1",filtracadxml(ejercicio1));
    addElementoTextoDom(doc,tag,"Ejercicio2",filtracadxml(ejercicio2));
    addElementoTextoDom(doc,tag,"Valorbasepor1",formateanumero(valorbasepor1,comadecimal,decimales));
    addElementoTextoDom(doc,tag,"Valorbasepor2",formateanumero(valorbasepor2,comadecimal,decimales));
    addElementoTextoDom(doc,tag,"Observaciones",filtracadxml(observaciones));
    addElementoTextoDom(doc,tag,"Analitica",analitica ? "true" : "false");
    addElementoTextoDom(doc,tag,"Ci",filtracadxml(ci));
    addElementoTextoDom(doc,tag,"Colref",filtracadxml(colref));
    addElementoTextoDom(doc,tag,"Cabecera",filtracadxml(cabecera));
    QString fechaini1,fechaini2, fechafin1, fechafin2;
    if (ui.fechas_ej1_groupBox->isChecked())
      {
       fechaini1=ui.ini_ej1_dateEdit->date().toString("yyyy/MM/dd");
       fechafin1=ui.fin_ej1_dateEdit->date().toString("yyyy/MM/dd");
      }
    if (ui.fechas_ej2_groupBox->isChecked())
      {
        fechaini2=ui.ini_ej2_dateEdit->date().toString("yyyy/MM/dd");
        fechafin2=ui.fin_ej2_dateEdit->date().toString("yyyy/MM/dd");
      }
    addElementoTextoDom(doc,tag,"FechaIni1",filtracadxml(fechaini1));
    addElementoTextoDom(doc,tag,"FechaFin1",filtracadxml(fechafin1));
    addElementoTextoDom(doc,tag,"FechaIni2",filtracadxml(fechaini2));
    addElementoTextoDom(doc,tag,"FechaFin2",filtracadxml(fechafin2));
    QString previsiones;
    if (ui.previsiones->isChecked()) previsiones=tr("Previsiones");
    addElementoTextoDom(doc,tag,"Previsiones",filtracadxml(previsiones));



    QSqlQuery query2 = basedatos::instancia()->select6Estadostituloparte1ordernodo( ui.titulolabel->text() , true );
    int veces;
    if ( query2.isActive() ) {
             while ( query2.next() ) {
               if (query2.value(0).toString().contains("LINEA")>0)
                 {
                   continue;
                 }
               // ----------------------------------------------------------------------
               if (ui.importescheckBox->isChecked()
                    && query2.value(2).toDouble()<0.0001
                    && query2.value(2).toDouble()>-0.0001
                    && ejercicio2.length()==0) continue;
               // ----------------------------------------------------------------------
               if (ui.importescheckBox->isChecked()
                    && query2.value(2).toDouble()<0.0001
                    && query2.value(2).toDouble()>-0.0001
                    && query2.value(3).toDouble()<0.0001
                    && query2.value(3).toDouble()>-0.0001
                    && ejercicio2.length()>0) continue;
               // ----------------------------------------------------------------------
               QDomElement tag2 = doc.createElement("Linea");
               root.appendChild(tag2);
               addElementoTextoDom(doc,tag2,"Parte",parte1);
               QString espacios;
               for (veces=1;veces<=query2.value(0).toString().count('.');veces++)
                   espacios += "  ";
               // apartado
               addElementoTextoDom(doc,tag2,"Apartado",
                                   espacios+filtracadxml(query2.value(1).toString()));
               if (haycolref)
                   addElementoTextoDom(doc,tag2,"ColRef",
                                       filtracadxml(query2.value(4).toString()));
               if (hayporcentajes)
                         {
                            porcentaje=query2.value(2).toDouble()/valorbasepor1*100;
                            QString cadpor= formateanumero(porcentaje,comadecimal,decimales);
                            addElementoTextoDom(doc,tag2,"Porcentaje1",
                                                filtracadxml(cadpor));
                         }
                       //---------------------------------------------
               // IMPORTE 1
               QString importe1;
               if (query2.value(2).toDouble()>0.0001 ||
                   query2.value(2).toDouble()<-0.0001)
                   importe1=formateanumero(
                           query2.value(2).toDouble(),comadecimal,decimales);
               addElementoTextoDom(doc,tag2,"Importe1",
                                       filtracadxml(importe1));
               addElementoTextoDom(doc,tag2,"ImporteCuenta","");
               addElementoTextoDom(doc,tag2,"ImporteAuxiliar","");
               // IMPORTE 2
               if (ejercicio2.length()>0)
                  {
                     if (hayporcentajes)
                      {
                         porcentaje=query2.value(3).toDouble()/valorbasepor2*100;
                         QString cadpor= formateanumero(porcentaje,comadecimal,decimales);
                         addElementoTextoDom(doc,tag2,"Porcentaje2",
                                             filtracadxml(cadpor));
                      }
                     QString importe2;
                     if (query2.value(3).toDouble()>0.0001 ||
                         query2.value(3).toDouble()<-0.0001)
                         importe2=formateanumero(
                                 query2.value(3).toDouble(),comadecimal,decimales);
                    addElementoTextoDom(doc,tag2,"Importe2",
                                           filtracadxml(importe2));
                  }
               // verificamos si hay desglose por meses y añadimos m1 a m12
               // ------------------------------------------------------------
               if (ui.desglose_mes_checkBox->isChecked())
                  {
                   double num=0; QString cadnummes;
                   num=query2.value(6).toDouble();
                   cadnummes=(num>0.001 || num<-0.001) ?
                        formateanumerosep(num,comadecimal,decimales) : QString();
                   addElementoTextoDom(doc,tag2,"Mes1",cadnummes);

                   num=query2.value(7).toDouble();
                   cadnummes=(num>0.001 || num<-0.001) ?
                        formateanumerosep(num,comadecimal,decimales) : QString();
                   addElementoTextoDom(doc,tag2,"Mes2",cadnummes);

                   num=query2.value(8).toDouble();
                   cadnummes=(num>0.001 || num<-0.001) ?
                        formateanumerosep(num,comadecimal,decimales) : QString();
                   addElementoTextoDom(doc,tag2,"Mes3",cadnummes);

                   num=query2.value(9).toDouble();
                   cadnummes=(num>0.001 || num<-0.001) ?
                        formateanumerosep(num,comadecimal,decimales) : QString();
                   addElementoTextoDom(doc,tag2,"Mes4",cadnummes);

                   num=query2.value(10).toDouble();
                   cadnummes=(num>0.001 || num<-0.001) ?
                        formateanumerosep(num,comadecimal,decimales) : QString();
                   addElementoTextoDom(doc,tag2,"Mes5",cadnummes);

                   num=query2.value(11).toDouble();
                   cadnummes=(num>0.001 || num<-0.001) ?
                        formateanumerosep(num,comadecimal,decimales) : QString();
                   addElementoTextoDom(doc,tag2,"Mes6",cadnummes);

                   num=query2.value(12).toDouble();
                   cadnummes=(num>0.001 || num<-0.001) ?
                        formateanumerosep(num,comadecimal,decimales) : QString();
                   addElementoTextoDom(doc,tag2,"Mes7",cadnummes);

                   num=query2.value(13).toDouble();
                   cadnummes=(num>0.001 || num<-0.001) ?
                        formateanumerosep(num,comadecimal,decimales) : QString();
                   addElementoTextoDom(doc,tag2,"Mes8",cadnummes);

                   num=query2.value(14).toDouble();
                   cadnummes=(num>0.001 || num<-0.001) ?
                        formateanumerosep(num,comadecimal,decimales) : QString();
                   addElementoTextoDom(doc,tag2,"Mes9",cadnummes);

                   num=query2.value(15).toDouble();
                   cadnummes=(num>0.001 || num<-0.001) ?
                        formateanumerosep(num,comadecimal,decimales) : QString();
                   addElementoTextoDom(doc,tag2,"Mes10",cadnummes);

                   num=query2.value(16).toDouble();
                   cadnummes=(num>0.001 || num<-0.001) ?
                        formateanumerosep(num,comadecimal,decimales) : QString();
                   addElementoTextoDom(doc,tag2,"Mes11",cadnummes);

                   num=query2.value(17).toDouble();
                   cadnummes=(num>0.001 || num<-0.001) ?
                        formateanumerosep(num,comadecimal,decimales) : QString();
                   addElementoTextoDom(doc,tag2,"Mes12",cadnummes);

                  } // if desglose por meses
               // ------------------------------------------------------------
               if (!condesglose && !condesglosectas) continue;
               // desglosamos el campo fórmula que no contenga {
               QString cadpru=query2.value(5).toString();
               if (cadpru.contains('{')) continue;

               int indice=0;
               int inicio,final;
               QString ejercicio=ui.Ejercicio1comboBox->currentText();
               bool acotado=ui.fechas_ej1_groupBox->isChecked();
               QDate fecha1=ui.ini_ej1_dateEdit->date();
               QDate fecha2=ui.fin_ej1_dateEdit->date();
               bool estadosmedios=consaldosmedios;
               double valor;
               QString extract;
               while (indice<cadpru.length())
                   {
                    if (cadpru[indice]=='[')
                        {
                         inicio=indice;
                         final=inicio;
                         while (final<cadpru.length() && cadpru[final]!=']') final++;
                         // extraemos la cadena de la cuenta sin corchetes
                         extract=cadpru.mid(inicio+1,final-inicio-1);
                        // habría que calcular el valor de la cuenta
                        // QMessageBox::warning( this, tr("Estados Contables"),extract);
                        // -------------------------------------------------------------------------------------
                        if (extract.contains(':')==1) valor=cuentaespec(extract,ejercicio,acotado,fecha1,fecha2);
                           else
                              {
                               if (!estadosmedios) valor=saldo_cuenta_lista_ej1(extract);
                                 else
                                      valor=calculamediacuenta(extract,true);
                              }
                        // añadimos desglose por meses aquí
                           // repetimos esto para cada mes
                           QDate finicio;
                           QDate fin;
                           double m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12;
                           m1=m2=m3=m4=m5=m6=m7=m8=m9=m10=m11=m12=0;
                           int anyo=inicioejercicio(ui.Ejercicio1comboBox->currentText()).year();
                           if (ui.desglose_mes_checkBox->isChecked())
                             {

                               finicio.setDate(anyo,1,1);
                               fin.setDate(anyo,1,31);
                               if (extract.contains(':')==1) m1=cuentaespec(extract,ejercicio,true,
                                                                            finicio,fin);
                                  else
                                      m1=saldo_cuenta_lista_mes(extract,1);


                               finicio.setDate(anyo,2,1);
                               fin.setDate(anyo,3,1);
                               fin=fin.addDays(-1);
                               if (extract.contains(':')==1) m2=cuentaespec(extract,ejercicio,true,
                                                                            finicio,fin);
                                  else
                                      m2=saldo_cuenta_lista_mes(extract,2);

                               finicio.setDate(anyo,3,1);
                               fin.setDate(anyo,3,31);
                               if (extract.contains(':')==1) m3=cuentaespec(extract,ejercicio,true,
                                                                            finicio,fin);
                                  else
                                      m3=saldo_cuenta_lista_mes(extract,3);

                               finicio.setDate(anyo,4,1);
                               fin.setDate(anyo,4,30);
                               if (extract.contains(':')==1) m4=cuentaespec(extract,ejercicio,true,
                                                                            finicio,fin);
                                  else
                                      m4=saldo_cuenta_lista_mes(extract,4);

                               finicio.setDate(anyo,5,1);
                               fin.setDate(anyo,5,31);
                               if (extract.contains(':')==1) m5=cuentaespec(extract,ejercicio,true,
                                                                            finicio,fin);
                                  else
                                      m5=saldo_cuenta_lista_mes(extract,5);

                               finicio.setDate(anyo,6,1);
                               fin.setDate(anyo,6,30);
                               if (extract.contains(':')==1) m6=cuentaespec(extract,ejercicio,true,
                                                                            finicio,fin);
                                  else
                                      m6=saldo_cuenta_lista_mes(extract,6);

                               finicio.setDate(anyo,7,1);
                               fin.setDate(anyo,7,31);
                               if (extract.contains(':')==1) m7=cuentaespec(extract,ejercicio,true,
                                                                            finicio,fin);
                                  else
                                      m7=saldo_cuenta_lista_mes(extract,7);

                               finicio.setDate(anyo,8,1);
                               fin.setDate(anyo,8,31);
                               if (extract.contains(':')==1) m8=cuentaespec(extract,ejercicio,true,
                                                                            finicio,fin);
                                  else
                                      m8=saldo_cuenta_lista_mes(extract,8);

                               finicio.setDate(anyo,9,1);
                               fin.setDate(anyo,9,30);
                               if (extract.contains(':')==1) m9=cuentaespec(extract,ejercicio,true,
                                                                            finicio,fin);
                                  else
                                      m9=saldo_cuenta_lista_mes(extract,9);

                               finicio.setDate(anyo,10,1);
                               fin.setDate(anyo,10,31);
                               if (extract.contains(':')==1) m10=cuentaespec(extract,ejercicio,true,
                                                                            finicio,fin);
                                  else
                                      m10=saldo_cuenta_lista_mes(extract,10);

                               finicio.setDate(anyo,11,1);
                               fin.setDate(anyo,11,30);
                               if (extract.contains(':')==1) m11=cuentaespec(extract,ejercicio,true,
                                                                            finicio,fin);
                                  else
                                      m11=saldo_cuenta_lista_mes(extract,11);
                               finicio.setDate(anyo,12,1);
                               fin.setDate(anyo,12,31);
                               if (extract.contains(':')==1) m12=cuentaespec(extract,ejercicio,true,
                                                                            finicio,fin);
                                  else
                                      saldo_cuenta_lista_mes(extract,12);
                             }
                        // if (valor>-0.004 && valor < 0.005) continue;
                        if (inicio-1>=0 && cadpru[inicio-1]=='-')
                           {
                            valor=-1*valor;
                            m1=-1*m1;
                            m2=-1*m2;
                            m3=-1*m3;
                            m4=-1*m4;
                            m5=-1*m5;
                            m6=-1*m6;
                            m7=-1*m7;
                            m8=-1*m8;
                            m9=-1*m9;
                            m10=-1*m10;
                            m11=-1*m11;
                            m12=-1*m12;
                           }
                        // imprimimos cadena formada por código de cuenta y descripción
                        bool positivo=false;
                        bool negativo=false;
                        positivo=extract.contains('+');
                        negativo=extract.contains('-');
                        extract.remove('+');
                        extract.remove('-');
                        if (valor>0.001 || valor<-0.001)
                           {
                            QDomElement tag3 = doc.createElement("Linea");
                            root.appendChild(tag3);
                            addElementoTextoDom(doc,tag3,"Parte",parte1);
                            // apartado
                            addElementoTextoDom(doc,tag3,"Apartado",
                                               "    " +extract+ " "+filtracadxml(descripcioncuenta(extract)));
                            addElementoTextoDom(doc,tag3,"ImporteCuenta",
                                  filtracadxml(formateanumerosep(valor,comadecimal,decimales)));
                            addElementoTextoDom(doc,tag3,"ImporteAuxiliar","");
                            addElementoTextoDom(doc,tag3,"Importe1","");
                            addElementoTextoDom(doc,tag3,"Importe2","");
                            if (ui.desglose_mes_checkBox->isChecked())
                              {
                                QString cadnummes;
                                cadnummes=(m1>0.001 || m1<-0.001) ?
                                          formateanumerosep(m1,comadecimal,decimales) : QString();
                                addElementoTextoDom(doc,tag3,"Mes1",cadnummes);
                                cadnummes=(m2>0.001 || m2<-0.001) ?
                                          formateanumerosep(m2,comadecimal,decimales) : QString();
                                addElementoTextoDom(doc,tag3,"Mes2",cadnummes);
                                cadnummes=(m3>0.001 || m3<-0.001) ?
                                          formateanumerosep(m3,comadecimal,decimales) : QString();
                                addElementoTextoDom(doc,tag3,"Mes3",cadnummes);
                                cadnummes=(m4>0.001 || m4<-0.001) ?
                                          formateanumerosep(m4,comadecimal,decimales) : QString();
                                addElementoTextoDom(doc,tag3,"Mes4",cadnummes);
                                cadnummes=(m5>0.001 || m5<-0.001) ?
                                          formateanumerosep(m5,comadecimal,decimales) : QString();
                                addElementoTextoDom(doc,tag3,"Mes5",cadnummes);
                                cadnummes=(m6>0.001 || m6<-0.001) ?
                                          formateanumerosep(m6,comadecimal,decimales) : QString();
                                addElementoTextoDom(doc,tag3,"Mes6",cadnummes);
                                cadnummes=(m7>0.001 || m7<-0.001) ?
                                          formateanumerosep(m7,comadecimal,decimales) : QString();
                                addElementoTextoDom(doc,tag3,"Mes7",cadnummes);
                                cadnummes=(m8>0.001 || m8<-0.001) ?
                                          formateanumerosep(m8,comadecimal,decimales) : QString();
                                addElementoTextoDom(doc,tag3,"Mes8",cadnummes);
                                cadnummes=(m9>0.001 || m9<-0.001) ?
                                          formateanumerosep(m9,comadecimal,decimales) : QString();
                                addElementoTextoDom(doc,tag3,"Mes9",cadnummes);
                                cadnummes=(m10>0.001 || m10<-0.001) ?
                                          formateanumerosep(m10,comadecimal,decimales) : QString();
                                addElementoTextoDom(doc,tag3,"Mes10",cadnummes);
                                cadnummes=(m11>0.001 || m11<-0.001) ?
                                          formateanumerosep(m11,comadecimal,decimales) : QString();
                                addElementoTextoDom(doc,tag3,"Mes11",cadnummes);
                                cadnummes=(m12>0.001 || m12<-0.001) ?
                                          formateanumerosep(m12,comadecimal,decimales) : QString();
                                addElementoTextoDom(doc,tag3,"Mes12",cadnummes);
                              }
                            if (condesglose)
                            {
                             QSqlQuery q;
                             if (!cod_longitud_variable())
                               {
                                q = basedatos::instancia()->selectCodigoplancontablecodigolength(extract);
                               }
                               else
                                   {
                                    q = basedatos::instancia()->selectCodigoplancontablecodigoauxiliar(extract);
                                   }
                              while (q.next())
                                 {
                                   QString extract2=q.value(0).toString();
                                   QString extract2sig=extract2;
                                   if (positivo) extract2sig.append('+');
                                   if (negativo) extract2sig.append('-');
                                   if (extract.contains(':')==1) valor=cuentaespec_aux(extract2sig,ejercicio,
                                                                       acotado,fecha1,fecha2);
                                   else
                                   {
                                    if (!estadosmedios) valor=saldo_cuenta_lista_ej1(extract2sig);
                                    else
                                      valor=calculamediacuenta_aux(extract2sig,true);
                                   }
                                   finicio.setDate(anyo,1,1);
                                   fin.setDate(anyo,1,31);
                                   if (extract.contains(':')==1) m1=cuentaespec(extract2sig,ejercicio,true,
                                                                                finicio,fin);
                                      else
                                          m1=saldo_cuenta_lista_mes(extract2sig,1);


                                   finicio.setDate(anyo,2,1);
                                   fin.setDate(anyo,3,1);
                                   fin=fin.addDays(-1);
                                   if (extract.contains(':')==1) m2=cuentaespec(extract2sig,ejercicio,true,
                                                                                finicio,fin);
                                      else
                                          m2=saldo_cuenta_lista_mes(extract2sig,2);

                                   finicio.setDate(anyo,3,1);
                                   fin.setDate(anyo,3,31);
                                   if (extract.contains(':')==1) m3=cuentaespec(extract2sig,ejercicio,true,
                                                                                finicio,fin);
                                      else
                                          m3=saldo_cuenta_lista_mes(extract2sig,3);

                                   finicio.setDate(anyo,4,1);
                                   fin.setDate(anyo,4,30);
                                   if (extract.contains(':')==1) m4=cuentaespec(extract2sig,ejercicio,true,
                                                                                finicio,fin);
                                      else
                                          m4=saldo_cuenta_lista_mes(extract2sig,4);
                                   finicio.setDate(anyo,5,1);
                                   fin.setDate(anyo,5,31);
                                   if (extract.contains(':')==1) m5=cuentaespec(extract2sig,ejercicio,true,
                                                                                finicio,fin);
                                      else
                                          m5=saldo_cuenta_lista_mes(extract2sig,5);

                                   finicio.setDate(anyo,6,1);
                                   fin.setDate(anyo,6,30);
                                   if (extract.contains(':')==1) m6=cuentaespec(extract2sig,ejercicio,true,
                                                                                finicio,fin);
                                      else
                                          m6=saldo_cuenta_lista_mes(extract2sig,6);

                                   finicio.setDate(anyo,7,1);
                                   fin.setDate(anyo,7,31);
                                   if (extract.contains(':')==1) m7=cuentaespec(extract2sig,ejercicio,true,
                                                                                finicio,fin);
                                      else
                                          m7=saldo_cuenta_lista_mes(extract2sig,7);

                                   finicio.setDate(anyo,8,1);
                                   fin.setDate(anyo,8,31);
                                   if (extract.contains(':')==1) m8=cuentaespec(extract2sig,ejercicio,true,
                                                                                finicio,fin);
                                      else
                                          m8=saldo_cuenta_lista_mes(extract2sig,8);

                                   finicio.setDate(anyo,9,1);
                                   fin.setDate(anyo,9,30);
                                   if (extract.contains(':')==1) m9=cuentaespec(extract2sig,ejercicio,true,
                                                                                finicio,fin);
                                      else
                                          m9=saldo_cuenta_lista_mes(extract2sig,9);

                                   finicio.setDate(anyo,10,1);
                                   fin.setDate(anyo,10,31);
                                   if (extract.contains(':')==1) m10=cuentaespec(extract2sig,ejercicio,true,
                                                                                finicio,fin);
                                      else
                                          m10=saldo_cuenta_lista_mes(extract2sig,10);

                                   finicio.setDate(anyo,11,1);
                                   fin.setDate(anyo,11,30);
                                   if (extract.contains(':')==1) m11=cuentaespec(extract2sig,ejercicio,true,
                                                                                finicio,fin);
                                      else
                                          m11=saldo_cuenta_lista_mes(extract2sig,11);

                                   finicio.setDate(anyo,12,1);
                                   fin.setDate(anyo,12,31);
                                   if (extract.contains(':')==1) m12=cuentaespec(extract2sig,ejercicio,true,
                                                                                finicio,fin);
                                      else
                                          m12=saldo_cuenta_lista_mes(extract2sig,12);

                                   if (valor>0.001 || valor <-0.001)
                                       {
                                         QDomElement tag3 = doc.createElement("Linea");
                                         root.appendChild(tag3);
                                         addElementoTextoDom(doc,tag3,"Parte",parte1);
                                         // apartado
                                         addElementoTextoDom(doc,tag3,"Apartado",
                                                    "     "+extract2+" "+
                                                    filtracadxml(descripcioncuenta(extract2)));
                                         if (inicio-1>=0 && cadpru[inicio-1]=='-')
                                            {
                                             valor=-1*valor;
                                             m1=-1*m1;
                                             m2=-1*m2;
                                             m3=-1*m3;
                                             m4=-1*m4;
                                             m5=-1*m5;
                                             m6=-1*m6;
                                             m7=-1*m7;
                                             m8=-1*m8;
                                             m9=-1*m9;
                                             m10=-1*m10;
                                             m11=-1*m11;
                                             m12=-1*m12;
                                            }
                                         addElementoTextoDom(doc,tag3,"ImporteAuxiliar",
                                               filtracadxml(formateanumerosep(valor,comadecimal,decimales)));
                                         addElementoTextoDom(doc,tag3,"ImporteCuenta","");
                                         addElementoTextoDom(doc,tag3,"Importe1","");
                                         addElementoTextoDom(doc,tag3,"Importe2","");
                                         if (ui.desglose_mes_checkBox->isChecked())
                                           {
                                             QString cadnummes;
                                             cadnummes=(m1>0.001 || m1<-0.001) ?
                                                       formateanumerosep(m1,comadecimal,decimales) : QString();
                                             addElementoTextoDom(doc,tag3,"Mes1",cadnummes);
                                             cadnummes=(m2>0.001 || m2<-0.001) ?
                                                       formateanumerosep(m2,comadecimal,decimales) : QString();
                                             addElementoTextoDom(doc,tag3,"Mes2",cadnummes);
                                             cadnummes=(m3>0.001 || m3<-0.001) ?
                                                       formateanumerosep(m3,comadecimal,decimales) : QString();
                                             addElementoTextoDom(doc,tag3,"Mes3",cadnummes);
                                             cadnummes=(m4>0.001 || m4<-0.001) ?
                                                       formateanumerosep(m4,comadecimal,decimales) : QString();
                                             addElementoTextoDom(doc,tag3,"Mes4",cadnummes);
                                             cadnummes=(m5>0.001 || m5<-0.001) ?
                                                       formateanumerosep(m5,comadecimal,decimales) : QString();
                                             addElementoTextoDom(doc,tag3,"Mes5",cadnummes);
                                             cadnummes=(m6>0.001 || m6<-0.001) ?
                                                       formateanumerosep(m6,comadecimal,decimales) : QString();
                                             addElementoTextoDom(doc,tag3,"Mes6",cadnummes);
                                             cadnummes=(m7>0.001 || m7<-0.001) ?
                                                       formateanumerosep(m7,comadecimal,decimales) : QString();
                                             addElementoTextoDom(doc,tag3,"Mes7",cadnummes);
                                             cadnummes=(m8>0.001 || m8<-0.001) ?
                                                       formateanumerosep(m8,comadecimal,decimales) : QString();
                                             addElementoTextoDom(doc,tag3,"Mes8",cadnummes);
                                             cadnummes=(m9>0.001 || m9<-0.001) ?
                                                       formateanumerosep(m9,comadecimal,decimales) : QString();
                                             addElementoTextoDom(doc,tag3,"Mes9",cadnummes);
                                             cadnummes=(m10>0.001 || m10<-0.001) ?
                                                       formateanumerosep(m10,comadecimal,decimales) : QString();
                                             addElementoTextoDom(doc,tag3,"Mes10",cadnummes);
                                             cadnummes=(m11>0.001 || m11<-0.001) ?
                                                       formateanumerosep(m11,comadecimal,decimales) : QString();
                                             addElementoTextoDom(doc,tag3,"Mes11",cadnummes);
                                             cadnummes=(m12>0.001 || m12<-0.001) ?
                                                       formateanumerosep(m12,comadecimal,decimales) : QString();
                                             addElementoTextoDom(doc,tag3,"Mes12",cadnummes);
                                           }
                                       }
                                  }
                               } // fin del condesglose
                           } // if valor no es cero
                    } // del cadpru índice
                  indice++;
                } // del while índice

               // -----------------------------------------------------------

             } // del while query next
           }

    progreso.setValue(2);
    QApplication::processEvents();

    if (parte2.length()>0)
     {
       query2 = basedatos::instancia()->select6Estadostituloparte1ordernodo(ui.titulolabel->text(),
                                                                            false );
       if ( query2.isActive() ) {
                while ( query2.next() ) {
                  // ----------------------------------------------------------------------
                  if (ui.importescheckBox->isChecked()
                       && query2.value(2).toDouble()<0.0001
                       && query2.value(2).toDouble()>-0.0001
                       && ejercicio2.length()==0) continue;
                  // ----------------------------------------------------------------------
                  if (ui.importescheckBox->isChecked()
                       && query2.value(2).toDouble()<0.0001
                       && query2.value(2).toDouble()>-0.0001
                       && query2.value(3).toDouble()<0.0001
                       && query2.value(3).toDouble()>-0.0001
                       && ejercicio2.length()>0) continue;
                  // ----------------------------------------------------------------------
                  QDomElement tag2 = doc.createElement("Linea");
                  root.appendChild(tag2);
                  addElementoTextoDom(doc,tag2,"Parte", parte2);
                  QString espacios;
                  for (veces=1;veces<=query2.value(0).toString().count('.');veces++)
                      espacios += "  ";
                  // apartado
                  addElementoTextoDom(doc,tag2,"Apartado",
                                      espacios+filtracadxml(query2.value(1).toString()));

                  if (haycolref)
                      addElementoTextoDom(doc,tag2,"ColRef",
                                          filtracadxml(query2.value(4).toString()));


                  if (hayporcentajes)
                            {
                               porcentaje=query2.value(2).toDouble()/valorbasepor1*100;
                               QString cadpor= formateanumero(porcentaje,comadecimal,decimales);
                               addElementoTextoDom(doc,tag2,"Porcentaje1",
                                                  filtracadxml(cadpor));
                            }
                  QString importe1;
                  if (query2.value(2).toDouble()>0.0001 ||
                      query2.value(2).toDouble()<-0.0001)
                      importe1=formateanumero(
                              query2.value(2).toDouble(),comadecimal,decimales);
                  addElementoTextoDom(doc,tag2,"Importe1",
                                      filtracadxml(importe1));
                  addElementoTextoDom(doc,tag2,"ImporteCuenta","");
                  addElementoTextoDom(doc,tag2,"ImporteAuxiliar","");
                  if (ejercicio2.length()>0)
                       {
                        if (hayporcentajes)
                          {
                             porcentaje=query2.value(3).toDouble()/valorbasepor2*100;
                             QString cadpor= formateanumero(porcentaje,comadecimal,decimales);
                             addElementoTextoDom(doc,tag2,"Porcentaje2",
                                                  filtracadxml(cadpor));
                          }
                        QString importe2;
                        if (query2.value(3).toDouble()>0.0001 ||
                            query2.value(3).toDouble()<-0.0001)
                            importe2=formateanumerosep(
                                    query2.value(3).toDouble(),comadecimal,decimales);
                         addElementoTextoDom(doc,tag2,"Importe2",
                                                filtracadxml(importe2));
                       }
                  // verificamos si hay desglose por meses y añadimos m1 a m12
                  // ------------------------------------------------------------
                  if (ui.desglose_mes_checkBox->isChecked())
                     {
                      double num=0; QString cadnummes;
                      num=query2.value(6).toDouble();
                      cadnummes=(num>0.001 || num<-0.001) ?
                           formateanumerosep(num,comadecimal,decimales) : QString();
                      addElementoTextoDom(doc,tag2,"Mes1",cadnummes);

                      num=query2.value(7).toDouble();
                      cadnummes=(num>0.001 || num<-0.001) ?
                           formateanumerosep(num,comadecimal,decimales) : QString();
                      addElementoTextoDom(doc,tag2,"Mes2",cadnummes);

                      num=query2.value(8).toDouble();
                      cadnummes=(num>0.001 || num<-0.001) ?
                           formateanumerosep(num,comadecimal,decimales) : QString();
                      addElementoTextoDom(doc,tag2,"Mes3",cadnummes);

                      num=query2.value(9).toDouble();
                      cadnummes=(num>0.001 || num<-0.001) ?
                           formateanumerosep(num,comadecimal,decimales) : QString();
                      addElementoTextoDom(doc,tag2,"Mes4",cadnummes);

                      num=query2.value(10).toDouble();
                      cadnummes=(num>0.001 || num<-0.001) ?
                           formateanumerosep(num,comadecimal,decimales) : QString();
                      addElementoTextoDom(doc,tag2,"Mes5",cadnummes);

                      num=query2.value(11).toDouble();
                      cadnummes=(num>0.001 || num<-0.001) ?
                           formateanumerosep(num,comadecimal,decimales) : QString();
                      addElementoTextoDom(doc,tag2,"Mes6",cadnummes);

                      num=query2.value(12).toDouble();
                      cadnummes=(num>0.001 || num<-0.001) ?
                           formateanumerosep(num,comadecimal,decimales) : QString();
                      addElementoTextoDom(doc,tag2,"Mes7",cadnummes);

                      num=query2.value(13).toDouble();
                      cadnummes=(num>0.001 || num<-0.001) ?
                           formateanumerosep(num,comadecimal,decimales) : QString();
                      addElementoTextoDom(doc,tag2,"Mes8",cadnummes);

                      num=query2.value(14).toDouble();
                      cadnummes=(num>0.001 || num<-0.001) ?
                           formateanumerosep(num,comadecimal,decimales) : QString();
                      addElementoTextoDom(doc,tag2,"Mes9",cadnummes);

                      num=query2.value(15).toDouble();
                      cadnummes=(num>0.001 || num<-0.001) ?
                           formateanumerosep(num,comadecimal,decimales) : QString();
                      addElementoTextoDom(doc,tag2,"Mes10",cadnummes);

                      num=query2.value(16).toDouble();
                      cadnummes=(num>0.001 || num<-0.001) ?
                           formateanumerosep(num,comadecimal,decimales) : QString();
                      addElementoTextoDom(doc,tag2,"Mes11",cadnummes);

                      num=query2.value(17).toDouble();
                      cadnummes=(num>0.001 || num<-0.001) ?
                           formateanumerosep(num,comadecimal,decimales) : QString();
                      addElementoTextoDom(doc,tag2,"Mes12",cadnummes);

                     } // if desglose por meses

                  // -----------------------------------------------------------
                  if (!condesglose && !condesglosectas) continue;
                  // desglosamos el campo fórmula que no contenga {
                  QString cadpru=query2.value(5).toString();
                  if (cadpru.contains('{')) continue;

                  int indice=0;
                  int inicio,final;
                  QString ejercicio=ui.Ejercicio1comboBox->currentText();
                  bool acotado=ui.fechas_ej1_groupBox->isChecked();
                  QDate fecha1=ui.ini_ej1_dateEdit->date();
                  QDate fecha2=ui.fin_ej1_dateEdit->date();
                  bool estadosmedios=consaldosmedios;
                  double valor;
                  QString extract;
                  while (indice<cadpru.length())
                      {
                       if (cadpru[indice]=='[')
                           {
                            inicio=indice;
                            final=inicio;
                            while (final<cadpru.length() && cadpru[final]!=']') final++;
                            // extraemos la cadena de la cuenta sin corchetes
                            extract=cadpru.mid(inicio+1,final-inicio-1);
                           // habría que calcular el valor de la cuenta
                           // QMessageBox::warning( this, tr("Estados Contables"),extract);
                           // -------------------------------------------------------------------------------------
                           if (extract.contains(':')==1) valor=cuentaespec(extract,ejercicio,acotado,fecha1,fecha2);
                              else
                                 {
                                  if (!estadosmedios) valor=saldo_cuenta_lista_ej1(extract);
                                    else
                                         valor=calculamediacuenta(extract,true);
                                 }
                              // añadimos desglose por meses aquí
                                 // repetimos esto para cada mes
                                 QDate finicio;
                                 QDate fin;
                                 double m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12;
                                 m1=m2=m3=m4=m5=m6=m7=m8=m9=m10=m11=m12=0;
                                 int anyo=inicioejercicio(ui.Ejercicio1comboBox->currentText()).year();
                                 if (ui.desglose_mes_checkBox->isChecked())
                                   {

                                     finicio.setDate(anyo,1,1);
                                     fin.setDate(anyo,1,31);
                                     if (extract.contains(':')==1) m1=cuentaespec(extract,ejercicio,true,
                                                                                  finicio,fin);
                                        else
                                            m1=saldo_cuenta_lista_mes(extract,1);


                                     finicio.setDate(anyo,2,1);
                                     fin.setDate(anyo,3,1);
                                     fin=fin.addDays(-1);
                                     if (extract.contains(':')==1) m2=cuentaespec(extract,ejercicio,true,
                                                                                  finicio,fin);
                                        else
                                            m2=saldo_cuenta_lista_mes(extract,2);

                                     finicio.setDate(anyo,3,1);
                                     fin.setDate(anyo,3,31);
                                     if (extract.contains(':')==1) m3=cuentaespec(extract,ejercicio,true,
                                                                                  finicio,fin);
                                        else
                                            m3=saldo_cuenta_lista_mes(extract,3);

                                     finicio.setDate(anyo,4,1);
                                     fin.setDate(anyo,4,30);
                                     if (extract.contains(':')==1) m4=cuentaespec(extract,ejercicio,true,
                                                                                  finicio,fin);
                                        else
                                            m4=saldo_cuenta_lista_mes(extract,4);

                                     finicio.setDate(anyo,5,1);
                                     fin.setDate(anyo,5,31);
                                     if (extract.contains(':')==1) m5=cuentaespec(extract,ejercicio,true,
                                                                                  finicio,fin);
                                        else
                                            m5=saldo_cuenta_lista_mes(extract,5);

                                     finicio.setDate(anyo,6,1);
                                     fin.setDate(anyo,6,30);
                                     if (extract.contains(':')==1) m6=cuentaespec(extract,ejercicio,true,
                                                                                  finicio,fin);
                                        else
                                            m6=saldo_cuenta_lista_mes(extract,6);

                                     finicio.setDate(anyo,7,1);
                                     fin.setDate(anyo,7,31);
                                     if (extract.contains(':')==1) m7=cuentaespec(extract,ejercicio,true,
                                                                                  finicio,fin);
                                        else
                                            m7=saldo_cuenta_lista_mes(extract,7);

                                     finicio.setDate(anyo,8,1);
                                     fin.setDate(anyo,8,31);
                                     if (extract.contains(':')==1) m8=cuentaespec(extract,ejercicio,true,
                                                                                  finicio,fin);
                                        else
                                            m8=saldo_cuenta_lista_mes(extract,8);

                                     finicio.setDate(anyo,9,1);
                                     fin.setDate(anyo,9,30);
                                     if (extract.contains(':')==1) m9=cuentaespec(extract,ejercicio,true,
                                                                                  finicio,fin);
                                        else
                                            m9=saldo_cuenta_lista_mes(extract,9);

                                     finicio.setDate(anyo,10,1);
                                     fin.setDate(anyo,10,31);
                                     if (extract.contains(':')==1) m10=cuentaespec(extract,ejercicio,true,
                                                                                  finicio,fin);
                                        else
                                            m10=saldo_cuenta_lista_mes(extract,10);

                                     finicio.setDate(anyo,11,1);
                                     fin.setDate(anyo,11,30);
                                     if (extract.contains(':')==1) m11=cuentaespec(extract,ejercicio,true,
                                                                                  finicio,fin);
                                        else
                                            m11=saldo_cuenta_lista_mes(extract,11);

                                     finicio.setDate(anyo,12,1);
                                     fin.setDate(anyo,12,31);
                                     if (extract.contains(':')==1) m12=cuentaespec(extract,ejercicio,true,
                                                                                  finicio,fin);
                                        else
                                            m12=saldo_cuenta_lista_mes(extract,12);
                                   }
                              // if (valor>-0.004 && valor < 0.005) continue;
                              if (inicio-1>=0 && cadpru[inicio-1]=='-')
                                 {
                                  valor=-1*valor;
                                  m1=-1*m1;
                                  m2=-1*m2;
                                  m3=-1*m3;
                                  m4=-1*m4;
                                  m5=-1*m5;
                                  m6=-1*m6;
                                  m7=-1*m7;
                                  m8=-1*m8;
                                  m9=-1*m9;
                                  m10=-1*m10;
                                  m11=-1*m11;
                                  m12=-1*m12;
                                 }

                           // if (valor>-0.004 && valor < 0.005) continue;
                           // if (inicio-1>=0 && cadpru[inicio-1]=='-') valor=-1*valor;
                           // imprimimos cadena formada por código de cuenta y descripción
                           bool positivo=false;
                           bool negativo=false;
                           positivo=extract.contains('+');
                           negativo=extract.contains('-');
                           extract.remove('+');
                           extract.remove('-');
                           if (valor>0.001 || valor<-0.001)
                              {
                               QDomElement tag3 = doc.createElement("Linea");
                               root.appendChild(tag3);
                               addElementoTextoDom(doc,tag3,"Parte",parte2);
                               // apartado
                               addElementoTextoDom(doc,tag3,"Apartado",
                                                 "    " + extract+ " "+filtracadxml(descripcioncuenta(extract)));
                               addElementoTextoDom(doc,tag3,"ImporteCuenta",
                                     filtracadxml(formateanumerosep(valor,comadecimal,decimales)));
                               addElementoTextoDom(doc,tag3,"ImporteAuxiliar","");
                               addElementoTextoDom(doc,tag3,"Importe1","");
                               addElementoTextoDom(doc,tag3,"Importe2","");
                               if (ui.desglose_mes_checkBox->isChecked())
                                 {
                                   QString cadnummes;
                                   cadnummes=(m1>0.001 || m1<-0.001) ?
                                             formateanumerosep(m1,comadecimal,decimales) : QString();
                                   addElementoTextoDom(doc,tag3,"Mes1",cadnummes);
                                   cadnummes=(m2>0.001 || m2<-0.001) ?
                                             formateanumerosep(m2,comadecimal,decimales) : QString();
                                   addElementoTextoDom(doc,tag3,"Mes2",cadnummes);
                                   cadnummes=(m3>0.001 || m3<-0.001) ?
                                             formateanumerosep(m3,comadecimal,decimales) : QString();
                                   addElementoTextoDom(doc,tag3,"Mes3",cadnummes);
                                   cadnummes=(m4>0.001 || m4<-0.001) ?
                                             formateanumerosep(m4,comadecimal,decimales) : QString();
                                   addElementoTextoDom(doc,tag3,"Mes4",cadnummes);
                                   cadnummes=(m5>0.001 || m5<-0.001) ?
                                             formateanumerosep(m5,comadecimal,decimales) : QString();
                                   addElementoTextoDom(doc,tag3,"Mes5",cadnummes);
                                   cadnummes=(m6>0.001 || m6<-0.001) ?
                                             formateanumerosep(m6,comadecimal,decimales) : QString();
                                   addElementoTextoDom(doc,tag3,"Mes6",cadnummes);
                                   cadnummes=(m7>0.001 || m7<-0.001) ?
                                             formateanumerosep(m7,comadecimal,decimales) : QString();
                                   addElementoTextoDom(doc,tag3,"Mes7",cadnummes);
                                   cadnummes=(m8>0.001 || m8<-0.001) ?
                                             formateanumerosep(m8,comadecimal,decimales) : QString();
                                   addElementoTextoDom(doc,tag3,"Mes8",cadnummes);
                                   cadnummes=(m9>0.001 || m9<-0.001) ?
                                             formateanumerosep(m9,comadecimal,decimales) : QString();
                                   addElementoTextoDom(doc,tag3,"Mes9",cadnummes);
                                   cadnummes=(m10>0.001 || m10<-0.001) ?
                                             formateanumerosep(m10,comadecimal,decimales) : QString();
                                   addElementoTextoDom(doc,tag3,"Mes10",cadnummes);
                                   cadnummes=(m11>0.001 || m11<-0.001) ?
                                             formateanumerosep(m11,comadecimal,decimales) : QString();
                                   addElementoTextoDom(doc,tag3,"Mes11",cadnummes);
                                   cadnummes=(m12>0.001 || m12<-0.001) ?
                                             formateanumerosep(m12,comadecimal,decimales) : QString();
                                   addElementoTextoDom(doc,tag3,"Mes12",cadnummes);
                                 }

                               if (condesglose)
                               {
                                QSqlQuery q;
                                if (!cod_longitud_variable())
                                  {
                                   q = basedatos::instancia()->selectCodigoplancontablecodigolength(extract);
                                  }
                                  else
                                      {
                                       q = basedatos::instancia()->selectCodigoplancontablecodigoauxiliar(extract);
                                      }
                                 while (q.next())
                                    {
                                      QString extract2=q.value(0).toString();
                                      QString extract2sig=extract2;
                                      if (positivo) extract2sig.append('+');
                                      if (negativo) extract2sig.append('-');
                                      if (extract.contains(':')==1) valor=cuentaespec_aux(extract2sig,ejercicio,
                                                                          acotado,fecha1,fecha2);
                                      else
                                      {
                                       if (!estadosmedios) valor=saldo_cuenta_lista_ej1(extract2sig);
                                       else
                                         valor=calculamediacuenta_aux(extract2sig,true);
                                      }
                                      finicio.setDate(anyo,1,1);
                                      fin.setDate(anyo,1,31);
                                      if (extract.contains(':')==1) m1=cuentaespec(extract2sig,ejercicio,true,
                                                                                   finicio,fin);
                                         else
                                             m1=saldo_cuenta_lista_mes(extract2sig,1);


                                      finicio.setDate(anyo,2,1);
                                      fin.setDate(anyo,3,1);
                                      fin=fin.addDays(-1);
                                      if (extract.contains(':')==1) m2=cuentaespec(extract2sig,ejercicio,true,
                                                                                   finicio,fin);
                                         else
                                             m2=saldo_cuenta_lista_mes(extract2sig,2);

                                      finicio.setDate(anyo,3,1);
                                      fin.setDate(anyo,3,31);
                                      if (extract.contains(':')==1) m3=cuentaespec(extract2sig,ejercicio,true,
                                                                                   finicio,fin);
                                         else
                                             m3=saldo_cuenta_lista_mes(extract2sig,3);

                                      finicio.setDate(anyo,4,1);
                                      fin.setDate(anyo,4,30);
                                      if (extract.contains(':')==1) m4=cuentaespec(extract2sig,ejercicio,true,
                                                                                   finicio,fin);
                                         else
                                             m4=saldo_cuenta_lista_mes(extract2sig,4);

                                      finicio.setDate(anyo,5,1);
                                      fin.setDate(anyo,5,31);
                                      if (extract.contains(':')==1) m5=cuentaespec(extract2sig,ejercicio,true,
                                                                                   finicio,fin);
                                         else
                                             m5=saldo_cuenta_lista_mes(extract2sig,5);

                                      finicio.setDate(anyo,6,1);
                                      fin.setDate(anyo,6,30);
                                      if (extract.contains(':')==1) m6=cuentaespec(extract2sig,ejercicio,true,
                                                                                   finicio,fin);
                                         else
                                             m6=saldo_cuenta_lista_mes(extract2sig,6);

                                      finicio.setDate(anyo,7,1);
                                      fin.setDate(anyo,7,31);
                                      if (extract.contains(':')==1) m7=cuentaespec(extract2sig,ejercicio,true,
                                                                                   finicio,fin);
                                         else
                                             m7=saldo_cuenta_lista_mes(extract2sig,7);

                                      finicio.setDate(anyo,8,1);
                                      fin.setDate(anyo,8,31);
                                      if (extract.contains(':')==1) m8=cuentaespec(extract2sig,ejercicio,true,
                                                                                   finicio,fin);
                                         else
                                             m8=saldo_cuenta_lista_mes(extract2sig,8);

                                      finicio.setDate(anyo,9,1);
                                      fin.setDate(anyo,9,30);
                                      if (extract.contains(':')==1) m9=cuentaespec(extract2sig,ejercicio,true,
                                                                                   finicio,fin);
                                         else
                                             m9=saldo_cuenta_lista_mes(extract2sig,9);

                                      finicio.setDate(anyo,10,1);
                                      fin.setDate(anyo,10,31);
                                      if (extract.contains(':')==1) m10=cuentaespec(extract2sig,ejercicio,true,
                                                                                   finicio,fin);
                                         else
                                             m10=saldo_cuenta_lista_mes(extract2sig,10);

                                      finicio.setDate(anyo,11,1);
                                      fin.setDate(anyo,11,30);
                                      if (extract.contains(':')==1) m11=cuentaespec(extract2sig,ejercicio,true,
                                                                                   finicio,fin);
                                         else
                                             m11=saldo_cuenta_lista_mes(extract2sig,11);

                                      finicio.setDate(anyo,12,1);
                                      fin.setDate(anyo,12,31);
                                      if (extract.contains(':')==1) m12=cuentaespec(extract2sig,ejercicio,true,
                                                                                   finicio,fin);
                                         else
                                             m12=saldo_cuenta_lista_mes(extract2sig,12);

                                      if (valor>0.001 || valor <-0.001)
                                          {
                                            QDomElement tag3 = doc.createElement("Linea");
                                            root.appendChild(tag3);
                                            addElementoTextoDom(doc,tag3,"Parte",parte2);
                                            // apartado
                                            addElementoTextoDom(doc,tag3,"Apartado",
                                                       "     "+extract2+" "+
                                                       filtracadxml(descripcioncuenta(extract2)));
                                            if (inicio-1>=0 && cadpru[inicio-1]=='-')
                                               {
                                                valor=-1*valor;
                                                m1=-1*m1;
                                                m2=-1*m2;
                                                m3=-1*m3;
                                                m4=-1*m4;
                                                m5=-1*m5;
                                                m6=-1*m6;
                                                m7=-1*m7;
                                                m8=-1*m8;
                                                m9=-1*m9;
                                                m10=-1*m10;
                                                m11=-1*m11;
                                                m12=-1*m12;
                                               }

                                            addElementoTextoDom(doc,tag3,"ImporteAuxiliar",
                                                  filtracadxml(formateanumerosep(valor,comadecimal,decimales)));
                                            addElementoTextoDom(doc,tag3,"ImporteCuenta","");
                                            addElementoTextoDom(doc,tag3,"Importe1","");
                                            addElementoTextoDom(doc,tag3,"Importe2","");
                                            if (ui.desglose_mes_checkBox->isChecked())
                                              {
                                                QString cadnummes;
                                                cadnummes=(m1>0.001 || m1<-0.001) ?
                                                          formateanumerosep(m1,comadecimal,decimales) : QString();
                                                addElementoTextoDom(doc,tag3,"Mes1",cadnummes);
                                                cadnummes=(m2>0.001 || m2<-0.001) ?
                                                          formateanumerosep(m2,comadecimal,decimales) : QString();
                                                addElementoTextoDom(doc,tag3,"Mes2",cadnummes);
                                                cadnummes=(m3>0.001 || m3<-0.001) ?
                                                          formateanumerosep(m3,comadecimal,decimales) : QString();
                                                addElementoTextoDom(doc,tag3,"Mes3",cadnummes);
                                                cadnummes=(m4>0.001 || m4<-0.001) ?
                                                          formateanumerosep(m4,comadecimal,decimales) : QString();
                                                addElementoTextoDom(doc,tag3,"Mes4",cadnummes);
                                                cadnummes=(m5>0.001 || m5<-0.001) ?
                                                          formateanumerosep(m5,comadecimal,decimales) : QString();
                                                addElementoTextoDom(doc,tag3,"Mes5",cadnummes);
                                                cadnummes=(m6>0.001 || m6<-0.001) ?
                                                          formateanumerosep(m6,comadecimal,decimales) : QString();
                                                addElementoTextoDom(doc,tag3,"Mes6",cadnummes);
                                                cadnummes=(m7>0.001 || m7<-0.001) ?
                                                          formateanumerosep(m7,comadecimal,decimales) : QString();
                                                addElementoTextoDom(doc,tag3,"Mes7",cadnummes);
                                                cadnummes=(m8>0.001 || m8<-0.001) ?
                                                          formateanumerosep(m8,comadecimal,decimales) : QString();
                                                addElementoTextoDom(doc,tag3,"Mes8",cadnummes);
                                                cadnummes=(m9>0.001 || m9<-0.001) ?
                                                          formateanumerosep(m9,comadecimal,decimales) : QString();
                                                addElementoTextoDom(doc,tag3,"Mes9",cadnummes);
                                                cadnummes=(m10>0.001 || m10<-0.001) ?
                                                          formateanumerosep(m10,comadecimal,decimales) : QString();
                                                addElementoTextoDom(doc,tag3,"Mes10",cadnummes);
                                                cadnummes=(m11>0.001 || m11<-0.001) ?
                                                          formateanumerosep(m11,comadecimal,decimales) : QString();
                                                addElementoTextoDom(doc,tag3,"Mes11",cadnummes);
                                                cadnummes=(m12>0.001 || m12<-0.001) ?
                                                          formateanumerosep(m12,comadecimal,decimales) : QString();
                                                addElementoTextoDom(doc,tag3,"Mes12",cadnummes);
                                              }
                                          }
                                     }
                                  } // fin del condesglose
                              } // if valor no es cero
                       } // del cadpru índice
                    indice++;
                   } // del while índice

                  // -----------------------------------------------------------

                } // fin del query next
              }
   } // fin de parte2 length > 0


   QString qfichero=dirtrabajo();
   qfichero.append(QDir::separator());
   if (ui.texlineEdit->text().length()==0)
      qfichero=qfichero+tr("estadocontable.xml");
   else
         {
            qfichero=qfichero+ui.texlineEdit->text();
            if (ui.texlineEdit->text().right(4)!=".xml") qfichero=qfichero+".xml";
         }
   QString pasa;
   if (eswindows()) pasa=QFile::encodeName(qfichero);
       else pasa=qfichero;
   QFile fichero(pasa);
    if (! fichero.open( QIODevice::WriteOnly ) ) return;
    QTextStream stream( &fichero );
    stream.setCodec("UTF-8");

    QString xml = doc.toString();

    stream.setCodec("UTF-8");

    stream << "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";

    // ------------------------------------------------------------------------------------
    stream << xml;

    fichero.close();

    QString qficherologo=dirtrabajo();
    qficherologo.append(QDir::separator());
    QString rutagraf=qficherologo+"logo.png";
    if (eswindows()) rutagraf=QFile::encodeName(rutagraf);
    // generamos imagen del logo
    QString imagen=basedatos::instancia()->logo_empresa();
    QPixmap foto;
    if (imagen.isEmpty()) imagen = logodefecto();
    if (imagen.length()>0)
       {
        QByteArray byteshexa;
        byteshexa.append ( imagen );
        QByteArray bytes;
        bytes=bytes.fromHex ( byteshexa );
        foto.loadFromData ( bytes, "PNG");
        foto.save(rutagraf,"PNG");
       }

    progreso.setValue(3);
    QApplication::processEvents();

    QString cj;
    if (haycolref && !ejercicio2.isEmpty()) cj=tr("estado_contable.jasper");
    if (!haycolref && !ejercicio2.isEmpty()) cj=tr("estado_contable_no_colref.jasper");
    if (ejercicio2.isEmpty() && !condesglose && !condesglosectas)
        cj=tr("estado_contable_1ejercicio.jasper");
    if (!formulabasepor.isEmpty())
      {
        if(ejercicio2.isEmpty()) cj=tr("estado_contable_porcent_1col.jasper");
          else cj=tr("estado_contable_porcent_2col.jasper");
      }
    if (condesglose || condesglosectas) cj=tr("estado_contable_desglose.jasper");
    QMessageBox::information( this, tr("Cálculo de Estado Contable"),
                              tr("Se ha generado el archivo XML") );

    QString cadfichjasper=trayreport();
    cadfichjasper.append(QDir::separator());
    cadfichjasper+=cj;

    QString cadpdf=dirtrabajo();
    cadpdf.append(QDir::separator());
    cadpdf+=cj.remove(".jasper")+".pdf";



    informe_jasper_xml(cadfichjasper, pasa,
                       "/Estado/Linea", cadpdf,
                       rutagraf);


}






void calcestado::generalatex_meses()
{
    if (auxiliares.count()==0)
       if (condesglose || condesglosectas) { calculaestado(); }
    QString ejercicio1="";
    QString ejercicio2="";
    QString parte1="";
    QString parte2="";
    QString formulabasepor;
    QString observaciones;
    QString cabecera;
    //double valorbasepor1=0;
    //double valorbasepor2=0;
    // bool estadosmedios=false;
    bool analitica=false; //,haycolref;
    QString ci,colref;

    QProgressDialog progreso(tr("Generando Informe ..."), 0, 0, 3);
    progreso.setWindowTitle("Estados Contables");

    progreso.setValue(1);
    QApplication::processEvents();

    QSqlQuery query = basedatos::instancia()->select14Cabeceraestadostitulo( ui.titulolabel->text() );

    if ( (query.isActive()) && (query.first()) ) {
       parte1=query.value(0).toString();
           parte2=query.value(1).toString();
           ejercicio1=query.value(2).toString();
           ejercicio2=query.value(3).toString();
           // estadosmedios=query.value(4).toBool();
           formulabasepor=query.value(5).toString();
           //valorbasepor1=query.value(6).toDouble();
           //valorbasepor2=query.value(7).toDouble();
           observaciones=query.value(8).toString();
           // analitica=query.value(9).toBool();
           ci=query.value(10).toString();
           // haycolref=query.value(11).toBool();
           colref=query.value(12).toString();
           cabecera=query.value(13).toString();
       } else return;
    // bool hayporcentajes=false;
    // if (formulabasepor.length()>0 && (valorbasepor1>0.001 || valorbasepor1<0.001)
    //    && (valorbasepor2>0.001 || valorbasepor2<0.001)) hayporcentajes=true;
   QString qfichero=dirtrabajo();
   qfichero.append(QDir::separator());
   if (ui.texlineEdit->text().length()==0)
      qfichero=qfichero+tr("estadocontable.tex");
   else
         {
            qfichero=qfichero+ui.texlineEdit->text();
            if (ui.texlineEdit->text().right(4)!=".tex") qfichero=qfichero+".tex";
         }
   // QMessageBox::warning( this, tr("Estados Contables"),qfichero);
   QString pasa;
   if (eswindows()) pasa=QFile::encodeName(qfichero);
       else pasa=qfichero;
   QFile fichero(pasa);
    if (! fichero.open( QIODevice::WriteOnly ) ) return;
    QTextStream stream( &fichero );
    stream.setCodec("UTF-8");

    stream << cabeceralatex();
    stream << margen_extra_latex();

    stream << "\\begin{landscape}" << "\n";

    // Generamos primera parte del Estado Contable
    stream << "\\begin{center}" << "\n";
    stream << "{\\Large \\textbf {";
    stream << filtracad(nombreempresa()) << "}}";
    stream << "\\end{center}";

    if (ui.previsiones->isChecked())
      {
       stream << "\\begin{center}" << "\n";
       stream << "{\\Large \\textbf {";
       stream << " ** PREVISIONES ** }}";
       stream << "\\end{center}";
      }

    if (analitica && ci.length()>0)
        {
         stream << "\\begin{center}" << "\n";
         stream << "{\\normalsize \\textbf {" << tr("CÓDIGO DE IMPUTACIÓN: ") << ci <<  "}}" << "\n";
         stream << "\\end{center}" << "\n";

         QString codigo=ci;
         QString descripcion;
         QString qnivel=0;

         stream << "\\begin{center}" << "\n";
         stream << "{\\normalsize {" ;

         if (codigo.startsWith("???"))
            {
             stream << tr("CUALQUIERA");
            }
         else
           {
            bool encontrada=buscaci(codigo.left(3),&descripcion,&qnivel);
            if (encontrada && qnivel.toInt()==1)
                stream << descripcion;
           }
         if (codigo.length()>3) stream << " - ";
         if (codigo.length()>3 && codigo.mid(3,3)==QString("???")) stream << tr("CUALQUIERA");
         else
          {
           bool encontrada=buscaci(codigo.mid(3,3),&descripcion,&qnivel);
           int elnivel=qnivel.toInt();
           if (encontrada && elnivel==2)
              stream << descripcion;
          }

         if (codigo.length()>6) stream << " - ";
         if (codigo.length()==7 && codigo[6]=='*')  stream << tr("CUALQUIERA");
         else
           {
             bool encontrada=buscaci(codigo.right(codigo.length()-6),&descripcion,&qnivel);
             if (encontrada && qnivel.toInt()==3)
             stream << descripcion;
           }
         stream << "}}" << "\n";
         stream << "\\end{center}" << "\n";
        }

    QApplication::processEvents();

    stream << tr("\\begin{center}") << "\n";

    stream << "\\begin{longtable}{|p{4.5cm}|r|r|r|r|r|r|r|r|r|r|r|r|r|}" << "\n";

    stream << "\\hline" << "\n";
   stream << "\\multicolumn{14";
    stream << "}{|c|} {\\textbf{ ";
    stream << cabecera <<  "}} \\\\";
    stream << "\\hline" << "\n";
    // ---------------------------------------------------------------------------------------

    stream << "{\\scriptsize{" << filtracad(parte1) << "}} & ";
    stream << "{\\scriptsize {" << filtracad(ejercicio1) <<"}} &";
    stream << "{\\scriptsize {" << filtracad(tr("MES 1")) <<"}} &";
    stream << "{\\scriptsize {" << filtracad(tr("MES 2")) <<"}} &";
    stream << "{\\scriptsize {" << filtracad(tr("MES 3")) <<"}} &";
    stream << "{\\scriptsize {" << filtracad(tr("MES 4")) <<"}} &";
    stream << "{\\scriptsize {" << filtracad(tr("MES 5")) <<"}} &";
    stream << "{\\scriptsize {" << filtracad(tr("MES 6")) <<"}} &";
    stream << "{\\scriptsize {" << filtracad(tr("MES 7")) <<"}} &";
    stream << "{\\scriptsize {" << filtracad(tr("MES 8")) <<"}} &";
    stream << "{\\scriptsize {" << filtracad(tr("MES 9")) <<"}} &";
    stream << "{\\scriptsize {" << filtracad(tr("MES 10")) <<"}} &";
    stream << "{\\scriptsize {" << filtracad(tr("MES 11")) <<"}} &";
    stream << "{\\scriptsize {" << filtracad(tr("MES 12")) <<"} ";
    stream << "} \\\\" << "\n";
    stream << "\\hline" << "\n";
    stream << "\\endfirsthead" << "\n";
    // -------------------------------------------------------------------------------------------------------
    stream << "\\hline" << "\n";
    stream << "{\\scriptsize{" << filtracad(parte1) << "}} & ";
    stream << "{\\scriptsize {" << filtracad(ejercicio1) <<"}} &";
    stream << "{\\scriptsize {" << filtracad(tr("MES 1")) <<"}} &";
    stream << "{\\scriptsize {" << filtracad(tr("MES 2")) <<"}} &";
    stream << "{\\scriptsize {" << filtracad(tr("MES 3")) <<"}} &";
    stream << "{\\scriptsize {" << filtracad(tr("MES 4")) <<"}} &";
    stream << "{\\scriptsize {" << filtracad(tr("MES 5")) <<"}} &";
    stream << "{\\scriptsize {" << filtracad(tr("MES 6")) <<"}} &";
    stream << "{\\scriptsize {" << filtracad(tr("MES 7")) <<"}} &";
    stream << "{\\scriptsize {" << filtracad(tr("MES 8")) <<"}} &";
    stream << "{\\scriptsize {" << filtracad(tr("MES 9")) <<"}} &";
    stream << "{\\scriptsize {" << filtracad(tr("MES 10")) <<"}} &";
    stream << "{\\scriptsize {" << filtracad(tr("MES 11")) <<"}} &";
    stream << "{\\scriptsize {" << filtracad(tr("MES 12")) <<"}";
    stream << "} \\\\" << "\n";
    stream << "\\hline" << "\n";
    stream << "\\endhead" << "\n";
    stream << "\\hline" << "\n";

    QSqlQuery query2 = basedatos::instancia()->select5Estadostituloparte1ordernodo( ui.titulolabel->text() , true );
    int veces;
    if ( query2.isActive() ) {
             while ( query2.next() ) {

               QApplication::processEvents();

               if (query2.value(0).toString().contains("LINEA")>0)
                 {
                   stream << "\\hline\n";
                   continue;
                 }
               // ----------------------------------------------------------------------
               if (ui.importescheckBox->isChecked()
                    && query2.value(2).toDouble()<0.0001
                    && query2.value(2).toDouble()>-0.0001)
                     continue;
               // ----------------------------------------------------------------------
               // ----------------------------------------------------------------------
               for (veces=1;veces<=query2.value(0).toString().count('.');veces++)
                   stream << "\\hspace{0.5cm} ";
               // if (query2.value(0).toString().contains("TOTAL")==0)
              //	   stream << query2.value(0).toString() << " " ;
               stream << "{\\tiny {" << filtracad(query2.value(1).toString()) << "}} & ";
               //---------------------------------------------
               if (query2.value(2).toDouble()>0.001 || query2.value(2).toDouble()<-0.001)
                     stream << "{\\tiny {" <<
                        formateanumerosep(query2.value(2).toDouble(),comadecimal,decimales) << "}}";
               stream << "&";
               if (query2.value(5).toDouble()>0.001 || query2.value(5).toDouble()<-0.001)
                     stream << "{\\tiny {" <<
                        formateanumerosep(query2.value(5).toDouble(),comadecimal,decimales) << "}}";
               stream << "&";
               if (query2.value(6).toDouble()>0.001 || query2.value(6).toDouble()<-0.001)
                     stream << "{\\tiny {" <<
                        formateanumerosep(query2.value(6).toDouble(),comadecimal,decimales) << "}}";
               stream << "&";
               if (query2.value(7).toDouble()>0.001 || query2.value(7).toDouble()<-0.001)
                     stream << "{\\tiny {" <<
                        formateanumerosep(query2.value(7).toDouble(),comadecimal,decimales) << "}}";
               stream << "&";
               if (query2.value(8).toDouble()>0.001 || query2.value(8).toDouble()<-0.001)
                     stream << "{\\tiny {" <<
                        formateanumerosep(query2.value(8).toDouble(),comadecimal,decimales) << "}}";
               stream << "&";
               if (query2.value(9).toDouble()>0.001 || query2.value(9).toDouble()<-0.001)
                     stream << "{\\tiny {" <<
                        formateanumerosep(query2.value(9).toDouble(),comadecimal,decimales) << "}}";
               stream << "&";
               if (query2.value(10).toDouble()>0.001 || query2.value(10).toDouble()<-0.001)
                     stream << "{\\tiny {" <<
                        formateanumerosep(query2.value(10).toDouble(),comadecimal,decimales) << "}}";
               stream << "&";
               if (query2.value(11).toDouble()>0.001 || query2.value(11).toDouble()<-0.001)
                     stream << "{\\tiny {" <<
                        formateanumerosep(query2.value(11).toDouble(),comadecimal,decimales) << "}}";
               stream << "&";
               if (query2.value(12).toDouble()>0.001 || query2.value(12).toDouble()<-0.001)
                     stream << "{\\tiny {" <<
                        formateanumerosep(query2.value(12).toDouble(),comadecimal,decimales) << "}}";
               stream << "&";
               if (query2.value(13).toDouble()>0.001 || query2.value(13).toDouble()<-0.001)
                     stream << "{\\tiny {" <<
                        formateanumerosep(query2.value(13).toDouble(),comadecimal,decimales) << "}}";
               stream << "&";
               if (query2.value(14).toDouble()>0.001 || query2.value(14).toDouble()<-0.001)
                     stream << "{\\tiny {" <<
                        formateanumerosep(query2.value(14).toDouble(),comadecimal,decimales) << "}}";
               stream << "&";
               if (query2.value(15).toDouble()>0.001 || query2.value(15).toDouble()<-0.001)
                     stream << "{\\tiny {" <<
                        formateanumerosep(query2.value(15).toDouble(),comadecimal,decimales) << "}}";
               stream << "&";
               if (query2.value(16).toDouble()>0.001 || query2.value(16).toDouble()<-0.001)
                     stream << "{\\tiny {" <<
                        formateanumerosep(query2.value(16).toDouble(),comadecimal,decimales) << "}}";
               stream << " \\\\" << "\n";

// ------------------------------------------------------------------------------------------------
               if (!condesglose && !condesglosectas) continue;

               // desglosamos el campo fórmula que no contenga {
               QString cadpru=query2.value(17).toString();
               if (cadpru.contains('{')) continue;

               int indice=0;
               int inicio,final;
               QString ejercicio=ui.Ejercicio1comboBox->currentText();
               bool acotado=ui.fechas_ej1_groupBox->isChecked();
               QDate fecha1=ui.ini_ej1_dateEdit->date();
               QDate fecha2=ui.fin_ej1_dateEdit->date();
               // bool estadosmedios=consaldosmedios;
               double valor;
               QString extract;
               while (indice<cadpru.length())
                   {
                    if (cadpru[indice]=='[')
                        {
                         inicio=indice;
                         final=inicio;
                         while (final<cadpru.length() && cadpru[final]!=']') final++;
                         // extraemos la cadena de la cuenta sin corchetes
                         extract=cadpru.mid(inicio+1,final-inicio-1);
                        // habría que calcular el valor de la cuenta
                        // QMessageBox::warning( this, tr("Estados Contables"),extract);
                        // -------------------------------------------------------------------------------------
                        if (extract.contains(':')==1) valor=cuentaespec(extract,ejercicio,acotado,fecha1,fecha2);
                           else
                               valor=saldo_cuenta_lista_ej1(extract);
                        // repetimos esto para cada mes
                        QDate finicio;
                        QDate fin;
                        double m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12;
                        int anyo=inicioejercicio(ui.Ejercicio1comboBox->currentText()).year();

                        finicio.setDate(anyo,1,1);
                        fin.setDate(anyo,1,31);
                        if (extract.contains(':')==1) m1=cuentaespec(extract,ejercicio,true,
                                                                     finicio,fin);
                           else
                               m1=saldo_cuenta_lista_mes(extract, 1);


                        finicio.setDate(anyo,2,1);
                        fin.setDate(anyo,3,1);
                        fin=fin.addDays(-1);
                        if (extract.contains(':')==1) m2=cuentaespec(extract,ejercicio,true,
                                                                     finicio,fin);
                           else
                               m2=saldo_cuenta_lista_mes(extract,2);

                        finicio.setDate(anyo,3,1);
                        fin.setDate(anyo,3,31);
                        if (extract.contains(':')==1) m3=cuentaespec(extract,ejercicio,true,
                                                                     finicio,fin);
                           else
                               m3=saldo_cuenta_lista_mes(extract,3);

                        finicio.setDate(anyo,4,1);
                        fin.setDate(anyo,4,30);
                        if (extract.contains(':')==1) m4=cuentaespec(extract,ejercicio,true,
                                                                     finicio,fin);
                           else
                               m4=saldo_cuenta_lista_mes(extract,4);

                        finicio.setDate(anyo,5,1);
                        fin.setDate(anyo,5,31);
                        if (extract.contains(':')==1) m5=cuentaespec(extract,ejercicio,true,
                                                                     finicio,fin);
                           else
                               m5=saldo_cuenta_lista_mes(extract,5);

                        finicio.setDate(anyo,6,1);
                        fin.setDate(anyo,6,30);
                        if (extract.contains(':')==1) m6=cuentaespec(extract,ejercicio,true,
                                                                     finicio,fin);
                           else
                               m6=saldo_cuenta_lista_mes(extract,6);

                        finicio.setDate(anyo,7,1);
                        fin.setDate(anyo,7,31);
                        if (extract.contains(':')==1) m7=cuentaespec(extract,ejercicio,true,
                                                                     finicio,fin);
                           else
                               m7=saldo_cuenta_lista_mes(extract,7);

                        finicio.setDate(anyo,8,1);
                        fin.setDate(anyo,8,31);
                        if (extract.contains(':')==1) m8=cuentaespec(extract,ejercicio,true,
                                                                     finicio,fin);
                           else
                               m8=saldo_cuenta_lista_mes(extract,8);

                        finicio.setDate(anyo,9,1);
                        fin.setDate(anyo,9,30);
                        if (extract.contains(':')==1) m9=cuentaespec(extract,ejercicio,true,
                                                                     finicio,fin);
                           else
                               m9=saldo_cuenta_lista_mes(extract,9);

                        finicio.setDate(anyo,10,1);
                        fin.setDate(anyo,10,31);
                        if (extract.contains(':')==1) m10=cuentaespec(extract,ejercicio,true,
                                                                     finicio,fin);
                           else
                               m10=saldo_cuenta_lista_mes(extract,10);

                        finicio.setDate(anyo,11,1);
                        fin.setDate(anyo,11,30);
                        if (extract.contains(':')==1) m11=cuentaespec(extract,ejercicio,true,
                                                                     finicio,fin);
                           else
                               m11=saldo_cuenta_lista_mes(extract,11);

                        finicio.setDate(anyo,12,1);
                        fin.setDate(anyo,12,31);
                        if (extract.contains(':')==1) m12=cuentaespec(extract,ejercicio,true,
                                                                     finicio,fin);
                           else
                               m12=saldo_cuenta_lista_mes(extract,12);


                        // if (valor>-0.004 && valor < 0.005) continue;
                        if (inicio-1>=0 && cadpru[inicio-1]=='-') valor=-1*valor;
                        // imprimimos cadena formada por código de cuenta y descripción
                        bool positivo=false;
                        bool negativo=false;
                        positivo=extract.contains('+');
                        negativo=extract.contains('-');
                        extract.remove('+');
                        extract.remove('-');
                        if (valor>0.001 || valor<-0.001)
                           {
                            stream << "{\\tiny {" << extract << " " << filtracad(descripcioncuenta(extract))
                                      << "}} & ";
                            stream << "{\\tiny {" << formateanumerosep(valor,comadecimal,decimales) << "}} & ";
                            // ahora todos los meses
                            stream << "{\\tiny {" << formateanumerosep(m1,comadecimal,decimales) << "}} & ";
                            stream << "{\\tiny {" << formateanumerosep(m2,comadecimal,decimales) << "}} & ";
                            stream << "{\\tiny {" << formateanumerosep(m3,comadecimal,decimales) << "}} & ";
                            stream << "{\\tiny {" << formateanumerosep(m4,comadecimal,decimales) << "}} & ";
                            stream << "{\\tiny {" << formateanumerosep(m5,comadecimal,decimales) << "}} & ";
                            stream << "{\\tiny {" << formateanumerosep(m6,comadecimal,decimales) << "}} & ";
                            stream << "{\\tiny {" << formateanumerosep(m7,comadecimal,decimales) << "}} & ";
                            stream << "{\\tiny {" << formateanumerosep(m8,comadecimal,decimales) << "}} & ";
                            stream << "{\\tiny {" << formateanumerosep(m9,comadecimal,decimales) << "}} & ";
                            stream << "{\\tiny {" << formateanumerosep(m10,comadecimal,decimales) << "}} & ";
                            stream << "{\\tiny {" << formateanumerosep(m11,comadecimal,decimales) << "}} & ";
                            stream << "{\\tiny {" << formateanumerosep(m12,comadecimal,decimales) << "}} ";
                            stream << " \\\\" << "\n";

                            // QMessageBox::warning( this, tr("Estados Contables"),extract);
                            // seguimos aquí con el desglose de todas las cuentas
                            // ojo si aparece el signo + ó menos en extract
                            // habría que quitarlo y añadirlo a cada selección
                            if (condesglose)
                            {
                             QSqlQuery q;
                             if (!cod_longitud_variable())
                               {
                                q = basedatos::instancia()->selectCodigoplancontablecodigolength(extract);
                               }
                               else
                                   {
                                    q = basedatos::instancia()->selectCodigoplancontablecodigoauxiliar(extract);
                                   }
                              while (q.next())
                                 {
                                   QString extract2=q.value(0).toString();
                                   QString extract2sig=extract2;
                                   if (positivo) extract2sig.append('+');
                                   if (negativo) extract2sig.append('-');
                                   if (extract.contains(':')==1) valor=cuentaespec_aux(extract2sig,ejercicio,
                                                                       acotado,fecha1,fecha2);
                                   else
                                   {
                                    valor=saldo_cuenta_lista_ej1(extract2sig);
                                   }

                                   finicio.setDate(anyo,1,1);
                                   fin.setDate(anyo,1,31);
                                   if (extract2sig.contains(':')==1) m1=cuentaespec(extract2sig,ejercicio,true,
                                                                                finicio,fin);
                                      else
                                          m1=saldo_cuenta_lista_mes(extract2sig,1);


                                   finicio.setDate(anyo,2,1);
                                   fin.setDate(anyo,3,1);
                                   fin=fin.addDays(-1);
                                   if (extract2sig.contains(':')==1) m2=cuentaespec(extract2sig,ejercicio,true,
                                                                                finicio,fin);
                                      else
                                          m2=saldo_cuenta_lista_mes(extract2sig,2);

                                   finicio.setDate(anyo,3,1);
                                   fin.setDate(anyo,3,31);
                                   if (extract2sig.contains(':')==1) m3=cuentaespec(extract2sig,ejercicio,true,
                                                                                finicio,fin);
                                      else
                                          m3=saldo_cuenta_lista_mes(extract2sig,3);

                                   finicio.setDate(anyo,4,1);
                                   fin.setDate(anyo,4,30);
                                   if (extract2sig.contains(':')==1) m4=cuentaespec(extract2sig,ejercicio,true,
                                                                                finicio,fin);
                                      else
                                          m4=saldo_cuenta_lista_mes(extract2sig,4);

                                   finicio.setDate(anyo,5,1);
                                   fin.setDate(anyo,5,31);
                                   if (extract2sig.contains(':')==1) m5=cuentaespec(extract2sig,ejercicio,true,
                                                                                finicio,fin);
                                      else
                                          m5=saldo_cuenta_lista_mes(extract2sig,5);

                                   finicio.setDate(anyo,6,1);
                                   fin.setDate(anyo,6,30);
                                   if (extract2sig.contains(':')==1) m6=cuentaespec(extract2sig,ejercicio,true,
                                                                                finicio,fin);
                                      else
                                          m6=saldo_cuenta_lista_mes(extract2sig,6);

                                   finicio.setDate(anyo,7,1);
                                   fin.setDate(anyo,7,31);
                                   if (extract2sig.contains(':')==1) m7=cuentaespec(extract2sig,ejercicio,true,
                                                                                finicio,fin);
                                      else
                                          m7=saldo_cuenta_lista_mes(extract2sig,7);

                                   finicio.setDate(anyo,8,1);
                                   fin.setDate(anyo,8,31);
                                   if (extract2sig.contains(':')==1) m8=cuentaespec(extract2sig,ejercicio,true,
                                                                                finicio,fin);
                                      else
                                          m8=saldo_cuenta_lista_mes(extract2sig,8);

                                   finicio.setDate(anyo,9,1);
                                   fin.setDate(anyo,9,30);
                                   if (extract2sig.contains(':')==1) m9=cuentaespec(extract2sig,ejercicio,true,
                                                                                finicio,fin);
                                      else
                                          m9=saldo_cuenta_lista_mes(extract2sig,9);

                                   finicio.setDate(anyo,10,1);
                                   fin.setDate(anyo,10,31);
                                   if (extract2sig.contains(':')==1) m10=cuentaespec(extract2sig,ejercicio,true,
                                                                                finicio,fin);
                                      else
                                          m10=saldo_cuenta_lista_mes(extract2sig,10);

                                   finicio.setDate(anyo,11,1);
                                   fin.setDate(anyo,11,30);
                                   if (extract2sig.contains(':')==1) m11=cuentaespec(extract2sig,ejercicio,true,
                                                                                finicio,fin);
                                      else
                                          m11=saldo_cuenta_lista_mes(extract2sig,11);

                                   finicio.setDate(anyo,12,1);
                                   fin.setDate(anyo,12,31);
                                   if (extract2sig.contains(':')==1) m12=cuentaespec(extract2sig,ejercicio,true,
                                                                                finicio,fin);
                                      else
                                          m12=saldo_cuenta_lista_mes(extract2sig,12);

                                   if (valor>0.001 || valor <-0.001)
                                       {
                                         stream << "\\hspace{0.5cm} ";
                                         stream << "{\\tiny {" << extract2 << " " <<
                                             filtracad(descripcioncuenta(extract2)) << "}} &";
                                         if (inicio-1>=0 && cadpru[inicio-1]=='-') valor=-1*valor;
                                         stream << "{\\tiny {" << formateanumerosep(valor,comadecimal,decimales) << "}} & ";
                                         // ahora todos los meses
                                         stream << "{\\tiny {" << formateanumerosep(m1,comadecimal,decimales) << "}} & ";
                                         stream << "{\\tiny {" << formateanumerosep(m2,comadecimal,decimales) << "}} & ";
                                         stream << "{\\tiny {" << formateanumerosep(m3,comadecimal,decimales) << "}} & ";
                                         stream << "{\\tiny {" << formateanumerosep(m4,comadecimal,decimales) << "}} & ";
                                         stream << "{\\tiny {" << formateanumerosep(m5,comadecimal,decimales) << "}} & ";
                                         stream << "{\\tiny {" << formateanumerosep(m6,comadecimal,decimales) << "}} & ";
                                         stream << "{\\tiny {" << formateanumerosep(m7,comadecimal,decimales) << "}} & ";
                                         stream << "{\\tiny {" << formateanumerosep(m8,comadecimal,decimales) << "}} & ";
                                         stream << "{\\tiny {" << formateanumerosep(m9,comadecimal,decimales) << "}} & ";
                                         stream << "{\\tiny {" << formateanumerosep(m10,comadecimal,decimales) << "}} & ";
                                         stream << "{\\tiny {" << formateanumerosep(m11,comadecimal,decimales) << "}} & ";
                                         stream << "{\\tiny {" << formateanumerosep(m12,comadecimal,decimales) << "}} ";
                                         stream << " \\\\" << "\n";
                                       }
                                  }
                                stream << "\\hline\n";
                               } // fin del condesglose
                           }
                    }
                 indice++;
                }
// ------------------------------------------------------------------------------------------------

             }
           }
    stream << "\\hline" << "\n";
    stream << "\\end{longtable}" << "\n";
    stream << "\\end{center}" << "\n";

    progreso.setValue(2);
    QApplication::processEvents();

 if (parte2.length()>0)
    {
    stream << "\\newpage" << "\n";

    // Generamos segunda parte
    stream << "\\begin{center}" << "\n";
    stream << "{\\Large \\textbf {";
    stream << filtracad(nombreempresa()) << "}}";
    stream << "\\end{center}";

    if (ui.previsiones->isChecked())
      {
       stream << "\\begin{center}" << "\n";
       stream << "{\\Large \\textbf {";
       stream << " ** PREVISIONES ** }}";
       stream << "\\end{center}";
      }

    stream << tr("\\begin{center}") << "\n";

    stream << "\\begin{longtable}{|p{4.5cm}|r|r|r|r|r|r|r|r|r|r|r|r|r|}" << "\n";

    stream << "\\hline" << "\n";
   stream << "\\multicolumn{14";
    stream << "}{|c|} {\\textbf{ ";
    stream << cabecera <<  "}} \\\\";
    stream << "\\hline" << "\n";
    // ---------------------------------------------------------------------------------------

    stream << "{\\scriptsize{" << filtracad(parte2) << "}} & ";
    stream << "{\\scriptsize {" << filtracad(ejercicio1) <<"}} &";
    stream << "{\\scriptsize {" << filtracad(tr("MES 1")) <<"}} &";
    stream << "{\\scriptsize {" << filtracad(tr("MES 2")) <<"}} &";
    stream << "{\\scriptsize {" << filtracad(tr("MES 3")) <<"}} &";
    stream << "{\\scriptsize {" << filtracad(tr("MES 4")) <<"}} &";
    stream << "{\\scriptsize {" << filtracad(tr("MES 5")) <<"}} &";
    stream << "{\\scriptsize {" << filtracad(tr("MES 6")) <<"}} &";
    stream << "{\\scriptsize {" << filtracad(tr("MES 7")) <<"}} &";
    stream << "{\\scriptsize {" << filtracad(tr("MES 8")) <<"}} &";
    stream << "{\\scriptsize {" << filtracad(tr("MES 9")) <<"}} &";
    stream << "{\\scriptsize {" << filtracad(tr("MES 10")) <<"}} &";
    stream << "{\\scriptsize {" << filtracad(tr("MES 11")) <<"}} &";
    stream << "{\\scriptsize {" << filtracad(tr("MES 12")) <<"}";
    stream << "} \\\\" << "\n";
    stream << "\\hline" << "\n";
    stream << "\\endfirsthead";
    // -------------------------------------------------------------------------------------------------------
    stream << "\\hline" << "\n";
    stream << "{\\scriptsize{" << filtracad(parte2) << "}} & ";
    stream << "{\\scriptsize {" << filtracad(ejercicio1) <<"}} &";
    stream << "{\\scriptsize {" << filtracad(tr("MES 1")) <<"}} &";
    stream << "{\\scriptsize {" << filtracad(tr("MES 2")) <<"}} &";
    stream << "{\\scriptsize {" << filtracad(tr("MES 3")) <<"}} &";
    stream << "{\\scriptsize {" << filtracad(tr("MES 4")) <<"}} &";
    stream << "{\\scriptsize {" << filtracad(tr("MES 5")) <<"}} &";
    stream << "{\\scriptsize {" << filtracad(tr("MES 6")) <<"}} &";
    stream << "{\\scriptsize {" << filtracad(tr("MES 7")) <<"}} &";
    stream << "{\\scriptsize {" << filtracad(tr("MES 8")) <<"}} &";
    stream << "{\\scriptsize {" << filtracad(tr("MES 9")) <<"}} &";
    stream << "{\\scriptsize {" << filtracad(tr("MES 10")) <<"}} &";
    stream << "{\\scriptsize {" << filtracad(tr("MES 11")) <<"}} &";
    stream << "{\\scriptsize {" << filtracad(tr("MES 12")) <<"}";
    stream << "} \\\\" << "\n";
    stream << "\\hline" << "\n";
    stream << "\\endhead" << "\n";
    stream << "\\hline" << "\n";
// -------------------------------------------------------------------------------------------------------
    query2 = basedatos::instancia()->select5Estadostituloparte1ordernodo( ui.titulolabel->text(),
                                                                          false );
    if ( query2.isActive() ) {
             while ( query2.next() ) {
               QApplication::processEvents();
               if (query2.value(0).toString().contains("LINEA")>0)
                 {
                   stream << "\\hline\n";
                   continue;
                 }
               // ----------------------------------------------------------------------
               if (ui.importescheckBox->isChecked()
                    && query2.value(2).toDouble()<0.0001
                    && query2.value(2).toDouble()>-0.0001)
                     continue;
               // ----------------------------------------------------------------------
               // ----------------------------------------------------------------------
               for (veces=1;veces<=query2.value(0).toString().count('.');veces++)
                   stream << "\\hspace{0.5cm} ";
               // if (query2.value(0).toString().contains("TOTAL")==0)
              //	   stream << query2.value(0).toString() << " " ;
               stream << "{\\tiny {" << filtracad(query2.value(1).toString()) << "}} & ";
               //---------------------------------------------
               if (query2.value(2).toDouble()>0.001 || query2.value(2).toDouble()<-0.001)
                     stream << "{\\tiny {" <<
                        formateanumerosep(query2.value(2).toDouble(),comadecimal,decimales) << "}}";
               stream << "&";
               if (query2.value(5).toDouble()>0.001 || query2.value(5).toDouble()<-0.001)
                     stream << "{\\tiny {" <<
                        formateanumerosep(query2.value(5).toDouble(),comadecimal,decimales) << "}}";
               stream << "&";
               if (query2.value(6).toDouble()>0.001 || query2.value(6).toDouble()<-0.001)
                     stream << "{\\tiny {" <<
                        formateanumerosep(query2.value(6).toDouble(),comadecimal,decimales) << "}}";
               stream << "&";
               if (query2.value(7).toDouble()>0.001 || query2.value(7).toDouble()<-0.001)
                     stream << "{\\tiny {" <<
                        formateanumerosep(query2.value(7).toDouble(),comadecimal,decimales) << "}}";
               stream << "&";
               if (query2.value(8).toDouble()>0.001 || query2.value(8).toDouble()<-0.001)
                     stream << "{\\tiny {" <<
                        formateanumerosep(query2.value(8).toDouble(),comadecimal,decimales) << "}}";
               stream << "&";
               if (query2.value(9).toDouble()>0.001 || query2.value(9).toDouble()<-0.001)
                     stream << "{\\tiny {" <<
                        formateanumerosep(query2.value(9).toDouble(),comadecimal,decimales) << "}}";
               stream << "&";
               if (query2.value(10).toDouble()>0.001 || query2.value(10).toDouble()<-0.001)
                     stream << "{\\tiny {" <<
                        formateanumerosep(query2.value(10).toDouble(),comadecimal,decimales) << "}}";
               stream << "&";
               if (query2.value(11).toDouble()>0.001 || query2.value(11).toDouble()<-0.001)
                     stream << "{\\tiny {" <<
                        formateanumerosep(query2.value(11).toDouble(),comadecimal,decimales) << "}}";
               stream << "&";
               if (query2.value(12).toDouble()>0.001 || query2.value(12).toDouble()<-0.001)
                     stream << "{\\tiny {" <<
                        formateanumerosep(query2.value(12).toDouble(),comadecimal,decimales) << "}}";
               stream << "&";
               if (query2.value(13).toDouble()>0.001 || query2.value(13).toDouble()<-0.001)
                     stream << "{\\tiny {" <<
                        formateanumerosep(query2.value(13).toDouble(),comadecimal,decimales) << "}}";
               stream << "&";
               if (query2.value(14).toDouble()>0.001 || query2.value(14).toDouble()<-0.001)
                     stream << "{\\tiny {" <<
                        formateanumerosep(query2.value(14).toDouble(),comadecimal,decimales) << "}}";
               stream << "&";
               if (query2.value(15).toDouble()>0.001 || query2.value(15).toDouble()<-0.001)
                     stream << "{\\tiny {" <<
                        formateanumerosep(query2.value(15).toDouble(),comadecimal,decimales) << "}}";
               stream << "&";
               if (query2.value(16).toDouble()>0.001 || query2.value(16).toDouble()<-0.001)
                     stream << "{\\tiny {" <<
                        formateanumerosep(query2.value(16).toDouble(),comadecimal,decimales) << "}}";
               stream << " \\\\" << "\n";
               // ------------------------------------------------------------------------------------------------
               if (!condesglose && !condesglosectas) continue;

                              // desglosamos el campo fórmula que no contenga {
                              QString cadpru=query2.value(17).toString();
                              if (cadpru.contains('{')) continue;

                              int indice=0;
                              int inicio,final;
                              QString ejercicio=ui.Ejercicio1comboBox->currentText();
                              bool acotado=ui.fechas_ej1_groupBox->isChecked();
                              QDate fecha1=ui.ini_ej1_dateEdit->date();
                              QDate fecha2=ui.fin_ej1_dateEdit->date();
                              // bool estadosmedios=consaldosmedios;
                              double valor;
                              QString extract;
                              while (indice<cadpru.length())
                                  {
                                   if (cadpru[indice]=='[')
                                       {
                                        inicio=indice;
                                        final=inicio;
                                        while (final<cadpru.length() && cadpru[final]!=']') final++;
                                        // extraemos la cadena de la cuenta sin corchetes
                                        extract=cadpru.mid(inicio+1,final-inicio-1);
                                       // habría que calcular el valor de la cuenta
                                       // QMessageBox::warning( this, tr("Estados Contables"),extract);
                                       // -------------------------------------------------------------------------------------
                                       if (extract.contains(':')==1) valor=cuentaespec(extract,ejercicio,acotado,fecha1,fecha2);
                                          else
                                              valor=saldo_cuenta_lista_ej1(extract);
                                       // repetimos esto para cada mes
                                       QDate finicio;
                                       QDate fin;
                                       double m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12;
                                       int anyo=inicioejercicio(ui.Ejercicio1comboBox->currentText()).year();

                                       finicio.setDate(anyo,1,1);
                                       fin.setDate(anyo,1,31);
                                       if (extract.contains(':')==1) m1=cuentaespec(extract,ejercicio,true,
                                                                                    finicio,fin);
                                          else
                                              m1=saldo_cuenta_lista_mes(extract,1);


                                       finicio.setDate(anyo,2,1);
                                       fin.setDate(anyo,3,1);
                                       fin=fin.addDays(-1);
                                       if (extract.contains(':')==1) m2=cuentaespec(extract,ejercicio,true,
                                                                                    finicio,fin);
                                          else
                                              m2=saldo_cuenta_lista_mes(extract,2);

                                       finicio.setDate(anyo,3,1);
                                       fin.setDate(anyo,3,31);
                                       if (extract.contains(':')==1) m3=cuentaespec(extract,ejercicio,true,
                                                                                    finicio,fin);
                                          else
                                              m3=saldo_cuenta_lista_mes(extract,3);

                                       finicio.setDate(anyo,4,1);
                                       fin.setDate(anyo,4,30);
                                       if (extract.contains(':')==1) m4=cuentaespec(extract,ejercicio,true,
                                                                                    finicio,fin);
                                          else
                                              m4=saldo_cuenta_lista_mes(extract,4);

                                       finicio.setDate(anyo,5,1);
                                       fin.setDate(anyo,5,31);
                                       if (extract.contains(':')==1) m5=cuentaespec(extract,ejercicio,true,
                                                                                    finicio,fin);
                                          else
                                              m5=saldo_cuenta_lista_mes(extract,5);

                                       finicio.setDate(anyo,6,1);
                                       fin.setDate(anyo,6,30);
                                       if (extract.contains(':')==1) m6=cuentaespec(extract,ejercicio,true,
                                                                                    finicio,fin);
                                          else
                                              m6=saldo_cuenta_lista_mes(extract,6);

                                       finicio.setDate(anyo,7,1);
                                       fin.setDate(anyo,7,31);
                                       if (extract.contains(':')==1) m7=cuentaespec(extract,ejercicio,true,
                                                                                    finicio,fin);
                                          else
                                              m7=saldo_cuenta_lista_mes(extract,7);

                                       finicio.setDate(anyo,8,1);
                                       fin.setDate(anyo,8,31);
                                       if (extract.contains(':')==1) m8=cuentaespec(extract,ejercicio,true,
                                                                                    finicio,fin);
                                          else
                                              m8=saldo_cuenta_lista_mes(extract,8);

                                       finicio.setDate(anyo,9,1);
                                       fin.setDate(anyo,9,30);
                                       if (extract.contains(':')==1) m9=cuentaespec(extract,ejercicio,true,
                                                                                    finicio,fin);
                                          else
                                              m9=saldo_cuenta_lista_mes(extract,9);

                                       finicio.setDate(anyo,10,1);
                                       fin.setDate(anyo,10,31);
                                       if (extract.contains(':')==1) m10=cuentaespec(extract,ejercicio,true,
                                                                                    finicio,fin);
                                          else
                                              m10=saldo_cuenta_lista_mes(extract,10);

                                       finicio.setDate(anyo,11,1);
                                       fin.setDate(anyo,11,30);
                                       if (extract.contains(':')==1) m11=cuentaespec(extract,ejercicio,true,
                                                                                    finicio,fin);
                                          else
                                              m11=saldo_cuenta_lista_mes(extract,11);

                                       finicio.setDate(anyo,12,1);
                                       fin.setDate(anyo,12,31);
                                       if (extract.contains(':')==1) m12=cuentaespec(extract,ejercicio,true,
                                                                                    finicio,fin);
                                          else
                                              m12=saldo_cuenta_lista_mes(extract,12);


                                       // if (valor>-0.004 && valor < 0.005) continue;
                                       if (inicio-1>=0 && cadpru[inicio-1]=='-') valor=-1*valor;
                                       // imprimimos cadena formada por código de cuenta y descripción
                                       bool positivo=false;
                                       bool negativo=false;
                                       positivo=extract.contains('+');
                                       negativo=extract.contains('-');
                                       extract.remove('+');
                                       extract.remove('-');
                                       if (valor>0.001 || valor<-0.001)
                                          {
                                           stream << "{\\tiny {" << extract << " " << filtracad(descripcioncuenta(extract))
                                                     << "}} & ";
                                           stream << "{\\tiny {" << formateanumerosep(valor,comadecimal,decimales) << "}} & ";
                                           // ahora todos los meses
                                           stream << "{\\tiny {" << formateanumerosep(m1,comadecimal,decimales) << "}} & ";
                                           stream << "{\\tiny {" << formateanumerosep(m2,comadecimal,decimales) << "}} & ";
                                           stream << "{\\tiny {" << formateanumerosep(m3,comadecimal,decimales) << "}} & ";
                                           stream << "{\\tiny {" << formateanumerosep(m4,comadecimal,decimales) << "}} & ";
                                           stream << "{\\tiny {" << formateanumerosep(m5,comadecimal,decimales) << "}} & ";
                                           stream << "{\\tiny {" << formateanumerosep(m6,comadecimal,decimales) << "}} & ";
                                           stream << "{\\tiny {" << formateanumerosep(m7,comadecimal,decimales) << "}} & ";
                                           stream << "{\\tiny {" << formateanumerosep(m8,comadecimal,decimales) << "}} & ";
                                           stream << "{\\tiny {" << formateanumerosep(m9,comadecimal,decimales) << "}} & ";
                                           stream << "{\\tiny {" << formateanumerosep(m10,comadecimal,decimales) << "}} & ";
                                           stream << "{\\tiny {" << formateanumerosep(m11,comadecimal,decimales) << "}} & ";
                                           stream << "{\\tiny {" << formateanumerosep(m12,comadecimal,decimales) << "}} ";
                                           stream << " \\\\" << "\n";

                                           // QMessageBox::warning( this, tr("Estados Contables"),extract);
                                           // seguimos aquí con el desglose de todas las cuentas
                                           // ojo si aparece el signo + ó menos en extract
                                           // habría que quitarlo y añadirlo a cada selección
                                           if (condesglose)
                                           {
                                            QSqlQuery q;
                                            if (!cod_longitud_variable())
                                              {
                                               q = basedatos::instancia()->selectCodigoplancontablecodigolength(extract);
                                              }
                                              else
                                                  {
                                                   q = basedatos::instancia()->selectCodigoplancontablecodigoauxiliar(extract);
                                                  }
                                             while (q.next())
                                                {
                                                  QString extract2=q.value(0).toString();
                                                  QString extract2sig=extract2;
                                                  if (positivo) extract2sig.append('+');
                                                  if (negativo) extract2sig.append('-');
                                                  if (extract.contains(':')==1) valor=cuentaespec_aux(extract2sig,ejercicio,
                                                                                      acotado,fecha1,fecha2);
                                                  else
                                                  {
                                                   valor=saldo_cuenta_lista_ej1(extract2sig);
                                                  }
                                                  finicio.setDate(anyo,1,1);
                                                  fin.setDate(anyo,1,31);
                                                  if (extract2sig.contains(':')==1) m1=cuentaespec(extract2sig,ejercicio,true,
                                                                                               finicio,fin);
                                                     else
                                                         m1=saldo_cuenta_lista_mes(extract2sig,1);


                                                  finicio.setDate(anyo,2,1);
                                                  fin.setDate(anyo,3,1);
                                                  fin=fin.addDays(-1);
                                                  if (extract2sig.contains(':')==1) m2=cuentaespec(extract2sig,ejercicio,true,
                                                                                               finicio,fin);
                                                     else
                                                         m2=saldo_cuenta_lista_mes(extract2sig,2);
                                                  finicio.setDate(anyo,3,1);
                                                  fin.setDate(anyo,3,31);
                                                  if (extract2sig.contains(':')==1) m3=cuentaespec(extract2sig,ejercicio,true,
                                                                                               finicio,fin);
                                                     else
                                                         m3=saldo_cuenta_lista_mes(extract2sig,3);

                                                  finicio.setDate(anyo,4,1);
                                                  fin.setDate(anyo,4,30);
                                                  if (extract2sig.contains(':')==1) m4=cuentaespec(extract2sig,ejercicio,true,
                                                                                               finicio,fin);
                                                     else
                                                         m4=saldo_cuenta_lista_mes(extract2sig,4);

                                                  finicio.setDate(anyo,5,1);
                                                  fin.setDate(anyo,5,31);
                                                  if (extract2sig.contains(':')==1) m5=cuentaespec(extract2sig,ejercicio,true,
                                                                                               finicio,fin);
                                                     else
                                                         m5=saldo_cuenta_lista_mes(extract2sig,5);

                                                  finicio.setDate(anyo,6,1);
                                                  fin.setDate(anyo,6,30);
                                                  if (extract2sig.contains(':')==1) m6=cuentaespec(extract2sig,ejercicio,true,
                                                                                               finicio,fin);
                                                     else
                                                         m6=saldo_cuenta_lista_mes(extract2sig,6);

                                                  finicio.setDate(anyo,7,1);
                                                  fin.setDate(anyo,7,31);
                                                  if (extract2sig.contains(':')==1) m7=cuentaespec(extract2sig,ejercicio,true,
                                                                                               finicio,fin);
                                                     else
                                                         m7=saldo_cuenta_lista_mes(extract2sig,7);

                                                  finicio.setDate(anyo,8,1);
                                                  fin.setDate(anyo,8,31);
                                                  if (extract2sig.contains(':')==1) m8=cuentaespec(extract2sig,ejercicio,true,
                                                                                               finicio,fin);
                                                     else
                                                         m8=saldo_cuenta_lista_mes(extract2sig,8);

                                                  finicio.setDate(anyo,9,1);
                                                  fin.setDate(anyo,9,30);
                                                  if (extract2sig.contains(':')==1) m9=cuentaespec(extract2sig,ejercicio,true,
                                                                                               finicio,fin);
                                                     else
                                                         m9=saldo_cuenta_lista_mes(extract2sig,9);

                                                  finicio.setDate(anyo,10,1);
                                                  fin.setDate(anyo,10,31);
                                                  if (extract2sig.contains(':')==1) m10=cuentaespec(extract2sig,ejercicio,true,
                                                                                               finicio,fin);
                                                     else
                                                         m10=saldo_cuenta_lista_mes(extract2sig,10);
                                                  finicio.setDate(anyo,11,1);
                                                  fin.setDate(anyo,11,30);
                                                  if (extract2sig.contains(':')==1) m11=cuentaespec(extract2sig,ejercicio,true,
                                                                                               finicio,fin);
                                                     else
                                                         m11=saldo_cuenta_lista_mes(extract2sig,11);
                                                  finicio.setDate(anyo,12,1);
                                                  fin.setDate(anyo,12,31);
                                                  if (extract2sig.contains(':')==1) m12=cuentaespec(extract2sig,ejercicio,true,
                                                                                               finicio,fin);
                                                     else
                                                         m12=saldo_cuenta_lista_mes(extract2sig,12);
                                                  if (valor>0.001 || valor <-0.001)
                                                      {
                                                        stream << "\\hspace{0.5cm} ";
                                                        stream << "{\\tiny {" << extract2 << " " <<
                                                            filtracad(descripcioncuenta(extract2)) << "}} &";
                                                        if (inicio-1>=0 && cadpru[inicio-1]=='-') valor=-1*valor;
                                                        stream << "{\\tiny {" << formateanumerosep(valor,comadecimal,decimales) << "}} & ";
                                                        // ahora todos los meses
                                                        stream << "{\\tiny {" << formateanumerosep(m1,comadecimal,decimales) << "}} & ";
                                                        stream << "{\\tiny {" << formateanumerosep(m2,comadecimal,decimales) << "}} & ";
                                                        stream << "{\\tiny {" << formateanumerosep(m3,comadecimal,decimales) << "}} & ";
                                                        stream << "{\\tiny {" << formateanumerosep(m4,comadecimal,decimales) << "}} & ";
                                                        stream << "{\\tiny {" << formateanumerosep(m5,comadecimal,decimales) << "}} & ";
                                                        stream << "{\\tiny {" << formateanumerosep(m6,comadecimal,decimales) << "}} & ";
                                                        stream << "{\\tiny {" << formateanumerosep(m7,comadecimal,decimales) << "}} & ";
                                                        stream << "{\\tiny {" << formateanumerosep(m8,comadecimal,decimales) << "}} & ";
                                                        stream << "{\\tiny {" << formateanumerosep(m9,comadecimal,decimales) << "}} & ";
                                                        stream << "{\\tiny {" << formateanumerosep(m10,comadecimal,decimales) << "}} & ";
                                                        stream << "{\\tiny {" << formateanumerosep(m11,comadecimal,decimales) << "}} & ";
                                                        stream << "{\\tiny {" << formateanumerosep(m12,comadecimal,decimales) << "}} ";
                                                        stream << " \\\\" << "\n";
                                                      }
                                                 }
                                               stream << "\\hline\n";
                                              } // fin del condesglose
                                          }
                                   }
                                indice++;
                               }
               // ------------------------------------------------------------------------------------------------

             }
           }
    stream << "\\hline" << "\n";
    stream << "\\end{longtable}" << "\n";
    stream << "\\end{center}" << "\n";
   } // if parte2
    stream << observaciones << "\n";

    stream << "\\end{landscape}\n";

    stream << "% FIN_CUERPO\n";
    stream << "\\end{document}" << "\n";

    progreso.setValue(3);
    QApplication::processEvents();

    fichero.close();

}