#include "StdAfx.h"
#include "datenbank.h"

#include <sstream> 
#include <iostream>
#include <fstream>

#include "simulation.h"
//#define DBHOST "tcp://160.45.41.29:3306"
/*
 #define DBHOST "casper-db.imp.fu-berlin.de"
 #define USER "casper_admin"
 #define PASSWORD "LJsmd5NmJHJa2eCP"
 #define DATABASE "casper_sokobio" 
 */

//#define DBHOST "tcp://160.45.41.29:3306"
//#define USER "sokobio"
//#define PASSWORD "wee6Jees"
//#define DATABASE "sokobio_leipzig" 
/*
 #define DBHOST "localhost" 
 #define USER "root"
 #define PASSWORD ""
 #define DATABASE "ecopay" 
 */

#define NUMOFFSET 100
#define COLNAME 200

using namespace std;
using namespace sql;

datenbank::datenbank( void)
{
    ifstream dbConfigFile( "db_config.txt");
    bool success = true;
    if( dbConfigFile.is_open())
    {
        if( !dbConfigFile.eof())
            getline( dbConfigFile, DBHOST);
        else
            success = false;
        if( !dbConfigFile.eof())
            getline( dbConfigFile, USER);
        else
            success = false;
        if( !dbConfigFile.eof())
            getline( dbConfigFile, PASSWORD);
        else
            success = false;
        if( !dbConfigFile.eof())
            getline( dbConfigFile, DATABASE);
        else
            success = false;
        dbConfigFile.close();
    } else
        success = false;

    if( !success)
    {
        AfxMessageBox( "Das Programm wird beendet.\n"
                "Stellen Sie sicher, dass die Datei "
                "db_config.txt vorhanden und \n"
                "korrekt konfiguriert ist.\n"
                "Starten Sie das Programm anschließend neu.", MB_OK, 0);
        exit( 1);
    }

    /*
     DBHOST = "tcp://160.45.41.29:3306";
     USER = "sokobio";
     PASSWORD = "wee6Jees";
     DATABASE = "sokobio_leipzig";
     */

    try
    {
        Driver *driver;
        //Connection *connect;
        driver = get_driver_instance();

        /* create a database connection using the Driver */
        con = driver->connect( DBHOST, USER, PASSWORD);
        con->setSchema( DATABASE);
        //con = connect;

    } catch( sql::SQLException &e)
    {
        int code = e.getErrorCode();
        string error = e.what();
        char er[ 1000];
        lstrcpy( er, error.c_str());
        AfxMessageBox( er, MB_OK, 0);
        AfxMessageBox( "Das Programm wird beendet.\n"
                "Stellen Sie sicher, dass die Datei "
                "db_config.txt vorhanden und \n"
                "korrekt konfiguriert ist.\n"
                "Starten Sie das Programm anschließend neu.", MB_OK, 0);
        exit( 1);
    }
}

datenbank::~datenbank( void)
{
    con->close();
    delete con;
}
Connection* datenbank::datacon( void)
{
    /* initiate url, user, password and database variables */
    /*HOCHLAND_FILTER = 1;
     WALD_FILTER = 2;
     ENTWAESSERT_FILTER = 3;
     SIELDUNG_FILTER = 4;
     GRUENLANDZAHL_FILTER = 5;
     KOSTEN_FILTER = 6;
     QUALITAET_FILTER = 7;
     ART_FILTER =8;
     
     // Position der Legende:
     XLegende = 500;
     YLegende = 450;
     XLegende2 = 650;
     YLegende2 = 450;*/

    try
    {
        Driver *driver;
        Connection *con;
        driver = get_driver_instance();

        /* create a database connection using the Driver */
        con = driver->connect( DBHOST, USER, PASSWORD);

        return con;

    } catch( sql::SQLException &e)
    {
        int code = e.getErrorCode();
        string error = e.what();
        char er[ 1000];
        lstrcpy( er, error.c_str());
        AfxMessageBox( er, MB_OK, 0);
        AfxMessageBox( "Das Programm wird beendet.\n"
                "Stellen Sie sicher, dass die Datei "
                "db_config.txt vorhanden und \n"
                "korrekt konfiguriert ist.\n"
                "Starten Sie das Programm anschließend neu.", MB_OK, 0);
        exit( 1);
    }
}

int datenbank::insertdata( string table, string column, string value)
{
    try
    {
        //Driver *driver;
        //Connection *con;
        Statement *stmt;
        ResultSet *res;
        //driver = get_driver_instance();

        /* create a database connection using the Driver */
        //con = driver -> connect(DBHOST, USER, PASSWORD);
        //return con;
        //con->setSchema(DATABASE);
        stmt = con->createStatement();
        char name[ 1000];
        lstrcpy( name, value.c_str());
        AfxMessageBox( name, MB_YESNO, 0);
        stringstream querystring;
        string insertstring;
        //we need to build the right SQL expression as a string:
        //"INSERT INTO table_name (column_name) VALUES ('value')"
        querystring << "INSERT INTO " << table << " (" << column << ") "
                << "VALUES " << "(" << value << ")";

        insertstring = querystring.str();
        int updatecount = stmt->executeUpdate( insertstring);

        //get the ID of the last inserted databse entry, so it can be used
        //for combined entries
        res = stmt->executeQuery( "SELECT LAST_INSERT_ID()");
        res->next();
        int id = res->getInt( 1);

        delete res;
        delete stmt;
        //delete con;
        //der letzte ID wird zurückgegeben
        return id;

    } catch( sql::SQLException &e)
    {
        int code = e.getErrorCode();
        string error = e.what();
        char er[ 1000];
        lstrcpy( er, error.c_str());
        AfxMessageBox( er, MB_OK, 0);
        AfxMessageBox( "Das Programm wird beendet.\n"
                "Stellen Sie sicher, dass die "
                "Datenbankverbindung verfügbar ist \n"
                "und starten Sie das Programm erneut.", MB_OK, 0);
        exit( 1);

    }
}

//Delete can only get rid of whole data set from a table, not just 
//columns of one data set, to change entrys in columns use "UPDATE"
int datenbank::deletedata( string table, string column, string value)
{
    try
    {
        //Driver *driver;
        //Connection *con;
        Statement *stmt;
        //ResultSet *res;
        //driver = get_driver_instance();

        /* create a database connection using the Driver */
        //con = driver -> connect(DBHOST, USER, PASSWORD);
        //return con;
        //con->setSchema(DATABASE);
        stmt = con->createStatement();
        char name[ 1000];
        lstrcpy( name, value.c_str());
        AfxMessageBox( name, MB_YESNO, 0);

        stringstream querystring;
        string insertstring;
        //we need to build the right SQL expression as a string:
        //"DELETE FROM table_name WHERE column_name='value')"
        querystring << "DELETE FROM " << table << " WHERE " << column << "= "
                << value;

        insertstring = querystring.str();
        int updatecount = stmt->executeUpdate( insertstring);

        //  delete res;
        delete stmt;
        //delete con;
        return updatecount;

    } catch( sql::SQLException &e)
    {
        int code = e.getErrorCode();
        string error = e.what();
        char er[ 1000];
        lstrcpy( er, error.c_str());
        AfxMessageBox( er, MB_OK, 0);
        AfxMessageBox( "Das Programm wird beendet.\n"
                "Stellen Sie sicher, dass die "
                "Datenbankverbindung verfügbar ist \n"
                "und starten Sie das Programm erneut.", MB_OK, 0);

        exit( 1);
    }
}

int datenbank::deleteart( string name, string savetime)
{
    try
    {
        //Driver *driver;
        //Connection *con;
        Statement *stmt;
        ResultSet *res;
        //driver = get_driver_instance();

        /* create a database connection using the Driver */
        //con = driver -> connect(DBHOST, USER, PASSWORD);
        //return con;
        //con->setSchema(DATABASE);
        stmt = con->createStatement();
        int ID = -1;
        int updatecount;

        stringstream querystring;
        string insertstring;
        querystring << "SELECT * FROM art WHERE name = " << "'" << name
                << "' AND savetime = " << "'" << savetime << "'";

        insertstring = querystring.str();
        res = stmt->executeQuery( insertstring);
        while( res->next())
        {
            ID = res->getInt( "artID");
        }

        //Löschen der Art falls sie gefunden wurde!!!
        if( ID != -1)
        {
            querystring.str( "");
            querystring.clear();
            querystring << "DELETE FROM art WHERE artID = " << ID;
            //Löschen der Monatsviertel
            insertstring = querystring.str();
            updatecount = stmt->executeUpdate( insertstring);
            querystring.str( "");
            querystring.clear();
            querystring << "DELETE FROM monatsviertel WHERE artID = " << ID;
            // Löschen des gazughörigen Grünlandeintrages
            insertstring = querystring.str();
            updatecount = stmt->executeUpdate( insertstring);
            querystring.str( "");
            querystring.clear();
            querystring << "DELETE FROM gruenland_pro_art WHERE artID = " << ID;

            insertstring = querystring.str();
            updatecount = stmt->executeUpdate( insertstring);
        }

        delete res;
        delete stmt;
        //delete con;
        return updatecount;

    } catch( sql::SQLException &e)
    {
        int code = e.getErrorCode();
        string error = e.what();
        char er[ 1000];
        lstrcpy( er, error.c_str());
        AfxMessageBox( er, MB_OK, 0);
        AfxMessageBox( "Das Programm wird beendet.\n"
                "Stellen Sie sicher, dass die "
                "Datenbankverbindung verfügbar ist \n"
                "und starten Sie das Programm erneut.", MB_OK, 0);
        exit( 1);
    }
}

list< CString> datenbank::returndata(
        string table,
        string column1,
        string column,
        string value)
{
    try
    {
        //Driver *driver;
        //Connection *con;
        Statement *stmt;
        ResultSet *res;
        //driver = get_driver_instance();

        /* create a database connection using the Driver */
        //con = driver -> connect(DBHOST, USER, PASSWORD);
        //return con;
        //con->setSchema(DATABASE);
        stmt = con->createStatement();
        //char name[1000];
        //char benutzer[1000];
        char eintrag[ 1000];
        list < CString > strlist;
        /*lstrcpy(name, value.c_str());
         AfxMessageBox(name,MB_YESNO,0);*/

        stringstream querystring;
        string insertstring;
        //we need to build the right SQL expression as a string:
        //"SELECT  column_name FROM table_name WHERE some_column = 'value'"
        //querystring << "SELECT " << column1 << " FROM " << table << " WHERE "
        //        << column << " = " << "'" << value << "'";
        querystring << "SELECT * FROM " << table << " WHERE " << column << " = "
                << "'" << value << "'";

        insertstring = querystring.str();
        res = stmt->executeQuery( insertstring);
        while( res->next())
        {
            string latein = res->getString( "name_latein");
            string name = res->getString( "name");
            //lstrcpy(name, result.c_str());
            string benutzer = res->getString( "name_benutzer");
            //lstrcpy(benutzer, result.c_str());
            string savetime = res->getString( "savetime");
            //lstrcpy(savetime, result.c_str());
            stringstream returnstring;
            returnstring << latein << "/" << name << ", " << savetime << ", "
                    << benutzer;

            string result = returnstring.str();
            lstrcpy( eintrag, result.c_str());
            strlist.push_back( eintrag);
        }
        /*
         res->next();
         result = res->getString(2);
         lstrcpy(benutzer, result.c_str());
         strlist.push_back(benutzer);

         res->next();
         result = res->getString(3);
         lstrcpy(savetime, result.c_str());
         strlist.push_back(savetime);*/

        delete res;
        delete stmt;
        //delete con;
        return strlist;

    } catch( sql::SQLException &e)
    {
        int code = e.getErrorCode();
        string error = e.what();
        char er[ 1000];
        lstrcpy( er, error.c_str());
        AfxMessageBox( er, MB_OK, 0);
        AfxMessageBox( "Das Programm wird beendet.\n"
                "Stellen Sie sicher, dass die "
                "Datenbankverbindung verfügbar ist \n"
                "und starten Sie das Programm erneut.", MB_OK, 0);

        exit( 1);
    }
}

int datenbank::saveart( art& newart)
{
    try
    {
        //Driver *driver;
        //Connection *con;
        Statement *stmt;
        ResultSet *res;
        //driver = get_driver_instance();

        /* create a database connection using the Driver */
        //con = driver -> connect(DBHOST, USER, PASSWORD);
        //return con;
        //con->setSchema(DATABASE);
        stmt = con->createStatement();

        LPCTSTR tabelle = "art";
        int id;

        //der STring für die Zeilen wird erstellt
        LPCTSTR zeilen =
                "gruppe, name, name_latein, lebensraumnr, anspruch_wasser, "
                "anspruch_siedlung, anspruch_wald, monatsviertel_ersatzbrut, "
                "ersatzbrut_erfolg, reproduktion_kritisch, reproduktion_total, "
                "reproduktion_total2, hoehe_kurz, hoehe_mittel, hoehe_hoch, "
                "feuchte_trocken, feuchte_frisch, feuchte_feucht, "
                "ausbreitungsradius, trittmortalitaettyp, zweitegeneration, "
                "zweitegeneration_ende, name_benutzer, praedation";

        // der String für die Werte wird erstellt
        stringstream querystring;
        //we need to build the right SQL expression as a string:
        //"INSERT INTO table_name (column_name) VALUES ('stringvalue', numbervalue)"
        querystring << "'" << newart._gruppe << "', '" << newart.m_name
                << "', '" << newart.m_name_latein << "', '"
                << newart.Lebensraumnr << "', " << newart._anspruch_wasser
                << ", " << newart._anspruch_siedlung << ", "
                << newart._anspruch_wald << ", "
                << newart._monatsviertel_ersatzbrut << ", "
                << newart._ersatzbrut_erfolg << ", "
                << newart._reproduktion_kritisch << ", "
                << newart._reproduktion_gesammt << ", "
                << newart._reproduktion_gesammt2 << ", " << newart._hoehe_kurz
                << ", " << newart._hoehe_mittel << ", " << newart._hoehe_hoch
                << ", " << newart._feuchte_trocken << ", "
                << newart._feuchte_frisch << ", " << newart._feuchte_feucht
                << ", " << newart._ausbreitungsradius << ", "
                << newart._trittmortalitaettyp << ", "
                << newart._zweitegeneration << ", "
                << newart._zweitegeneration_ende << ", '" << newart.person_name
                << "', " << newart.praedation;

        string eintraege = querystring.str();

        querystring.str( "");
        querystring.clear();

        querystring << "INSERT INTO " << tabelle << " (" << zeilen << ") "
                << "VALUES " << "(" << eintraege << ")";
        string insertstring;
        insertstring = querystring.str();
        int updatecount = stmt->executeUpdate( insertstring);
        if( updatecount != 0)
        {
            res = stmt->executeQuery( "SELECT LAST_INSERT_ID()");
            //get the ID of the last inserted databse entry, so it can be used 
            //for combined entries
            res->next();
            id = res->getInt( 1);

            if( newart._gruppe != "Lebensraum")
            {

                //build the string to save the Eiablagewahrscheinlichkeit in 
                //the table monatsviertel
                tabelle = "monatsviertel";

                zeilen =
                        "artID, MV1, MV2, MV3, MV4, MV5, MV6, MV7, MV8, MV9, "
                        "MV10, MV11, MV12, MV13, MV14, MV15, MV16, MV17, MV18, "
                        "MV19, MV20, MV21, MV22, MV23, MV24, MV25, MV26, MV27, "
                        "MV28, MV29, MV30, MV31, MV32, MV33, MV34, MV35, MV36, "
                        "MV37, MV38, MV39, MV40, MV41, MV42, MV43, MV44, MV45, "
                        "MV46, MV47, MV48";

                querystring.str( "");
                querystring.clear();

                querystring << id << ", " << newart._monatsviertel1 << ", "
                        << newart._monatsviertel2 << ", "
                        << newart._monatsviertel3 << ", "
                        << newart._monatsviertel4 << ", "
                        << newart._monatsviertel5 << ", "
                        << newart._monatsviertel6 << ", "
                        << newart._monatsviertel7 << ", "
                        << newart._monatsviertel8 << ", "
                        << newart._monatsviertel9 << ", "
                        << newart._monatsviertel10 << ", "
                        << newart._monatsviertel11 << ", "
                        << newart._monatsviertel12 << ", "
                        << newart._monatsviertel13 << ", "
                        << newart._monatsviertel14 << ", "
                        << newart._monatsviertel15 << ", "
                        << newart._monatsviertel16 << ", "
                        << newart._monatsviertel17 << ", "
                        << newart._monatsviertel18 << ", "
                        << newart._monatsviertel19 << ", "
                        << newart._monatsviertel20 << ", "
                        << newart._monatsviertel21 << ", "
                        << newart._monatsviertel22 << ", "
                        << newart._monatsviertel23 << ", "
                        << newart._monatsviertel24 << ", "
                        << newart._monatsviertel25 << ", "
                        << newart._monatsviertel26 << ", "
                        << newart._monatsviertel27 << ", "
                        << newart._monatsviertel28 << ", "
                        << newart._monatsviertel29 << ", "
                        << newart._monatsviertel30 << ", "
                        << newart._monatsviertel31 << ", "
                        << newart._monatsviertel32 << ", "
                        << newart._monatsviertel33 << ", "
                        << newart._monatsviertel34 << ", "
                        << newart._monatsviertel35 << ", "
                        << newart._monatsviertel36 << ", "
                        << newart._monatsviertel37 << ", "
                        << newart._monatsviertel38 << ", "
                        << newart._monatsviertel39 << ", "
                        << newart._monatsviertel40 << ", "
                        << newart._monatsviertel41 << ", "
                        << newart._monatsviertel42 << ", "
                        << newart._monatsviertel43 << ", "
                        << newart._monatsviertel44 << ", "
                        << newart._monatsviertel45 << ", "
                        << newart._monatsviertel46 << ", "
                        << newart._monatsviertel47 << ", "
                        << newart._monatsviertel48;

                string eintraege = querystring.str();

                querystring.str( "");
                querystring.clear();

                querystring << "INSERT INTO " << tabelle << " (" << zeilen
                        << ") " << "VALUES " << "(" << eintraege << ")";

                insertstring = querystring.str();
                int updatecount = stmt->executeUpdate( insertstring);
            }
            if( newart._gruppe == "Schmetterling")
                save_gruenland_for_art( newart.gruenlandID, id);
        }
        delete res;
        delete stmt;

        return id;

    } catch( sql::SQLException &e)
    {
        int code = e.getErrorCode();
        string error = e.what();
        char er[ 1000];
        lstrcpy( er, error.c_str());
        AfxMessageBox( er, MB_OK, 0);
        AfxMessageBox( "Das Programm wird beendet.\n"
                "Stellen Sie sicher, dass die "
                "Datenbankverbindung verfügbar ist \n"
                "und starten Sie das Programm erneut.", MB_OK, 0);

        exit( 1);
    }
}

//returning the data of art from the database, choosen by name and savetime
art datenbank::returnart(
        string table,
        string column1,
        string column2,
        string value1,
        string value2)
{
    try
    {
        //Driver *driver;
        //Connection *con;
        Statement *stmt;
        ResultSet *res;
        //driver = get_driver_instance();

        /* create a database connection using the Driver */
        //con = driver -> connect(DBHOST, USER, PASSWORD);
        //return con;
        //con->setSchema(DATABASE);
        stmt = con->createStatement();
        int IDnr;

        char eintrag[ 1000];
        CString nreintrag;
        list < CString > strlist;
        art* d_art;
        d_art = new art();

        stringstream querystring;
        string insertstring;
        //we need to build the right SQL expression as a string:
        //"SELECT  column_name FROM table_name WHERE some_column = 'value'"
        querystring << "SELECT " << "*" << " FROM " << table << " WHERE "
                << column1 << " = " << "'" << value1 << "'" << " AND "
                << column2 << " = " << "'" << value2 << "'";

        insertstring = querystring.str();
        res = stmt->executeQuery( insertstring);
        /* these are the columns of art in the database: 

         artID int(11)
         gruppe text 
         name longtext 
         name_latein longtext 
         lebensraumnr longtext 
         anspruch_wasser double
         anspruch_siedlung double 
         anspruch_wald double 
         monatsviertel_ersatzbrut int(11)
         ersatzbrut_erfolg double Yes 
         reproduktion_kritisch int(11) 
         reproduktion_gesammt int(11)
         reproduktion_gesammt2 int(11)
         mobilitaetsradius double 
         hoehe_kurz double 
         hoehe_mittel double
         hoehe_hoch double 
         feuchte_trocken double 
         feuchte_frisch double 
         feuchte_feucht double 
         
         
         besatzdichte double 
         zweitegeneration 	int(11)
         name_benutzer longtext 
         savetime							*/

        while( res->next())
        {
            IDnr = res->getInt( "artID");
            d_art->set_artID( IDnr);

            //nreintrag.Format(_T("%d"),idnr);
            //strlist.push_back(nreintrag);
            string data = res->getString( "gruppe");
            lstrcpy( eintrag, data.c_str());
            //AfxMessageBox("ich bin hier!",MB_YESNO,0);
            //AfxMessageBox(eintrag,MB_YESNO,0);
            d_art->set_gruppe( eintrag);
            data = res->getString( "name");
            lstrcpy( eintrag, data.c_str());
            d_art->set_m_name( eintrag);
            data = res->getString( "name_latein");
            lstrcpy( eintrag, data.c_str());
            d_art->set_m_name_latein( eintrag);
            int intnr = res->getInt( "lebensraumnr");
            d_art->set_Lebensraumnr( intnr);
            double nr = res->getDouble( "anspruch_wasser");
            d_art->set_anspruch_wasser( nr);
            nr = res->getDouble( "anspruch_siedlung");
            d_art->set_anspruch_siedlung( nr);
            nr = res->getDouble( "anspruch_wald");
            d_art->set_anspruch_wald( nr);
            intnr = res->getInt( "monatsviertel_ersatzbrut");
            d_art->set_monatsviertel_ersatzbrut( intnr);

            nr = res->getDouble( "ersatzbrut_erfolg");
            d_art->set_ersatzbrut_erfolg( nr);
            intnr = res->getInt( "reproduktion_kritisch");
            //er.Format(_T("%d"),intnr);
            //AfxMessageBox(er,MB_OK,0);
            d_art->set_reproduktion_kritisch( intnr);
            intnr = res->getInt( "reproduktion_total");
            d_art->set_reproduktion_gesammt( intnr);
            intnr = res->getInt( "reproduktion_total2");
            d_art->set_reproduktion_gesammt2( intnr);
            nr = res->getDouble( "hoehe_kurz");
            d_art->set_hoehe_kurz( nr);
            nr = res->getDouble( "hoehe_mittel");
            d_art->set_hoehe_mittel( nr);
            nr = res->getDouble( "hoehe_hoch");
            d_art->set_hoehe_hoch( nr);
            nr = res->getDouble( "feuchte_trocken");
            d_art->set_feuchte_trocken( nr);
            nr = res->getDouble( "feuchte_frisch");
            d_art->set_feuchte_frisch( nr);
            nr = res->getDouble( "feuchte_feucht");
            d_art->set_feuchte_feucht( nr);

            nr = res->getDouble( "ausbreitungsradius");
            d_art->set_ausbreitungsradius( nr);
            intnr = res->getInt( "trittmortalitaettyp");
            d_art->set_trittmortalitaettyp( intnr);
            //bool b;
            intnr = res->getInt( "zweitegeneration");
            d_art->set_zweitegeneration( intnr);
            intnr = res->getInt( "zweitegeneration_ende");
            d_art->set_zweitegeneration_ende( intnr);
            d_art->praedation = res->getDouble( "praedation");
            data = res->getString( "name_benutzer");
            lstrcpy( eintrag, data.c_str());
            d_art->set_person_name( eintrag);
            d_art->savet = res->getString( "savetime");
        }
        
        //get also the "Eiablagewahrscheinlichkeit pro Monatsviertel"
        //we need to build the right SQL expression as a string:
        //"SELECT  column_name FROM table_name WHERE some_column = 'value'"
        if( d_art->_gruppe != "Lebensraum")
        {
            querystring.str( "");
            querystring.clear();
            querystring << "SELECT * FROM monatsviertel WHERE  artID = "
                    << IDnr;
            insertstring = querystring.str();
            res = stmt->executeQuery( insertstring);
            while( res->next())
            {
                bool start = false;
                bool end = false;
                double nr = res->getDouble( "MV1");
                d_art->set_monatsviertel1( nr);
                if( nr != 0 && !start)
                    start = true;
                else
                {
                    if( start && nr == 0 && !end)
                    {
                        end = true;
                        d_art->last_egg_dep = 1;
                    }
                }

                nr = res->getDouble( "MV2");
                d_art->set_monatsviertel2( nr);
                if( nr != 0 && !start)
                    start = true;
                else
                {
                    if( start && nr == 0 && !end)
                    {
                        end = true;
                        d_art->last_egg_dep = 2;
                    }
                }
                nr = res->getDouble( "MV3");
                d_art->set_monatsviertel3( nr);
                if( nr != 0 && !start)
                    start = true;
                else
                {
                    if( start && nr == 0 && !end)
                    {
                        end = true;
                        d_art->last_egg_dep = 3;
                    }
                }
                nr = res->getDouble( "MV4");
                d_art->set_monatsviertel4( nr);
                if( nr != 0 && !start)
                    start = true;
                else
                {
                    if( start && nr == 0 && !end)
                    {
                        end = true;
                        d_art->last_egg_dep = 4;
                    }
                }
                nr = res->getDouble( "MV5");
                d_art->set_monatsviertel5( nr);
                if( nr != 0 && !start)
                    start = true;
                else
                {
                    if( start && nr == 0 && !end)
                    {
                        end = true;
                        d_art->last_egg_dep = 5;
                    }
                }
                nr = res->getDouble( "MV6");
                d_art->set_monatsviertel6( nr);
                if( nr != 0 && !start)
                    start = true;
                else
                {
                    if( start && nr == 0 && !end)
                    {
                        end = true;
                        d_art->last_egg_dep = 6;
                    }
                }
                nr = res->getDouble( "MV7");
                d_art->set_monatsviertel7( nr);
                if( nr != 0 && !start)
                    start = true;
                else
                {
                    if( start && nr == 0 && !end)
                    {
                        end = true;
                        d_art->last_egg_dep = 7;
                    }
                }
                nr = res->getDouble( "MV8");
                d_art->set_monatsviertel8( nr);
                if( nr != 0 && !start)
                    start = true;
                else
                {
                    if( start && nr == 0 && !end)
                    {
                        end = true;
                        d_art->last_egg_dep = 8;
                    }
                }
                nr = res->getDouble( "MV9");
                d_art->set_monatsviertel9( nr);
                if( nr != 0 && !start)
                    start = true;
                else
                {
                    if( start && nr == 0 && !end)
                    {
                        end = true;
                        d_art->last_egg_dep = 9;
                    }
                }
                nr = res->getDouble( "MV10");
                d_art->set_monatsviertel10( nr);
                if( nr != 0 && !start)
                    start = true;
                else
                {
                    if( start && nr == 0 && !end)
                    {
                        end = true;
                        d_art->last_egg_dep = 10;
                    }
                }
                nr = res->getDouble( "MV11");
                d_art->set_monatsviertel11( nr);
                if( nr != 0 && !start)
                    start = true;
                else
                {
                    if( start && nr == 0 && !end)
                    {
                        end = true;
                        d_art->last_egg_dep = 11;
                    }
                }
                nr = res->getDouble( "MV12");
                d_art->set_monatsviertel12( nr);
                if( nr != 0 && !start)
                    start = true;
                else
                {
                    if( start && nr == 0 && !end)
                    {
                        end = true;
                        d_art->last_egg_dep = 12;
                    }
                }
                nr = res->getDouble( "MV13");
                d_art->set_monatsviertel13( nr);
                if( nr != 0 && !start)
                    start = true;
                else
                {
                    if( start && nr == 0 && !end)
                    {
                        end = true;
                        d_art->last_egg_dep = 13;
                    }
                }
                nr = res->getDouble( "MV14");
                d_art->set_monatsviertel14( nr);
                if( nr != 0 && !start)
                    start = true;
                else
                {
                    if( start && nr == 0 && !end)
                    {
                        end = true;
                        d_art->last_egg_dep = 14;
                    }
                }
                nr = res->getDouble( "MV15");
                d_art->set_monatsviertel15( nr);
                if( nr != 0 && !start)
                    start = true;
                else
                {
                    if( start && nr == 0 && !end)
                    {
                        end = true;
                        d_art->last_egg_dep = 15;
                    }
                }
                nr = res->getDouble( "MV16");
                d_art->set_monatsviertel16( nr);
                if( nr != 0 && !start)
                    start = true;
                else
                {
                    if( start && nr == 0 && !end)
                    {
                        end = true;
                        d_art->last_egg_dep = 16;
                    }
                }
                nr = res->getDouble( "MV17");
                d_art->set_monatsviertel17( nr);
                if( nr != 0 && !start)
                    start = true;
                else
                {
                    if( start && nr == 0 && !end)
                    {
                        end = true;
                        d_art->last_egg_dep = 17;
                    }
                }
                nr = res->getDouble( "MV18");
                d_art->set_monatsviertel18( nr);
                if( nr != 0 && !start)
                    start = true;
                else
                {
                    if( start && nr == 0 && !end)
                    {
                        end = true;
                        d_art->last_egg_dep = 18;
                    }
                }
                nr = res->getDouble( "MV19");
                d_art->set_monatsviertel19( nr);
                if( nr != 0 && !start)
                    start = true;
                else
                {
                    if( start && nr == 0 && !end)
                    {
                        end = true;
                        d_art->last_egg_dep = 19;
                    }
                }
                nr = res->getDouble( "MV20");
                d_art->set_monatsviertel20( nr);
                if( nr != 0 && !start)
                    start = true;
                else
                {
                    if( start && nr == 0 && !end)
                    {
                        end = true;
                        d_art->last_egg_dep = 20;
                    }
                }
                nr = res->getDouble( "MV21");
                d_art->set_monatsviertel21( nr);
                if( nr != 0 && !start)
                    start = true;
                else
                {
                    if( start && nr == 0 && !end)
                    {
                        end = true;
                        d_art->last_egg_dep = 21;
                    }
                }
                nr = res->getDouble( "MV22");
                d_art->set_monatsviertel22( nr);
                if( nr != 0 && !start)
                    start = true;
                else
                {
                    if( start && nr == 0 && !end)
                    {
                        end = true;
                        d_art->last_egg_dep = 22;
                    }
                }
                nr = res->getDouble( "MV23");
                d_art->set_monatsviertel23( nr);
                if( nr != 0 && !start)
                    start = true;
                else
                {
                    if( start && nr == 0 && !end)
                    {
                        end = true;
                        d_art->last_egg_dep = 23;
                    }
                }
                nr = res->getDouble( "MV24");
                d_art->set_monatsviertel24( nr);
                if( nr != 0 && !start)
                    start = true;
                else
                {
                    if( start && nr == 0 && !end)
                    {
                        end = true;
                        d_art->last_egg_dep = 24;
                    }
                }
                nr = res->getDouble( "MV25");
                d_art->set_monatsviertel25( nr);
                if( nr != 0 && !start)
                    start = true;
                else
                {
                    if( start && nr == 0 && !end)
                    {
                        end = true;
                        d_art->last_egg_dep = 25;
                    }
                }
                nr = res->getDouble( "MV26");
                d_art->set_monatsviertel26( nr);
                if( nr != 0 && !start)
                    start = true;
                else
                {
                    if( start && nr == 0 && !end)
                    {
                        end = true;
                        d_art->last_egg_dep = 26;
                    }
                }
                nr = res->getDouble( "MV27");
                d_art->set_monatsviertel27( nr);
                if( nr != 0 && !start)
                    start = true;
                else
                {
                    if( start && nr == 0 && !end)
                    {
                        end = true;
                        d_art->last_egg_dep = 27;
                    }
                }
                nr = res->getDouble( "MV28");
                d_art->set_monatsviertel28( nr);
                if( nr != 0 && !start)
                    start = true;
                else
                {
                    if( start && nr == 0 && !end)
                    {
                        end = true;
                        d_art->last_egg_dep = 28;
                    }
                }
                nr = res->getDouble( "MV29");
                d_art->set_monatsviertel29( nr);
                if( nr != 0 && !start)
                    start = true;
                else
                {
                    if( start && nr == 0 && !end)
                    {
                        end = true;
                        d_art->last_egg_dep = 29;
                    }
                }
                nr = res->getDouble( "MV30");
                d_art->set_monatsviertel30( nr);
                if( nr != 0 && !start)
                    start = true;
                else
                {
                    if( start && nr == 0 && !end)
                    {
                        end = true;
                        d_art->last_egg_dep = 30;
                    }
                }
                nr = res->getDouble( "MV31");
                d_art->set_monatsviertel31( nr);
                if( nr != 0 && !start)
                    start = true;
                else
                {
                    if( start && nr == 0 && !end)
                    {
                        end = true;
                        d_art->last_egg_dep = 31;
                    }
                }
                nr = res->getDouble( "MV32");
                d_art->set_monatsviertel32( nr);
                if( nr != 0 && !start)
                    start = true;
                else
                {
                    if( start && nr == 0 && !end)
                    {
                        end = true;
                        d_art->last_egg_dep = 32;
                    }
                }
                nr = res->getDouble( "MV33");
                d_art->set_monatsviertel33( nr);
                if( nr != 0 && !start)
                    start = true;
                else
                {
                    if( start && nr == 0 && !end)
                    {
                        end = true;
                        d_art->last_egg_dep = 33;
                    }
                }
                nr = res->getDouble( "MV34");
                d_art->set_monatsviertel34( nr);
                if( nr != 0 && !start)
                    start = true;
                else
                {
                    if( start && nr == 0 && !end)
                    {
                        end = true;
                        d_art->last_egg_dep = 34;
                    }
                }
                nr = res->getDouble( "MV35");
                d_art->set_monatsviertel35( nr);
                if( nr != 0 && !start)
                    start = true;
                else
                {
                    if( start && nr == 0 && !end)
                    {
                        end = true;
                        d_art->last_egg_dep = 35;
                    }
                }
                nr = res->getDouble( "MV36");
                d_art->set_monatsviertel36( nr);
                if( nr != 0 && !start)
                    start = true;
                else
                {
                    if( start && nr == 0 && !end)
                    {
                        end = true;
                        d_art->last_egg_dep = 36;
                    }
                }
                nr = res->getDouble( "MV37");
                d_art->set_monatsviertel37( nr);
                if( nr != 0 && !start)
                    start = true;
                else
                {
                    if( start && nr == 0 && !end)
                    {
                        end = true;
                        d_art->last_egg_dep = 37;
                    }
                }
                nr = res->getDouble( "MV38");
                d_art->set_monatsviertel38( nr);
                if( nr != 0 && !start)
                    start = true;
                else
                {
                    if( start && nr == 0 && !end)
                    {
                        end = true;
                        d_art->last_egg_dep = 38;
                    }
                }
                nr = res->getDouble( "MV39");
                d_art->set_monatsviertel39( nr);
                if( nr != 0 && !start)
                    start = true;
                else
                {
                    if( start && nr == 0 && !end)
                    {
                        end = true;
                        d_art->last_egg_dep = 39;
                    }
                }
                nr = res->getDouble( "MV40");
                d_art->set_monatsviertel40( nr);
                if( nr != 0 && !start)
                    start = true;
                else
                {
                    if( start && nr == 0 && !end)
                    {
                        end = true;
                        d_art->last_egg_dep = 40;
                    }
                }
                nr = res->getDouble( "MV41");
                d_art->set_monatsviertel41( nr);
                if( nr != 0 && !start)
                    start = true;
                else
                {
                    if( start && nr == 0 && !end)
                    {
                        end = true;
                        d_art->last_egg_dep = 41;
                    }
                }
                nr = res->getDouble( "MV42");
                d_art->set_monatsviertel42( nr);
                if( nr != 0 && !start)
                    start = true;
                else
                {
                    if( start && nr == 0 && !end)
                    {
                        end = true;
                        d_art->last_egg_dep = 42;
                    }
                }
                nr = res->getDouble( "MV43");
                d_art->set_monatsviertel43( nr);
                if( nr != 0 && !start)
                    start = true;
                else
                {
                    if( start && nr == 0 && !end)
                    {
                        end = true;
                        d_art->last_egg_dep = 43;
                    }
                }
                nr = res->getDouble( "MV44");
                d_art->set_monatsviertel44( nr);
                if( nr != 0 && !start)
                    start = true;
                else
                {
                    if( start && nr == 0 && !end)
                    {
                        end = true;
                        d_art->last_egg_dep = 44;
                    }
                }
                nr = res->getDouble( "MV45");
                d_art->set_monatsviertel45( nr);
                if( nr != 0 && !start)
                    start = true;
                else
                {
                    if( start && nr == 0 && !end)
                    {
                        end = true;
                        d_art->last_egg_dep = 45;
                    }
                }
                nr = res->getDouble( "MV46");
                d_art->set_monatsviertel46( nr);
                if( nr != 0 && !start)
                    start = true;
                else
                {
                    if( start && nr == 0 && !end)
                    {
                        end = true;
                        d_art->last_egg_dep = 46;
                    }
                }
                nr = res->getDouble( "MV47");
                d_art->set_monatsviertel47( nr);
                if( nr != 0 && !start)
                    start = true;
                else
                {
                    if( start && nr == 0 && !end)
                    {
                        end = true;
                        d_art->last_egg_dep = 47;
                    }
                }
                nr = res->getDouble( "MV48");
                d_art->set_monatsviertel48( nr);
                if( nr != 0 && !start)
                    start = true;
                else
                {
                    if( start && nr == 0 && !end)
                    {
                        end = true;
                        d_art->last_egg_dep = 48;
                    }
                }

            }
        }
        if( d_art->_gruppe == "Schmetterling")
        {
            vector< gruenland>::iterator it;
            get_gruenland_for_art( d_art->gruen, d_art->_artID);
            if( d_art->gruen.size() > 0)
            {
                for( it = d_art->gruen.begin(); it != d_art->gruen.end(); it++)
                {
                    d_art->gruenlandID.push_back( (*it).gruenlandID);
                }
            }
        }

        delete res;
        delete stmt;
        //delete con;
        return *(d_art);

    } catch( sql::SQLException &e)
    {
        int code = e.getErrorCode();
        string error = e.what();
        char er[ 1000];
        lstrcpy( er, error.c_str());
        AfxMessageBox( er, MB_OK, 0);
        AfxMessageBox( "Das Programm wird beendet.\n"
                "Stellen Sie sicher, dass die "
                "Datenbankverbindung verfügbar ist \n"
                "und starten Sie das Programm erneut.", MB_OK, 0);

        exit( 1);
    }
}

vector< art*> datenbank::returnartliste(
        string table,
        string column1,
        string value1)
{
    vector< art*> artliste;
    try
    {
        //Driver *driver;
        //Connection *con;
        Statement *stmt;
        ResultSet *res;
        ResultSet *res2;
        //driver = get_driver_instance();

        /* create a database connection using the Driver */
        //con = driver -> connect(DBHOST, USER, PASSWORD);
        //return con;
        //con->setSchema(DATABASE);
        stmt = con->createStatement();
        int idnr;

        char eintrag[ 1000];
        CString nreintrag;
        list < CString > strlist;

        stringstream querystring;
        string insertstring;
        //we need to build the right SQL expression as a string:
        //"SELECT  column_name FROM table_name WHERE some_column = 'value'"
        querystring << "SELECT " << "*" << " FROM " << table << " WHERE "
                << column1 << " = " << "'" << value1 << "'";

        insertstring = querystring.str();
        res = stmt->executeQuery( insertstring);

        while( res->next())
        {
            art* d_art;
            d_art = new art();

            idnr = res->getInt( "artID");

            //nreintrag.Format(_T("%d"),idnr);
            //strlist.push_back(nreintrag);
            string data = res->getString( "gruppe");
            lstrcpy( eintrag, data.c_str());
            //AfxMessageBox("ich bin hier!",MB_YESNO,0);
            //AfxMessageBox(eintrag,MB_YESNO,0);
            d_art->set_gruppe( eintrag);
            data = res->getString( "name");
            lstrcpy( eintrag, data.c_str());
            d_art->set_m_name( eintrag);
            data = res->getString( "name_latein");
            lstrcpy( eintrag, data.c_str());
            d_art->set_m_name_latein( eintrag);
            int intnr = res->getInt( "lebensraumnr");
            d_art->set_Lebensraumnr( intnr);
            double nr = res->getDouble( "anspruch_wasser");
            d_art->set_anspruch_wasser( nr);
            nr = res->getDouble( "anspruch_siedlung");
            d_art->set_anspruch_siedlung( nr);
            nr = res->getDouble( "anspruch_wald");
            d_art->set_anspruch_wald( nr);
            intnr = res->getInt( "monatsviertel_ersatzbrut");
            d_art->set_monatsviertel_ersatzbrut( intnr);
            intnr = res->getInt( "artID");
            d_art->set_artID( intnr);
            nr = res->getDouble( "ersatzbrut_erfolg");
            d_art->set_ersatzbrut_erfolg( nr);
            intnr = res->getInt( "reproduktion_kritisch");
            //er.Format(_T("%d"),intnr);
            //AfxMessageBox(er,MB_OK,0);
            d_art->set_reproduktion_kritisch( intnr);
            intnr = res->getInt( "reproduktion_total");
            d_art->set_reproduktion_gesammt( intnr);
            intnr = res->getInt( "reproduktion_total2");
            d_art->set_reproduktion_gesammt2( intnr);
            nr = res->getDouble( "hoehe_kurz");
            d_art->set_hoehe_kurz( nr);
            nr = res->getDouble( "hoehe_mittel");
            d_art->set_hoehe_mittel( nr);
            nr = res->getDouble( "hoehe_hoch");
            d_art->set_hoehe_hoch( nr);
            nr = res->getDouble( "feuchte_trocken");
            d_art->set_feuchte_trocken( nr);
            nr = res->getDouble( "feuchte_frisch");
            d_art->set_feuchte_frisch( nr);
            nr = res->getDouble( "feuchte_feucht");
            d_art->set_feuchte_feucht( nr);
            nr = res->getDouble( "ausbreitungsradius");
            d_art->set_ausbreitungsradius( nr);
            intnr = res->getInt( "trittmortalitaettyp");
            d_art->set_trittmortalitaettyp( intnr);

            intnr = res->getInt( "zweitegeneration");
            d_art->set_zweitegeneration( intnr);
            intnr = res->getInt( "zweitegeneration_ende");
            d_art->set_zweitegeneration_ende( intnr);
            d_art->praedation = res->getDouble( "praedation");
            data = res->getString( "name_benutzer");
            lstrcpy( eintrag, data.c_str());
            d_art->set_person_name( eintrag);
            d_art->savet = res->getString( "savetime");

            if( d_art->_gruppe != "Lebensraum")
            {
                querystring.str( "");
                querystring.clear();
                querystring << "SELECT * FROM monatsviertel WHERE  artID = "
                        << idnr;
                insertstring = querystring.str();
                res2 = stmt->executeQuery( insertstring);

                while( res2->next())
                {
                    bool start = false;
                    bool end = false;
                    double nr = res2->getDouble( "MV1");
                    d_art->set_monatsviertel1( nr);
                    if( nr != 0 && !start)
                        start = true;
                    else
                    {
                        if( start && nr == 0 && !end)
                        {
                            end = true;
                            d_art->last_egg_dep = 1;
                        }
                    }

                    nr = res2->getDouble( "MV2");
                    d_art->set_monatsviertel2( nr);
                    if( nr != 0 && !start)
                        start = true;
                    else
                    {
                        if( start && nr == 0 && !end)
                        {
                            end = true;
                            d_art->last_egg_dep = 2;
                        }
                    }
                    nr = res2->getDouble( "MV3");
                    d_art->set_monatsviertel3( nr);
                    if( nr != 0 && !start)
                        start = true;
                    else
                    {
                        if( start && nr == 0 && !end)
                        {
                            end = true;
                            d_art->last_egg_dep = 3;
                        }
                    }
                    nr = res2->getDouble( "MV4");
                    d_art->set_monatsviertel4( nr);
                    if( nr != 0 && !start)
                        start = true;
                    else
                    {
                        if( start && nr == 0 && !end)
                        {
                            end = true;
                            d_art->last_egg_dep = 4;
                        }
                    }
                    nr = res2->getDouble( "MV5");
                    d_art->set_monatsviertel5( nr);
                    if( nr != 0 && !start)
                        start = true;
                    else
                    {
                        if( start && nr == 0 && !end)
                        {
                            end = true;
                            d_art->last_egg_dep = 5;
                        }
                    }
                    nr = res2->getDouble( "MV6");
                    d_art->set_monatsviertel6( nr);
                    if( nr != 0 && !start)
                        start = true;
                    else
                    {
                        if( start && nr == 0 && !end)
                        {
                            end = true;
                            d_art->last_egg_dep = 6;
                        }
                    }
                    nr = res2->getDouble( "MV7");
                    d_art->set_monatsviertel7( nr);
                    if( nr != 0 && !start)
                        start = true;
                    else
                    {
                        if( start && nr == 0 && !end)
                        {
                            end = true;
                            d_art->last_egg_dep = 7;
                        }
                    }
                    nr = res2->getDouble( "MV8");
                    d_art->set_monatsviertel8( nr);
                    if( nr != 0 && !start)
                        start = true;
                    else
                    {
                        if( start && nr == 0 && !end)
                        {
                            end = true;
                            d_art->last_egg_dep = 8;
                        }
                    }
                    nr = res2->getDouble( "MV9");
                    d_art->set_monatsviertel9( nr);
                    if( nr != 0 && !start)
                        start = true;
                    else
                    {
                        if( start && nr == 0 && !end)
                        {
                            end = true;
                            d_art->last_egg_dep = 9;
                        }
                    }
                    nr = res2->getDouble( "MV10");
                    d_art->set_monatsviertel10( nr);
                    if( nr != 0 && !start)
                        start = true;
                    else
                    {
                        if( start && nr == 0 && !end)
                        {
                            end = true;
                            d_art->last_egg_dep = 10;
                        }
                    }
                    nr = res2->getDouble( "MV11");
                    d_art->set_monatsviertel11( nr);
                    if( nr != 0 && !start)
                        start = true;
                    else
                    {
                        if( start && nr == 0 && !end)
                        {
                            end = true;
                            d_art->last_egg_dep = 11;
                        }
                    }
                    nr = res2->getDouble( "MV12");
                    d_art->set_monatsviertel12( nr);
                    if( nr != 0 && !start)
                        start = true;
                    else
                    {
                        if( start && nr == 0 && !end)
                        {
                            end = true;
                            d_art->last_egg_dep = 12;
                        }
                    }
                    nr = res2->getDouble( "MV13");
                    d_art->set_monatsviertel13( nr);
                    if( nr != 0 && !start)
                        start = true;
                    else
                    {
                        if( start && nr == 0 && !end)
                        {
                            end = true;
                            d_art->last_egg_dep = 13;
                        }
                    }
                    nr = res2->getDouble( "MV14");
                    d_art->set_monatsviertel14( nr);
                    if( nr != 0 && !start)
                        start = true;
                    else
                    {
                        if( start && nr == 0 && !end)
                        {
                            end = true;
                            d_art->last_egg_dep = 14;
                        }
                    }
                    nr = res2->getDouble( "MV15");
                    d_art->set_monatsviertel15( nr);
                    if( nr != 0 && !start)
                        start = true;
                    else
                    {
                        if( start && nr == 0 && !end)
                        {
                            end = true;
                            d_art->last_egg_dep = 15;
                        }
                    }
                    nr = res2->getDouble( "MV16");
                    d_art->set_monatsviertel16( nr);
                    if( nr != 0 && !start)
                        start = true;
                    else
                    {
                        if( start && nr == 0 && !end)
                        {
                            end = true;
                            d_art->last_egg_dep = 16;
                        }
                    }
                    nr = res2->getDouble( "MV17");
                    d_art->set_monatsviertel17( nr);
                    if( nr != 0 && !start)
                        start = true;
                    else
                    {
                        if( start && nr == 0 && !end)
                        {
                            end = true;
                            d_art->last_egg_dep = 17;
                        }
                    }
                    nr = res2->getDouble( "MV18");
                    d_art->set_monatsviertel18( nr);
                    if( nr != 0 && !start)
                        start = true;
                    else
                    {
                        if( start && nr == 0 && !end)
                        {
                            end = true;
                            d_art->last_egg_dep = 18;
                        }
                    }
                    nr = res2->getDouble( "MV19");
                    d_art->set_monatsviertel19( nr);
                    if( nr != 0 && !start)
                        start = true;
                    else
                    {
                        if( start && nr == 0 && !end)
                        {
                            end = true;
                            d_art->last_egg_dep = 19;
                        }
                    }
                    nr = res2->getDouble( "MV20");
                    d_art->set_monatsviertel20( nr);
                    if( nr != 0 && !start)
                        start = true;
                    else
                    {
                        if( start && nr == 0 && !end)
                        {
                            end = true;
                            d_art->last_egg_dep = 20;
                        }
                    }
                    nr = res2->getDouble( "MV21");
                    d_art->set_monatsviertel21( nr);
                    if( nr != 0 && !start)
                        start = true;
                    else
                    {
                        if( start && nr == 0 && !end)
                        {
                            end = true;
                            d_art->last_egg_dep = 21;
                        }
                    }
                    nr = res2->getDouble( "MV22");
                    d_art->set_monatsviertel22( nr);
                    if( nr != 0 && !start)
                        start = true;
                    else
                    {
                        if( start && nr == 0 && !end)
                        {
                            end = true;
                            d_art->last_egg_dep = 22;
                        }
                    }
                    nr = res2->getDouble( "MV23");
                    d_art->set_monatsviertel23( nr);
                    if( nr != 0 && !start)
                        start = true;
                    else
                    {
                        if( start && nr == 0 && !end)
                        {
                            end = true;
                            d_art->last_egg_dep = 23;
                        }
                    }
                    nr = res2->getDouble( "MV24");
                    d_art->set_monatsviertel24( nr);
                    if( nr != 0 && !start)
                        start = true;
                    else
                    {
                        if( start && nr == 0 && !end)
                        {
                            end = true;
                            d_art->last_egg_dep = 24;
                        }
                    }
                    nr = res2->getDouble( "MV25");
                    d_art->set_monatsviertel25( nr);
                    if( nr != 0 && !start)
                        start = true;
                    else
                    {
                        if( start && nr == 0 && !end)
                        {
                            end = true;
                            d_art->last_egg_dep = 25;
                        }
                    }
                    nr = res2->getDouble( "MV26");
                    d_art->set_monatsviertel26( nr);
                    if( nr != 0 && !start)
                        start = true;
                    else
                    {
                        if( start && nr == 0 && !end)
                        {
                            end = true;
                            d_art->last_egg_dep = 26;
                        }
                    }
                    nr = res2->getDouble( "MV27");
                    d_art->set_monatsviertel27( nr);
                    if( nr != 0 && !start)
                        start = true;
                    else
                    {
                        if( start && nr == 0 && !end)
                        {
                            end = true;
                            d_art->last_egg_dep = 27;
                        }
                    }
                    nr = res2->getDouble( "MV28");
                    d_art->set_monatsviertel28( nr);
                    if( nr != 0 && !start)
                        start = true;
                    else
                    {
                        if( start && nr == 0 && !end)
                        {
                            end = true;
                            d_art->last_egg_dep = 28;
                        }
                    }
                    nr = res2->getDouble( "MV29");
                    d_art->set_monatsviertel29( nr);
                    if( nr != 0 && !start)
                        start = true;
                    else
                    {
                        if( start && nr == 0 && !end)
                        {
                            end = true;
                            d_art->last_egg_dep = 29;
                        }
                    }
                    nr = res2->getDouble( "MV30");
                    d_art->set_monatsviertel30( nr);
                    if( nr != 0 && !start)
                        start = true;
                    else
                    {
                        if( start && nr == 0 && !end)
                        {
                            end = true;
                            d_art->last_egg_dep = 30;
                        }
                    }
                    nr = res2->getDouble( "MV31");
                    d_art->set_monatsviertel31( nr);
                    if( nr != 0 && !start)
                        start = true;
                    else
                    {
                        if( start && nr == 0 && !end)
                        {
                            end = true;
                            d_art->last_egg_dep = 31;
                        }
                    }
                    nr = res2->getDouble( "MV32");
                    d_art->set_monatsviertel32( nr);
                    if( nr != 0 && !start)
                        start = true;
                    else
                    {
                        if( start && nr == 0 && !end)
                        {
                            end = true;
                            d_art->last_egg_dep = 32;
                        }
                    }
                    nr = res2->getDouble( "MV33");
                    d_art->set_monatsviertel33( nr);
                    if( nr != 0 && !start)
                        start = true;
                    else
                    {
                        if( start && nr == 0 && !end)
                        {
                            end = true;
                            d_art->last_egg_dep = 33;
                        }
                    }
                    nr = res2->getDouble( "MV34");
                    d_art->set_monatsviertel34( nr);
                    if( nr != 0 && !start)
                        start = true;
                    else
                    {
                        if( start && nr == 0 && !end)
                        {
                            end = true;
                            d_art->last_egg_dep = 34;
                        }
                    }
                    nr = res2->getDouble( "MV35");
                    d_art->set_monatsviertel35( nr);
                    if( nr != 0 && !start)
                        start = true;
                    else
                    {
                        if( start && nr == 0 && !end)
                        {
                            end = true;
                            d_art->last_egg_dep = 35;
                        }
                    }
                    nr = res2->getDouble( "MV36");
                    d_art->set_monatsviertel36( nr);
                    if( nr != 0 && !start)
                        start = true;
                    else
                    {
                        if( start && nr == 0 && !end)
                        {
                            end = true;
                            d_art->last_egg_dep = 36;
                        }
                    }
                    nr = res2->getDouble( "MV37");
                    d_art->set_monatsviertel37( nr);
                    if( nr != 0 && !start)
                        start = true;
                    else
                    {
                        if( start && nr == 0 && !end)
                        {
                            end = true;
                            d_art->last_egg_dep = 37;
                        }
                    }
                    nr = res2->getDouble( "MV38");
                    d_art->set_monatsviertel38( nr);
                    if( nr != 0 && !start)
                        start = true;
                    else
                    {
                        if( start && nr == 0 && !end)
                        {
                            end = true;
                            d_art->last_egg_dep = 38;
                        }
                    }
                    nr = res2->getDouble( "MV39");
                    d_art->set_monatsviertel39( nr);
                    if( nr != 0 && !start)
                        start = true;
                    else
                    {
                        if( start && nr == 0 && !end)
                        {
                            end = true;
                            d_art->last_egg_dep = 39;
                        }
                    }
                    nr = res2->getDouble( "MV40");
                    d_art->set_monatsviertel40( nr);
                    if( nr != 0 && !start)
                        start = true;
                    else
                    {
                        if( start && nr == 0 && !end)
                        {
                            end = true;
                            d_art->last_egg_dep = 40;
                        }
                    }
                    nr = res2->getDouble( "MV41");
                    d_art->set_monatsviertel41( nr);
                    if( nr != 0 && !start)
                        start = true;
                    else
                    {
                        if( start && nr == 0 && !end)
                        {
                            end = true;
                            d_art->last_egg_dep = 41;
                        }
                    }
                    nr = res2->getDouble( "MV42");
                    d_art->set_monatsviertel42( nr);
                    if( nr != 0 && !start)
                        start = true;
                    else
                    {
                        if( start && nr == 0 && !end)
                        {
                            end = true;
                            d_art->last_egg_dep = 42;
                        }
                    }
                    nr = res2->getDouble( "MV43");
                    d_art->set_monatsviertel43( nr);
                    if( nr != 0 && !start)
                        start = true;
                    else
                    {
                        if( start && nr == 0 && !end)
                        {
                            end = true;
                            d_art->last_egg_dep = 43;
                        }
                    }
                    nr = res2->getDouble( "MV44");
                    d_art->set_monatsviertel44( nr);
                    if( nr != 0 && !start)
                        start = true;
                    else
                    {
                        if( start && nr == 0 && !end)
                        {
                            end = true;
                            d_art->last_egg_dep = 44;
                        }
                    }
                    nr = res2->getDouble( "MV45");
                    d_art->set_monatsviertel45( nr);
                    if( nr != 0 && !start)
                        start = true;
                    else
                    {
                        if( start && nr == 0 && !end)
                        {
                            end = true;
                            d_art->last_egg_dep = 45;
                        }
                    }
                    nr = res2->getDouble( "MV46");
                    d_art->set_monatsviertel46( nr);
                    if( nr != 0 && !start)
                        start = true;
                    else
                    {
                        if( start && nr == 0 && !end)
                        {
                            end = true;
                            d_art->last_egg_dep = 46;
                        }
                    }
                    nr = res2->getDouble( "MV47");
                    d_art->set_monatsviertel47( nr);
                    if( nr != 0 && !start)
                        start = true;
                    else
                    {
                        if( start && nr == 0 && !end)
                        {
                            end = true;
                            d_art->last_egg_dep = 47;
                        }
                    }
                    nr = res2->getDouble( "MV48");
                    d_art->set_monatsviertel48( nr);
                    if( nr != 0 && !start)
                        start = true;
                    else
                    {
                        if( start && nr == 0 && !end)
                        {
                            end = true;
                            d_art->last_egg_dep = 48;
                        }
                    }
                }
            }
            if( d_art->_gruppe == "Schmetterling")
            {
                vector< gruenland>::iterator it;
                get_gruenland_for_art( d_art->gruen, d_art->_artID);
                if( d_art->gruen.size() > 0)
                {
                    for( it = d_art->gruen.begin(); it != d_art->gruen.end();
                            it++)
                    {
                        d_art->gruenlandID.push_back( (*it).gruenlandID);
                    }
                }
            }
            artliste.push_back( d_art);

        }
        //get also the "Eiablagewahrscheinlichkeit pro Monatsviertel"
        //we need to build the right SQL expression as a string:
        //"SELECT  column_name FROM table_name WHERE some_column = 'value'"

        delete res;
        delete res2;
        delete stmt;
        //delete con;
        return artliste;

    } catch( sql::SQLException &e)
    {
        int code = e.getErrorCode();
        string error = e.what();
        char er[ 1000];
        lstrcpy( er, error.c_str());
        AfxMessageBox( er, MB_OK, 0);
        AfxMessageBox( "Das Programm wird beendet.\n"
                "Stellen Sie sicher, dass die "
                "Datenbankverbindung verfügbar ist \n"
                "und starten Sie das Programm erneut.", MB_OK, 0);

        exit( 1);
    }
}

void datenbank::returnvariablekosten(
        int verfahren_nr,
        vector< variablekosten>& varkosten)
{
    try
    {
        //Driver *driver;
        //Connection *con;
        Statement *stmt;
        ResultSet *res;

        //driver = get_driver_instance();

        /* create a database connection using the Driver */
        //con = driver -> connect(DBHOST, USER, PASSWORD);
        //return con;
        //con->setSchema(DATABASE);
        stmt = con->createStatement();
        int idnr;

        char eintrag[ 1000];
        CString nreintrag;
        list < CString > strlist;
        //variablekosten* prod_kosten1,prod_kosten2,prod_kosten3,prod_kosten4;
        variablekosten prod_kosten1;//1= new variablekosten();
        variablekosten prod_kosten2;// = new variablekosten();
        variablekosten prod_kosten3;// = new variablekosten();
		variablekosten prod_kosten4;// = new variablekosten();

        CString er;

        stringstream querystring;
        string insertstring;
        //we need to build the right SQL expression as a string:
        //"SELECT  column_name FROM table_name WHERE some_column = 'value'"
        //querystring << "SELECT " << "*" << " FROM " << table << " WHERE "
        //        << column1 << " = " << "'" << value1 << "'" << " AND "
        //        << column2 << " = " << "'" << value2 << "'";
        //get the ID of the verfahren, from 
        //the table: verfahren_mit_leistungsgruppe
        querystring << "SELECT " << "*"
                << " FROM verfahren_mit_leistungsgruppe WHERE verfahren_nr = "
                << "'" << verfahren_nr << "'";
        insertstring = querystring.str();
        res = stmt->executeQuery( insertstring);
        double anteil;

        while( res->next())
        {
            idnr = res->getInt( "verfahrenID");
            int leistungsgruppe = res->getInt( "leistungsgruppe");

            ResultSet *res3;
            ResultSet *res2;
            //er.Format(_T("%d"),idnr);
            // AfxMessageBox(er,MB_OK,0);
            switch( leistungsgruppe)
            {
                case 1:
                    querystring.str( "");
                    querystring.clear();
                    querystring
                            << "SELECT * FROM variable_kosten WHERE  verfahrenID = "
                            << idnr;
                    insertstring = querystring.str();
                    //ResultSet *res3;
                    res3 = stmt->executeQuery( insertstring);
                    while( res3->next())
                    {
                        prod_kosten1.nutzungsjahre = res3->getInt(
                                "nutzungsjahre");
                        prod_kosten1.saatstaerke = res3->getDouble(
                                "saatstaerke");
                        prod_kosten1.saatgutpreis = res3->getDouble(
                                "saatgutpreis");
                        prod_kosten1.saatgutkosten = res3->getDouble(
                                "saatgutkosten");
                        prod_kosten1.anzahl_herbizid = res3->getDouble(
                                "anzahl_herbizid");
                        prod_kosten1.preis_pro_herbizid = res3->getDouble(
                                "preis_pro_herbizid");
                        prod_kosten1.pflanzenschutzkosten = res3->getDouble(
                                "pflanzenschutzkosten");
                        prod_kosten1.duengeraufwand_N = res3->getDouble(
                                "duengeraufwand_N");
                        prod_kosten1.leguminosenanteil = res3->getDouble(
                                "leguminosenanteil");
                        prod_kosten1.duengeraufwand_P = res3->getDouble(
                                "duengeraufwand_P");
                        prod_kosten1.duengeraufwand_K = res3->getDouble(
                                "duengeraufwand_K");
                        prod_kosten1.duengerN = res3->getDouble(
                                "duengerN_Euro/kg");
                        prod_kosten1.duengerP = res3->getDouble(
                                "duengerP_Euro/kg");
                        prod_kosten1.duengerK = res3->getDouble(
                                "duengerK_Euro/kg");
                        prod_kosten1.duegungskosten = res3->getDouble(
                                "duegungskosten");
                        prod_kosten1.hagelversicherung = res3->getDouble(
                                "hagelversicherung");
                        prod_kosten1.hangneigung = res3->getDouble(
                                "hangneigung");
                        prod_kosten1.lohnarbeit = res3->getDouble(
                                "lohnarbeit");
                        prod_kosten1.maschinenmiete = res3->getDouble(
                                "maschinenmiete");
                        prod_kosten1.anteil_siliermittel = res3->getDouble(
                                "anteil_siliermittel");
                        prod_kosten1.sielierkosten = res3->getDouble(
                                "sielierkosten");
                        prod_kosten1.weidekosten = res3->getDouble(
                                "weidekosten");
                        prod_kosten1.arbeits_lohn = res3->getDouble(
                                "Personalkosten_je_Akh");
                    }

                    /*	 er.Format(_T("%.2f"),(prod_kosten1.saatgutkosten));
                     AfxMessageBox(er,MB_OK,0);
                     AfxMessageBox("case1",MB_YESNO,0);*/

                    querystring.str( "");
                    querystring.clear();
                    querystring << "SELECT " << "*"
                            << " FROM maschinen_pro_verfahren WHERE verfahrenID = "
                            << idnr;
                    insertstring = querystring.str();
                    //ResultSet *res2;
                    res2 = stmt->executeQuery( insertstring);
                    prod_kosten1.stunden = 0;
                    prod_kosten1.diesel = 0;
                    prod_kosten1.unterhalt = 0;
                    prod_kosten1.sonstige = 0;

                    while( res2->next())
                    {
                        idnr = res2->getInt( "maschinenID");
                        anteil = res2->getDouble( "anteil");

                        querystring.str( "");
                        querystring.clear();
                        querystring
                                << "SELECT * FROM maschinenkosten WHERE  maschinenID = "
                                << idnr;
                        insertstring = querystring.str();
                        ResultSet *res4;
                        res4 = stmt->executeQuery( insertstring);

                        while( res4->next())
                        {
                            prod_kosten1.stunden = prod_kosten1.stunden
                                    + (res4->getDouble( "stunden_akh/ha")
                                            * anteil);

                            prod_kosten1.diesel = prod_kosten1.diesel
                                    + ((res4->getDouble( "diesel_eur/ha"))
                                            * anteil);

                            prod_kosten1.unterhalt = prod_kosten1.unterhalt
                                    + (res4->getDouble( "unterhalt_eur/ha")
                                            * anteil);
                            prod_kosten1.sonstige = prod_kosten1.sonstige
                                    + (res4->getDouble( "sonstige_eur/ha")
                                            * anteil);
                        }
                        delete res4;

                    }
                    delete res2;
                    delete res3;
                    break;
                case 2:
                    querystring.str( "");
                    querystring.clear();
                    querystring
                            << "SELECT * FROM variable_kosten WHERE  verfahrenID = "
                            << idnr;
                    insertstring = querystring.str();
                    //ResultSet *res3;
                    res3 = stmt->executeQuery( insertstring);
                    while( res3->next())
                    {
                        prod_kosten2.nutzungsjahre = res3->getInt(
                                "nutzungsjahre");
                        prod_kosten2.saatstaerke = res3->getDouble(
                                "saatstaerke");
                        prod_kosten2.saatgutpreis = res3->getDouble(
                                "saatgutpreis");
                        prod_kosten2.saatgutkosten = res3->getDouble(
                                "saatgutkosten");
                        prod_kosten2.anzahl_herbizid = res3->getDouble(
                                "anzahl_herbizid");
                        prod_kosten2.preis_pro_herbizid = res3->getDouble(
                                "preis_pro_herbizid");
                        prod_kosten2.pflanzenschutzkosten = res3->getDouble(
                                "pflanzenschutzkosten");
                        prod_kosten2.duengeraufwand_N = res3->getDouble(
                                "duengeraufwand_N");
                        prod_kosten2.leguminosenanteil = res3->getDouble(
                                "leguminosenanteil");
                        prod_kosten2.duengeraufwand_P = res3->getDouble(
                                "duengeraufwand_P");
                        prod_kosten2.duengeraufwand_K = res3->getDouble(
                                "duengeraufwand_K");
                        prod_kosten2.duengerN = res3->getDouble(
                                "duengerN_Euro/kg");
                        prod_kosten2.duengerP = res3->getDouble(
                                "duengerP_Euro/kg");
                        prod_kosten2.duengerK = res3->getDouble(
                                "duengerK_Euro/kg");
                        prod_kosten2.duegungskosten = res3->getDouble(
                                "duegungskosten");
                        prod_kosten2.hagelversicherung = res3->getDouble(
                                "hagelversicherung");
                        prod_kosten2.hangneigung = res3->getDouble(
                                "hangneigung");
                        prod_kosten2.lohnarbeit = res3->getDouble(
                                "lohnarbeit");
                        prod_kosten2.maschinenmiete = res3->getDouble(
                                "maschinenmiete");
                        prod_kosten2.anteil_siliermittel = res3->getDouble(
                                "anteil_siliermittel");
                        prod_kosten2.sielierkosten = res3->getDouble(
                                "sielierkosten");
                        prod_kosten2.weidekosten = res3->getDouble(
                                "weidekosten");
                        prod_kosten2.arbeits_lohn = res3->getDouble(
                                "Personalkosten_je_Akh");
                    }

                    /* er.Format(_T("%.2f"),(prod_kosten2.saatgutkosten));
                     AfxMessageBox(er,MB_OK,0);
                     AfxMessageBox("case2",MB_YESNO,0);*/

                    querystring.str( "");
                    querystring.clear();
                    querystring << "SELECT " << "*"
                            << " FROM maschinen_pro_verfahren WHERE verfahrenID = "
                            << idnr;
                    insertstring = querystring.str();
                    //ResultSet *res2;
                    res2 = stmt->executeQuery( insertstring);
                    prod_kosten2.stunden = 0;
                    prod_kosten2.diesel = 0;
                    prod_kosten2.unterhalt = 0;
                    prod_kosten2.sonstige = 0;

                    while( res2->next())
                    {
                        idnr = res2->getInt( "maschinenID");
                        anteil = res2->getDouble( "anteil");
                        querystring.str( "");
                        querystring.clear();
                        querystring
                                << "SELECT * FROM maschinenkosten WHERE  maschinenID = "
                                << idnr;
                        insertstring = querystring.str();
                        ResultSet *res4;
                        res4 = stmt->executeQuery( insertstring);

                        while( res4->next())
                        {
                            prod_kosten2.stunden = prod_kosten2.stunden
                                    + (res4->getDouble( "stunden_akh/ha")
                                            * anteil);
                            prod_kosten2.diesel = prod_kosten2.diesel
                                    + (res4->getDouble( "diesel_eur/ha")
                                            * anteil);
                            prod_kosten2.unterhalt = prod_kosten2.unterhalt
                                    + (res4->getDouble( "unterhalt_eur/ha")
                                            * anteil);
                            prod_kosten2.sonstige = prod_kosten2.sonstige
                                    + (res4->getDouble( "sonstige_eur/ha")
                                            * anteil);
                        }
                        delete res4;
                    }
                    delete res2;
                    delete res3;
                    break;
                case 3:
                    querystring.str( "");
                    querystring.clear();
                    querystring
                            << "SELECT * FROM variable_kosten WHERE  verfahrenID = "
                            << idnr;
                    insertstring = querystring.str();
                    //ResultSet *res3;
                    res3 = stmt->executeQuery( insertstring);
                    while( res3->next())
                    {
                        prod_kosten3.nutzungsjahre = res3->getInt(
                                "nutzungsjahre");
                        prod_kosten3.saatstaerke = res3->getDouble(
                                "saatstaerke");
                        prod_kosten3.saatgutpreis = res3->getDouble(
                                "saatgutpreis");
                        prod_kosten3.saatgutkosten = res3->getDouble(
                                "saatgutkosten");
                        prod_kosten3.anzahl_herbizid = res3->getDouble(
                                "anzahl_herbizid");
                        prod_kosten3.preis_pro_herbizid = res3->getDouble(
                                "preis_pro_herbizid");
                        prod_kosten3.pflanzenschutzkosten = res3->getDouble(
                                "pflanzenschutzkosten");
                        prod_kosten3.duengeraufwand_N = res3->getDouble(
                                "duengeraufwand_N");
                        prod_kosten3.leguminosenanteil = res3->getDouble(
                                "leguminosenanteil");
                        prod_kosten3.duengeraufwand_P = res3->getDouble(
                                "duengeraufwand_P");
                        prod_kosten3.duengeraufwand_K = res3->getDouble(
                                "duengeraufwand_K");
                        prod_kosten3.duengerN = res3->getDouble(
                                "duengerN_Euro/kg");
                        prod_kosten3.duengerP = res3->getDouble(
                                "duengerP_Euro/kg");
                        prod_kosten3.duengerK = res3->getDouble(
                                "duengerK_Euro/kg");
                        prod_kosten3.duegungskosten = res3->getDouble(
                                "duegungskosten");
                        prod_kosten3.hagelversicherung = res3->getDouble(
                                "hagelversicherung");
                        prod_kosten3.hangneigung = res3->getDouble(
                                "hangneigung");
                        prod_kosten3.lohnarbeit = res3->getDouble(
                                "lohnarbeit");
                        prod_kosten3.maschinenmiete = res3->getDouble(
                                "maschinenmiete");
                        prod_kosten3.anteil_siliermittel = res3->getDouble(
                                "anteil_siliermittel");
                        prod_kosten3.sielierkosten = res3->getDouble(
                                "sielierkosten");
                        prod_kosten3.weidekosten = res3->getDouble(
                                "weidekosten");
                        prod_kosten3.arbeits_lohn = res3->getDouble(
                                "Personalkosten_je_Akh");
                    }

                    /*  er.Format(_T("%.2f"),(prod_kosten3.saatgutkosten));
                     AfxMessageBox(er,MB_OK,0);
                     AfxMessageBox("case3",MB_YESNO,0);*/

                    querystring.str( "");
                    querystring.clear();
                    querystring << "SELECT " << "*"
                            << " FROM maschinen_pro_verfahren WHERE verfahrenID = "
                            << idnr;
                    insertstring = querystring.str();
                    //ResultSet *res2;
                    res2 = stmt->executeQuery( insertstring);
                    prod_kosten3.stunden = 0;
                    prod_kosten3.diesel = 0;
                    prod_kosten3.unterhalt = 0;
                    prod_kosten3.sonstige = 0;

                    while( res2->next())
                    {
                        idnr = res2->getInt( "maschinenID");
                        anteil = res2->getDouble( "anteil");
                        querystring.str( "");
                        querystring.clear();
                        querystring
                                << "SELECT * FROM maschinenkosten WHERE  maschinenID = "
                                << idnr;
                        insertstring = querystring.str();
                        ResultSet *res4;
                        res4 = stmt->executeQuery( insertstring);

                        while( res4->next())
                        {
                            prod_kosten3.stunden = prod_kosten3.stunden
                                    + (res4->getDouble( "stunden_akh/ha")
                                            * anteil);
                            prod_kosten3.diesel = prod_kosten3.diesel
                                    + (res4->getDouble( "diesel_eur/ha")
                                            * anteil);
                            prod_kosten3.unterhalt = prod_kosten3.unterhalt
                                    + (res4->getDouble( "unterhalt_eur/ha")
                                            * anteil);
                            prod_kosten3.sonstige = prod_kosten3.sonstige
                                    + (res4->getDouble( "sonstige_eur/ha")
                                            * anteil);
                        }
                        delete res4;
                    }
                    delete res2;
                    delete res3;
                    break;
                case 4:
                    querystring.str( "");
                    querystring.clear();
                    querystring
                            << "SELECT * FROM variable_kosten WHERE  verfahrenID = "
                            << idnr;
                    insertstring = querystring.str();
                    //ResultSet *res3;
                    res3 = stmt->executeQuery( insertstring);
                    while( res3->next())
                    {
                        prod_kosten4.nutzungsjahre = res3->getInt(
                                "nutzungsjahre");
                        prod_kosten4.saatstaerke = res3->getDouble(
                                "saatstaerke");
                        prod_kosten4.saatgutpreis = res3->getDouble(
                                "saatgutpreis");
                        prod_kosten4.saatgutkosten = res3->getDouble(
                                "saatgutkosten");
                        prod_kosten4.anzahl_herbizid = res3->getDouble(
                                "anzahl_herbizid");
                        prod_kosten4.preis_pro_herbizid = res3->getDouble(
                                "preis_pro_herbizid");
                        prod_kosten4.pflanzenschutzkosten = res3->getDouble(
                                "pflanzenschutzkosten");
                        prod_kosten4.duengeraufwand_N = res3->getDouble(
                                "duengeraufwand_N");
                        prod_kosten4.leguminosenanteil = res3->getDouble(
                                "leguminosenanteil");
                        prod_kosten4.duengeraufwand_P = res3->getDouble(
                                "duengeraufwand_P");
                        prod_kosten4.duengeraufwand_K = res3->getDouble(
                                "duengeraufwand_K");
                        prod_kosten4.duengerN = res3->getDouble(
                                "duengerN_Euro/kg");
                        prod_kosten4.duengerP = res3->getDouble(
                                "duengerP_Euro/kg");
                        prod_kosten4.duengerK = res3->getDouble(
                                "duengerK_Euro/kg");
                        prod_kosten4.duegungskosten = res3->getDouble(
                                "duegungskosten");
                        prod_kosten4.hagelversicherung = res3->getDouble(
                                "hagelversicherung");
                        prod_kosten4.hangneigung = res3->getDouble(
                                "hangneigung");
                        prod_kosten4.lohnarbeit = res3->getDouble(
                                "lohnarbeit");
                        prod_kosten4.maschinenmiete = res3->getDouble(
                                "maschinenmiete");
                        prod_kosten4.anteil_siliermittel = res3->getDouble(
                                "anteil_siliermittel");
                        prod_kosten4.sielierkosten = res3->getDouble(
                                "sielierkosten");
                        prod_kosten4.weidekosten = res3->getDouble(
                                "weidekosten");
                        prod_kosten4.arbeits_lohn = res3->getDouble(
                                "Personalkosten_je_Akh");
                    }

                    /* er.Format(_T("%.2f"),(prod_kosten4.saatgutkosten));
                     AfxMessageBox(er,MB_OK,0);
                     AfxMessageBox("case4",MB_YESNO,0);*/

                    querystring.str( "");
                    querystring.clear();
                    querystring << "SELECT " << "*"
                            << " FROM maschinen_pro_verfahren WHERE verfahrenID = "
                            << idnr;
                    insertstring = querystring.str();
                    //ResultSet *res2;
                    res2 = stmt->executeQuery( insertstring);
                    prod_kosten4.stunden = 0;
                    prod_kosten4.diesel = 0;
                    prod_kosten4.unterhalt = 0;
                    prod_kosten4.sonstige = 0;

                    while( res2->next())
                    {
                        idnr = res2->getInt( "maschinenID");
                        anteil = res2->getDouble( "anteil");
                        querystring.str( "");
                        querystring.clear();
                        querystring
                                << "SELECT * FROM maschinenkosten WHERE  maschinenID = "
                                << idnr;
                        insertstring = querystring.str();
                        ResultSet *res4;
                        res4 = stmt->executeQuery( insertstring);

                        while( res4->next())
                        {
                            prod_kosten4.stunden = prod_kosten4.stunden
                                    + (res4->getDouble( "stunden_akh/ha")
                                            * anteil);
                            prod_kosten4.diesel = prod_kosten4.diesel
                                    + (res4->getDouble( "diesel_eur/ha")
                                            * anteil);
                            prod_kosten4.unterhalt = prod_kosten4.unterhalt
                                    + (res4->getDouble( "unterhalt_eur/ha")
                                            * anteil);
                            prod_kosten4.sonstige = prod_kosten4.sonstige
                                    + (res4->getDouble( "sonstige_eur/ha")
                                            * anteil);
                        }
                        delete res4;
                    }
                    delete res2;
                    delete res3;
                    break;
                default:
                    break;
            }
        }

        delete res;
        delete stmt;
        //delete con;
        //vector<variablekosten>* varkosten = new vector<variablekosten>;
        varkosten.push_back( prod_kosten1);
        varkosten.push_back( prod_kosten2);
        varkosten.push_back( prod_kosten3);
        varkosten.push_back( prod_kosten4);

    } catch( sql::SQLException &e)
    {
        int code = e.getErrorCode();
        string error = e.what();
        char er[ 1000];
        lstrcpy( er, error.c_str());
        AfxMessageBox( er, MB_OK, 0);
        AfxMessageBox( "Das Programm wird beendet.\n"
                "Stellen Sie sicher, dass die "
                "Datenbankverbindung verfügbar ist \n"
                "und starten Sie das Programm erneut.", MB_OK, 0);

        exit( 1);
    }
}

verfahren_ertrag datenbank::returnverfahrenkosten( int verfahren_nr)
{
    try
    {
        //Driver *driver;
        //Connection *con;
        Statement *stmt;
        ResultSet *res;

        //driver = get_driver_instance();

        /* create a database connection using the Driver */
        //con = driver -> connect(DBHOST, USER, PASSWORD);
        //return con;
        //con->setSchema(DATABASE);
        stmt = con->createStatement();
        int idnr;

        verfahren_ertrag prod_kosten;
        //prod_kosten = new verfahren_ertrag();

        CString er;

        stringstream querystring;
        string insertstring;
        //we need to build the right SQL expression as a string:
        //"SELECT  column_name FROM table_name WHERE some_column = 'value'"
        //querystring << "SELECT " << "*" << " FROM " << table << " WHERE "
        //        << column1 << " = " << "'" << value1 << "'" << " AND "
        //        << column2 << " = " << "'" << value2 << "'";
        //get the ID of the verfahren, from 
        //the table: verfahren_mit_leistungsgruppe
        querystring << "SELECT " << "*"
                << " FROM verfahren WHERE verfahren_nr = " << verfahren_nr;
        insertstring = querystring.str();
        res = stmt->executeQuery( insertstring);

        prod_kosten.verfahren_nr = verfahren_nr;

        while( res->next())
        {
            //idnr = res->getInt("verfahrenID");
            prod_kosten.netto_energiekonzentration_aws = res->getInt(
                    "energie_aws");
            prod_kosten.netto_energiekonzentration_sonstige = res->getInt(
                    "energie_sonstige");
            prod_kosten.ertrag1 = res->getInt( "ertrag1");
            prod_kosten.ertrag2 = res->getInt( "ertrag2");
            prod_kosten.ertrag3 = res->getInt( "ertrag3");
            prod_kosten.ertrag4 = res->getInt( "ertrag4");

            prod_kosten.umrechnungsfaktor = res->getDouble(
                    "umrechnungsfaktor");
			prod_kosten.ertragsanteil_m1 = res->getDouble("ertragsanteil_m1");
			prod_kosten.ertragsanteil_m2 = res->getDouble("ertragsanteil_m2");

            prod_kosten.gruenlandzahl1 = res->getInt( "gruenlandzahl1");

            prod_kosten.gruenlandzahl2 = res->getInt( "gruenlandzahl2");

            prod_kosten.gruenlandzahl3 = res->getInt( "gruenlandzahl3");

            prod_kosten.gruenlandzahl4 = res->getInt( "gruenlandzahl4");
        }
        delete res;

        delete stmt;
        return prod_kosten;

    } catch( sql::SQLException &e)
    {
        int code = e.getErrorCode();
        string error = e.what();
        char er[ 1000];
        lstrcpy( er, error.c_str());
        AfxMessageBox( er, MB_OK, 0);
        AfxMessageBox( "Das Programm wird beendet.\n"
                "Stellen Sie sicher, dass die "
                "Datenbankverbindung verfügbar ist \n"
                "und starten Sie das Programm erneut.", MB_OK, 0);

        exit( 1);
    }
}

kosten datenbank::returnkosten(
        int verfahren_nr,
        int mv1,
        int abstand,
		int abstand2,
        double grossvieheinheit,
        int viehID)
{
    try
    {
        //Driver *driver;
        //Connection *con;
        Statement *stmt;
        ResultSet *res;

        ResultSet *res3;
        ResultSet *res4;


        //driver = get_driver_instance();

        /* create a database connection using the Driver */
        //con = driver -> connect(DBHOST, USER, PASSWORD);
        //return con;
        //con->setSchema(DATABASE);
        stmt = con->createStatement();
        int idnr;

        char eintrag[ 1000];
        CString nreintrag;
        list < CString > strlist;
        kosten prod_kosten;
        //prod_kosten = new kosten();

        //CString er;

        stringstream querystring;
        string insertstring;
        //we need to build the right SQL expression as a string:
        //"SELECT  column_name FROM table_name WHERE some_column = 'value'"
        //querystring << "SELECT " << "*" << " FROM " << table << " WHERE "
        //        << column1 << " = " << "'" << value1 << "'" << " AND "
        //        << column2 << " = " << "'" << value2 << "'";
        //get the ID of the verfahren, from the table: verfahren_mit_leistungsgruppe
        querystring << "SELECT " << "*"
                << " FROM verfahren WHERE verfahren_nr = " << verfahren_nr;
        insertstring = querystring.str();
        res = stmt->executeQuery( insertstring);

        while( res->next())
        {
            //idnr = res->getInt("verfahrenID");
            prod_kosten.netto_energiekonzentration_aws = res->getInt(
                    "energie_aws");
            prod_kosten.netto_energiekonzentration_sonstige = res->getInt(
                    "energie_sonstige");
			prod_kosten.ertragsanteil_m1 = res->getDouble("ertragsanteil_m1");
			prod_kosten.ertragsanteil_m2 = res->getDouble("ertragsanteil_m2");
        }
        //er.Format(_T("%d"),idnr);
        // AfxMessageBox(er,MB_OK,0);

        querystring.str( "");
        querystring.clear();

        querystring
                << "SELECT * FROM verfahren_mit_leistungsgruppe WHERE  verfahren_nr = "
                << verfahren_nr;
        insertstring = querystring.str();
        res3 = stmt->executeQuery( insertstring);
        while( res3->next())
        {
            int verfahrenID = res3->getInt( "verfahrenID");
            int leistungsgruppe = res3->getInt( "leistungsgruppe");
            querystring.str( "");
            querystring.clear();
            ResultSet *res2;
            //Die unterschiedlichen Werte fuer die 4 Leistungsgruppen hole
            if( (viehID == 0) || (grossvieheinheit > 90)) 
            {
                //Es liegt eine Mahd vor, da es keine Tiere gibt oder es 
                //liegt eine Hutung Koppelumtriebsweide vor
                switch( leistungsgruppe)
                {
                    case 1:
                        if( abstand == 0) 
                        {
                            // es gibt nur einen Schnitt also nur Heu!
                            querystring << "SELECT " << "*"
                                    << " FROM energie_ertragsaenderung WHERE verfahrenID = "
                                    << verfahrenID << " AND monatsviertel  = "
                                    << mv1 << " AND nutzung2 = 0";
                            insertstring = querystring.str();
                            res2 = stmt->executeQuery( insertstring);

                            while( res2->next())
                            {

                                prod_kosten.energieaws_l1 = 0;
                                prod_kosten.energieheu_l1 = res2->getDouble(
                                        "energie");
                                prod_kosten.trockenaws_l1 = 0;
                                prod_kosten.trockenheu_l1 = res2->getDouble(
                                        "trocken");
                            }
                            delete res2;
                        } else
                        {
                            querystring << "SELECT " << "*"
                                    << " FROM energie_ertragsaenderung WHERE verfahrenID = "
                                    << verfahrenID << " AND monatsviertel  = "
                                    << mv1 << " AND nutzung2 = 1";
                            insertstring = querystring.str();
                            res2 = stmt->executeQuery( insertstring);
							

                            while( res2->next())
                            {
                                prod_kosten.energieaws_l1 = res2->getDouble(
                                        "energie");
                                prod_kosten.trockenaws_l1 = res2->getDouble(
                                        "trocken");
								bool nutz3 = res2->getBoolean("nutzung3");
                                querystring.str( "");
                                querystring.clear();
                                querystring << "SELECT " << "*"
                                        << " FROM energie_2mahd WHERE verfahrenID = "
                                        << verfahrenID;
                                insertstring = querystring.str();
                                ResultSet * res4;
                                res4 = stmt->executeQuery( insertstring);
                                while( res4->next())
                                {
                                    switch( abstand)
                                    {
									case 4:
                                        prod_kosten.energieheu_l1 = res4
                                                ->getDouble( "MV4_energie_heu");
                                        prod_kosten.trockenheu_l1 = res4
                                                ->getDouble( "MV4_trocken_heu");
										break;
									case 6:
                                        prod_kosten.energieheu_l1 = res4
                                                ->getDouble(
                                                "MV6_energie_heu");
                                        prod_kosten.trockenheu_l1 = res4
                                                ->getDouble(
                                                "MV6_trocken_heu");
										break;
									case 8:
                                         prod_kosten.energieheu_l1 =
                                                res4->getDouble(
                                                        "MV8_energie_heu");
                                        prod_kosten.trockenheu_l1 =
                                                res4->getDouble(
                                                        "MV8_trocken_heu");
										break;
									case 10:
                                        prod_kosten.energieheu_l1 =
                                                res4->getDouble(
                                                        "MV10_energie_heu");
                                        prod_kosten.trockenheu_l1 =
                                                res4->getDouble(
                                                        "MV10_trocken_heu");
										break;
									case 12:
										prod_kosten.energieheu_l1 =
                                                res4->getDouble(
                                                        "MV12_energie_heu");
                                        prod_kosten.trockenheu_l1 =
                                                res4->getDouble(
                                                        "MV12_trocken_heu");
										break;
									case 14:
										prod_kosten.energieheu_l1 =
                                                res4->getDouble(
                                                        "MV14_energie_heu");
                                        prod_kosten.trockenheu_l1 =
                                                res4->getDouble(
                                                        "MV14_trocken_heu");
										break;
									case 16:
										prod_kosten.energieheu_l1 =
                                                res4->getDouble(
                                                        "MV16_energie_heu");
                                        prod_kosten.trockenheu_l1 =
                                                res4->getDouble(
                                                        "MV16_trocken_heu");
										break;
									default:
										break;
                                        
									}
                                }
                                delete res4;
								if (abstand2 != 0)
								{

									querystring.str( "");
									querystring.clear();
									querystring << "SELECT " << "*"
											<< " FROM energie_3mahd WHERE verfahrenID = "
											<< verfahrenID;
									insertstring = querystring.str();
									ResultSet * res5;
									res5 = stmt->executeQuery( insertstring);
									while( res5->next())
									{
										switch( abstand2)
										{
										case 4:
											prod_kosten.energie2heu_l1 = res5
													->getDouble( "MV4_energie_heu");
											prod_kosten.trocken2heu_l1 = res5
													->getDouble( "MV4_trocken_heu");
											break;
										case 6:
											prod_kosten.energie2heu_l1 = res5
													->getDouble(
													"MV6_energie_heu");
											prod_kosten.trocken2heu_l1 = res5
													->getDouble(
													"MV6_trocken_heu");
											break;
										case 8:
											 prod_kosten.energie2heu_l1 =
													res5->getDouble(
															"MV8_energie_heu");
											prod_kosten.trocken2heu_l1 =
													res5->getDouble(
															"MV8_trocken_heu");
											break;
										case 10:
											prod_kosten.energie2heu_l1 =
													res5->getDouble(
															"MV10_energie_heu");
											prod_kosten.trocken2heu_l1 =
													res5->getDouble(
															"MV10_trocken_heu");
											break;
										
										default:
											break;
	                                        
										}
									}
									delete res5;
								}


                            }
                            delete res2;
                        }

                        break;
                    case 2:
                        if( abstand == 0) 
                        {
                            // es gibt nur einen Schnitt also nur Heu!
                            querystring << "SELECT " << "*"
                                    << " FROM energie_ertragsaenderung WHERE verfahrenID = "
                                    << verfahrenID << " AND monatsviertel  = "
                                    << mv1 << " AND nutzung2 = 0";
                            insertstring = querystring.str();

                            res2 = stmt->executeQuery( insertstring);

                            while( res2->next())
                            {
                                prod_kosten.energieaws_l2 = 0;
                                prod_kosten.energieheu_l2 = res2->getDouble(
                                        "energie");
                                prod_kosten.trockenaws_l2 = 0;
                                prod_kosten.trockenheu_l2 = res2->getDouble(
                                        "trocken");

                            }
                            delete res2;
                        } else
                        {
                            querystring << "SELECT " << "*"
                                    << " FROM energie_ertragsaenderung WHERE verfahrenID = "
                                    << verfahrenID << " AND monatsviertel  = "
                                    << mv1 << " AND nutzung2 = 1";
                            insertstring = querystring.str();

                            res2 = stmt->executeQuery( insertstring);

                            while( res2->next())
                            {
                                prod_kosten.energieaws_l2 = res2->getDouble(
                                        "energie");
                                prod_kosten.trockenaws_l2 = res2->getDouble(
                                        "trocken");
								bool nutz3 = res2->getBoolean("nutzung3");
                                querystring.str( "");
                                querystring.clear();
                                querystring << "SELECT " << "*"
                                        << " FROM energie_2mahd WHERE verfahrenID = "
                                        << verfahrenID;
                                insertstring = querystring.str();
                                ResultSet * res4;
                                res4 = stmt->executeQuery( insertstring);
                                while( res4->next())
                                {
                                    switch( abstand)
                                    {
									case 4:
                                        prod_kosten.energieheu_l2 = res4
                                                ->getDouble( "MV4_energie_heu");
                                        prod_kosten.trockenheu_l2 = res4
                                                ->getDouble( "MV4_trocken_heu");
										break;
									case 6:
                                        prod_kosten.energieheu_l2 = res4
                                                ->getDouble(
                                                "MV6_energie_heu");
                                        prod_kosten.trockenheu_l2 = res4
                                                ->getDouble(
                                                "MV6_trocken_heu");
										break;
									case 8:
                                        prod_kosten.energieheu_l2 =
                                                res4->getDouble(
                                                        "MV8_energie_heu");
                                        prod_kosten.trockenheu_l2 =
                                                res4->getDouble(
                                                        "MV8_trocken_heu");
										break;
									case 10:
                                        prod_kosten.energieheu_l2 =
                                                res4->getDouble(
                                                        "MV10_energie_heu");
                                        prod_kosten.trockenheu_l2 =
                                                res4->getDouble(
                                                        "MV10_trocken_heu");
										break;
									case 12:
										prod_kosten.energieheu_l2 =
                                                res4->getDouble(
                                                        "MV12_energie_heu");
                                        prod_kosten.trockenheu_l2 =
                                                res4->getDouble(
                                                        "MV12_trocken_heu");
										break;
									case 14:
										prod_kosten.energieheu_l2 =
                                                res4->getDouble(
                                                        "MV14_energie_heu");
                                        prod_kosten.trockenheu_l2 =
                                                res4->getDouble(
                                                        "MV14_trocken_heu");
										break;
									case 16:
										prod_kosten.energieheu_l2 =
                                                res4->getDouble(
                                                        "MV16_energie_heu");
                                        prod_kosten.trockenheu_l2 =
                                                res4->getDouble(
                                                        "MV16_trocken_heu");
										break;
									default:
										break;
                                        
                                    }
                                }
                                delete res4;
								if (abstand2 != 0)
								{

									querystring.str( "");
									querystring.clear();
									querystring << "SELECT " << "*"
											<< " FROM energie_3mahd WHERE verfahrenID = "
											<< verfahrenID;
									insertstring = querystring.str();
									ResultSet * res5;
									res5 = stmt->executeQuery( insertstring);
									while( res5->next())
									{
										switch( abstand2)
										{
										case 4:
											prod_kosten.energie2heu_l2 = 
												res5->getDouble( "MV4_energie_heu");
											prod_kosten.trocken2heu_l2 = 
												res5->getDouble( "MV4_trocken_heu");
											break;
										case 6:
											prod_kosten.energie2heu_l2 = 
													res5->getDouble(
													"MV6_energie_heu");
											prod_kosten.trocken2heu_l2 = 
													res5->getDouble(
													"MV6_trocken_heu");
											break;
										case 8:
											 prod_kosten.energie2heu_l2 =
													res5->getDouble(
															"MV8_energie_heu");
											prod_kosten.trocken2heu_l2 =
													res5->getDouble(
															"MV8_trocken_heu");
											break;
										case 10:
											prod_kosten.energie2heu_l2 =
													res5->getDouble(
															"MV10_energie_heu");
											prod_kosten.trocken2heu_l2 =
													res5->getDouble(
															"MV10_trocken_heu");
											break;
										
										default:
											break;
	                                        
										}
									}
									delete res5;
								}
                            }
                            delete res2;
                        }
                        break;
                    case 3:
                        if( abstand == 0) 
                        {
                            // es gibt nur einen Schnitt also nur Heu!
                            querystring << "SELECT " << "*"
                                    << " FROM energie_ertragsaenderung WHERE verfahrenID = "
                                    << verfahrenID << " AND monatsviertel  = "
                                    << mv1 << " AND nutzung2 = 0";
                            insertstring = querystring.str();
                            //ResultSet *res2;
                            res2 = stmt->executeQuery( insertstring);

                            while( res2->next())
                            {
                                prod_kosten.energieaws_l3 = 0;
                                prod_kosten.energieheu_l3 = res2->getDouble(
                                        "energie");
                                prod_kosten.trockenaws_l3 = 0;
                                prod_kosten.trockenheu_l3 = res2->getDouble(
                                        "trocken");
                            }
                            delete res2;
                        } else
                        {
                            querystring << "SELECT " << "*"
                                    << " FROM energie_ertragsaenderung WHERE verfahrenID = "
                                    << verfahrenID << " AND monatsviertel  = "
                                    << mv1 << " AND nutzung2 = 1";
                            insertstring = querystring.str();

                            res2 = stmt->executeQuery( insertstring);

                            while( res2->next())
                            {
                                prod_kosten.energieaws_l3 = res2->getDouble(
                                        "energie");
                                prod_kosten.trockenaws_l3 = res2->getDouble(
                                        "trocken");
								bool nutz3 = res2->getBoolean("nutzung3");
                                querystring.str( "");
                                querystring.clear();
                                querystring << "SELECT " << "*"
                                        << " FROM energie_2mahd WHERE verfahrenID = "
                                        << verfahrenID;
                                insertstring = querystring.str();
                                ResultSet * res4;
                                res4 = stmt->executeQuery( insertstring);
                                while( res4->next())
                                {
                                    switch( abstand)
                                    {
									case 4:
                                        prod_kosten.energieheu_l3 = res4
                                                ->getDouble( "MV4_energie_heu");
                                        prod_kosten.trockenheu_l3 = res4
                                                ->getDouble( "MV4_trocken_heu");
										break;
									case 6:
                                      prod_kosten.energieheu_l3 = res4
                                            ->getDouble(
                                            "MV6_energie_heu");
                                    prod_kosten.trockenheu_l3 = res4
                                            ->getDouble(
                                            "MV6_trocken_heu");
										break;
									case 8:
                                        prod_kosten.energieheu_l3 =
                                                res4->getDouble(
                                                        "MV8_energie_heu");
                                        prod_kosten.trockenheu_l3 =
                                                res4->getDouble(
                                                        "MV8_trocken_heu");
										break;
									case 10:
                                        prod_kosten.energieheu_l3 =
                                                res4->getDouble(
                                                        "MV10_energie_heu");
                                        prod_kosten.trockenheu_l3 =
                                                res4->getDouble(
                                                        "MV10_trocken_heu");
										break;
									case 12:
										prod_kosten.energieheu_l3 =
                                                res4->getDouble(
                                                        "MV12_energie_heu");
                                        prod_kosten.trockenheu_l3 =
                                                res4->getDouble(
                                                        "MV12_trocken_heu");
										break;
									case 14:
										prod_kosten.energieheu_l3 =
                                                res4->getDouble(
                                                        "MV14_energie_heu");
                                        prod_kosten.trockenheu_l3 =
                                                res4->getDouble(
                                                        "MV14_trocken_heu");
										break;
									case 16:
										prod_kosten.energieheu_l3 =
                                                res4->getDouble(
                                                        "MV16_energie_heu");
                                        prod_kosten.trockenheu_l3 =
                                                res4->getDouble(
                                                        "MV16_trocken_heu");
										break;
									default:
										break;

                                    }
                                }
                                delete res4;
								if (abstand2 != 0)
								{

									querystring.str( "");
									querystring.clear();
									querystring << "SELECT " << "*"
											<< " FROM energie_3mahd WHERE verfahrenID = "
											<< verfahrenID;
									insertstring = querystring.str();
									ResultSet * res5;
									res5 = stmt->executeQuery( insertstring);
									while( res5->next())
									{
										switch( abstand2)
										{
										case 4:
											prod_kosten.energie2heu_l3 = res5
													->getDouble( "MV4_energie_heu");
											prod_kosten.trocken2heu_l3 = res5
													->getDouble( "MV4_trocken_heu");
											break;
										case 6:
											prod_kosten.energie2heu_l3 = res5
													->getDouble(
													"MV6_energie_heu");
											prod_kosten.trocken2heu_l3 = res5
													->getDouble(
													"MV6_trocken_heu");
											break;
										case 8:
											 prod_kosten.energie2heu_l3 =
													res5->getDouble(
															"MV8_energie_heu");
											prod_kosten.trocken2heu_l3 =
													res5->getDouble(
															"MV8_trocken_heu");
											break;
										case 10:
											prod_kosten.energie2heu_l3 =
													res5->getDouble(
															"MV10_energie_heu");
											prod_kosten.trocken2heu_l3 =
													res5->getDouble(
															"MV10_trocken_heu");
											break;
										
										default:
											break;
	                                        
										}
									}
									delete res5;
								}
                            }
                            delete res2;
                        }
                        break;
                    case 4:
                        if( abstand == 0) 
                        {
                            // es gibt nur einen Schnitt also nur Heu oder 
                            // nur ein Weidegang!
                            querystring << "SELECT " << "*"
                                    << " FROM energie_ertragsaenderung WHERE verfahrenID = "
                                    << verfahrenID << " AND monatsviertel  = "
                                    << mv1 << " AND nutzung2 = 0";
                            insertstring = querystring.str();

                            res2 = stmt->executeQuery( insertstring);

                            while( res2->next())
                            {
                                prod_kosten.energieaws_l4 = 0;
                                prod_kosten.energieheu_l4 = res2->getDouble(
                                        "energie");
                                prod_kosten.trockenaws_l4 = 0;
                                prod_kosten.trockenheu_l4 = res2->getDouble(
                                        "trocken");
                            }
                            delete res2;
                        } else
                        {
                            querystring << "SELECT " << "*"
                                    << " FROM energie_ertragsaenderung WHERE verfahrenID = "
                                    << verfahrenID << " AND monatsviertel  = "
                                    << mv1 << " AND nutzung2 = 1";
                            insertstring = querystring.str();

                            res2 = stmt->executeQuery( insertstring);

                            while( res2->next())
                            {
                                prod_kosten.energieaws_l4 = res2->getDouble(
                                        "energie");
                                prod_kosten.trockenaws_l4 = res2->getDouble(
                                        "trocken");
								bool nutz3 = res2->getBoolean("nutzung3");
                                querystring.str( "");
                                querystring.clear();
                                querystring << "SELECT " << "*"
                                        << " FROM energie_2mahd WHERE verfahrenID = "
                                        << verfahrenID;
                                insertstring = querystring.str();
                                ResultSet * res4;
                                res4 = stmt->executeQuery( insertstring);
                                while( res4->next())
                                {
                                    switch( abstand)
                                    {
									case 4:
                                        prod_kosten.energieheu_l4 = res4
                                                ->getDouble( "MV4_energie_heu");
                                        prod_kosten.trockenheu_l4 = res4
                                                ->getDouble( "MV4_trocken_heu");
										break;
									case 6:
                                        prod_kosten.energieheu_l4 = res4
                                                ->getDouble(
                                                "MV6_energie_heu");
                                        prod_kosten.trockenheu_l4 = res4
                                                ->getDouble(
                                                "MV6_trocken_heu");
										break;
									case 8:
                                        prod_kosten.energieheu_l4 =
                                                res4->getDouble(
                                                        "MV8_energie_heu");
                                        prod_kosten.trockenheu_l4 =
                                                res4->getDouble(
                                                        "MV8_trocken_heu");
										break;
									case 10:
                                        prod_kosten.energieheu_l4 =
                                                res4->getDouble(
                                                        "MV10_energie_heu");
                                        prod_kosten.trockenheu_l4 =
                                                res4->getDouble(
                                                        "MV10_trocken_heu");
										break;
									case 12:
										prod_kosten.energieheu_l4 =
                                                res4->getDouble(
                                                        "MV12_energie_heu");
                                        prod_kosten.trockenheu_l4 =
                                                res4->getDouble(
                                                        "MV12_trocken_heu");
										break;
									case 14:
										prod_kosten.energieheu_l4 =
                                                res4->getDouble(
                                                        "MV14_energie_heu");
                                        prod_kosten.trockenheu_l4 =
                                                res4->getDouble(
                                                        "MV14_trocken_heu");
										break;
									case 16:
										prod_kosten.energieheu_l4 =
                                                res4->getDouble(
                                                        "MV16_energie_heu");
                                        prod_kosten.trockenheu_l4 =
                                                res4->getDouble(
                                                        "MV16_trocken_heu");
										break;
									default:
										break;

                                    }
                                }
                                delete res4;
								if (abstand2 != 0)
								{

									querystring.str( "");
									querystring.clear();
									querystring << "SELECT " << "*"
											<< " FROM energie_3mahd WHERE verfahrenID = "
											<< verfahrenID;
									insertstring = querystring.str();
									ResultSet * res5;
									res5 = stmt->executeQuery( insertstring);
									while( res5->next())
									{
										switch( abstand2)
										{
										case 4:
											prod_kosten.energie2heu_l4 = res5
													->getDouble( "MV4_energie_heu");
											prod_kosten.trocken2heu_l4 = res5
													->getDouble( "MV4_trocken_heu");
											break;
										case 6:
											prod_kosten.energie2heu_l4 = res5
													->getDouble(
													"MV6_energie_heu");
											prod_kosten.trocken2heu_l4 = res5
													->getDouble(
													"MV6_trocken_heu");
											break;
										case 8:
											 prod_kosten.energie2heu_l4 =
													res5->getDouble(
															"MV8_energie_heu");
											prod_kosten.trocken2heu_l4 =
													res5->getDouble(
															"MV8_trocken_heu");
											break;
										case 10:
											prod_kosten.energie2heu_l4 =
													res5->getDouble(
															"MV10_energie_heu");
											prod_kosten.trocken2heu_l4 =
													res5->getDouble(
															"MV10_trocken_heu");
											break;
										
										default:
											break;
	                                        
										}
									}
									delete res5;
								}
                            }
                            delete res2;
                        }
                        break;

                    default:
                        break;
                }
            } else 
            {
                //es liegt eine  andere Form von Beweidung vor
				if( grossvieheinheit < 60) 
				{
					ResultSet *res5;
					querystring.str( "");
					querystring.clear();
					querystring << "SELECT * FROM viehart WHERE  viehID = "
							<< viehID;
					insertstring = querystring.str();
					res5 = stmt->executeQuery( insertstring);
					while( res5->next())
					{
						prod_kosten.viehID = res5->getInt( "viehID");
						prod_kosten.besatzdichte = res5->getDouble(
								"besatzdichte");
						//prod_kosten.faktor = res5->getDouble("faktor"); 
						prod_kosten.aufnahmerate = res5->getDouble(
								"aufnahmerate");
					}
					delete res5;
				}
				if(verfahren_nr == 7)
				{
					//es liegt eine Maehweide mit Standweide vor also muessen auch die Werte 
                    //für die Mahd geholt werden
					
                    
                    switch( leistungsgruppe)
                    {
                        case 1:
                            querystring.str( "");
                            querystring.clear();
                            querystring << "SELECT " << "*"
                                    << " FROM energie_ertragsaenderung WHERE verfahrenID = "
                                    << verfahrenID << " AND monatsviertel  = " << mv1;
                            insertstring = querystring.str();
                            res2 = stmt->executeQuery( insertstring);

                            while( res2->next())
                            {

                                prod_kosten.energieaws_l1 = res2->getDouble(
                                        "energie");
                                prod_kosten.trockenaws_l1 = res2->getDouble(
                                        "trocken");
							}

                            delete res2;

                            break;
                        case 2:
                            querystring.str( "");
                            querystring.clear();
                            querystring << "SELECT " << "*"
                                    << " FROM energie_ertragsaenderung WHERE verfahrenID = "
                                   << verfahrenID << " AND monatsviertel  = " << mv1;
                            insertstring = querystring.str();

                            res2 = stmt->executeQuery( insertstring);

                            while( res2->next())
                            {

                                prod_kosten.energieaws_l2 = res2->getDouble(
                                        "energie");
                                prod_kosten.trockenaws_l2 = res2->getDouble(
                                        "trocken");
								
                            }

                            delete res2;

                            break;
                        case 3:
                            querystring.str( "");
                            querystring.clear();
                            querystring << "SELECT " << "*"
                                    << " FROM energie_ertragsaenderung WHERE verfahrenID = "
                                    << verfahrenID << " AND monatsviertel  = " << mv1;

                            insertstring = querystring.str();

                            res2 = stmt->executeQuery( insertstring);

                            while( res2->next())
                            {
                                prod_kosten.energieaws_l3 = res2->getDouble(
                                        "energie");
                                prod_kosten.trockenaws_l3 = res2->getDouble(
                                        "trocken");
								
                            }
                            delete res2;

                            break;
                        case 4:
                            querystring.str( "");
                            querystring.clear();
                            querystring << "SELECT " << "*"
                                    << " FROM energie_ertragsaenderung WHERE verfahrenID = "
                                    << verfahrenID << " AND monatsviertel  = " << mv1;

                            insertstring = querystring.str();

                            res2 = stmt->executeQuery( insertstring);

                            while( res2->next())
                            {
                                prod_kosten.energieaws_l4 = res2->getDouble(
                                        "energie");
                                prod_kosten.trockenaws_l4 = res2->getDouble(
                                        "trocken");	

                            }
                            delete res2;

                            break;

                        default:
                            break;
                    }
				}
            }
        }
		
        delete res3;

        // er.Format(_T("%.2f"),(prod_kosten->saatgutkosten));
        //AfxMessageBox("Daten geholt",MB_OK,0);

        delete res;

        delete stmt;
        //delete con;
        return prod_kosten;

    } catch( sql::SQLException &e)
    {
        int code = e.getErrorCode();
        string error = e.what();
        char er[ 1000];
        lstrcpy( er, error.c_str());
        AfxMessageBox( er, MB_OK, 0);
        AfxMessageBox( "Das Programm wird beendet.\n"
                "Stellen Sie sicher, dass die "
                "Datenbankverbindung verfügbar ist \n"
                "und starten Sie das Programm erneut.", MB_OK, 0);

        exit( 1);
    }
}

bool datenbank::save_massnahme(
        string name,
        int mv1massnahme,
        int abstand2massnahme,
		int abstand3massnahme,
        int tierart,
        double grossvieheinheit,
        bool duengung,
        int verfahren_nr)
{
    try
    {
        //Driver *driver;
        //Connection *con;
        Statement *stmt;
        //ResultSet *res;
        //driver = get_driver_instance();

        /* create a database connection using the Driver */
        //con = driver -> connect(DBHOST, USER, PASSWORD);
        //return con;
        //con->setSchema(DATABASE);
        stmt = con->createStatement();
        stringstream querystring;
        string insertstring;
        //we need to build the right SQL expression as a string:
        //"INSERT INTO table_name (column_name) VALUES ('value')"
        querystring
                << "INSERT INTO massnahmen (name, mv1massnahme, "
                << "abstand2massnahme, abstand3massnahme, viehID, grossvieheinheit, "
                << "duengung, verfahren_nr) VALUES "
                << "('" << name << "', " << mv1massnahme << ", "
                << abstand2massnahme << ", " << abstand3massnahme << ", "<< tierart << ", "
                << grossvieheinheit << ", " << duengung << ", " << verfahren_nr
                << ")";

        insertstring = querystring.str();
        int updatecount = stmt->executeUpdate( insertstring);

        //delete res;
        delete stmt;
        //delete con;
        //der letzte ID wird zurückgegeben
        return true;

    } catch( sql::SQLException &e)
    {
        int code = e.getErrorCode();
        string error = e.what();
        char er[ 1000];
        lstrcpy( er, error.c_str());
        AfxMessageBox( er, MB_OK, 0);
        AfxMessageBox( "Das Programm wird beendet.\n"
                "Stellen Sie sicher, dass die "
                "Datenbankverbindung verfügbar ist \n"
                "und starten Sie das Programm erneut.", MB_OK, 0);

        exit( 1);
    }
}

bool** datenbank::get_vorkommen(
        int artID,
        double reichweite,
        int zeilen,
        int spalten,
        int bundesland)
{
    try
    {
        //Driver *driver;
        //Connection *con;
        Statement *stmt;
        ResultSet *res;

        stmt = con->createStatement();

        CString er;

        stringstream querystring;
        string insertstring;
        //build the matrix for it

        bool** matrix;

        int i, j;

        matrix = new bool*[ zeilen];
        for( i = 0; i < zeilen; i++)
            matrix[ i] = new bool[ spalten];

        for( i = 0; i < zeilen; i++)
        {

            for( j = 0; j < spalten; j++)
            {
                matrix[ i][ j] = false;

            }
        }
        
        //we need to build the right SQL expression as a string:
        //"SELECT  column_name FROM table_name WHERE some_column = 'value'"
        //querystring << "SELECT " << "*" << " FROM " << table << " WHERE "
        //        << column1 << " = " << "'" << value1 << "'" << " AND "
        //        << column2 << " = " << "'" << value2 << "'";
        //get the ID of the verfahren, from 
        //the table: verfahren_mit_leistungsgruppe
        //AfxMessageBox("Bei vorkommen",MB_YESNO,0);
        if( bundesland == 1)
        {
            querystring << "SELECT * FROM vorkommen WHERE artID = " << artID
                    << " AND  bID = " << bundesland;
            insertstring = querystring.str();
            //res = stmt->executeQuery(insertstring);
            bool retvalue = stmt->execute( insertstring);
            //AfxMessageBox("Hinter vorkommen",MB_YESNO,0);

            if( retvalue)
            {
                res = stmt->getResultSet();

                int g, h;
                char eintrag[ 100];
                h = 0;
                while( res->next())
                {

                    i = res->getInt( "matrix_i");
                    j = res->getInt( "matrix_j");

                    //Hier wird unsere Gittergroesse benutzt, es muss bei 
                    //einem anderen Gitter angepasst werden!	
                    int rw = int( reichweite / 0.25);
                    int r = i - rw;
                    int c = j - rw;
                    if( r < 0)
                    {
                        r = 0;
                        if( c < 0)
                            c = 0;
                    }
                    if( c < 0)
                        c = 0;
                    for( int k = r; k < r + (2 * (rw + 1)); k++)
                    {
                        //AfxMessageBox("erste SChleife",MB_YESNO,0);
                        for( int l = c; l < c + (2 * (rw + 1)); l++)
                        {
                            if( k < zeilen && l < spalten)
                                matrix[ k][ l] = true;

                        }
                    }
                    //matrix[i][j]= true;
                    h++;
                }
            }
        } else
        {
            querystring << "SELECT * FROM vorkommen2 WHERE artID = " << artID
                    << " AND  bundeslandID = " << bundesland;
            insertstring = querystring.str();
            //res = stmt->executeQuery(insertstring);
            bool retvalue = stmt->execute( insertstring);
            //AfxMessageBox("Hinter vorkommen",MB_YESNO,0);

            if( retvalue)
            {
                res = stmt->getResultSet();

                int g, h;
                char eintrag[ 100];

                while( res->next())
                {
                    i = res->getInt( "matrix_i");
                    j = res->getInt( "matrix_j");
                    //Hier wird unsere Gittergroesse benutzt, es muss 
                    //bei einem anderen Gitter angepasst werden!
                    int rw = int( reichweite / 0.25);
                    int r = i - rw;
                    int c = j - rw;
                    if( r < 0)
                    {
                        r = 0;
                        if( c < 0)
                            c = 0;
                    }
                    if( c < 0)
                        c = 0;
                    for( int k = r; k < r + (2 * (rw + 1)); k++)
                    {
                        //AfxMessageBox("erste SChleife",MB_YESNO,0);
                        for( int l = c; l < c + (2 * (rw + 1)); l++)
                        {
                            if( k < zeilen && l < spalten)
                                matrix[ k][ l] = true;
                        }
                    }

                    //matrix[i][j]= true;
                    h++;

                }
                CString er;
                er.Format( _T( "%d"), h++);
                //AfxMessageBox(er,MB_OK,0);
            }
        }

        delete stmt;
        //delete con;
        delete res;
        return matrix;

    } catch( sql::SQLException &e)
    {
        int code = e.getErrorCode();
        string error = e.what();
        char er[ 1000];
        lstrcpy( er, error.c_str());
        AfxMessageBox( er, MB_OK, 0);
        AfxMessageBox( "Das Programm wird beendet.\n"
                "Stellen Sie sicher, dass die "
                "Datenbankverbindung verfügbar ist \n"
                "und starten Sie das Programm erneut.", MB_OK, 0);

        exit( 1);
    }
}

void datenbank::get_matrix_referenz(
        int& zeilen,
        int& spalten,
        int bundeslandID)
{
    try
    {
        //Driver *driver;
        //Connection *con;
        Statement *stmt;
        ResultSet *res;
        //driver = get_driver_instance();

        /* create a database connection using the Driver */
        //con = driver -> connect(DBHOST, USER, PASSWORD);
        //return con;
        //con->setSchema(DATABASE);
        stmt = con->createStatement();

        CString er;
        int start;

        stringstream querystring;
        string insertstring;

        querystring << "SELECT * FROM matrix_referenz WHERE  bundeslandID = "
                << bundeslandID;
        insertstring = querystring.str();
        res = stmt->executeQuery( insertstring);
        while( res->next())
        {

            zeilen = res->getInt( "zeilenanzahl");
            spalten = res->getInt( "spaltenanzahl");
        }

        delete stmt;
        delete res;

    } catch( sql::SQLException &e)
    {
        //AfxMessageBox("hier ist der Fehler",MB_YESNO,0);
        int code = e.getErrorCode();
        string error = e.what();
        char er[ 1000];
        lstrcpy( er, error.c_str());
        AfxMessageBox( er, MB_OK, 0);
        AfxMessageBox( "Das Programm wird beendet.\n"
                "Stellen Sie sicher, dass die "
                "Datenbankverbindung verfügbar ist \n"
                "und starten Sie das Programm erneut.", MB_OK, 0);

        exit( 1);
    }
}

bool datenbank::get_matrix_referenz( 
        int& zeilen, 
        int& spalten, 
        double& x_untenlinks,
        double& y_untenlinks,
        int bundeslandID)
{
    try
    {
        Statement *stmt = con->createStatement();
        stringstream query_stringstream;
        query_stringstream << "SELECT * FROM matrix_referenz WHERE "
                << "bundeslandID = " << bundeslandID;
        string query = query_stringstream.str();
        ResultSet *res = stmt->executeQuery( query);
        if( res->next())
        {
            zeilen = res->getInt( "zeilenanzahl");
            spalten = res->getInt( "spaltenanzahl");
            x_untenlinks = res->getDouble( "x_untenlinks");
            y_untenlinks = res->getDouble( "y_untenlinks");
            delete stmt;
            delete res;
            return true;
        }
        else
        {
            delete stmt;
            delete res;
            return false;
        }
               
    } catch( sql::SQLException &e)
    {
        int code = e.getErrorCode();
        string error = e.what();
        char er[ 1000];
        lstrcpy( er, error.c_str());
        AfxMessageBox( er, MB_OK, 0);
        AfxMessageBox( "Das Programm wird beendet.\n"
                "Stellen Sie sicher, dass die "
                "Datenbankverbindung verfügbar ist \n"
                "und starten Sie das Programm erneut.", MB_OK, 0);
        exit( 1);
    }
}

bool datenbank::get_bundesland( int bland,int& start, int& niedrig, int& mittel)
{
    try
    {
        //Driver *driver;
        //Connection *con;
        Statement *stmt;
        ResultSet *res;
        //driver = get_driver_instance();

        /* create a database connection using the Driver */
        //con = driver -> connect(DBHOST, USER, PASSWORD);
        //return con;
        //con->setSchema(DATABASE);
        stmt = con->createStatement();

        CString er;
        int start;

        stringstream querystring;
        string insertstring;

        querystring << "SELECT * FROM bundesland WHERE  bundeslandID = "
                << bland;
        insertstring = querystring.str();
        res = stmt->executeQuery( insertstring);
        while( res->next())
        {

            start = res->getInt( "wachstum_start");
			niedrig = res->getInt( "wachstumklasse_niedrig");
			mittel= res->getInt( "wachstumsklasse_mittel");
         }

        // er.Format(_T("%.2f"),(prod_kosten->saatgutkosten));
        //AfxMessageBox(er,MB_OK,0);

        delete stmt;
        //delete con;
        delete res;
        return 1;

    } catch( sql::SQLException &e)
    {
        //AfxMessageBox("hier ist der Fehler",MB_YESNO,0);
        int code = e.getErrorCode();
        string error = e.what();
        char er[ 1000];
        lstrcpy( er, error.c_str());
        AfxMessageBox( er, MB_OK, 0);
        AfxMessageBox( "Das Programm wird beendet.\n"
                "Stellen Sie sicher, dass die "
                "Datenbankverbindung verfügbar ist \n"
                "und starten Sie das Programm erneut.", MB_OK, 0);

        exit( 1);
    }
}

bool datenbank::get_pixel( pixel*** pixelarray, int bland)
{
    try
    {
        //Driver *driver;
        //Connection *con;
        Statement *stmt;
        ResultSet *res, *res2;
        //driver = get_driver_instance();

        /* create a database connection using the Driver */
        //con = driver -> connect(DBHOST, USER, PASSWORD);
        //return con;
        //con->setSchema(DATABASE);
        stmt = con->createStatement();

        CString er;
        int start;

        stringstream querystring;
        string insertstring;

        querystring << "SELECT * FROM bundesland WHERE  bundeslandID = "
                << bland;
        insertstring = querystring.str();
        res2 = stmt->executeQuery( insertstring);
        while( res2->next())
        {

            start = res2->getInt( "wachstum_start");
        }
        //we need to build the right SQL expression as a string:
        //"SELECT  column_name FROM table_name WHERE some_column = 'value'"
        //querystring << "SELECT " << "*" << " FROM " << table << " WHERE "
        //        << column1 << " = " << "'" << value1 << "'" << " AND "
        //        << column2 << " = " << "'" << value2 << "'";
        //get the ID of the verfahren, from 
        //the table: verfahren_mit_leistungsgruppe
        querystring.str( "");
        querystring.clear();
        querystring << "SELECT * FROM pixel  WHERE  bundeslandID = " << bland;
        insertstring = querystring.str();
        res = stmt->executeQuery( insertstring);

        int i, j, g;
        char eintrag[ 100];

        while( res->next())
        {
            i = res->getInt( "matrix_i");
            j = res->getInt( "matrix_j");
            
            pixelarray[ i][ j]->set_matrix_i( i);
            pixelarray[ i][ j]->set_matrix_j( j);
            //er.Format(_T("%d"),(pixelarray[i][j]->get_matrix_j()));
            //AfxMessageBox(er,MB_OK,0);

            string data = res->getString( "bundesland");
            lstrcpy( eintrag, data.c_str());
            pixelarray[ i][ j]->set_bundesland( eintrag);
            pixelarray[ i][ j]->set_feuchte_entwaessert(
                    res->getBoolean( "entwaessert"));
            pixelarray[ i][ j]->set_feuchte_feucht( res->getDouble( "feucht"));
            pixelarray[ i][ j]->set_feuchte_mittel( res->getDouble( "mittel"));
            pixelarray[ i][ j]->set_feuchte_trocken(
                    res->getDouble( "trocken"));
            g = res->getInt( "gruenlandzahl");
            pixelarray[ i][ j]->set_gruenlandzahl( g);
            pixelarray[ i][ j]->set_hoehenlage( res->getInt( "hoehenlage"));
            pixelarray[ i][ j]->set_pixelID( res->getInt( "pixelID"));

            //pix.set_praedatorendruck(res->getDouble("praedatorendruck"));
            data = res->getString( "raumgliederung");
            lstrcpy( eintrag, data.c_str());
            pixelarray[ i][ j]->set_raumgliederung( eintrag);
            pixelarray[ i][ j]->set_siedlung( res->getBoolean( "siedlung"));
            pixelarray[ i][ j]->set_wald( res->getBoolean( "wald"));
            pixelarray[ i][ j]->set_wasser( res->getBoolean( "wasser_binnen"));
            pixelarray[ i][ j]->set_x_koordinate( res->getInt( "x_koordinate"));
            pixelarray[ i][ j]->set_y_koordinate( res->getInt( "y_koordinate"));
            pixelarray[ i][ j]->set_bearbeitung( res->getInt( "wiese_weide"));
            pixelarray[ i][ j]->bundeslandID = res->getInt( "bundeslandID");
            pixelarray[ i][ j]->wachstum_start = start;

            //Die Grenzen sind variable daher nicht mehr hier setzen!!!
            /*
             if (g < 35)
             pixelarray[i][j]->set_wuchsklasse(1);
             else
             {
             if(g > 54)
             pixelarray[i][j]->set_wuchsklasse(3);
             else
             pixelarray[i][j]->set_wuchsklasse(2);
             }*/
        }

        // er.Format(_T("%.2f"),(prod_kosten->saatgutkosten));
        //AfxMessageBox(er,MB_OK,0);

        delete stmt;
        //delete con;
        delete res;
        delete res2;
        return 1;

    } catch( sql::SQLException &e)
    {
        //AfxMessageBox("hier ist der Fehler",MB_YESNO,0);
        int code = e.getErrorCode();
        string error = e.what();
        char er[ 1000];
        lstrcpy( er, error.c_str());
        AfxMessageBox( er, MB_OK, 0);
        AfxMessageBox( "Das Programm wird beendet.\n"
                "Stellen Sie sicher, dass die "
                "Datenbankverbindung verfügbar ist \n"
                "und starten Sie das Programm erneut.", MB_OK, 0);

        exit( 1);
    }
}

bool datenbank::get_pixel( pixel*** pixelarray, int bland, bool hoch)
{
    try
    {
        //Driver *driver;
        //Connection *con;
        Statement *stmt;
        ResultSet *res, *res2;
        //driver = get_driver_instance();

        /* create a database connection using the Driver */
        //con = driver -> connect(DBHOST, USER, PASSWORD);
        //return con;
        //con->setSchema(DATABASE);
        stmt = con->createStatement();

        CString er;
        int start;

        stringstream querystring;
        string insertstring;

        querystring << "SELECT * FROM bundesland WHERE  bundeslandID = "
                << bland;
        insertstring = querystring.str();
        res2 = stmt->executeQuery( insertstring);
        while( res2->next())
        {

            start = res2->getInt( "wachstum_start");
        }
        //we need to build the right SQL expression as a string:
        //"SELECT  column_name FROM table_name WHERE some_column = 'value'"
        //querystring << "SELECT " << "*" << " FROM " << table << " WHERE "
        //        << column1 << " = " << "'" << value1 << "'" << " AND "
        //        << column2 << " = " << "'" << value2 << "'";
        //get the ID of the verfahren, from 
        //the table: verfahren_mit_leistungsgruppe
        querystring.str( "");
        querystring.clear();
		int hoehe;
		if (hoch)
			hoehe = 1;
		else
			hoehe = 0;

        querystring << "SELECT * FROM pixel  WHERE  bundeslandID = " << bland
                << " AND hoehenlage = " << hoehe;
        insertstring = querystring.str();
        res = stmt->executeQuery( insertstring);

        int i, j, g;
        char eintrag[ 100];

        while( res->next())
        {
            i = res->getInt( "matrix_i");
            j = res->getInt( "matrix_j");

            pixelarray[ i][ j]->set_matrix_i( i);
            pixelarray[ i][ j]->set_matrix_j( j);
            //er.Format(_T("%d"),(pixelarray[i][j]->get_matrix_j()));
            //AfxMessageBox(er,MB_OK,0);

            string data = res->getString( "bundesland");
            lstrcpy( eintrag, data.c_str());
            pixelarray[ i][ j]->set_bundesland( eintrag);
            pixelarray[ i][ j]->set_feuchte_entwaessert(
                    res->getBoolean( "entwaessert"));
            pixelarray[ i][ j]->set_feuchte_feucht( res->getDouble( "feucht"));
            pixelarray[ i][ j]->set_feuchte_mittel( res->getDouble( "mittel"));
            pixelarray[ i][ j]->set_feuchte_trocken(
                    res->getDouble( "trocken"));
            g = res->getInt( "gruenlandzahl");
            pixelarray[ i][ j]->set_gruenlandzahl( g);
            pixelarray[ i][ j]->set_hoehenlage( res->getInt( "hoehenlage"));
            pixelarray[ i][ j]->set_pixelID( res->getInt( "pixelID"));

            //pix.set_praedatorendruck(res->getDouble("praedatorendruck"));
            data = res->getString( "raumgliederung");
            lstrcpy( eintrag, data.c_str());
            pixelarray[ i][ j]->set_raumgliederung( eintrag);
            pixelarray[ i][ j]->set_siedlung( res->getBoolean( "siedlung"));
            pixelarray[ i][ j]->set_wald( res->getBoolean( "wald"));
            pixelarray[ i][ j]->set_wasser( res->getBoolean( "wasser_binnen"));
            pixelarray[ i][ j]->set_x_koordinate( res->getInt( "x_koordinate"));
            pixelarray[ i][ j]->set_y_koordinate( res->getInt( "y_koordinate"));
            pixelarray[ i][ j]->set_bearbeitung( res->getInt( "wiese_weide"));
            pixelarray[ i][ j]->bundeslandID = res->getInt( "bundeslandID");
            pixelarray[ i][ j]->wachstum_start = start;

            //Die Grenzen sind variable daher nicht mehr hier setzen!
            /*
             if (g < 35)
             pixelarray[i][j]->set_wuchsklasse(1);
             else
             {
             if(g > 54)
             pixelarray[i][j]->set_wuchsklasse(3);
             else
             pixelarray[i][j]->set_wuchsklasse(2);
             }*/
        }

        // er.Format(_T("%.2f"),(prod_kosten->saatgutkosten));
        //AfxMessageBox(er,MB_OK,0);

        delete stmt;
        //delete con;
        delete res;
        delete res2;
        return 1;

    } catch( sql::SQLException &e)
    {
        //AfxMessageBox("hier ist der Fehler",MB_YESNO,0);
        int code = e.getErrorCode();
        string error = e.what();
        char er[ 1000];
        lstrcpy( er, error.c_str());
        AfxMessageBox( er, MB_OK, 0);
        AfxMessageBox( "Das Programm wird beendet.\n"
                "Stellen Sie sicher, dass die "
                "Datenbankverbindung verfügbar ist \n"
                "und starten Sie das Programm erneut.", MB_OK, 0);

        exit( 1);
    }
}

list< int> datenbank::getgruenland_for_massnahme_from_database(
        int massnahmeID,
        bool weide)
{
    try
    {
        //Driver *driver;
        //Connection *con;
        Statement *stmt;
        ResultSet *res;
        //driver = get_driver_instance();

        /* create a database connection using the Driver */
        //con = driver -> connect(DBHOST, USER, PASSWORD);
        //return con;
        //con->setSchema(DATABASE);
        stmt = con->createStatement();
        char eintrag[ 1000];
        list< int> liste;

        stringstream querystring;
        string insertstring;
        //we need to build the right SQL expression as a string:
        //"SELECT  column_name FROM table_name WHERE some_column = 'value'"
        querystring
                << "SELECT gruenlandID FROM massnahme_gruenland WHERE massnahmenID = "
                << massnahmeID;

        insertstring = querystring.str();
        //bool retvalue = stmt->execute(insertstring);
        res = stmt->executeQuery( insertstring);

        int ID;

        while( res->next())
        {
            ID = res->getInt( "gruenlandID");

            liste.push_back( ID);
        }
        if( liste.size() == 0)
        {
            if( weide)
                liste.push_back( 24);
            else
                liste.push_back( 20);
        }

        delete res;
        delete stmt;
        // delete con;
        return liste;

    } catch( sql::SQLException &e)
    {
        int code = e.getErrorCode();
        string error = e.what();
        char er[ 1000];
        lstrcpy( er, error.c_str());
        AfxMessageBox( er, MB_OK, 0);
        AfxMessageBox( "Das Programm wird beendet.\n"
                "Stellen Sie sicher, dass die "
                "Datenbankverbindung verfügbar ist \n"
                "und starten Sie das Programm erneut.", MB_OK, 0);

        exit( 1);
    }
}

massnahme datenbank::returnmassnahme(
        CString name,
        int mv1massnahme,
        int abstand2massnahme,
		int abstand3massnahme,
        bool duengung,
        double grossvieheinheit,
        int tierart)
{
    try
    {
        //Driver *driver;
        //Connection *con;
        Statement *stmt;
        ResultSet *res;
        //driver = get_driver_instance();

        /* create a database connection using the Driver */
        //con = driver -> connect(DBHOST, USER, PASSWORD);
        //con->setSchema(DATABASE);
        stmt = con->createStatement();

        char eintrag[ 1000];

        massnahme m;

        stringstream querystring;
        string insertstring;
        //we need to build the right SQL expression as a string:
        //"SELECT  column_name FROM table_name WHERE some_column = 'value'"
        querystring << "SELECT  * FROM massnahmen WHERE name = '" << name
                << "' AND mv1massnahme = " << mv1massnahme
                << " AND  abstand2massnahme =" << abstand2massnahme
				<< " AND  abstand3massnahme =" << abstand3massnahme
                << " AND  duengung = " << duengung
                << " AND  grossvieheinheit = " << grossvieheinheit
                << " AND viehID  = " << tierart;

        insertstring = querystring.str();
        bool retvalue = stmt->execute( insertstring);

        if( retvalue)
        {
            res = stmt->getResultSet();
            //ResultSetMetaData *res_meta = res->getMetaData();
            //int num = res_meta->getColumnCount();

            while( res->next())
            {

                string data = res->getString( "name");
                lstrcpy( eintrag, data.c_str());
                m.name = eintrag;
                if( m.name == "Streifenmahd")
                    m.streifenmahd = true;
                else
                    m.streifenmahd = false;
                m.massnahmeID = res->getInt( "massnahmenID");
                m.mv1massnahme = res->getInt( "mv1massnahme");
                m.abstand2massnahme = res->getInt( "abstand2massnahme");
				m.abstand3massnahme = res->getInt( "abstand3massnahme");
                m.duengung = res->getBoolean( "duengung");
                m.grossvieheinheit = res->getDouble( "grossvieheinheit");
                m.tierart = res->getInt( "viehID");
                m.verfahren_nr = res->getInt( "verfahren_nr");

            }

        } else
        {
            //was tun wenn keine Massnahmen da sind?
            AfxMessageBox( "Es gibt keine Massnahmen in der Datenbank!",
                    MB_YESNO, 0);
        }

        delete res;
        delete stmt;
        // delete con;
        return m;

    } catch( sql::SQLException &e)
    {
        int code = e.getErrorCode();
        string error = e.what();
        char er[ 1000];
        lstrcpy( er, error.c_str());
        AfxMessageBox( er, MB_OK, 0);
        AfxMessageBox( "Das Programm wird beendet.\n"
                "Stellen Sie sicher, dass die "
                "Datenbankverbindung verfügbar ist \n"
                "und starten Sie das Programm erneut.", MB_OK, 0);

        exit( 1);
    }
}

vector< string> datenbank::returnmassnahmenname()
{
    try
    {
        //Driver *driver;
        //Connection *con;
        Statement *stmt;
        ResultSet *res;
        //driver = get_driver_instance();

        /* create a database connection using the Driver */
        //con = driver -> connect(DBHOST, USER, PASSWORD);
        //con->setSchema(DATABASE);
        stmt = con->createStatement();

        vector < string > massnamen_namen;

        stringstream querystring;
        string insertstring;
        //we need to build the right SQL expression as a string:
        //"SELECT  column_name FROM table_name WHERE some_column = 'value'"
        querystring << "SELECT DISTINCT name FROM massnahmen";

        insertstring = querystring.str();
        bool retvalue = stmt->execute( insertstring);

        if( retvalue)
        {
            res = stmt->getResultSet();
            //ResultSetMetaData *res_meta = res->getMetaData();
            //int num = res_meta->getColumnCount();

            while( res->next())
            {
                string data = res->getString( "name");
                massnamen_namen.push_back( data);

            }

        } else
        {
            //was tun wenn keine Massnahmen da sind?
            AfxMessageBox( "Es gibt keine Massnahmen in der Datenbank!",
                    MB_YESNO, 0);
        }

        delete res;
        delete stmt;
        // delete con;
        return massnamen_namen;

    } catch( sql::SQLException &e)
    {

        int code = e.getErrorCode();
        string error = e.what();
        char er[ 1000];
        lstrcpy( er, error.c_str());
        AfxMessageBox( er, MB_OK, 0);
        AfxMessageBox( "Das Programm wird beendet.\n"
                "Stellen Sie sicher, dass die "
                "Datenbankverbindung verfügbar ist \n"
                "und starten Sie das Programm erneut.", MB_OK, 0);

        exit( 1);
    }
}

vector< int> datenbank::returnmassnahmenstart( CString name)
{
    try
    {
        //Driver *driver;
        //Connection *con;
        Statement *stmt;
        ResultSet *res;
        //driver = get_driver_instance();

        /* create a database connection using the Driver */
        //con = driver -> connect(DBHOST, USER, PASSWORD);
        //con->setSchema(DATABASE);
        stmt = con->createStatement();

        vector< int> massnahmenstart;

        char eintrag[ 1000];

        stringstream querystring;
        string insertstring;
        //we need to build the right SQL expression as a string:
        //"SELECT  column_name FROM table_name WHERE some_column = 'value'"
        querystring
                << "SELECT DISTINCT mv1massnahme FROM massnahmen WHERE name = '"
                << name << "'";

        insertstring = querystring.str();
        bool retvalue = stmt->execute( insertstring);

        int ID;
        if( retvalue)
        {
            res = stmt->getResultSet();
            //ResultSetMetaData *res_meta = res->getMetaData();
            //int num = res_meta->getColumnCount();

            while( res->next())
            {
                massnahmenstart.push_back( res->getInt( "mv1massnahme"));
            }
        } else
        {
            //was tun wenn keine Massnahmen da sind?
            AfxMessageBox( "Es gibt keine Massnahmen in der Datenbank!",
                    MB_YESNO, 0);
        }

        delete res;
        delete stmt;
        // delete con;
        return massnahmenstart;

    } catch( sql::SQLException &e)
    {
        int code = e.getErrorCode();
        string error = e.what();
        char er[ 1000];
        lstrcpy( er, error.c_str());
        AfxMessageBox( er, MB_OK, 0);
        AfxMessageBox( "Das Programm wird beendet.\n"
                "Stellen Sie sicher, dass die "
                "Datenbankverbindung verfügbar ist \n"
                "und starten Sie das Programm erneut.", MB_OK, 0);

        exit( 1);
    }
}

vector< int> datenbank::returnmassnahmenabstand( CString name, int mv1massnahme)
{
    try
    {
        //Driver *driver;
        //Connection *con;
        Statement *stmt;
        ResultSet *res;
        //driver = get_driver_instance();

        /* create a database connection using the Driver */
        //con = driver -> connect(DBHOST, USER, PASSWORD);
        //con->setSchema(DATABASE);
        stmt = con->createStatement();
        vector< int> massnahmenabstand;

        char eintrag[ 1000];

        stringstream querystring;
        string insertstring;
        //we need to build the right SQL expression as a string:
        //"SELECT  column_name FROM table_name WHERE some_column = 'value'"
        querystring
                << "SELECT DISTINCT abstand2massnahme FROM massnahmen WHERE name = '"
                << name << "' AND mv1massnahme = " << mv1massnahme;

        insertstring = querystring.str();
        bool retvalue = stmt->execute( insertstring);

        int ID;
        if( retvalue)
        {
            res = stmt->getResultSet();
            //ResultSetMetaData *res_meta = res->getMetaData();
            //int num = res_meta->getColumnCount();

            while( res->next())
            {
                massnahmenabstand.push_back( res->getInt( "abstand2massnahme"));
            }
        } else
        {
            //was tun wenn keine Massnahmen da sind?
            AfxMessageBox( "Es gibt keine Massnahmen in der Datenbank!",
                    MB_YESNO, 0);
        }

        delete res;
        delete stmt;
        // delete con;
        return massnahmenabstand;

    } catch( sql::SQLException &e)
    {
        int code = e.getErrorCode();
        string error = e.what();
        char er[ 1000];
        lstrcpy( er, error.c_str());
        AfxMessageBox( er, MB_OK, 0);
        AfxMessageBox( "Das Programm wird beendet.\n"
                "Stellen Sie sicher, dass die "
                "Datenbankverbindung verfügbar ist \n"
                "und starten Sie das Programm erneut.", MB_OK, 0);

        exit( 1);
    }
}
vector< int> datenbank::returnmassnahmenabstand2( CString name, int mv1massnahme, int abstand2massnahme)
{
    try
    {
        //Driver *driver;
        //Connection *con;
        Statement *stmt;
        ResultSet *res;
        //driver = get_driver_instance();

        /* create a database connection using the Driver */
        //con = driver -> connect(DBHOST, USER, PASSWORD);
        //con->setSchema(DATABASE);
        stmt = con->createStatement();
        vector< int> massnahmenabstand;

        char eintrag[ 1000];

        stringstream querystring;
        string insertstring;
        //we need to build the right SQL expression as a string:
        //"SELECT  column_name FROM table_name WHERE some_column = 'value'"
        querystring
                << "SELECT DISTINCT abstand3massnahme FROM massnahmen WHERE name = '"
                << name << "' AND mv1massnahme = " << mv1massnahme << " AND abstand2massnahme = " << abstand2massnahme;

        insertstring = querystring.str();
        bool retvalue = stmt->execute( insertstring);

        int ID;
        if( retvalue)
        {
            res = stmt->getResultSet();
            //ResultSetMetaData *res_meta = res->getMetaData();
            //int num = res_meta->getColumnCount();

            while( res->next())
            {
                massnahmenabstand.push_back( res->getInt( "abstand3massnahme"));
            }
        } else
        {
            //was tun wenn keine Massnahmen da sind?
            AfxMessageBox( "Es gibt keine Massnahmen in der Datenbank!",
                    MB_YESNO, 0);
        }

        delete res;
        delete stmt;
        // delete con;
        return massnahmenabstand;

    } catch( sql::SQLException &e)
    {
        int code = e.getErrorCode();
        string error = e.what();
        char er[ 1000];
        lstrcpy( er, error.c_str());
        AfxMessageBox( er, MB_OK, 0);
        AfxMessageBox( "Das Programm wird beendet.\n"
                "Stellen Sie sicher, dass die "
                "Datenbankverbindung verfügbar ist \n"
                "und starten Sie das Programm erneut.", MB_OK, 0);

        exit( 1);
    }
}
vector< double> datenbank::returnmassnahmenGV(
        CString name,
        int mv1massnahme,
        int abstand2massnahme,
		int abstand3massnahme)
{
    try
    {
        //Driver *driver;
        //Connection *con;
        Statement *stmt;
        ResultSet *res;
        //driver = get_driver_instance();

        /* create a database connection using the Driver */
        //con = driver -> connect(DBHOST, USER, PASSWORD);
        //con->setSchema(DATABASE);
        stmt = con->createStatement();

        vector< double> grossvieheinheiten;

        stringstream querystring;
        string insertstring;
        //we need to build the right SQL expression as a string:
        //"SELECT  column_name FROM table_name WHERE some_column = 'value'"
        querystring
                << "SELECT DISTINCT grossvieheinheit FROM massnahmen WHERE name = '"
                << name << "' AND mv1massnahme = " << mv1massnahme
                << " AND abstand2massnahme = " << abstand2massnahme
				<< " AND abstand3massnahme = " << abstand3massnahme;

        insertstring = querystring.str();
        bool retvalue = stmt->execute( insertstring);

        int ID;
        if( retvalue)
        {
            res = stmt->getResultSet();
            //ResultSetMetaData *res_meta = res->getMetaData();
            //int num = res_meta->getColumnCount();

            while( res->next())
            {
                grossvieheinheiten.push_back(
                        res->getDouble( "grossvieheinheit"));
            }
        } else
        {
            //was tun wenn keine Massnahmen da sind?
            AfxMessageBox( "Es gibt keine Massnahmen in der Datenbank!",
                    MB_YESNO, 0);
        }

        delete res;
        delete stmt;
        // delete con;
        return grossvieheinheiten;

    } catch( sql::SQLException &e)
    {
        int code = e.getErrorCode();
        string error = e.what();
        char er[ 1000];
        lstrcpy( er, error.c_str());
        AfxMessageBox( er, MB_OK, 0);
        AfxMessageBox( "Das Programm wird beendet.\n"
                "Stellen Sie sicher, dass die "
                "Datenbankverbindung verfügbar ist \n"
                "und starten Sie das Programm erneut.", MB_OK, 0);

        exit( 1);
    }
}

vector< bool> datenbank::returnmassnahmenduengung(
        CString name,
        int mv1massnahme,
        int abstand2massnahme,
		int abstand3massnahme)
{
    try
    {
        //Driver *driver;
        //Connection *con;
        Statement *stmt;
        ResultSet *res;
        //driver = get_driver_instance();

        /* create a database connection using the Driver */
        //con = driver -> connect(DBHOST, USER, PASSWORD);
        //con->setSchema(DATABASE);
        stmt = con->createStatement();

        vector< bool> dung;

        stringstream querystring;
        string insertstring;
        //we need to build the right SQL expression as a string:
        //"SELECT  column_name FROM table_name WHERE some_column = 'value'"
        querystring << "SELECT DISTINCT duengung FROM massnahmen WHERE name = '"
                << name << "' AND mv1massnahme = " << mv1massnahme
                << " AND abstand2massnahme = " << abstand2massnahme
				<< " AND abstand3massnahme = " << abstand3massnahme;

        insertstring = querystring.str();
        bool retvalue = stmt->execute( insertstring);

        int ID;
        if( retvalue)
        {
            res = stmt->getResultSet();
            //ResultSetMetaData *res_meta = res->getMetaData();
            //int num = res_meta->getColumnCount();

            while( res->next())
            {
                dung.push_back( res->getBoolean( "duengung"));
            }

        } else
        {
            //was tun wenn keine Massnahmen da sind?
            AfxMessageBox( "Es gibt keine Massnahmen in der Datenbank!",
                    MB_YESNO, 0);
        }

        delete res;
        delete stmt;
        // delete con;
        return dung;

    } catch( sql::SQLException &e)
    {
        int code = e.getErrorCode();
        string error = e.what();
        char er[ 1000];
        lstrcpy( er, error.c_str());
        AfxMessageBox( er, MB_OK, 0);
        AfxMessageBox( "Das Programm wird beendet.\n"
                "Stellen Sie sicher, dass die "
                "Datenbankverbindung verfügbar ist \n"
                "und starten Sie das Programm erneut.", MB_OK, 0);
        exit( 1);
    }
}

vector< string> datenbank::returnmassnahmentierart(
        CString name,
        int mv1massnahme,
        int abstand2massnahme,
		int abstand3massnahme)
{
    try
    {
        //Driver *driver;
        //Connection *con;
        Statement *stmt;
        ResultSet *res, *res2;
        //driver = get_driver_instance();

        /* create a database connection using the Driver */
        //con = driver -> connect(DBHOST, USER, PASSWORD);
        //con->setSchema(DATABASE);
        stmt = con->createStatement();

        vector < string > tierartliste;

        stringstream querystring;
        string insertstring, tierstring;
        //we need to build the right SQL expression as a string:
        //"SELECT  column_name FROM table_name WHERE some_column = 'value'"
        
        /*
         stringstream querystring3;
        string insertstring3;
        querystring3
                << "SELECT DISTINCT duengung FROM massnahmen WHERE name = '"
                << name << "' AND mv1massnahme = " << mv1massnahme
                << " AND abstand2massnahme = " << abstand2massnahme;
        insertstring3 = querystring3.str();
        res3 = stmt->executeQuery( insertstring3);

        int i = 0;
        while( res3->next())
        {
            duengung = (res->getBoolean( "duengung"));
            i++;
        }
        anzd = i;
         */

        querystring << "SELECT DISTINCT viehID FROM massnahmen WHERE name = '"
                << name << "' AND mv1massnahme = " << mv1massnahme
                << " AND abstand2massnahme = " << abstand2massnahme
				<< " AND abstand3massnahme = " << abstand3massnahme;

        insertstring = querystring.str();
        bool retvalue = stmt->execute( insertstring);

        int ID;
        if( retvalue)
        {
            res = stmt->getResultSet();
            //ResultSetMetaData *res_meta = res->getMetaData();
            //int num = res_meta->getColumnCount();

            while( res->next())
            {
                int vID = res->getInt( "viehID");
                if( vID != 0) //es gibt Tiere für diese Massnahme
                {
                    stringstream querystring2, returnstring;
                    string insertstring2;

                    querystring2 << "SELECT * FROM viehart WHERE  viehID = "
                            << vID;
                    insertstring2 = querystring2.str();

                    res2 = stmt->executeQuery( insertstring2);
                    while( res2->next())
                    {

                        returnstring.str( "");
                        returnstring.clear();
                        returnstring << res->getInt( "viehID") << ","
                                << res2->getString( "viehart");
                        tierstring = returnstring.str();

                        tierartliste.push_back( tierstring);
                    }
                    delete res2;

                } else
                    tierartliste.push_back( "Maßnahme ohne Vieh");
            }
        } else
        {
            //was tun wenn keine Massnahmen da sind?
            AfxMessageBox( "Es gibt keine Massnahmen in der Datenbank!",
                    MB_YESNO, 0);
        }

        delete res;
        delete stmt;
        // delete con;
        return tierartliste;

    } catch( sql::SQLException &e)
    {
        int code = e.getErrorCode();
        string error = e.what();
        char er[ 1000];
        lstrcpy( er, error.c_str());
        AfxMessageBox( er, MB_OK, 0);
        AfxMessageBox( "Das Programm wird beendet.\n"
                "Stellen Sie sicher, dass die "
                "Datenbankverbindung verfügbar ist \n"
                "und starten Sie das Programm erneut.", MB_OK, 0);

        exit( 1);
    }
}

massnahme** datenbank::returnmassnahmen( int& anzahl)
{
    try
    {
        //Driver *driver;
        //Connection *con;
        Statement *stmt;
        ResultSet *res;
        //driver = get_driver_instance();

        /* create a database connection using the Driver */
        //con = driver -> connect(DBHOST, USER, PASSWORD);
        //con->setSchema(DATABASE);
        stmt = con->createStatement();
        massnahme** massnahmen;

        char eintrag[ 1000];

        stringstream querystring;
        string insertstring;
        //we need to build the right SQL expression as a string:
        //"SELECT  column_name FROM table_name WHERE some_column = 'value'"
        querystring << "SELECT * FROM massnahmen";

        insertstring = querystring.str();
        bool retvalue = stmt->execute( insertstring);

        int ID;
        if( retvalue)
        {
            res = stmt->getResultSet();
            //ResultSetMetaData *res_meta = res->getMetaData();
            //int num = res_meta->getColumnCount();
            anzahl = 4000;
            massnahmen = new massnahme*[ 4000];
            int i = 0;
            while( res->next())
            {

                massnahmen[ i] = new massnahme;
                string data = res->getString( "name");
                lstrcpy( eintrag, data.c_str());
                massnahmen[ i]->name = eintrag;
                if( eintrag == "Streifenmahd")
                    massnahmen[ i]->streifenmahd = true;
                else
                    massnahmen[ i]->streifenmahd = false;
                massnahmen[ i]->massnahmeID = res->getInt( "massnahmenID");
                massnahmen[ i]->mv1massnahme = res->getInt( "mv1massnahme");
                massnahmen[ i]->abstand2massnahme = res->getInt(
                        "abstand2massnahme");
				massnahmen[ i]->abstand3massnahme = res->getInt(
                        "abstand3massnahme");
                massnahmen[ i]->duengung = res->getBoolean( "duengung");
                massnahmen[ i]->grossvieheinheit = res->getDouble(
                        "grossvieheinheit");
                massnahmen[ i]->tierart = res->getInt( "viehID");
                massnahmen[ i]->verfahren_nr = res->getInt( "verfahren_nr");
                
                /*
                querystring.str( "");
                querystring.clear();
                querystring << "SELECT * FROM viehart WHERE  viehID = "
                        << massnahmen[ i]->tierart;
                insertstring = querystring.str();
                ResultSet *res4;
                res4 = stmt->executeQuery( insertstring);
                while( res4->next())
                {
                    //double faktor = res4->getDouble("faktor");
                    double gv = res4->getDouble( "besatzdichte");

                    if( gv != 0)
                        massnahmen[ i]->viehanzahl = (massnahmen[ i]
                                ->grossvieheinheit / gv) * faktor;
                    else
                        massnahmen[ i]->viehanzahl = 0;
                }
                delete res4;
                 */
                i++;
            }
            anzahl = i;
        } else
        {
            //was tun wenn keine Massnahmen da sind?
            AfxMessageBox( "Es gibt keine Massnahmen in der Datenbank!",
                    MB_YESNO, 0);
        }

        delete res;
        delete stmt;
        // delete con;
        return massnahmen;

    } catch( sql::SQLException &e)
    {
        int code = e.getErrorCode();
        string error = e.what();
        char er[ 1000];
        lstrcpy( er, error.c_str());
        AfxMessageBox( er, MB_OK, 0);
        AfxMessageBox( "Das Programm wird beendet.\n"
                "Stellen Sie sicher, dass die "
                "Datenbankverbindung verfügbar ist \n"
                "und starten Sie das Programm erneut.", MB_OK, 0);

        exit( 1);
    }
}

void datenbank::save_gruenland_for_art( vector< int> gruenlandID, int artID)
{
    try
    {
        //Driver *driver;
        //Connection *con;
        Statement *stmt;
        //ResultSet *res;
        //driver = get_driver_instance();

        /* create a database connection using the Driver */
        //con = driver -> connect(DBHOST, USER, PASSWORD);
        //con->setSchema(DATABASE);
        stmt = con->createStatement();

        char eintrag[ 1000];
        vector< int>::iterator it;

        stringstream querystring;
        string insertstring;
        for( it = gruenlandID.begin(); it != gruenlandID.end(); it++)
        {
            querystring.str( "");
            querystring.clear();
            querystring << "INSERT INTO gruenland_pro_art (gruenlandID, artID) "
                    << (*it) << ", " << artID;
            string insertstring;
            insertstring = querystring.str();
            int updatecount = stmt->executeUpdate( insertstring);
        }

        //delete res;
        delete stmt;
        //delete con;

    } catch( sql::SQLException &e)
    {
        int code = e.getErrorCode();
        string error = e.what();
        char er[ 1000];
        lstrcpy( er, error.c_str());
        AfxMessageBox( er, MB_OK, 0);
        AfxMessageBox( "Das Programm wird beendet.\n"
                "Stellen Sie sicher, dass die "
                "Datenbankverbindung verfügbar ist \n"
                "und starten Sie das Programm erneut.", MB_OK, 0);

        exit( 1);
    }
}

void datenbank::get_gruenland_for_art( vector< gruenland>& gruen, int artID)
{
    try
    {
        //Driver *driver;
        //Connection *con;
        Statement *stmt;
        ResultSet *res;
        ResultSet *res2;
        //driver = get_driver_instance();

        /* create a database connection using the Driver */
        //con = driver -> connect(DBHOST, USER, PASSWORD);
        //con->setSchema(DATABASE);
        stmt = con->createStatement();

        char eintrag[ 1000];

        stringstream querystring;
        string insertstring;
        //we need to build the right SQL expression as a string:
        //"SELECT  column_name FROM table_name WHERE some_column = 'value'"
        querystring << "SELECT * FROM gruenland_pro_art WHERE artID = "
                << artID;

        insertstring = querystring.str();
        bool retvalue = stmt->execute( insertstring);
        gruenland g;

        int ID;
        if( retvalue)
        {
            res = stmt->getResultSet();

            while( res->next())
            {
                ID = res->getInt( "gruenlandID");
                querystring.str( "");
                querystring.clear();
                querystring << "SELECT * FROM gruenlandtyp WHERE gruenlandID = "
                        << ID;
                insertstring = querystring.str();
                bool retvalue = stmt->execute( insertstring);

                if( retvalue)
                {
                    res2 = stmt->getResultSet();
                    int num = 0;

                    while( res2->next())
                    {
                        string data = res2->getString( "name_deutsch");
                        lstrcpy( eintrag, data.c_str());
                        g.name_deutsch = eintrag;
                        data = res2->getString( "name_latein");
                        lstrcpy( eintrag, data.c_str());
                        g.name_latein = eintrag;
                        g.duengung = res2->getBoolean( "duengung");
                        g.feucht = res2->getDouble( "feucht");
                        g.frisch = res2->getDouble( "frisch");
                        g.trocken = res2->getDouble( "trocken");
                        g.gruenlandID = res2->getInt( "gruenlandID");
                        g.nummer = res2->getInt( "nummer");
                        g.hoch = res2->getBoolean( "hoch");
                        g.tief = res2->getBoolean( "tief");
                        g.mager = res2->getBoolean( "mager");
                        g.normal = res2->getBoolean( "normal");
                        g.keine_duengung = res2->getBoolean( "keine_duengung");
                        g.lebensraumID = res2->getInt( "lebensraumID");
                        data = res2->getString( "name_benutzer");
                        lstrcpy( eintrag, data.c_str());
                        g.name_benutzer = eintrag;
                        data = res2->getString( "savetime");
                        lstrcpy( eintrag, data.c_str());
                        g.savetime = eintrag;
                        gruen.push_back( g);

                    }
                }
            }
        } else
        {
            //was tun wenn kein Gruenlandtypen da sind?
            AfxMessageBox( "Es gibt keine Gruenlandliste in der Datenbank!",
                    MB_YESNO, 0);
        }

        delete res;
        delete stmt;
        //delete con;

    } catch( sql::SQLException &e)
    {
        int code = e.getErrorCode();
        string error = e.what();
        char er[ 1000];
        lstrcpy( er, error.c_str());
        AfxMessageBox( er, MB_OK, 0);
        AfxMessageBox( "Das Programm wird beendet.\n"
                "Stellen Sie sicher, dass die "
                "Datenbankverbindung verfügbar ist \n"
                "und starten Sie das Programm erneut.", MB_OK, 0);

        exit( 1);
    }
}

void datenbank::returndistinctgruenland(
        gruenland& g,
        string name,
        string savetime,
        bool mager)
{
    try
    {
        //Driver *driver;
        //Connection *con;
        Statement *stmt;
        ResultSet *res;
        //driver = get_driver_instance();

        /* create a database connection using the Driver */
        //con = driver -> connect(DBHOST, USER, PASSWORD);
        //con->setSchema(DATABASE);
        stmt = con->createStatement();

        char eintrag[ 1000];

        stringstream querystring;
        string insertstring;
        //we need to build the right SQL expression as a string:
        //"SELECT  column_name FROM table_name WHERE some_column = 'value'"
        querystring << "SELECT * FROM gruenlandtyp WHERE name_deutsch = " << "'"
                << name << "' AND savetime = " << "'" << savetime
                << "' AND mager = " << mager;

        insertstring = querystring.str();
        bool retvalue = stmt->execute( insertstring);

        int ID;
        if( retvalue)
        {
            res = stmt->getResultSet();
            int num = 0;

            while( res->next())
            {
                string data = res->getString( "name_deutsch");
                lstrcpy( eintrag, data.c_str());
                g.name_deutsch = eintrag;
                data = res->getString( "name_latein");
                lstrcpy( eintrag, data.c_str());
                g.name_latein = eintrag;
                g.duengung = res->getBoolean( "duengung");
                g.feucht = res->getDouble( "feucht");
                g.frisch = res->getDouble( "frisch");
                g.trocken = res->getDouble( "trocken");
                g.gruenlandID = res->getInt( "gruenlandID");
                g.nummer = res->getInt( "nummer");
                g.hoch = res->getBoolean( "hoch");
                g.tief = res->getBoolean( "tief");
                g.mager = res->getBoolean( "mager");
                g.normal = res->getBoolean( "normal");
                g.keine_duengung = res->getBoolean( "keine_duengung");
                g.lebensraumID = res->getInt( "lebensraumID");
                data = res->getString( "name_benutzer");
                lstrcpy( eintrag, data.c_str());
                g.name_benutzer = eintrag;
                data = res->getString( "savetime");
                lstrcpy( eintrag, data.c_str());
                g.savetime = eintrag;
            }
        } else
        {
            //was tun wenn kein Gruenlandtypen da sind?
            AfxMessageBox( "Es gibt keine Gruenlandliste in der Datenbank!",
                    MB_YESNO, 0);
        }

        delete res;
        delete stmt;
        //delete con;

    } catch( sql::SQLException &e)
    {
        int code = e.getErrorCode();
        string error = e.what();
        char er[ 1000];
        lstrcpy( er, error.c_str());
        AfxMessageBox( er, MB_OK, 0);
        AfxMessageBox( "The program will shut down.\n"
                "Make sure the database connection is available \n"
                "and restart the program afterwards.", MB_OK, 0);

        exit( 1);
    }
}

vector< gruenland*> datenbank::returngruenland( int& anzahl)
{
    try
    {
        //Driver *driver;
        //Connection *con;
        Statement *stmt;
        ResultSet *res;
        //driver = get_driver_instance();

        /* create a database connection using the Driver */
        //con = driver -> connect(DBHOST, USER, PASSWORD);
        //con->setSchema(DATABASE);
        stmt = con->createStatement();
        gruenland* g;
        vector< gruenland*> liste;

        char eintrag[ 1000];

        stringstream querystring;
        string insertstring;
        //we need to build the right SQL expression as a string:
        //"SELECT  column_name FROM table_name WHERE some_column = 'value'"
        querystring << "SELECT * FROM gruenlandtyp";

        insertstring = querystring.str();
        bool retvalue = stmt->execute( insertstring);

        int ID;
        if( retvalue)
        {
            res = stmt->getResultSet();
            int num = 0;

            while( res->next())
            {
                g = new gruenland;
                string data = res->getString( "name_deutsch");
                lstrcpy( eintrag, data.c_str());
                g->name_deutsch = eintrag;
                data = res->getString( "name_latein");
                lstrcpy( eintrag, data.c_str());
                g->name_latein = eintrag;
                g->duengung = res->getBoolean( "duengung");
                g->feucht = res->getDouble( "feucht");
                g->frisch = res->getDouble( "frisch");
                g->trocken = res->getDouble( "trocken");
                g->gruenlandID = res->getInt( "gruenlandID");
                g->nummer = res->getInt( "nummer");
                g->hoch = res->getBoolean( "hoch");
                g->tief = res->getBoolean( "tief");
                g->mager = res->getBoolean( "mager");
                g->normal = res->getBoolean( "normal");
                g->keine_duengung = res->getBoolean( "keine_duengung");
                g->lebensraumID = res->getInt( "lebensraumID");
                data = res->getString( "name_benutzer");
                lstrcpy( eintrag, data.c_str());
                g->name_benutzer = eintrag;
                data = res->getString( "savetime");
                lstrcpy( eintrag, data.c_str());
                g->savetime = eintrag;

                liste.push_back( g);
                num++;
            }
            anzahl = num;
        } else
        {
            //was tun wenn kein Gruenlandtypen da sind?
            AfxMessageBox( "Es gibt keine Gruenlandliste in der Datenbank!",
                    MB_YESNO, 0);
        }

        delete res;
        delete stmt;
        //delete con;
        return liste;

    } catch( sql::SQLException &e)
    {
        int code = e.getErrorCode();
        string error = e.what();
        char er[ 1000];
        lstrcpy( er, error.c_str());
        AfxMessageBox( er, MB_OK, 0);
        AfxMessageBox( "The program will shut down.\n"
                "Make sure the database connection is available \n"
                "and restart the program afterwards.", MB_OK, 0);

        exit( 1);
    }
}

bool datenbank::save_ergebnis_zwischenvis(
        int pixelID,
        int massnahmeID,
        double zahlung,
        double gewinn,
        double qualitaet,
        string artenqual)
{
    try
    {
        Statement *stmt;
        stmt = con->createStatement();
        stringstream querystring;
        string insertstring;
        vector< ergebnis::qart>::iterator it;
        //we need to build the right SQL expression as a string:
        //"INSERT INTO table_name (column_name) VALUES ('value')"
        querystring
                << "INSERT INTO ergebnis_zwischen_speicher "
                << "(pixelID, massnahmenID, zahlung, gewinn, "
                << "qualitaet, arten_qualitaet) VALUES "
                << "(" << pixelID << ", " << massnahmeID << ", " << zahlung
                << ", " << gewinn << ", " << qualitaet << ", '" << artenqual
                << "' )";
        insertstring = querystring.str();
        int updatecount = stmt->executeUpdate( insertstring);

        delete stmt;

        //der letzte ID wird zurückgegeben
        return true;

    } catch( sql::SQLException &e)
    {
        int code = e.getErrorCode();
        string error = e.what();
        char er[ 1000];
        lstrcpy( er, error.c_str());
        AfxMessageBox( er, MB_OK, 0);
        AfxMessageBox( "Das Programm wird beendet.\n"
                "Stellen Sie sicher, dass die "
                "Datenbankverbindung verfügbar ist \n"
                "und starten Sie das Programm erneut.", MB_OK, 0);

        exit( 1);
    }
}

bool datenbank::delete_ergebnis_zwischenvis( void)
{
    try
    {
        Statement *stmt;
        stmt = con->createStatement();

        stringstream querystring;
        string insertstring;
        //we need to build the right SQL expression as a string:
        //"DELETE FROM table_name WHERE column_name='value')"
        querystring << "TRUNCATE TABLE `ergebnis_zwischen_speicher`";
        insertstring = querystring.str();
        int updatecount = stmt->executeUpdate( insertstring);

        //  delete res;
        delete stmt;
        //delete con;

		return updatecount;

    } catch( sql::SQLException &e)
    {
        int code = e.getErrorCode();
        string error = e.what();
        char er[ 1000];
        lstrcpy( er, error.c_str());
        AfxMessageBox( er, MB_OK, 0);
        AfxMessageBox( "Das Programm wird beendet.\n"
                "Stellen Sie sicher, dass die "
                "Datenbankverbindung verfügbar ist \n"
                "und starten Sie das Programm erneut.", MB_OK, 0);

        exit( 1);
    }
}

bool datenbank::save_ergebnis(
        int pixelID,
        int massnahmeID,
        int konfiguration,
        double gewinn,
        vector< ergebnis::qart> artqualitaet)
{
    try
    {
        Statement *stmt;
        stmt = con->createStatement();
        stringstream querystring;
        string insertstring;
        vector< ergebnis::qart>::iterator it;
        //we need to build the right SQL expression as a string:
        //"INSERT INTO table_name (column_name) VALUES ('value')"
        querystring
                << "INSERT INTO ergebnis (pixelID, konfigurationID, "
                << "massnahmenID,gewinn) VALUES "
                << "(" << pixelID << ", " << konfiguration << ", "
                << massnahmeID << ", " << gewinn << ")";
        insertstring = querystring.str();
        int updatecount = stmt->executeUpdate( insertstring);
        for( it = artqualitaet.begin(); it != artqualitaet.end(); it++)
        {
            querystring.str( "");
            querystring.clear();
            string insertstring1;
            querystring
                    << "INSERT INTO qualitaet (pixelID,konfigurationID, "
                    << "artID, qualitaet) VALUES "
                    << "(" << pixelID << ", " << konfiguration << ", "
                    << (*it).art.get_artID() << ", " << (*it).qualitaet << ")";
            insertstring1 = querystring.str();
            int updatecount = stmt->executeUpdate( insertstring1);

        }

        delete stmt;

        //der letzte ID wird zurückgegeben
        return true;

    } catch( sql::SQLException &e)
    {
        int code = e.getErrorCode();
        string error = e.what();
        char er[ 1000];
        lstrcpy( er, error.c_str());
        AfxMessageBox( er, MB_OK, 0);
        AfxMessageBox( "Das Programm wird beendet.\n"
                "Stellen Sie sicher, dass die "
                "Datenbankverbindung verfügbar ist \n"
                "und starten Sie das Programm erneut.", MB_OK, 0);

        exit( 1);
    }
}

bool datenbank::save_ergebnis(
        int pixelID,
        int massnahmeID,
        int konfiguration,
        double gewinn,
        vector< modell::artenqualitaet> artqualitaet)
{
    try
    {
        Statement *stmt;
        stmt = con->createStatement();
        stringstream querystring;
        string insertstring;
        vector< modell::artenqualitaet>::iterator it;
        //we need to build the right SQL expression as a string:
        //"INSERT INTO table_name (column_name) VALUES ('value')"
        querystring
                << "INSERT INTO ergebnis (pixelID, konfigurationID, "
                << "massnahmenID,gewinn) VALUES "
                << "(" << pixelID << ", " << konfiguration << ", "
                << massnahmeID << ", " << gewinn << ")";
        insertstring = querystring.str();
        int updatecount = stmt->executeUpdate( insertstring);

        for( it = artqualitaet.begin(); it != artqualitaet.end(); it++)
        {
            querystring.str( "");
            querystring.clear();
            string insertstring1;
            querystring
                    << "INSERT INTO qualitaet (pixelID,konfigurationID, "
                    << "artID, qualitaet) VALUES "
                    << "(" << pixelID << ", " << konfiguration << ", "
                    << (*it).art->get_artID() << ", " << (*it).qualitaet << ")";
            insertstring1 = querystring.str();
            int updatecount = stmt->executeUpdate( insertstring1);
        }

        delete stmt;

        //der letzte ID wird zurückgegeben
        return true;

    } catch( sql::SQLException &e)
    {
        int code = e.getErrorCode();
        string error = e.what();
        char er[ 1000];
        lstrcpy( er, error.c_str());
        AfxMessageBox( er, MB_OK, 0);
        AfxMessageBox( "Das Programm wird beendet.\n"
                "Stellen Sie sicher, dass die "
                "Datenbankverbindung verfügbar ist \n"
                "und starten Sie das Programm erneut.", MB_OK, 0);

        exit( 1);
    }
}

bool datenbank::delete_ergebnis( int konfiguration)
{
    try
    {
        Statement *stmt;
        stmt = con->createStatement();

        stringstream querystring;
        string insertstring;
        //we need to build the right SQL expression as a string:
        //"DELETE FROM table_name WHERE column_name='value')"
        querystring << "DELETE FROM ergebnis WHERE konfigurationID" << "= "
                << konfiguration;
        insertstring = querystring.str();
        int updatecount = stmt->executeUpdate( insertstring);
        querystring.str( "");
        querystring.clear();
        querystring << "DELETE FROM qualitaet WHERE konfigurationID" << "= "
                << konfiguration;
        insertstring = querystring.str();
        updatecount = stmt->executeUpdate( insertstring);
        querystring.str( "");
        querystring.clear();
        querystring << "DELETE FROM konfiguration WHERE konfigurationID" << "= "
                << konfiguration;
        insertstring = querystring.str();
        updatecount = stmt->executeUpdate( insertstring);

        //  delete res;
        delete stmt;
        //delete con;
        return updatecount;

    } catch( sql::SQLException &e)
    {
        int code = e.getErrorCode();
        string error = e.what();
        char er[ 1000];
        lstrcpy( er, error.c_str());
        AfxMessageBox( er, MB_OK, 0);
        AfxMessageBox( "Das Programm wird beendet.\n"
                "Stellen Sie sicher, dass die "
                "Datenbankverbindung verfügbar ist \n"
                "und starten Sie das Programm erneut.", MB_OK, 0);

        exit( 1);
    }
}

bool datenbank::save_konfiguration(
        int konfiguration,
        int massnahme,
        double zahlung,
        double flaeche,
        CString konfigname,
        int bundeslandID)
{
    try
    {
        Statement *stmt;
        stmt = con->createStatement();
        stringstream querystring;
        string insertstring;
        //AfxMessageBox("hier 1",MB_YESNO,0);
        //we need to build the right SQL expression as a string:
        //"INSERT INTO table_name (column_name) VALUES ('value')"
        querystring
                << "INSERT INTO konfiguration (konfigurationID, massnahmenID, "
                << "zahlung, flaeche, konfigname, bundeslandID) VALUES "
                << "(" << konfiguration << ", " << massnahme << ", " << zahlung
                << ", " << flaeche << ", '" << konfigname << "', "
                << bundeslandID << ")";
        //AfxMessageBox("hier",MB_YESNO,0);
        insertstring = querystring.str();
        int updatecount = stmt->executeUpdate( insertstring);

        delete stmt;

        //der letzte ID wird zurückgegeben
        return true;

    } catch( sql::SQLException &e)
    {

        int code = e.getErrorCode();
        string error = e.what();
        char er[ 1000];
        lstrcpy( er, error.c_str());
        AfxMessageBox( er, MB_OK, 0);
        AfxMessageBox( "Das Programm wird beendet.\n"
                "Stellen Sie sicher, dass die "
                "Datenbankverbindung verfügbar ist \n"
                "und starten Sie das Programm erneut.", MB_OK, 0);

        exit( 1);
    }
}

double datenbank::get_trittmortalitaet( int viehID, double typ)
{
    try
    {
        Statement *stmt;
        ResultSet *res;

        stmt = con->createStatement();

        stringstream querystring;
        string insertstring;
        //we need to build the right SQL expression as a string:
        //"SELECT  column_name FROM table_name WHERE some_column = 'value'"
        querystring
                << "SELECT faktor FROM trittmortalitaet WHERE "
                << "(trittmortalitaettyp = "
                << typ << " AND viehID = " << viehID << ")";

        insertstring = querystring.str();
        //bool retvalue = stmt->execute(insertstring);
        res = stmt->executeQuery( insertstring);

        double faktor;

        while( res->next())
        {
            faktor = res->getDouble( "faktor");
        }

        delete res;
        delete stmt;
        // delete con;
        return faktor;

    } catch( sql::SQLException &e)
    {
        int code = e.getErrorCode();
        string error = e.what();
        char er[ 1000];
        lstrcpy( er, error.c_str());
        AfxMessageBox( er, MB_OK, 0);
        AfxMessageBox( "Das Programm wird beendet.\n"
                "Stellen Sie sicher, dass die "
                "Datenbankverbindung verfügbar ist \n"
                "und starten Sie das Programm erneut.", MB_OK, 0);

        exit( 1);
    }
}

void datenbank::get_ertrags_besatz_grenzen(
        int& gzniedrigmax,
        int& gzmittelmax,
        int& gzhochmax,
        int& gzsehrhochmax,
        double& besatzniedrigmax,
        double& besatzmittelmax,
        double& besatzhochmax,
        double& besatzsehrhochmax)
{
    try
    {
        Statement *stmt;
        ResultSet *res;

        stmt = con->createStatement();

        stringstream querystring;
        string insertstring;
        //we need to build the right SQL expression as a string:
        //"SELECT  column_name FROM table_name WHERE some_column = 'value'"
        querystring << "SELECT * FROM leistungsgruppen ";

        insertstring = querystring.str();
        //bool retvalue = stmt->execute(insertstring);
        res = stmt->executeQuery( insertstring);

        double faktor;

        while( res->next())
        {
            int id = res->getInt( "leistungsID");
            switch( id)
            {
                case 1:
                    gzniedrigmax = res->getInt( "gruenlandzahl_max");
                    besatzniedrigmax = res->getDouble( "besatzdichte_max");
                    break;
                case 2:
                    gzmittelmax = res->getInt( "gruenlandzahl_max");
                    besatzmittelmax = res->getDouble( "besatzdichte_max");
                case 3:
                    gzhochmax = res->getInt( "gruenlandzahl_max");
                    besatzhochmax = res->getDouble( "besatzdichte_max");
                case 4:
                    gzsehrhochmax = res->getInt( "gruenlandzahl_max");
                    besatzsehrhochmax = res->getDouble( "besatzdichte_max");
                default:
                    break;
            }
        }

        delete res;
        delete stmt;
        // delete con;

    } catch( sql::SQLException &e)
    {
        int code = e.getErrorCode();
        string error = e.what();
        char er[ 1000];
        lstrcpy( er, error.c_str());
        AfxMessageBox( er, MB_OK, 0);
        AfxMessageBox( "Das Programm wird beendet.\n"
                "Stellen Sie sicher, dass die "
                "Datenbankverbindung verfügbar ist \n"
                "und starten Sie das Programm erneut.", MB_OK, 0);

        exit( 1);
    }
}

wuchshoehe datenbank::get_wuchshoehe( int leistungsID)
{
    try
    {
        //Driver *driver;
        //Connection *con;
        Statement *stmt;
        ResultSet *res;

        stmt = con->createStatement();
        int idnr;

        wuchshoehe* hoehe;
        //hoehe = new wuchshoehe();
        stringstream querystring;
        string insertstring;
        //we need to build the right SQL expression as a string:
        //"SELECT  column_name FROM table_name WHERE some_column = 'value'"
        //querystring << "SELECT " << "*" << " FROM " << table << " WHERE "
        //        << column1 << " = " << "'" << value1 << "'" << " AND "
        //        << column2 << " = " << "'" << value2 << "'";
        //get the ID of the verfahren, from 
        //the table: verfahren_mit_leistungsgruppe
        querystring << "SELECT * FROM wuchshoehe WHERE hoehenID = "
                << leistungsID;
        insertstring = querystring.str();
        res = stmt->executeQuery( insertstring);

        hoehe->hoehenID = leistungsID;

        while( res->next())
        {
            hoehe->gruenlandzahl_max = res->getInt( "gruenlandzahl_max");
            hoehe->besatzdichte_max = res->getDouble( "besatzdichte_max");
            hoehe->besatzdichte_min = res->getDouble( "besatzdichte_min");
            hoehe->hoch_max = res->getDouble( "hoch_max");
            hoehe->hoch_min = res->getDouble( "hoch_min");
            hoehe->mittel_max = res->getDouble( "mittel_max");
            hoehe->mittel_min = res->getDouble( "mittel_min");
            hoehe->niedrig_max = res->getDouble( "niedrig_max");
            hoehe->niedrig_min = res->getDouble( "niedrig_min");
        }

        delete res;
        delete stmt;
        return *(hoehe);
    } catch( sql::SQLException &e)
    {
        int code = e.getErrorCode();
        string error = e.what();
        char er[ 1000];
        lstrcpy( er, error.c_str());
        AfxMessageBox( er, MB_OK, 0);
        AfxMessageBox( "Das Programm wird beendet.\n"
                "Stellen Sie sicher, dass die "
                "Datenbankverbindung verfügbar ist \n"
                "und starten Sie das Programm erneut.", MB_OK, 0);

        exit( 1);
    }
}

void datenbank::save_mas_gr( int massID, int gruenlandID)
{
    try
    {
        Statement *stmt;
        stmt = con->createStatement();
        stringstream querystring;
        string insertstring;
        //we need to build the right SQL expression as a string:
        //"INSERT INTO table_name (column_name) VALUES ('value')"
        querystring
                << "INSERT INTO massnahme_gruenland "
                << "(massnahmenID, gruenlandID) VALUES "
                << "(" << massID << ", " << gruenlandID << ")";

        insertstring = querystring.str();
        int updatecount = stmt->executeUpdate( insertstring);

        delete stmt;

        //der letzte ID wird zurückgegeben
        //return true;

    } catch( sql::SQLException &e)
    {
        int code = e.getErrorCode();
        string error = e.what();
        char er[ 1000];
        lstrcpy( er, error.c_str());
        AfxMessageBox( er, MB_OK, 0);
        AfxMessageBox( "Das Programm wird beendet.\n"
                "Stellen Sie sicher, dass die "
                "Datenbankverbindung verfügbar ist \n"
                "und starten Sie das Programm erneut.", MB_OK, 0);
        exit( 1);
    }
}

bool datenbank::save_zwischenvis(
        int massnahmeID,
        CString massnahme_art,
        int artID,
        CString art_name,
        double qualitaet,
        int pixelID,
        int pixel_i,
        int pixel_j,
        double gewinn,
        double zahlung,
        int gruenlandID,
        int bundesland)
{
    try
    {
        Statement *stmt;
        stmt = con->createStatement();
        stringstream querystring;
        string insertstring;
        //we need to build the right SQL expression as a string:
        //"INSERT INTO table_name (column_name) VALUES ('value')"
        querystring
                << "INSERT INTO zwischen_speicher (massnahmenID, "
                << "massnahmen_art, artID, art_name, qualitaet, pixelID, "
                << "pixel_i, pixel_j, gewinn, zahlung, gruenlandID, bundeslandID ) "
                << "VALUES (" << massnahmeID << ", '" << massnahme_art << "' , "
                << artID << ", '" << art_name << "' , " << qualitaet << ", "
                << pixelID << ", " << pixel_i << ", " << pixel_j << ", "
                << gewinn << ", " << zahlung << ", " << gruenlandID << ", "
                << bundesland << ")";

        insertstring = querystring.str();
        int updatecount = stmt->executeUpdate( insertstring);

        delete stmt;

        //der letzte ID wird zurückgegeben
        return true;

    } catch( sql::SQLException &e)
    {
        int code = e.getErrorCode();
        string error = e.what();
        char er[ 1000];
        lstrcpy( er, error.c_str());
        AfxMessageBox( er, MB_OK, 0);
        AfxMessageBox( "Das Programm wird beendet.\n"
                "Stellen Sie sicher, dass die "
                "Datenbankverbindung verfügbar ist \n"
                "und starten Sie das Programm erneut.", MB_OK, 0);

        exit( 1);
    }
}

bool datenbank::save_zwischenvis(
        int massnahmeID,
        CString massnahme_art,
        int artID,
        CString art_name,
        double qualitaet,
        int pixelID,
        int pixel_i,
        int pixel_j,
        double gewinn,
        double zahlung,
        int bundesland)
{
    try
    {
        Statement *stmt;
        stmt = con->createStatement();
        stringstream querystring;
        string insertstring;
        //we need to build the right SQL expression as a string:
        //"INSERT INTO table_name (column_name) VALUES ('value')"
        querystring
                << "INSERT INTO zwischen_speicher (massnahmenID, "
                << "massnahmen_art, artID, art_name, qualitaet, pixelID, "
                << "pixel_i, pixel_j, gewinn, zahlung, bundeslandID ) VALUES "
                << "(" << massnahmeID << ", '" << massnahme_art << "' , "
                << artID << ", '" << art_name << "' , " << qualitaet << ", "
                << pixelID << ", " << pixel_i << ", " << pixel_j << ", "
                << gewinn << ", " << zahlung << ", " << bundesland << ")";

        insertstring = querystring.str();
        int updatecount = stmt->executeUpdate( insertstring);

        delete stmt;

        //der letzte ID wird zurückgegeben
        return true;

    } catch( sql::SQLException &e)
    {
        int code = e.getErrorCode();
        string error = e.what();
        char er[ 1000];
        lstrcpy( er, error.c_str());
        AfxMessageBox( er, MB_OK, 0);
        AfxMessageBox( "Das Programm wird beendet.\n"
                "Stellen Sie sicher, dass die "
                "Datenbankverbindung verfügbar ist \n"
                "und starten Sie das Programm erneut.", MB_OK, 0);

        exit( 1);
    }
}

bool datenbank::delete_zwischenvis( void)
{
    try
    {
        Statement *stmt;
        stmt = con->createStatement();

        stringstream querystring;
        string insertstring;
        //we need to build the right SQL expression as a string:
        //"DELETE FROM table_name WHERE column_name='value')"
        querystring << "TRUNCATE TABLE `zwischen_speicher`";
        insertstring = querystring.str();
        int updatecount = stmt->executeUpdate( insertstring);

        //  delete res;
        delete stmt;
        //delete con;
        return updatecount;

    } catch( sql::SQLException &e)
    {
        int code = e.getErrorCode();
        string error = e.what();
        char er[ 1000];
        lstrcpy( er, error.c_str());
        AfxMessageBox( er, MB_OK, 0);
        AfxMessageBox( "Das Programm wird beendet.\n"
                "Stellen Sie sicher, dass die "
                "Datenbankverbindung verfügbar ist \n"
                "und starten Sie das Programm erneut.", MB_OK, 0);

        exit( 1);
    }
}

bool datenbank::delete_graphic( void)
{
    try
    {
        Statement *stmt;
        stmt = con->createStatement();

        stringstream querystring;
        string insertstring;
        //we need to build the right SQL expression as a string:
        //"DELETE FROM table_name WHERE column_name='value')"
        querystring << "TRUNCATE TABLE `graphic`";
        insertstring = querystring.str();
        int updatecount = stmt->executeUpdate( insertstring);

        //  delete res;
        delete stmt;
        //delete con;
        return updatecount;

    } catch( sql::SQLException &e)
    {
        int code = e.getErrorCode();
        string error = e.what();
        char er[ 1000];
        lstrcpy( er, error.c_str());
        AfxMessageBox( er, MB_OK, 0);
        AfxMessageBox( "Das Programm wird beendet.\n"
                "Stellen Sie sicher, dass die "
                "Datenbankverbindung verfügbar ist \n"
                "und starten Sie das Programm erneut.", MB_OK, 0);
        exit( 1);
    }
}

CString datenbank::returnname( string column, string column2, CString value)
{
    try
    {
        //Driver *driver;
        //Connection *con;
        Statement *stmt;
        ResultSet *res;
        //driver = get_driver_instance();

        /* create a database connection using the Driver */
        //con = driver -> connect(DBHOST, USER, PASSWORD);
        //con->setSchema(DATABASE);
        stmt = con->createStatement();

        char eintrag[ 1000];

        CString name;

        stringstream querystring, querystring2;
        string insertstring;
        //we need to build the right SQL expression as a string:
        //"SELECT  column_name FROM table_name WHERE some_column = 'value'"
        querystring << "SELECT " << column << " FROM art WHERE " << column2
                << " = '" << value << "'";

        insertstring = querystring.str();
        bool retvalue = stmt->execute( insertstring);

        if( retvalue)
        {
            res = stmt->getResultSet();
            //ResultSetMetaData *res_meta = res->getMetaData();
            //int num = res_meta->getColumnCount();

            while( res->next())
            {
                string data = res->getString( column);
                lstrcpy( eintrag, data.c_str());
                name = eintrag;
                //AfxMessageBox(name);
            }
        } else
        {
            //was tun wenn keine Arten da sind?
            AfxMessageBox( "Es gibt keine Arten in der Datenbank!", MB_YESNO,
                    0);
        }

        delete res;
        delete stmt;
        // delete con;
        return name;

    } catch( sql::SQLException &e)
    {
        int code = e.getErrorCode();
        string error = e.what();
        char er[ 1000];
        lstrcpy( er, error.c_str());
        AfxMessageBox( er, MB_OK, 0);
        AfxMessageBox( "Das Programm wird beendet.\n"
                "Stellen Sie sicher, dass die "
                "Datenbankverbindung verfügbar ist \n"
                "und starten Sie das Programm erneut.", MB_OK, 0);
        exit( 1);
    }
}

vector< CString> datenbank::returnartname( string column)
{
    try
    {
        //Driver *driver;
        //Connection *con;
        Statement *stmt;
        ResultSet *res, *res2;
        //driver = get_driver_instance();

        /* create a database connection using the Driver */
        //con = driver -> connect(DBHOST, USER, PASSWORD);
        //con->setSchema(DATABASE);
        stmt = con->createStatement();

        char eintrag[ 1000];

        vector < CString > arten_namen;

        stringstream querystring, querystring2;
        string insertstring;
        //we need to build the right SQL expression as a string:
        //"SELECT  column_name FROM table_name WHERE some_column = 'value'"
        querystring << "SELECT DISTINCT " << column << " FROM art";

        insertstring = querystring.str();
        bool retvalue = stmt->execute( insertstring);

        if( retvalue)
        {
            res = stmt->getResultSet();
            //ResultSetMetaData *res_meta = res->getMetaData();
            //int num = res_meta->getColumnCount();

            while( res->next())
            {
                string data = res->getString( column);
                lstrcpy( eintrag, data.c_str());
                arten_namen.push_back( eintrag);
            }
        } else
        {
            //was tun wenn keine Arten da sind?
            AfxMessageBox( "Es gibt keine Arten in der Datenbank!", MB_YESNO,
                    0);
        }

        delete res;
        delete stmt;
        // delete con;
        return arten_namen;

    } catch( sql::SQLException &e)
    {
        int code = e.getErrorCode();
        string error = e.what();
        char er[ 1000];
        lstrcpy( er, error.c_str());
        AfxMessageBox( er, MB_OK, 0);
        AfxMessageBox( "Das Programm wird beendet.\n"
                "Stellen Sie sicher, dass die "
                "Datenbankverbindung verfügbar ist \n"
                "und starten Sie das Programm erneut.", MB_OK, 0);

        exit( 1);
    }
}

vector< CString> datenbank::returnartspeicherdatum(
        CString value,
        string column)
{
    try
    {
        //Driver *driver;
        //Connection *con;
        Statement *stmt;
        ResultSet *res;
        //driver = get_driver_instance();

        /* create a database connection using the Driver */
        //con = driver -> connect(DBHOST, USER, PASSWORD);
        //con->setSchema(DATABASE);
        stmt = con->createStatement();

        char eintrag[ 1000];
        vector < CString > savetime;

        stringstream querystring;
        string insertstring;
        //we need to build the right SQL expression as a string:
        //"SELECT  column_name FROM table_name WHERE some_column = 'value'"
        querystring << "SELECT DISTINCT savetime FROM art WHERE " << column
                << " = '" << value << "'";

        insertstring = querystring.str();
        bool retvalue = stmt->execute( insertstring);

        if( retvalue)
        {
            res = stmt->getResultSet();
            //ResultSetMetaData *res_meta = res->getMetaData();
            //int num = res_meta->getColumnCount();

            while( res->next())
            {
                string data = res->getString( "savetime");
                lstrcpy( eintrag, data.c_str());
                savetime.push_back( eintrag);
            }

        } else
        {
            //was tun wenn keine Massnahmen da sind?
            AfxMessageBox( "Es gibt keine Massnahmen in der Datenbank!",
                    MB_YESNO, 0);
        }

        delete res;
        delete stmt;
        // delete con;
        return savetime;

    } catch( sql::SQLException &e)
    {
        int code = e.getErrorCode();
        string error = e.what();
        char er[ 1000];
        lstrcpy( er, error.c_str());
        AfxMessageBox( er, MB_OK, 0);
        AfxMessageBox( "Das Programm wird beendet.\n"
                "Stellen Sie sicher, dass die "
                "Datenbankverbindung verfügbar ist \n"
                "und starten Sie das Programm erneut.", MB_OK, 0);

        exit( 1);
    }
}

vector< CString> datenbank::returnbundeslandname( void)
{
    try
    {
        //Driver *driver;
        //Connection *con;
        Statement *stmt;
        ResultSet *res;
        //driver = get_driver_instance();

        /* create a database connection using the Driver */
        //con = driver -> connect(DBHOST, USER, PASSWORD);
        //con->setSchema(DATABASE);
        stmt = con->createStatement();

        char eintrag[ 1000];
        vector < CString > bundeslandnamen;

        stringstream querystring;
        string insertstring;
        //we need to build the right SQL expression as a string:
        //"SELECT  column_name FROM table_name WHERE some_column = 'value'"
        querystring << "SELECT DISTINCT name FROM bundesland ";

        insertstring = querystring.str();
        bool retvalue = stmt->execute( insertstring);

        if( retvalue)
        {
            res = stmt->getResultSet();
            //ResultSetMetaData *res_meta = res->getMetaData();
            //int num = res_meta->getColumnCount();

            while( res->next())
            {
                string data = res->getString( "name");
                lstrcpy( eintrag, data.c_str());
                bundeslandnamen.push_back( eintrag);
            }
        } else
        {
            //was tun wenn keine Massnahmen da sind?
            AfxMessageBox( "Es gibt keine Bundeslaender in der Datenbank!",
                    MB_YESNO, 0);
        }

        delete res;
        delete stmt;
        // delete con;
        return bundeslandnamen;

    } catch( sql::SQLException &e)
    {
        int code = e.getErrorCode();
        string error = e.what();
        char er[ 1000];
        lstrcpy( er, error.c_str());
        AfxMessageBox( er, MB_OK, 0);
        AfxMessageBox( "Das Programm wird beendet.\n"
                "Stellen Sie sicher, dass die "
                "Datenbankverbindung verfügbar ist \n"
                "und starten Sie das Programm erneut.", MB_OK, 0);
        exit( 1);
    }
}

int datenbank::save_gruenland( gruenland& gruen)
{
    try
    {
        //Driver *driver;
        //Connection *con;
        Statement *stmt;
        ResultSet *res;
        //driver = get_driver_instance();

        /* create a database connection using the Driver */
        //con = driver -> connect(DBHOST, USER, PASSWORD);
        //return con;
        //con->setSchema(DATABASE);
        stmt = con->createStatement();
        char name[ 1000];
        stringstream querystring;
        string insertstring;
        //we need to build the right SQL expression as a string:
        //"INSERT INTO table_name (column_name) VALUES ('value')"
        querystring
                << "INSERT INTO  gruenlandtyp (name_deutsch, name_latein, "
                << "nummer, hoch, tief, feucht, frisch, trocken, mager, "
                << "normal, duengung, keine_duengung, name_benutzer) VALUES "
                << "('" << gruen.name_deutsch << "', '" << gruen.name_latein
                << "', " << gruen.nummer << ", " << gruen.hoch << ", "
                << gruen.tief << ", " << gruen.feucht << ", " << gruen.frisch
                << ", " << gruen.trocken << ", " << gruen.mager << ", "
                << gruen.normal << ", " << gruen.duengung << ", "
                << gruen.keine_duengung << ", '" << gruen.name_benutzer << "')";

        insertstring = querystring.str();
        int updatecount = stmt->executeUpdate( insertstring);

        //get the ID of the last inserted databse entry, so it can be used 
        //for combined entries
        res = stmt->executeQuery( "SELECT LAST_INSERT_ID()");
        res->next();
        int id = res->getInt( 1);

        delete res;
        delete stmt;
        //delete con;
        //der letzte ID wird zurückgegeben
        return id;

    } catch( sql::SQLException &e)
    {
        int code = e.getErrorCode();
        string error = e.what();
        char er[ 1000];
        lstrcpy( er, error.c_str());
        AfxMessageBox( er, MB_OK, 0);
        AfxMessageBox( "Das Programm wird beendet.\n"
                "Stellen Sie sicher, dass die "
                "Datenbankverbindung verfügbar ist \n"
                "und starten Sie das Programm erneut.", MB_OK, 0);

        exit( 1);
    }
}

void datenbank::getgruenland( vector< gruenland>& gr, int lebensraumID)
{
    try
    {
        //Driver *driver;
        //Connection *con;
        Statement *stmt;
        ResultSet *res;
        //driver = get_driver_instance();

        /* create a database connection using the Driver */
        //con = driver -> connect(DBHOST, USER, PASSWORD);
        //return con;
        //con->setSchema(DATABASE);
        stmt = con->createStatement();
        char name[ 1000];
        stringstream querystring;
        string insertstring;
        querystring << "SELECT * FROM gruenlandtyp WHERE lebensraumID = "
                << lebensraumID;

        insertstring = querystring.str();
        bool retvalue = stmt->execute( insertstring);

        if( retvalue)
        {
            res = stmt->getResultSet();
            //ResultSetMetaData *res_meta = res->getMetaData();
            //int num = res_meta->getColumnCount();

            while( res->next())
            {
                gruenland g;
                g.duengung = res->getBoolean( "duengung");
                g.feucht = res->getDouble( "feucht");
                g.frisch = res->getDouble( "frisch");
                g.trocken = res->getDouble( "trocken");
                g.gruenlandID = res->getInt( "gruenlandID");
                g.hoch = res->getBoolean( "hoch");
                g.keine_duengung = res->getBoolean( "keine_duengung");
                g.lebensraumID = res->getInt( "lebensraumID");
                g.mager = res->getBoolean( "mager");
                string data = res->getString( "name_deutsch");
                lstrcpy( name, data.c_str());
                g.name_deutsch = name;
                data = res->getString( "name_latein");
                lstrcpy( name, data.c_str());
                g.name_latein = name;
                g.normal = res->getBoolean( "normal");
                g.nummer = res->getInt( "nummer");
                g.tief = res->getBoolean( "tief");
                data = res->getString( "name_benutzer");
                lstrcpy( name, data.c_str());
                g.name_benutzer = name;
                data = res->getString( "savetime");
                lstrcpy( name, data.c_str());
                g.savetime = name;
                gr.push_back( g);
            }
        }

        delete res;
        delete stmt;

    } catch( sql::SQLException &e)
    {
        int code = e.getErrorCode();
        string error = e.what();
        char er[ 1000];
        lstrcpy( er, error.c_str());
        AfxMessageBox( er, MB_OK, 0);
        AfxMessageBox( "Das Programm wird beendet.\n"
                "Stellen Sie sicher, dass die "
                "Datenbankverbindung verfügbar ist \n"
                "und starten Sie das Programm erneut.", MB_OK, 0);

        exit( 1);
    }
}

void datenbank::get_massnahmen_for_gruenland(
        vector< massnahme>& mass,
        int gruenlandID)
{
    try
    {
        //Driver *driver;
        //Connection *con;
        Statement *stmt;
        ResultSet *res;
        ResultSet *res2;
        //driver = get_driver_instance();

        /* create a database connection using the Driver */
        //con = driver -> connect(DBHOST, USER, PASSWORD);
        //return con;
        //con->setSchema(DATABASE);
        stmt = con->createStatement();
        char name[ 1000];
        stringstream querystring;
        string insertstring;
        querystring << "SELECT * FROM massnahme_gruenland WHERE gruenlandID = "
                << gruenlandID;

        insertstring = querystring.str();
        bool retvalue = stmt->execute( insertstring);

        if( retvalue)
        {
            res = stmt->getResultSet();
            //ResultSetMetaData *res_meta = res->getMetaData();
            //int num = res_meta->getColumnCount();

            while( res->next())
            {
                int massnahmenID = res->getInt( "massnahmenID");
                querystring.str( "");
                querystring.clear();
                querystring << "SELECT * FROM massnahmen WHERE massnahmenID = "
                        << massnahmenID;

                insertstring = querystring.str();
                bool retvalue = stmt->execute( insertstring);

                if( retvalue)
                {
                    res2 = stmt->getResultSet();
                    //ResultSetMetaData *res_meta = res->getMetaData();
                    //int num = res_meta->getColumnCount();

                    while( res2->next())
                    {
                        massnahme m;
                        string data = res2->getString( "name");
                        lstrcpy( name, data.c_str());
                        m.name = name;
                        if( name == "Streifenmahd")
                            m.streifenmahd = 1;
                        else
                            m.streifenmahd = 0;
                        m.massnahmeID = res2->getInt( "massnahmenID");
                        m.mv1massnahme = res2->getInt( "mv1massnahme");
                        m.abstand2massnahme = res2->getInt(
                                "abstand2massnahme");
						m.abstand3massnahme = res2->getInt(
                                "abstand3massnahme");
                        m.duengung = res2->getBoolean( "duengung");
                        m.grossvieheinheit = res2->getDouble(
                                "grossvieheinheit");
                        m.tierart = res2->getInt( "viehID");
                        m.verfahren_nr = res2->getInt( "verfahren_nr");
                        mass.push_back( m);

                    }
                }
            }
        }

        delete res;
        delete res2;
        delete stmt;

    } catch( sql::SQLException &e)
    {
        int code = e.getErrorCode();
        string error = e.what();
        char er[ 1000];
        lstrcpy( er, error.c_str());
        AfxMessageBox( er, MB_OK, 0);
        AfxMessageBox( "Das Programm wird beendet.\n"
                "Stellen Sie sicher, dass die "
                "Datenbankverbindung verfügbar ist \n"
                "und starten Sie das Programm erneut.", MB_OK, 0);

        exit( 1);
    }
}

int datenbank::returnbundeslandID( CString name)
{
    try
    {
        //Driver *driver;
        //Connection *con;
        Statement *stmt;
        ResultSet *res;
        //driver = get_driver_instance();

        /* create a database connection using the Driver */
        //con = driver -> connect(DBHOST, USER, PASSWORD);
        //con->setSchema(DATABASE);
        stmt = con->createStatement();

        int ID;
        char eintrag[ 1000];
        //vector<CString> savetime;

        stringstream querystring;
        string insertstring;
        //we need to build the right SQL expression as a string:
        //"SELECT  column_name FROM table_name WHERE some_column = 'value'"
        querystring << "SELECT bundeslandID FROM bundesland WHERE name = '"
                << name << "'";

        insertstring = querystring.str();
        bool retvalue = stmt->execute( insertstring);

        if( retvalue)
        {
            res = stmt->getResultSet();
            //ResultSetMetaData *res_meta = res->getMetaData();
            //int num = res_meta->getColumnCount();

            while( res->next())
            {
                ID = res->getInt( "bundeslandID");
            }
        } else
        {
            //was tun wenn keine Massnahmen da sind?
            AfxMessageBox( "Es gibt keine Bundeslaender in der Datenbank!",
                    MB_YESNO, 0);
        }

        delete res;
        delete stmt;
        // delete con;
        return ID;

    } catch( sql::SQLException &e)
    {
        int code = e.getErrorCode();
        string error = e.what();
        char er[ 1000];
        lstrcpy( er, error.c_str());
        AfxMessageBox( er, MB_OK, 0);
        AfxMessageBox( "Das Programm wird beendet.\n"
                "Stellen Sie sicher, dass die "
                "Datenbankverbindung verfügbar ist \n"
                "und starten Sie das Programm erneut.", MB_OK, 0);

        exit( 1);
    }
}

void datenbank::save_ergebnis_graphic(
        int massnahmenID,
        int artID,
        CString m_name,
        CString art_name,
        double qual_min,
        double qual_max,
        double qual_mittel,
        double kosten_min,
        double kosten_max,
        double kosten_mittel)
{
    try
    {
        //Driver *driver;
        //Connection *con;
        Statement *stmt;
        //driver = get_driver_instance();

        /* create a database connection using the Driver */
        //con = driver -> connect(DBHOST, USER, PASSWORD);
        //return con;
        //con->setSchema(DATABASE);
        stmt = con->createStatement();
        char name[ 1000];
        stringstream querystring;
        string insertstring;
        //we need to build the right SQL expression as a string:
        //"INSERT INTO table_name (column_name) VALUES ('value')"
        querystring
                << "INSERT INTO  graphic (massnahmenID, artID, m_name, "
                << "art_name, qual_min, qual_max, qual_mittel, kosten_min, "
                << "kosten_max, kosten_mittel) VALUES "
                << "( " << massnahmenID << ", " << artID << ", '" << m_name
                << "', '" << art_name << "', " << qual_min << ", " << qual_max
                << ", " << qual_mittel << ", " << kosten_min << ", "
                << kosten_max << ", " << kosten_mittel << ")";

        insertstring = querystring.str();
        int updatecount = stmt->executeUpdate( insertstring);

        //get the ID of the last inserted databse entry, so it can be used 
        //for combined entries

        delete stmt;
        //delete con;
        //der letzte ID wird zurückgegeben

    } catch( sql::SQLException &e)
    {
        int code = e.getErrorCode();
        string error = e.what();
        char er[ 1000];
        lstrcpy( er, error.c_str());
        AfxMessageBox( er, MB_OK, 0);
        AfxMessageBox( "Das Programm wird beendet.\n"
                "Stellen Sie sicher, dass die "
                "Datenbankverbindung verfügbar ist \n"
                "und starten Sie das Programm erneut.", MB_OK, 0);

        exit( 1);
    }
}

void datenbank::returnmassnahmen_gruppe(
        vector< massnahme>& massnahmengruppe,
        CString gruppe)
{
    try
    {
        //Driver *driver;
        //Connection *con;
        Statement *stmt;
        ResultSet *res;
        //driver = get_driver_instance();

        /* create a database connection using the Driver */
        //con = driver -> connect(DBHOST, USER, PASSWORD);
        //con->setSchema(DATABASE);
        stmt = con->createStatement();

        char eintrag[ 1000];

        massnahme m;

        stringstream querystring;
        string insertstring;
        //we need to build the right SQL expression as a string:
        //"SELECT  column_name FROM table_name WHERE some_column = 'value'"
        querystring << "SELECT  * FROM massnahmen WHERE name = '" << gruppe
                << "'";//<<"AND viehID = 2";

        insertstring = querystring.str();
        bool retvalue = stmt->execute( insertstring);

        if( retvalue)
        {
            res = stmt->getResultSet();
            //ResultSetMetaData *res_meta = res->getMetaData();
            //int num = res_meta->getColumnCount();

            while( res->next())
            {
                string data = res->getString( "name");
                lstrcpy( eintrag, data.c_str());
                m.name = eintrag;
                if( m.name == "Streifenmahd")
                    m.streifenmahd = 1;
                else
                    m.streifenmahd = 0;
                m.massnahmeID = res->getInt( "massnahmenID");
                m.mv1massnahme = res->getInt( "mv1massnahme");
                m.abstand2massnahme = res->getInt( "abstand2massnahme");
				m.abstand3massnahme = res->getInt( "abstand3massnahme");
                m.duengung = res->getBoolean( "duengung");
                m.grossvieheinheit = res->getDouble( "grossvieheinheit");
                m.tierart = res->getInt( "viehID");
                m.verfahren_nr = res->getInt( "verfahren_nr");
                massnahmengruppe.push_back( m);
            }
        } else
        {
            //was tun wenn keine Massnahmen da sind?
            AfxMessageBox( "Es gibt keine Massnahmen in der Datenbank!",
                    MB_YESNO, 0);
        }

        delete res;
        delete stmt;
        // delete con;

    } catch( sql::SQLException &e)
    {
        int code = e.getErrorCode();
        string error = e.what();
        char er[ 1000];
        lstrcpy( er, error.c_str());
        AfxMessageBox( er, MB_OK, 0);
        AfxMessageBox( "Das Programm wird beendet.\n"
                "Stellen Sie sicher, dass die "
                "Datenbankverbindung verfügbar ist \n"
                "und starten Sie das Programm erneut.", MB_OK, 0);
        exit( 1);
    }
}

void datenbank::returnmassnahmen_gruppe( vector< massnahme>& massnahmengruppe)
{
    try
    {
        //Driver *driver;
        //Connection *con;
        Statement *stmt;
        ResultSet *res;
        //driver = get_driver_instance();

        /* create a database connection using the Driver */
        //con = driver -> connect(DBHOST, USER, PASSWORD);
        //con->setSchema(DATABASE);
        stmt = con->createStatement();

        char eintrag[ 1000];

        massnahme m;

        stringstream querystring;
        string insertstring;
        //we need to build the right SQL expression as a string:
        //"SELECT  column_name FROM table_name WHERE some_column = 'value'"
        querystring << "SELECT  * FROM massnahmen ";

        insertstring = querystring.str();
        bool retvalue = stmt->execute( insertstring);

        if( retvalue)
        {
            res = stmt->getResultSet();
            //ResultSetMetaData *res_meta = res->getMetaData();
            //int num = res_meta->getColumnCount();

            while( res->next())
            {
                string data = res->getString( "name");
                lstrcpy( eintrag, data.c_str());
                m.name = eintrag;
                if( m.name == "Streifenmahd")
                    m.streifenmahd = 1;
                else
                    m.streifenmahd = 0;
                m.massnahmeID = res->getInt( "massnahmenID");
                m.mv1massnahme = res->getInt( "mv1massnahme");
                m.abstand2massnahme = res->getInt( "abstand2massnahme");
				m.abstand2massnahme = res->getInt( "abstand3massnahme");
                m.duengung = res->getBoolean( "duengung");
                m.grossvieheinheit = res->getDouble( "grossvieheinheit");
                m.tierart = res->getInt( "viehID");
                m.verfahren_nr = res->getInt( "verfahren_nr");
                massnahmengruppe.push_back( m);
            }
        } else
        {
            //was tun wenn keine Massnahmen da sind?
            AfxMessageBox( "Es gibt keine Massnahmen in der Datenbank!",
                    MB_YESNO, 0);
        }

        delete res;
        delete stmt;
        // delete con;

    } catch( sql::SQLException &e)
    {
        int code = e.getErrorCode();
        string error = e.what();
        char er[ 1000];
        lstrcpy( er, error.c_str());
        AfxMessageBox( er, MB_OK, 0);
        AfxMessageBox( "Das Programm wird beendet.\n"
                "Stellen Sie sicher, dass die "
                "Datenbankverbindung verfügbar ist \n"
                "und starten Sie das Programm erneut.", MB_OK, 0);
        exit( 1);
    }
}
void datenbank::get_verwertbarkeit(vector<kosten::verwertbarkeit>& verwert)
{
	 try
    {
        //Driver *driver;
        //Connection *con;
        Statement *stmt;
        ResultSet *res;
        //driver = get_driver_instance();

        /* create a database connection using the Driver */
        //con = driver -> connect(DBHOST, USER, PASSWORD);
        //con->setSchema(DATABASE);
        stmt = con->createStatement();

        char eintrag[ 1000];


        stringstream querystring;
        string insertstring;
        //we need to build the right SQL expression as a string:
        //"SELECT  column_name FROM table_name WHERE some_column = 'value'"
		
		querystring << "SELECT  * FROM verwertbarkeit ";

		insertstring = querystring.str();
		bool retvalue = stmt->execute( insertstring);

		if( retvalue)
		{
			res = stmt->getResultSet();
			//ResultSetMetaData *res_meta = res->getMetaData();
			//int num = res_meta->getColumnCount();

			while( res->next())
			{
			  kosten::verwertbarkeit faktor;

			  faktor.energiekonzentration = ( res->getInt( "energiekonzetration"));
			  faktor.silage =( res->getDouble( "silage"));
			  faktor.heu =( res->getDouble( "heu"));
			  faktor.weide =( res->getDouble( "weide"));
			  faktor.weide3 =( res->getDouble( "weide3"));
			  verwert.push_back(faktor);
			}
		} else
		{
			//was tun wenn keine Massnahmen da sind?
			AfxMessageBox( "Es gibt keinen Energiewert in der Datenbank!",
					MB_YESNO, 0);
		}
		

        delete res;
        delete stmt;
        // delete con;

    } catch( sql::SQLException &e)
    {
        int code = e.getErrorCode();
        string error = e.what();
        char er[ 1000];
        lstrcpy( er, error.c_str());
        AfxMessageBox( er, MB_OK, 0);
        AfxMessageBox( "Das Programm wird beendet.\n"
                "Stellen Sie sicher, dass die "
                "Datenbankverbindung verfügbar ist \n"
                "und starten Sie das Programm erneut.", MB_OK, 0);
        exit( 1);
    }

}
vector< CString> datenbank::getpixelfields( void)
{
    try
    {
        Statement *stmt;
        ResultSet *res;
        stmt = con->createStatement();

        char entry[ 1000];
        vector < CString> pixelfields;
        bool retvalue = stmt->execute( "DESCRIBE pixel;");

        if( retvalue)
        {
            res = stmt->getResultSet();
            while( res->next())
            {
                string data = res->getString( "Field");
                lstrcpy( entry, data.c_str());
                pixelfields.push_back( entry);
            }
        } 
        else
        {
            AfxMessageBox( "Beschreibung der Pixeltabelle konnte nicht geladen"
                    " werden!", MB_OK, 0);
        }

        delete res;
        delete stmt;
        return pixelfields;

    } catch( sql::SQLException &e)
    {
        int code = e.getErrorCode();
        string error = e.what();
        char er[ 1000];
        lstrcpy( er, error.c_str());
        AfxMessageBox( er, MB_OK, 0);
        AfxMessageBox( "Das Programm wird beendet.\n"
                "Stellen Sie sicher, dass die "
                "Datenbankverbindung verfügbar ist \n"
                "und starten Sie das Programm erneut.", MB_OK, 0);
        exit( 1);
    }
}

string datenbank::updatePixel( 
        int bundeslandID, 
        double xCoord, 
        double yCoord, 
        CString attname, 
        CString attToken)
{
    try
    {
        Statement *stmt;
        stmt = con->createStatement();
        stringstream query_stringstream;
        query_stringstream << "UPDATE pixel SET " 
                << attname << "='" << attToken << "' "
                << "WHERE bundeslandID='" << bundeslandID << "' "
                << "AND x_koordinate='" << ((int)floor( xCoord)) << "' "
                << "AND y_koordinate='" << ((int)floor( yCoord)) << "';";
        stmt->execute( query_stringstream.str());

        delete stmt;
        return "";

    } catch( sql::SQLException &e)
    {
        return e.what();
    }
}

string datenbank::insertPixel( 
        int bundeslandID,
        CString bundeslandname,
        double xCoord,
        double yCoord,
        int matrix_i,
        int matrix_j)
{
    try
    {
        Statement *stmt;
        stmt = con->createStatement();
        stringstream query_stringstream;
        query_stringstream << "INSERT INTO pixel (bundeslandID, "
                << "bundesland, x_koordinate, y_koordinate, "
                << "matrix_i, matrix_j) VALUES('" 
                << bundeslandID << "', '" << bundeslandname << "', '" 
                << ((int)floor( xCoord)) << "', '" 
                << ((int)floor( yCoord)) << "', '" 
                << matrix_i << "', '" << matrix_j << "');\n\n";
        stmt->execute( query_stringstream.str());

        delete stmt;
        return "";

    } catch( sql::SQLException &e)
    {
        return e.what();
    }
}

bool datenbank::save_optimierungsfortgang(int optID,
										  int it,
										  CString aup,
										  double f,
										  double f_best,
										  double schranke,
										  double Temp,
										  double Wkt)
{
    try
    {
		CString query;
		query.Format("INSERT INTO optimierungsfortgang (optID, it, aup, f, f_best, schranke, Temp, Wkt)"
			"VALUES (%d, %d ,\" %s \", %f , %f , %f, %f, %f )"
					, optID, it, aup, f, f_best, schranke, Temp, Wkt);
		//AfxMessageBox(query,MB_YESNO,0);

        Statement *stmt;
        stmt = con->createStatement();
        stringstream querystring;
        string insertstring;
        //we need to build the right SQL expression as a string:
        //"INSERT INTO table_name (column_name) VALUES ('value')"
        querystring << query;
        insertstring = querystring.str();
        int updatecount = stmt->executeUpdate( insertstring);

        delete stmt;

        //der letzte ID wird zurückgegeben
        return true;

    } catch( sql::SQLException &e)
    {
        int code = e.getErrorCode();
        string error = e.what();
        char er[ 1000];
        lstrcpy( er, error.c_str());
        AfxMessageBox( er, MB_OK, 0);
        AfxMessageBox( "Fehler beim Eintragen des aktuellen Optimierungsschrittes. Das Programm wird beendet.\n"
                "Stellen Sie sicher, dass die "
                "Datenbankverbindung verfügbar ist \n"
                "und starten Sie das Programm erneut.", MB_OK, 0);

        exit( 1);
    }
}



bool datenbank::delete_optimierungsfortgang( void)
{
    try
    {
        Statement *stmt;
        stmt = con->createStatement();

        stringstream querystring;
        string insertstring;
        //we need to build the right SQL expression as a string:
        //"DELETE FROM table_name WHERE column_name='value')"
        querystring << "TRUNCATE TABLE `optimierungsfortgang`";
        insertstring = querystring.str();
        int updatecount = stmt->executeUpdate( insertstring);

        //  delete res;
        delete stmt;
        //delete con;
        return updatecount;

    } catch( sql::SQLException &e)
    {
        int code = e.getErrorCode();
        string error = e.what();
        char er[ 1000];
        lstrcpy( er, error.c_str());
        AfxMessageBox( er, MB_OK, 0);
        AfxMessageBox( "Das Programm wird beendet.\n"
                "Stellen Sie sicher, dass die "
                "Datenbankverbindung verfügbar ist \n"
                "und starten Sie das Programm erneut.", MB_OK, 0);

        exit( 1);
    }
}

bool datenbank::save_itzahltest(vector<vector<vector<double>>> Statistik, vector<int> ItZahlen)
{
	try
    {
		int maxAnzGreifMass = Statistik.size();
		int AnzItZahl = Statistik[0].size();
		for(int i=0; i<maxAnzGreifMass; i++)
		{
			for(int j=0; j<AnzItZahl; j++)
			{
				CString anf;
				anf.Format("INSERT INTO itzahlvergleich (AnzGreifMass, ItZahl, minVerb, maxVerb, durchVerb, minEff, maxEff, durchEff)");
				CString end;
				end.Format(" VALUES (%d,%d,%f,%f,%f,%f,%f,%f)"
							, i, ItZahlen[j], 
							Statistik[i][j][0], Statistik[i][j][1], Statistik[i][j][2], 
							Statistik[i][j][3], Statistik[i][j][4], Statistik[i][j][5]);
				anf.Append(end);
				//AfxMessageBox(anf,MB_YESNO,0);

				CString filename = _T("IterationszahlTestProt.txt");
				simulation::schreibeInDatei(filename , end);

				Statement *stmt;
				stmt = con->createStatement();
				stringstream querystring;
				string insertstring;
				//we need to build the right SQL expression as a string:
				//"INSERT INTO table_name (column_name) VALUES ('value')"
				querystring << anf;
				insertstring = querystring.str();
				int updatecount = stmt->executeUpdate( insertstring);
				delete stmt;
			}
		}

        //der letzte ID wird zurückgegeben
        return true;
    } 
	catch( sql::SQLException &e)
    {
        int code = e.getErrorCode();
        string error = e.what();
        char er[ 1000];
        lstrcpy( er, error.c_str());
        AfxMessageBox( er, MB_OK, 0);
        AfxMessageBox( "Fehler beim Eintragen des Vergleichs der Iterationszahlen. Das Programm wird beendet.\n"
                "Stellen Sie sicher, dass die "
                "Datenbankverbindung verfügbar ist \n"
                "und starten Sie das Programm erneut.", MB_OK, 0);

        exit( 1);
    }
}

bool datenbank::save_heurtest(	vector<CString> name,
								int anzWiederholungen,
								vector<int> anzBeste,
								vector<double> AnteilAnBesterDurch,
								vector<double> AnteilAnBesterVar,
								vector<int> anzBudOk,
								vector<double> durchBudAuss,
								vector<int> anzOhneLoes,
								vector<double> durchRang)
{
	try
    {
		int anzHeur = name.size();
		for(int i=0; i<anzHeur; i++)
		{
			CString anf;
			anf.Format("INSERT INTO heurvergleich (name, versuche, anzBeste, "
				"AnteilAnBesterDurch, AnteilAnBesterVar, AnteilAnBesterStd, anzBudOk, durchBudAus, anzOhneLoes, durchRang)");
			CString end;
			end.Format(" VALUES (\" %s \", %d , %d , %f , %f , %f, %d , %f, %d, %f )"
						, name[i], anzWiederholungen, anzBeste[i], 
						AnteilAnBesterDurch[i] , AnteilAnBesterVar[i], sqrt(AnteilAnBesterVar[i]), anzBudOk[i], durchBudAuss[i], 
						anzOhneLoes[i], durchRang[i]);
			anf.Append(end);
			//AfxMessageBox(anf,MB_YESNO,0);

			CString filename = _T("AnfHeurTestProt.txt");
			simulation::schreibeInDatei(filename , end);

			Statement *stmt;
			stmt = con->createStatement();
			stringstream querystring;
			string insertstring;
			//we need to build the right SQL expression as a string:
			//"INSERT INTO table_name (column_name) VALUES ('value')"
			querystring << anf;
			insertstring = querystring.str();
			int updatecount = stmt->executeUpdate( insertstring);

			delete stmt;
		}

        //der letzte ID wird zurückgegeben
        return true;

    } catch( sql::SQLException &e)
    {
        int code = e.getErrorCode();
        string error = e.what();
        char er[ 1000];
        lstrcpy( er, error.c_str());
        AfxMessageBox( er, MB_OK, 0);
        AfxMessageBox( "Fehler beim Eintragen des Heuristikvergleichs. Das Programm wird beendet.\n"
                "Stellen Sie sicher, dass die "
                "Datenbankverbindung verfügbar ist \n"
                "und starten Sie das Programm erneut.", MB_OK, 0);

        exit( 1);
    }
}

bool datenbank::speichereStichproben(vector<CString> namen,
									 vector<CString> mass,
									 vector<vector<double>> Stichprobe)
{
	try
    {
		Statement *stmt;
		stmt = con->createStatement();
		stringstream stream;

		//Alte Tabelle loeschen 
		CString query = "DROP TABLE IF EXISTS Stichprobe";
		stream << query;
		string queryIns = stream.str();
		int updatecount = stmt->executeUpdate( queryIns );

		int anzVerf = namen.size();
		int UmfangSP = Stichprobe.size();
		//Neue Tabelle anlegen
		query = "CREATE TABLE Stichprobe( Massnahmen TEXT";
		CString query2 = "CREATE TABLE Stichprobe( Massnahmen TEXT";
		for(int i=0; i<anzVerf; i++)
		{
			query.Append(", `" + namen[i] + "` DOUBLE");
			CString nr;
			nr.Format("%d",i);
			query2.Append( ", Verfahren" +  nr + " DOUBLE");
		}
		query.Append(")");
		query2.Append(")");
	
		stream.str("");
		stream << query;
		queryIns = stream.str();
		
		try{updatecount = stmt->executeUpdate( queryIns );}
		catch(...)
		{
			//AfxMessageBox(query2);
			stream.str("");
			stream << query2;
			queryIns = stream.str();
			//AfxMessageBox( queryIns.c_str() ,0,0);
			updatecount = stmt->executeUpdate( queryIns );
		}

		CString formatStr = "%f";
	
		//Einfuegen der Stichprobe in Tabelle
		for(int i=0; i<UmfangSP; i++)
		{
			query = "INSERT INTO Stichprobe VALUES ( \"" + mass[i] + "\"";
			for(int j=0; j<anzVerf; j++)
			{
				CString val;
				val.Format(formatStr, Stichprobe[i][j]);
				query.Append(" , " + val);
			}
			query.Append(" )");
			//AfxMessageBox(query);
			stream.str("");
			stream << query;
			queryIns = stream.str();
			updatecount = stmt->executeUpdate( queryIns );
		}

		delete stmt;

        //der letzte ID wird zurückgegeben
        return true;

    } catch( sql::SQLException &e)
    {
        int code = e.getErrorCode();
        string error = e.what();
        char er[ 1000];
        lstrcpy( er, error.c_str());
        AfxMessageBox( er, MB_OK, 0);
        AfxMessageBox( "Fehler beim Eintragen der Stichprobe. Das Programm wird beendet.\n"
                "Stellen Sie sicher, dass die "
                "Datenbankverbindung verfügbar ist \n"
                "und starten Sie das Programm erneut.", MB_OK, 0);

        exit( 1);
    }


}