/********************************************************************/
/*         Datei / Version|.../tankdaten.cpp    / 1.0                    */
/*        Autor / Erstellt|Christian Hayer / 31.05.2003                */
/*                        |Philipp Eder                                */
/*         Autor / Update|                                            */
/*----------------------|-------------------------------------------*/
/*             Copyright|FHTE - IT2a (Gruppe: PetrolSoft)            */
/*                Internet|http://it.chayer.de/petrolsoft                */
/*                 Email|petrolsoft@it.chayer.de                    */
/*----------------------|-------------------------------------------*/
/*                 Aufgabe|Verwaltung der Tankdaten                    */
/*----------------------|-------------------------------------------*/
/*                 Eingang|Tankdaten                                    */
/*----------------------|-------------------------------------------*/
/*                 Ausgang|Tankdaten und Statistikwerte                */
/*----------------------|-------------------------------------------*/
/* Verwendete Funktionen|OnTankdatenCreate(); OnTankdatenDelete();    */
/*                        |OnTankdatenEdit(); OnTankdatenNext();        */
/*                        |OnTankdatenPrev(); OnCreate();                */
/*                        |OnKillFocus(); OnPaint();                    */
/*----------------------|-------------------------------------------*/
/*     Globale Variablen|db2, frzset2, tdset2, tdanzahl                */
/*----------------------|-------------------------------------------*/
/*        Fehlerbehandlung|Abfangen von falschen Formateingaben        */
/********************************************************************/

/********************************************************************/
/*                                                                    */
/* This program is free software; you can redistribute it and/or    */
/* modify it under the terms of the GNU General Public License as */
/* published by the Free Software Foundation; either version 2    */
/* of the License, or (at your option) any later version.            */
/*                                                                    */
/********************************************************************/

/////////////////////////////////////////////////////////////////////////////
// tankdaten.cpp : implementation file
//

#include "stdafx.h"
#include "Spritkostenverwaltung.h"
#include "tankdaten.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

    CDaoDatabase db2;    // Datenbank-Variable
    CDaoRecordset tdset2(&db2);    // RecordSet für Tankdaten zuweisen
    CDaoRecordset frzset2(&db2);    // RecordSet für Fahrzeuge zuweisen
    long tdanzahl;    // Variable für Anzahl der Fahrzeuge, die in der DB abgelegt sind

/////////////////////////////////////////////////////////////////////////////
// CTankdatenView dialog


CTankdatenView::CTankdatenView(CWnd* pParent /*=NULL*/)
    : CDialog(CTankdatenView::IDD, pParent)
{
    //{{AFX_DATA_INIT(CTankdatenView)
    m_TdAnmerkung = _T("");
    m_TdDatum = COleDateTime::GetCurrentTime();
    m_TdStand = 0;
    m_TdStat_km = _T("");
    m_TdStat_Kosten = _T("");
    m_TdStat_Preis = _T("");
    m_TdStat_Verbrauch = _T("");
    m_TdSpritmenge = 0;
    m_TdID = 0;
    m_TdKosten = 0;
    //}}AFX_DATA_INIT
}


void CTankdatenView::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CTankdatenView)
    DDX_Control(pDX, IDC_TankdatenDelete, m_TdDelete);
    DDX_Control(pDX, IDC_TdStand, m_TdStandC);
    DDX_Control(pDX, IDC_TdSpritmenge, m_TdSpritmengeC);
    DDX_Control(pDX, IDC_TdKosten, m_TdKostenC);
    DDX_Control(pDX, IDC_TdDatum, m_TdDatumC);
    DDX_Control(pDX, IDC_TdAnmerkung, m_TdAnmerkungC);
    DDX_Control(pDX, IDC_TankdatenCreate, m_TdCreate);
    DDX_Control(pDX, IDC_TankdatenPrev, m_TdPrev);
    DDX_Control(pDX, IDC_TankdatenNext, m_TdNext);
    DDX_Control(pDX, IDC_TankdatenEdit, m_TdEdit);
    DDX_Text(pDX, IDC_TdAnmerkung, m_TdAnmerkung);
    DDX_Text(pDX, IDC_TdDatum, m_TdDatum);
    DDX_Text(pDX, IDC_TdStand, m_TdStand);
    DDX_Text(pDX, IDC_TdStat_km, m_TdStat_km);
    DDX_Text(pDX, IDC_TdStat_Kosten, m_TdStat_Kosten);
    DDX_Text(pDX, IDC_TdStat_Preis, m_TdStat_Preis);
    DDX_Text(pDX, IDC_TdStat_Verbrauch, m_TdStat_Verbrauch);
    DDX_Text(pDX, IDC_TdSpritmenge, m_TdSpritmenge);
    DDX_Text(pDX, IDC_TdID, m_TdID);
    DDX_Text(pDX, IDC_TdKosten, m_TdKosten);
    //}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CTankdatenView, CDialog)
    //{{AFX_MSG_MAP(CTankdatenView)
    ON_BN_CLICKED(IDC_TankdatenCreate, OnTankdatenCreate)
    ON_BN_CLICKED(IDC_TankdatenDelete, OnTankdatenDelete)
    ON_BN_CLICKED(IDC_TankdatenEdit, OnTankdatenEdit)
    ON_BN_CLICKED(IDC_TankdatenNext, OnTankdatenNext)
    ON_BN_CLICKED(IDC_TankdatenPrev, OnTankdatenPrev)
    ON_WM_CREATE()
    ON_WM_KILLFOCUS()
    ON_WM_PAINT()
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// Wird beim Aufbau des Dialogs ausgeführt
int CTankdatenView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CDialog::OnCreate(lpCreateStruct) == -1)
        return -1;

    CString    sql;    // locale CString-Variablen
    CString Anmerkung,FrzBezeichnung;    // String-Variablen für Felder
    COleDateTime Datum;    // Variable für Datumsausgabe
    long kmStand,TdID,lastkm;    // long-Variablen für Felder
    float Spritmenge,Kosten;    // int-Variablen für Felder
    int TdDay, TdMonth, TdYear;    // Variablen für Datum/Zeit-Wandlung
    COleVariant var,i_var,d_var;    // Variablen für den Datenaustausch mit der DB
    var.ChangeType(VT_BSTR, NULL);
    i_var.ChangeType(VT_I4, NULL);
    d_var.ChangeType(VT_DATE, NULL);


    db2.Open("PetrolSoft_DB.mdb");    // Datenbank öffnen
    sql.Format(_T("SELECT * FROM Tankdaten WHERE Fahrzeug_ID = %d ORDER BY kmStand"),searchID);
    tdset2.Open(AFX_DAO_USE_DEFAULT_TYPE,sql,NULL);        // RecordSet für Tankdatenöffnen
    sql.Format(_T("SELECT * FROM Fahrzeugdaten WHERE Fahrzeug_ID = %d"),searchID);
    frzset2.Open(AFX_DAO_USE_DEFAULT_TYPE,sql,NULL);    // RecordSet für Fahrzeugdaten öffnen

    // Auslesen der Fahrzeugdaten aus dem RecordSet
    frzset2.GetFieldValue("Fahrzeugbezeichnung",var);
    FrzBezeichnung = (LPCSTR)var.pbstrVal;
    FrzBezeichnung = "Tankdaten - " + FrzBezeichnung;
    SetWindowText(FrzBezeichnung);    // Dialog-Caption schreiben

    if(!tdset2.IsEOF()) // If not EOF
    {
        tdset2.MoveLast();    // gehe zum letzten Datensatz

        tdanzahl = tdset2.GetAbsolutePosition();    // bestimmen der Anzahl der Datensätze

        // Auslesen der Tankdaten aus dem RecordSet
        tdset2.GetFieldValue("Tank_ID",i_var);
        TdID = (long)i_var.lVal;
        tdset2.GetFieldValue("Datum",d_var);
        Datum = COleDateTime(d_var);
        tdset2.GetFieldValue("kmStand",i_var);
        kmStand = (long)i_var.lVal;
        tdset2.GetFieldValue("Spritmenge",i_var);
        Spritmenge = (float)i_var.dblVal;
        tdset2.GetFieldValue("Kosten",i_var);
        Kosten = (float)i_var.dblVal;
        tdset2.GetFieldValue("Anmerkung",var);
        if (var.vt != 1) Anmerkung = (LPCSTR)var.pbstrVal;

        // Variablen den Feldern zuweisen
        m_TdDatum = Datum;
        m_TdStand = kmStand;
        m_TdSpritmenge = Spritmenge;
        m_TdKosten = Kosten;
        m_TdAnmerkung = Anmerkung;
        m_TdID = TdID;

        if (tdset2.GetAbsolutePosition() > 0)
        {
            tdset2.MovePrev();
            tdset2.GetFieldValue("kmStand",i_var);
            lastkm = (long)i_var.lVal;
            tdset2.MoveNext();
        }
        else
        {
            frzset2.GetFieldValue("kmStand",i_var);
            lastkm = (long)i_var.lVal;
        }
    
        // Statistikwerte ausgeben
        m_TdStat_Preis.Format(_T("%5.2f €"),(Kosten/Spritmenge));
        m_TdStat_km.Format(_T("%d km"),(kmStand-lastkm));
        m_TdStat_Verbrauch.Format(_T("%5.2f l"),(Spritmenge/(kmStand-lastkm)*100));
        m_TdStat_Kosten.Format(_T("%5.2f €"),(Kosten/(kmStand-lastkm)*100));
    }
    else    // wenn kein Datensatz vorhanden ist => Meldung ausgeben
    {
        AfxMessageBox(_T("Für dieses Fahrzeug stehen noch keine Tankdaten zur Verfügung."));
        m_TdDatum = COleDateTime::GetCurrentTime();
        TdDay = m_TdDatum.GetDay();
        TdMonth = m_TdDatum.GetMonth();
        TdYear = m_TdDatum.GetYear();
        m_TdDatum.SetDate(TdYear,TdMonth,TdDay);
    }

    frzset2.Close();    // RecordSet für Fahrzeugdaten schließen

    return 0;
}

/////////////////////////////////////////////////////////////////////////////
// Wird beim Zeichnen des Dialogs ausgeführt
void CTankdatenView::OnPaint()
{
    CPaintDC dc(this); // device context for painting

    if (tdset2.GetAbsolutePosition() == -1)    // wenn kein Datensatz vorhanden
    {
        m_TdNext.EnableWindow(FALSE);
        m_TdPrev.EnableWindow(FALSE);
        m_TdDelete.EnableWindow(FALSE);
        m_TdEdit.EnableWindow(FALSE);
    }
    else
    {
        m_TdDelete.EnableWindow(TRUE);
        m_TdEdit.EnableWindow(TRUE);
    }
    if (tdset2.GetAbsolutePosition() == 0)    // wenn beim 1. Datensatz
    {
        m_TdPrev.EnableWindow(FALSE);
    }
    
    if (tdset2.GetAbsolutePosition() == tdanzahl)    // wenn beim letzten Datensatz
    {
        m_TdNext.EnableWindow(FALSE);
    }
}    // OnPaint()

/////////////////////////////////////////////////////////////////////////////
// Wird beim "Schließen" des Dialogs ausgeführt
void CTankdatenView::OnKillFocus(CWnd* pNewWnd)
{
    CDialog::OnKillFocus(pNewWnd);
    tdset2.Close();    // RecordSet für Tankdaten schließen
    db2.Close();    // Datenbank schließen
}    // OnKillFocus()

/////////////////////////////////////////////////////////////////////////////
// Anlegen eines neuen Tankdaten-Datensatzes
void CTankdatenView::OnTankdatenCreate()
{
    CString sql,status,msg;    // locale CString-Variablen
    int TdDay, TdMonth, TdYear;    // Variablen für Datum/Zeit-Wandlung
    long kmStand,TdID,lastkm;    // long-Variablen für Felder
    float Spritmenge,Kosten;    // int-Variablen für Felder
    BOOL fehler = 0;        // Variable für Fehlerauswertung
    COleVariant i_var;        // Variable für Austausch mit RecSet (DB)
    i_var.ChangeType(VT_R4, NULL);

    GetDlgItemText(IDC_TankdatenCreate,status);
    if (status=="Neu Anlegen")    // In Neu Anlegen Modus wechseln
    {
        // Felder und Buttons auf Ausgangswerte setzten
        UpdateData(TRUE);
        m_TdDatum = COleDateTime::GetCurrentTime();
        TdDay = m_TdDatum.GetDay();
        TdMonth = m_TdDatum.GetMonth();
        TdYear = m_TdDatum.GetYear();
        m_TdDatum.SetDate(TdYear,TdMonth,TdDay);
        m_TdID = 0;
        m_TdStand = 0;
        m_TdSpritmenge = 0;
        m_TdKosten = 0;
        m_TdAnmerkung = _T("");
        m_TdNext.EnableWindow(FALSE);
        m_TdPrev.EnableWindow(FALSE);
        m_TdDatumC.SetReadOnly(FALSE);
        m_TdStandC.SetReadOnly(FALSE);
        m_TdSpritmengeC.SetReadOnly(FALSE);
        m_TdKostenC.SetReadOnly(FALSE);
        m_TdAnmerkungC.SetReadOnly(FALSE);
        m_TdEdit.EnableWindow(FALSE);
        m_TdDelete.EnableWindow(FALSE);
        UpdateData(FALSE);

        SetDlgItemText(IDC_TankdatenCreate,"Speichern");
    }
    else    // Speichern und in Anzeigemodus wechseln
    {
        tdset2.AddNew();    // Neuen Datensatz am Ende des RecordSet anfügen
        
        if (UpdateData(TRUE) == 0) return;    // wenn UpdateData nicht erfolgreich Abbruch

        msg = "Es wurden nicht alle Felder ausgefüllt:\n";
        if (!m_TdDatum)    // Fehler wenn keinDatum eingegeben wurde
        {
            msg += "- Tankdatum\n";
            fehler = 1;
        }
        if (!m_TdStand)    // Fehler wenn kein km-Stand eingegeben wurde
        {
            msg += "- kmStand\n";
            fehler = 1;
        }
        if (!m_TdSpritmenge)    // Fehler wenn keine Spritmenge eingegeben wurde
        {
            msg += "- Spritmenge\n";
            fehler = 1;
        }
        if (!m_TdKosten)    // Fehler wenn keine Kosten eingegeben wurde
        {
            msg += "- Kosten\n";
            fehler = 1;
        }
        if (fehler)    // Wenn Fehler, entsprechende Fehlermeldung ausgeben
        {
            AfxMessageBox(msg);    // Fehlermeldung ausgeben
            return;
        }

        // Daten in RecordSet schreiben
        tdset2.SetFieldValue("Fahrzeug_ID",(long)searchID);
        tdset2.SetFieldValue("Datum",m_TdDatum);
        tdset2.SetFieldValue("kmStand",(long)m_TdStand);
        tdset2.SetFieldValue("Spritmenge",(float)m_TdSpritmenge);
        tdset2.SetFieldValue("Kosten",(float)m_TdKosten);
        if ((CString)m_TdAnmerkung != "") tdset2.SetFieldValue("Anmerkung",(LPCSTR)m_TdAnmerkung);

        // Felder und Buttons aktualisieren
        UpdateData(FALSE);
        kmStand = (long)m_TdStand;
        Spritmenge = (float)m_TdSpritmenge;
        Kosten = (float)m_TdKosten;


        tdset2.Update();    // Datenbank mit RecordSet abgleichen

        tdanzahl = tdanzahl + 1;    // Anzahl der Datensätze um eins erhöhen
        
        tdset2.MoveLast();    // gehe zum letzten Datensatz
        
        AfxMessageBox(_T("Neue Tankdaten wurde angelegt."));
        tdset2.GetFieldValue("Tank_ID",i_var);    // Fahrzeug_ID aus RecSet auslesen
        TdID = i_var.lVal;

        if (tdset2.GetAbsolutePosition() > 0)    // Wenn nicht auf ersten Datensatz
        {
            m_TdPrev.EnableWindow(TRUE);    // Button << aktivieren
        }

        UpdateData(TRUE);
        m_TdID = TdID;

        if (tdset2.GetAbsolutePosition() > 0)    // wenn nicht erster Datensatz
        {
            tdset2.MovePrev();    // gehe zum vorherigen Datensatz
            tdset2.GetFieldValue("kmStand",i_var);    // lese km-Stand aus
            lastkm = (long)i_var.lVal;    // km-Stand als vorheriger km-Stand setzen
            tdset2.MoveNext();    // gehe wieder zum nächsten Datensatz
        }
        else    // wenn auf erstem Datensatz wir km-Stand aus Fahrzeugdaten gelesen
        {
            sql.Format(_T("SELECT * FROM Fahrzeugdaten WHERE Fahrzeug_ID = %d"),searchID);
            frzset2.Open(AFX_DAO_USE_DEFAULT_TYPE,sql,NULL);    // öffnen des Fahrzeug-RecordSet
            frzset2.GetFieldValue("kmStand",i_var);    // km-Stand auslesen
            lastkm = (long)i_var.lVal;    // km-Stand als vorheriger km-Stand setzen
            frzset2.Close();    // Fahrzeug-RecordSet schließen
        }

        // Statistikwerte ausgeben
        m_TdStat_Preis.Format(_T("%5.2f €"),(Kosten/Spritmenge));
        m_TdStat_km.Format(_T("%d km"),(kmStand-lastkm));
        m_TdStat_Verbrauch.Format(_T("%5.2f l"),(Spritmenge/(kmStand-lastkm)*100));
        m_TdStat_Kosten.Format(_T("%5.2f €"),(Kosten/(kmStand-lastkm)*100));

        // Felder auf nur lesbar schalten
        m_TdDatumC.SetReadOnly(TRUE);
        m_TdStandC.SetReadOnly(TRUE);
        m_TdSpritmengeC.SetReadOnly(TRUE);
        m_TdKostenC.SetReadOnly(TRUE);
        m_TdAnmerkungC.SetReadOnly(TRUE);
        m_TdEdit.EnableWindow(TRUE);
        m_TdDelete.EnableWindow(TRUE);
        UpdateData(FALSE);

        SetDlgItemText(IDC_TankdatenCreate,"Neu Anlegen");
    }
}    // OnTankdatenCreate()

/////////////////////////////////////////////////////////////////////////////
// Einen vorhandenen Tankdaten-Datensatz editieren
void CTankdatenView::OnTankdatenEdit()
{
    CString sql,status,msg;    // locale CString-Variablen
    long kmStand,lastkm;    // int-Variablen
    float Spritmenge,Kosten;    // float-Variablen
    BOOL fehler = 0;    // Variable für die locale Fehlerauswertung
    COleVariant i_var;    // Variable für Austausch mit RecSet (DB)
    i_var.ChangeType(VT_R4, NULL);

    GetDlgItemText(IDC_TankdatenEdit,status);
    if (status=="Ändern")    // In Editiermodus wechseln
    {
        // Felder auf editierbar stellen
        m_TdDatumC.SetReadOnly(FALSE);
        m_TdStandC.SetReadOnly(FALSE);
        m_TdSpritmengeC.SetReadOnly(FALSE);
        m_TdKostenC.SetReadOnly(FALSE);
        m_TdAnmerkungC.SetReadOnly(FALSE);
        SetDlgItemText(IDC_TankdatenEdit,"Speichern");
    }
    else    // Speichern und in Anzeigemodus wechseln
    {
        if (UpdateData(TRUE) == 0) return;    // wenn UpdateData nicht erfolgreich Abbruch
        msg = "Es wurden nicht alle Felder ausgefüllt:\n";
        if (!m_TdDatum)    // Fehler wenn keinDatum eingegeben wurde
        {
            msg += "- Tankdatum\n";
            fehler = 1;
        }
        if (!m_TdStand)    // Fehler wenn kein km-Stand eingegeben wurde
        {
            msg += "- kmStand\n";
            fehler = 1;
        }
        if (!m_TdSpritmenge)    // Fehler wenn keine Spritmenge eingegeben wurde
        {
            msg += "- Spritmenge\n";
            fehler = 1;
        }
        if (!m_TdKosten)    // Fehler wenn keine Kosten eingegeben wurde
        {
            msg += "- Kosten\n";
            fehler = 1;
        }
        if (fehler)    // Wenn Fehler, entsprechende Fehlermeldung ausgeben
        {
            AfxMessageBox(msg);    // Fehlermeldung ausgeben
            return;
        }
        tdset2.Edit();    // RecordSet mit Felddaten abgleichen

        // RecordSet mit Felddaten abgleichen
        tdset2.SetFieldValue("Datum",m_TdDatum);
        tdset2.SetFieldValue("kmStand",(long)m_TdStand);
        tdset2.SetFieldValue("Spritmenge",(float)m_TdSpritmenge);
        tdset2.SetFieldValue("Kosten",(float)m_TdKosten);

        kmStand = (long)m_TdStand;
        Spritmenge = (float)m_TdSpritmenge;
        Kosten = (float)m_TdKosten;

        if ((CString)m_TdAnmerkung != "") tdset2.SetFieldValue("Anmerkung",(LPCSTR)m_TdAnmerkung);
        else tdset2.SetFieldValueNull("Anmerkung");

        tdset2.Update();    // Datenbank mit RecordSet abgleichen

        if (tdset2.GetAbsolutePosition() > 0)    // wenn nicht erster Datensatz
        {
            tdset2.MovePrev();    // gehe zum vorherigen Datensatz
            tdset2.GetFieldValue("kmStand",i_var);    // lese km-Stand aus
            lastkm = (long)i_var.lVal;    // km-Stand als vorheriger km-Stand setzen
            tdset2.MoveNext();    // gehe wieder zum nächsten Datensatz
        }
        else    // wenn auf erstem Datensatz wir km-Stand aus Fahrzeugdaten gelesen
        {
            sql.Format(_T("SELECT * FROM Fahrzeugdaten WHERE Fahrzeug_ID = %d"),searchID);
            frzset2.Open(AFX_DAO_USE_DEFAULT_TYPE,sql,NULL);    // öffnen des Fahrzeug-RecordSet
            frzset2.GetFieldValue("kmStand",i_var);    // km-Stand auslesen
            lastkm = (long)i_var.lVal;    // km-Stand als vorheriger km-Stand setzen
            frzset2.Close();    // Fahrzeug-RecordSet schließen
        }

        // Statistikwerte ausgeben
        m_TdStat_Preis.Format(_T("%5.2f €"),(Kosten/Spritmenge));
        m_TdStat_km.Format(_T("%d km"),(kmStand-lastkm));
        m_TdStat_Verbrauch.Format(_T("%5.2f l"),(Spritmenge/(kmStand-lastkm)*100));
        m_TdStat_Kosten.Format(_T("%5.2f €"),(Kosten/(kmStand-lastkm)*100));

        // Felder auf nur lesbar setzen
        m_TdDatumC.SetReadOnly(TRUE);
        m_TdStandC.SetReadOnly(TRUE);
        m_TdSpritmengeC.SetReadOnly(TRUE);
        m_TdKostenC.SetReadOnly(TRUE);
        m_TdAnmerkungC.SetReadOnly(TRUE);
        UpdateData(FALSE);
        OnPaint();    // Button aktualisieren
        AfxMessageBox(_T("Tankdatendaten wurde geändert."));
        SetDlgItemText(IDC_TankdatenEdit,"Ändern");
    }
}    // OnTankdatenEdit()

/////////////////////////////////////////////////////////////////////////////
// Im RecordSet einen Tankdaten-Datensatz nach vorne gehen
void CTankdatenView::OnTankdatenNext()
{
    CString Anmerkung;    // String-Variablen für Felder
    COleDateTime Datum;    // Variable für Datumsausgabe
    long kmStand,TdID,lastkm;    // long-Variablen für Felder
    float Spritmenge,Kosten;    // int-Variablen für Felder
    COleVariant var,i_var,d_var;    // Variablen für den Datenaustausch mit der DB
    var.ChangeType(VT_BSTR, NULL);
    i_var.ChangeType(VT_I4, NULL);
    d_var.ChangeType(VT_DATE, NULL);
    tdset2.MoveNext();    // gehe zum nächsten Datensatz

    if (tdanzahl == tdset2.GetAbsolutePosition())    // wenn beim letzten Datensatz Button >> deaktivieren
    {
        m_TdNext.EnableWindow(FALSE);
    }

    // Werte aus dem RecordSet auslesen
    tdset2.GetFieldValue("Tank_ID",i_var);
    TdID = (long)i_var.lVal;
    tdset2.GetFieldValue("Datum",d_var);
    Datum = COleDateTime(d_var);
    tdset2.GetFieldValue("kmStand",i_var);
    kmStand = (long)i_var.lVal;
    tdset2.GetFieldValue("Spritmenge",i_var);
    Spritmenge = (float)i_var.dblVal;
    tdset2.GetFieldValue("Kosten",i_var);
    Kosten = (float)i_var.dblVal;
    tdset2.GetFieldValue("Anmerkung",var);
    if (var.vt != 1) Anmerkung = (LPCSTR)var.pbstrVal;

    // Felder und Buttons aktualisieren
    UpdateData(TRUE);
    m_TdDatum = Datum;
    m_TdStand = kmStand;
    m_TdSpritmenge = Spritmenge;
    m_TdKosten = Kosten;
    m_TdAnmerkung = Anmerkung;
    m_TdID = TdID;

    tdset2.MovePrev();    // gehe zum vorherigen Datensatz
    tdset2.GetFieldValue("kmStand",i_var);    // lese km-Stand aus
    lastkm = (long)i_var.lVal;    // km-Stand als vorheriger km-Stand setzen
    tdset2.MoveNext();    // gehe wieder zum nächsten Datensatz

    // Statistikwerte ausgeben
    m_TdStat_Preis.Format(_T("%5.2f €"),(Kosten/Spritmenge));
    m_TdStat_km.Format(_T("%d km"),(kmStand-lastkm));
    m_TdStat_Verbrauch.Format(_T("%5.2f l"),(Spritmenge/(kmStand-lastkm)*100));
    m_TdStat_Kosten.Format(_T("%5.2f €"),(Kosten/(kmStand-lastkm)*100));

    m_TdPrev.EnableWindow(TRUE);
    UpdateData(FALSE);
}    // OnTankdatenNext()

/////////////////////////////////////////////////////////////////////////////
// Im RecordSet einen Tankdaten-Datensatz nach hinten gehen
void CTankdatenView::OnTankdatenPrev()
{
    CString    sql;    // locale CString-Variablen
    CString Anmerkung;    // String-Variablen für Felder
    COleDateTime Datum;    // Variable für Datumsausgabe
    long kmStand,TdID,lastkm;    // long-Variablen für Felder
    float Spritmenge,Kosten;    // int-Variablen für Felder
    COleVariant var,i_var,d_var;    // Variablen für den Datenaustausch mit der DB
    var.ChangeType(VT_BSTR, NULL);
    i_var.ChangeType(VT_I4, NULL);
    d_var.ChangeType(VT_DATE, NULL);
    
    tdset2.MovePrev();    // gehe zum vorherigen Datensatz
    if (tdset2.GetAbsolutePosition() == 0)    // wenn beim ersten Datensatz Button << deaktivieren
    {
        m_TdPrev.EnableWindow(FALSE);
    }

    // Werte aus dem RecordSet auslesen
    tdset2.GetFieldValue("Tank_ID",i_var);
    TdID = (long)i_var.lVal;
    tdset2.GetFieldValue("Datum",d_var);
    Datum = COleDateTime(d_var);
    tdset2.GetFieldValue("kmStand",i_var);
    kmStand = (long)i_var.lVal;
    tdset2.GetFieldValue("Spritmenge",i_var);
    Spritmenge = (float)i_var.dblVal;
    tdset2.GetFieldValue("Kosten",i_var);
    Kosten = (float)i_var.dblVal;
    tdset2.GetFieldValue("Anmerkung",var);
    if (var.vt != 1) Anmerkung = (LPCSTR)var.pbstrVal;

    // Felder und Buttons aktualisieren
    UpdateData(TRUE);
    m_TdDatum = Datum;
    m_TdStand = kmStand;
    m_TdSpritmenge = Spritmenge;
    m_TdKosten = Kosten;
    m_TdAnmerkung = Anmerkung;
    m_TdID = TdID;
    
    if (tdset2.GetAbsolutePosition() > 0)    // wenn nicht erster Datensatz
    {
        tdset2.MovePrev();    // gehe zum vorherigen Datensatz
        tdset2.GetFieldValue("kmStand",i_var);    // lese km-Stand aus
        lastkm = (long)i_var.lVal;    // km-Stand als vorheriger km-Stand setzen
        tdset2.MoveNext();    // gehe wieder zum nächsten Datensatz
    }
    else    // wenn auf erstem Datensatz wir km-Stand aus Fahrzeugdaten gelesen
    {
        sql.Format(_T("SELECT * FROM Fahrzeugdaten WHERE Fahrzeug_ID = %d"),searchID);
        frzset2.Open(AFX_DAO_USE_DEFAULT_TYPE,sql,NULL);    // öffnen des Fahrzeug-RecordSet
        frzset2.GetFieldValue("kmStand",i_var);    // km-Stand auslesen
        lastkm = (long)i_var.lVal;    // km-Stand als vorheriger km-Stand setzen
        frzset2.Close();    // Fahrzeug-RecordSet schließen
    }

    // Statistikwerte ausgeben
    m_TdStat_Preis.Format(_T("%5.2f €"),(Kosten/Spritmenge));
    m_TdStat_km.Format(_T("%d km"),(kmStand-lastkm));
    m_TdStat_Verbrauch.Format(_T("%5.2f l"),(Spritmenge/(kmStand-lastkm)*100));
    m_TdStat_Kosten.Format(_T("%5.2f €"),(Kosten/(kmStand-lastkm)*100));

    m_TdNext.EnableWindow(TRUE);
    UpdateData(FALSE);
}    // OnTankdatenPrev()

/////////////////////////////////////////////////////////////////////////////
// Ein Tankdaten aus der Datenbank löschen (Tankdaten werden auch gelöscht)
void CTankdatenView::OnTankdatenDelete()
{
    CString    sql,lDatum;    // locale CString-Variablen
    int msg;    // Variable für die Abfrage der Messagebox
    CString Anmerkung;    // String-Variablen für Felder
    COleDateTime Datum;    // Variable für Datumsausgabe
    long kmStand,TdID,lastkm;    // long-Variablen für Felder
    float Spritmenge,Kosten;    // int-Variablen für Felder
    int TdDay, TdMonth, TdYear;    // Variablen für Datum/Zeit-Wandlung
    COleVariant var,i_var,d_var;    // Variablen für den Datenaustausch mit der DB
    var.ChangeType(VT_BSTR, NULL);
    i_var.ChangeType(VT_I4, NULL);
    d_var.ChangeType(VT_DATE, NULL);

    GetDlgItemText(IDC_TdDatum,lDatum);    // Datum des Datensatzes auslesen

    msg = AfxMessageBox(_T("Sollen die Tankdaten vom " + lDatum +" wirklich gelöscht werden?"),MB_OKCANCEL);
    if (msg == 1)    // Wenn Meldung mit OK bestätigt, wird der Datensatz gelöscht
    {
        tdset2.Delete();    // aktuellen Datensatz löschen

        tdanzahl = tdanzahl - 1 ;    // Anzahl der Tankdaten um eins verringern
        if (tdanzahl > 0)    // wenn noch Daten vorhanden sind, entsprechende Werte ausgeben
        {
            tdset2.MoveLast();    // gehe zum letzten Datensatz
            // Werte aus dem RecordSet auslesen
            tdset2.GetFieldValue("Tank_ID",i_var);
            TdID = (long)i_var.lVal;
            tdset2.GetFieldValue("Datum",d_var);
            Datum = COleDateTime(d_var);
            tdset2.GetFieldValue("kmStand",i_var);
            kmStand = (long)i_var.lVal;
            tdset2.GetFieldValue("Spritmenge",i_var);
            Spritmenge = (float)i_var.dblVal;
            tdset2.GetFieldValue("Kosten",i_var);
            Kosten = (float)i_var.dblVal;
            tdset2.GetFieldValue("Anmerkung",var);
            if (var.vt != 1) Anmerkung = (LPCSTR)var.pbstrVal;

            if (tdset2.GetAbsolutePosition() > 0)    // wenn nicht erster Datensatz
            {
                tdset2.MovePrev();    // gehe zum vorherigen Datensatz
                tdset2.GetFieldValue("kmStand",i_var);    // lese km-Stand aus
                lastkm = (long)i_var.lVal;    // km-Stand als vorheriger km-Stand setzen
                tdset2.MoveNext();    // gehe wieder zum nächsten Datensatz
            }
            else    // wenn auf erstem Datensatz wir km-Stand aus Fahrzeugdaten gelesen
            {
                sql.Format(_T("SELECT * FROM Fahrzeugdaten WHERE Fahrzeug_ID = %d"),searchID);
                frzset2.Open(AFX_DAO_USE_DEFAULT_TYPE,sql,NULL);    // öffnen des Fahrzeug-RecordSet
                frzset2.GetFieldValue("kmStand",i_var);    // km-Stand auslesen
                lastkm = (long)i_var.lVal;    // km-Stand als vorheriger km-Stand setzen
                frzset2.Close();    // Fahrzeug-RecordSet schließen
            }
            // Statistikwerte ausgeben
            UpdateData(TRUE);
            m_TdStat_Preis.Format(_T("%5.2f €"),(Kosten/Spritmenge));
            m_TdStat_km.Format(_T("%d km"),(kmStand-lastkm));
            m_TdStat_Verbrauch.Format(_T("%5.2f l"),(Spritmenge/(kmStand-lastkm)*100));
            m_TdStat_Kosten.Format(_T("%5.2f €"),(Kosten/(kmStand-lastkm)*100));
            UpdateData(FALSE);
        }
        else// Wenn kein Datensatz vorhanden, entsprechende Ausgabe der Felder
        {
            TdID = 0;
            Datum = COleDateTime::GetCurrentTime();    // Datum auf heute setzen
            TdDay = m_TdDatum.GetDay();
            TdMonth = m_TdDatum.GetMonth();
            TdYear = m_TdDatum.GetYear();
            Datum.SetDate(TdYear,TdMonth,TdDay);
            kmStand = 0;
            Spritmenge = 0;
            Kosten = 0;
            Anmerkung = "keine Tankdaten vorhanden !";

            UpdateData(TRUE);
            m_TdStat_Preis.Format(_T(" €"));
            m_TdStat_km.Format(_T(" km"));
            m_TdStat_Verbrauch.Format(_T(" l"));
            m_TdStat_Kosten.Format(_T(" €"));
            UpdateData(FALSE);
        }
        OnPaint();    // Button aktualisieren

    // Felder und Buttons aktualisieren
    UpdateData(TRUE);
    m_TdDatum = Datum;
    m_TdStand = kmStand;
    m_TdSpritmenge = Spritmenge;
    m_TdKosten = Kosten;
    m_TdAnmerkung = Anmerkung;
    m_TdID = TdID;
    m_TdPrev.EnableWindow(TRUE);
    m_TdDatumC.SetReadOnly(TRUE);
    m_TdStandC.SetReadOnly(TRUE);
    m_TdSpritmengeC.SetReadOnly(TRUE);
    m_TdKostenC.SetReadOnly(TRUE);
    m_TdAnmerkungC.SetReadOnly(TRUE);
    UpdateData(FALSE);
    }
}    // OnTankdatenDelete()