/********************************************************************/
/*         Datei / Version|.../auswertung.cpp    / 1.0                    */
/*        Autor / Erstellt|Christian Hayer / 31.05.2003                */
/*                        |Michael Luik                                */
/*         Autor / Update|                                            */
/*----------------------|-------------------------------------------*/
/*             Copyright|FHTE - IT2a (Gruppe: PetrolSoft)            */
/*                Internet|http://it.chayer.de/petrolsoft                */
/*                 Email|petrolsoft@it.chayer.de                    */
/*----------------------|-------------------------------------------*/
/*                 Aufgabe|Berechnung und Ausgabe von Statistikwerten    */
/*----------------------|-------------------------------------------*/
/*                 Eingang|keine                                        */
/*----------------------|-------------------------------------------*/
/*                 Ausgang|Tankdaten mit Statistikwerten                */
/*----------------------|-------------------------------------------*/
/* Verwendete Funktionen|OnKillFocus(); OnCreate(); OnInitDialog()    */
/*----------------------|-------------------------------------------*/
/*     Globale Variablen|db3, tdset3, start_kmStand                    */
/*----------------------|-------------------------------------------*/
/*        Fehlerbehandlung|keine                                        */
/********************************************************************/

/********************************************************************/
/*                                                                    */
/* 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.            */
/*                                                                    */
/********************************************************************/

/////////////////////////////////////////////////////////////////////////////
// Auswertung.cpp : implementation file
//

#include "stdafx.h"
#include "Spritkostenverwaltung.h"
#include "SpritkostenverwaltungView.h"
#include "Auswertung.h"

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

    CDaoDatabase db3;        // Datenbank-Variable
    CDaoRecordset tdset3(&db3);    // RecordSet zuweisen
    long Start_kmStand;        // Variable für Berechnung von diversen Statistikwerten

/////////////////////////////////////////////////////////////////////////////
// CAuswertung dialog


CAuswertungView::CAuswertungView(CWnd* pParent /*=NULL*/)
    : CDialog(CAuswertungView::IDD, pParent)
{
    //{{AFX_DATA_INIT(CAuswertungView)
    m_FrzBesitzer = _T("");
    m_FrzBezeichnung = _T("");
    m_FrzDaten = _T("");
    m_km_ges = _T("");
    m_kosten_ges = _T("");
    m_kosten_schnitt = _T("");
    m_preis_schnitt = _T("");
    m_sprit_ges = _T("");
    m_sprit_schnitt = _T("");
    //}}AFX_DATA_INIT
}

BEGIN_MESSAGE_MAP(CAuswertungView, CDialog)
    //{{AFX_MSG_MAP(CAuswertungView)
    ON_WM_CREATE()
    ON_WM_KILLFOCUS()
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()


void CAuswertungView::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CAuswertungView)
    DDX_Control(pDX, IDC_Tankdaten, m_TankdatenC);
    DDX_Text(pDX, IDC_FrzBesitzer, m_FrzBesitzer);
    DDX_Text(pDX, IDC_FrzBezeichnung, m_FrzBezeichnung);
    DDX_Text(pDX, IDC_FrzDaten, m_FrzDaten);
    DDX_Text(pDX, IDC_TD_km_ges, m_km_ges);
    DDX_Text(pDX, IDC_TD_Kosten_ges, m_kosten_ges);
    DDX_Text(pDX, IDC_TD_Kosten_schnitt, m_kosten_schnitt);
    DDX_Text(pDX, IDC_TD_Preis_schnitt, m_preis_schnitt);
    DDX_Text(pDX, IDC_TD_Sprit_ges, m_sprit_ges);
    DDX_Text(pDX, IDC_TD_Sprit_schnitt, m_sprit_schnitt);
    //}}AFX_DATA_MAP
}


/////////////////////////////////////////////////////////////////////////////
// CAuswertung message handlers

/////////////////////////////////////////////////////////////////////////////
// Wird beim Aufruf des Dialogs ausgeführt
int CAuswertungView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CDialog::OnCreate(lpCreateStruct) == -1)
        return -1;
    
    CString    sql,Titeltext;    // locale CString Variablen
    CString FrzID,Fahrzeug,Besitzer,Fahrzeugdaten,Anmerkung;    // Variablen für Felder
    COleVariant var;    // Variable für Datenaustausch mit RecordSet
    var.ChangeType(VT_BSTR, NULL);

    db3.Open("PetrolSoft_DB.mdb");    // Datenbank öffnen

    sql.Format(_T("SELECT * FROM Fahrzeugdaten WHERE Fahrzeug_ID = %d"),searchID);

    tdset3.Open(AFX_DAO_USE_DEFAULT_TYPE,sql,NULL);    // RecordSet mit Fahrzeugdaten öffnen
    
    if(!tdset3.IsEOF()) // If not EOF
    {
        // Fahrzeugdaten aud RecSet auslesen
        tdset3.GetFieldValue("Fahrzeugbezeichnung",var);
        Fahrzeug = (LPCSTR)var.pbstrVal;
        tdset3.GetFieldValue("Fahrzeugdaten",var);
        Fahrzeugdaten = (LPCSTR)var.pbstrVal;
        tdset3.GetFieldValue("Besitzer",var);
        Besitzer = (LPCSTR)var.pbstrVal;
        tdset3.GetFieldValue("kmStand",var);
        Start_kmStand = (long)var.lVal;

        // Variablen den Feldern zuweisen
        m_FrzBezeichnung = Fahrzeug;
        m_FrzBesitzer = Besitzer;
        m_FrzDaten = Fahrzeugdaten;

        Titeltext = "Auswertung der Tankdaten - " + Fahrzeug;
        SetWindowText(Titeltext);    // Dialog-Caption schreiben

    }
    tdset3.Close();    // RecordSet der Fahrzeuge schließen

    return 0;
}    // OnCreate()

/////////////////////////////////////////////////////////////////////////////
// Wird beim "Schließen" des Dialogs ausgeführt
void CAuswertungView::OnKillFocus(CWnd* pNewWnd)
{
    CDialog::OnKillFocus(pNewWnd);
    tdset3.Close();    // RecordSet schließen
    db3.Close();    // Datenbank schließen
}    // OnKillFocus()

/////////////////////////////////////////////////////////////////////////////
// wird beim initialisieren des Dialogs ausgeführt
BOOL CAuswertungView::OnInitDialog()
{
    CDialog::OnInitDialog();
    
    // Spalten in die Listbox einfügen
    m_TankdatenC.InsertColumn(0,"Datum",LVCFMT_RIGHT,68,LVCFMT_CENTER); // Spalte für Datum anlagen
    m_TankdatenC.InsertColumn(1,"km-Stand",LVCFMT_RIGHT,80,LVCFMT_CENTER); // Spalte für km-Stand anlagen
    m_TankdatenC.InsertColumn(2,"Spritmenge",LVCFMT_RIGHT,70,LVCFMT_CENTER); // Spalte für Spritmenge anlagen
    m_TankdatenC.InsertColumn(3,"Kosten",LVCFMT_RIGHT,70,LVCFMT_CENTER); // Spalte für Spritkosten anlagen
    m_TankdatenC.InsertColumn(4,"gefahren km",LVCFMT_RIGHT,80,LVCFMT_CENTER); // Spalte für gefahrene Strecke anlagen
    m_TankdatenC.InsertColumn(5,"Verbrauch/100km",LVCFMT_RIGHT,100,LVCFMT_CENTER); // Spalte für Verbrauch anlagen
    m_TankdatenC.InsertColumn(6,"Kosten/100km",LVCFMT_RIGHT,85,LVCFMT_CENTER); // Spalte für Kosten anlagen

    ListView_SetExtendedListViewStyle(m_TankdatenC,LVS_EX_GRIDLINES); // Gitternetz einfügen
    
    RefreshList();    // List mit Werten füllen

    return TRUE;
}    // OnInitDialog()

/////////////////////////////////////////////////////////////////////////////
// Liste aktualisieren
void CAuswertungView::RefreshList()
{
    COleVariant var,i_var,c_var,d_var; // Variablen für den Datenaustausch mit der DB
    var.ChangeType(VT_BSTR, NULL);
    i_var.ChangeType(VT_R4, NULL);
    d_var.ChangeType(VT_DATE, NULL);
    CString sql,strItem;    // locale CString-Variablen
    CString Datum,Stand;    // Variablen für Listenausgabe
    int i=0;                // locale int-Variable
    long last_Stand=0, gefahrene_km;    // long-Variablen für Listenausgabe
    float Spritmenge,Spritkosten;    // float-Variablen für Listenausgabe
    float Spritmenge_ges=0, Kosten_ges=0, km_ges=0, preis_schnitt, kosten_schnitt, sprit_schnitt;    // float-Variablen für Statistikwerte

    m_TankdatenC.DeleteAllItems(); // Listbox zurücksetzen

    sql.Format(_T("SELECT * FROM Tankdaten WHERE Fahrzeug_ID = %d ORDER BY kmStand"),searchID);    // Tankdaten zu dem ausgewählten Fahrzeug aus DB lesen

    tdset3.Open(AFX_DAO_USE_DEFAULT_TYPE,sql,NULL);    // RecordSet öffnen

    while(!tdset3.IsEOF()) // bis zum Ende des RecordSet ausführen
    {
        // Werte aus dem RecordSet auslesen
        tdset3.GetFieldValue("Datum",d_var);
        Datum = COleDateTime(d_var).Format();
        m_TankdatenC.InsertItem(0,Datum,0);
        tdset3.GetFieldValue("kmStand",i_var);
        strItem.Format(_T("%d km"), i_var.lVal);
        m_TankdatenC.SetItemText(0,1,strItem);
        if (last_Stand == 0) last_Stand = Start_kmStand;
        gefahrene_km = (long)i_var.lVal - last_Stand;
        strItem.Format(_T("%d km"), gefahrene_km);
        m_TankdatenC.SetItemText(0,4,strItem);
        last_Stand = (long)i_var.lVal;
        km_ges += gefahrene_km;
        tdset3.GetFieldValue("Spritmenge",i_var);
        Spritmenge = (float)i_var.dblVal;
        strItem.Format(_T("%5.2f l"),Spritmenge);
        m_TankdatenC.SetItemText(0,2,strItem);
        Spritmenge_ges += Spritmenge;
        tdset3.GetFieldValue("Kosten",i_var);
        Spritkosten = (float)i_var.dblVal;
        strItem.Format(_T("%5.2f EUR"),Spritkosten);
        m_TankdatenC.SetItemText(0,3,strItem);
        Kosten_ges += Spritkosten;

        // Statistikwerte berechnen und ausgeben
        strItem.Format(_T("%5.2f l"), (Spritmenge / gefahrene_km * 100));
        m_TankdatenC.SetItemText(0,5,strItem);
        strItem.Format(_T("%5.2f EUR"), (Spritkosten / gefahrene_km * 100));
        m_TankdatenC.SetItemText(0,6,strItem);

        i++;
        tdset3.MoveNext();    // zum nächsten Datensatz
    }
    
    if (i > 0)    // wenn Datensatze vorhanden
    {
        // Statistikwerte berechnen
        preis_schnitt = Kosten_ges / Spritmenge_ges;
        kosten_schnitt = Kosten_ges / km_ges * 100;
        sprit_schnitt = Spritmenge_ges / km_ges * 100;
        
        // Statistikwerte ausgeben
        UpdateData(TRUE);
        m_km_ges.Format(_T("%9.0f km"),km_ges);
        m_kosten_ges.Format(_T("%6.2f EUR"),Kosten_ges);
        m_sprit_ges.Format(_T("%6.2f l"),Spritmenge_ges);
        m_preis_schnitt.Format(_T("%5.2f EUR"),preis_schnitt);
        m_kosten_schnitt.Format(_T("%5.2f EUR"),kosten_schnitt);
        m_sprit_schnitt.Format(_T("%5.2f l"),sprit_schnitt);
        UpdateData(FALSE);
    }
    else    // Wenn keine Daten vorhanden => Meldung ausgeben
    {
        AfxMessageBox(_T("Für dieses Fahrzeug stehen noch keine Tankdaten zur Verfügung."));
    }
}    // RefreshList()