//	****************************************************************************
//	*	$VER: Datenbank.h 1.08 25.02.2000													*
//	****************************************************************************
//	*	Include für MT-Rechnung III, Enthält eine allgemeine Klasse zur Daten-	*
//	*	verwaltung (lesen, einfügen, löschen, suchen) 									*
//	****************************************************************************
//	*	Programmiersprache:	C++																*
//	*	Compiler:				Maxon C++ (Version 3.00)									*
//	*	Portierung:				keine AMIGA-spezifischen Teile							*
//	*	Programmierer:			Manfred Tremmel												*
//	****************************************************************************
//    Copyright (C) 1997-2000 Manfred Tremmel
//
//    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.
//
//    This program is distributed in the hope that it will be useful,
//    but WITHOUT ANY WARRANTY; without even the implied warranty of
//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//    GNU General Public License for more details.
//
//    You should have received a copy of the GNU General Public License
//    along with this program; if not, write to the Free Software
//    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA

#include <exec/types.h>
#include <stream.h>
#include <fstream.h>
#include <rexx/storage.h>

class DataBase;

class DataBaseSearch
{
	TEXT						Zwischenstring[512];
	BOOL						ZW_BOOL;
	UBYTE						ZW_UBYTE;
	UWORD						ZW_UWORD;
	ULONG						ZW_ULONG;
	BYTE						ZW_BYTE;
	WORD						ZW_WORD;
	LONG						ZW_LONG;
	DOUBLE					ZW_DOUBLE;
	struct DateStamp		ZW_DATUM;

	STRPTR	Vergleichswert;
	void*		Datenbankfeld;
	UBYTE		Vergleichstypus;				// Vergleichstypus:
													//  0 : Text
													//  1 : Text mit Joker
													//  2 : Datum
													//  3 : Datum mit Joker
													//  4 : BOOL
													//  5 : UBYTE
													//  6 : UWORD
													//  7 : ULONG
													//  8 : BYTE
													//  9 : WORD
													// 10 : LONG
													// 11 : DOUBLE
	UBYTE		VergleichsKZ;					//  0 : =
													//  1 : <=
													//  2 : <
													//  3 : >
													//  4 : >=

	void		VGL_Vorbereiten();

 public:
	friend class DataBase;
	friend class Laender;

	ULONG		DatenbankfeldNr;

	BOOL		Vergleich( void* = NULL );
};

struct DBHeader
{
	TEXT							Versionstring[06];	// Immer "$VER: "
	TEXT							Bezeichnung[20];		// Dateibezeichnung
	TEXT							Version[5];				// Version "xx.xx"
	TEXT							KlammerAuf[2];			// Immer " ("
	TEXT							UpdDatum[8];			// Datum letztes Update xx.xx.xx
	TEXT							KlammerZu[3];			// Immer ") \n"
	ULONG							AnzahlSaetze;			// Anzahl vorhandener Datensaetze
	LONG							Satzlaenge;				// Länge des einzelnen Datensatzes
};

struct DruWert
{
	TEXT		VText[32];
	TEXT		VSymbol[2];
	STRPTR	Wert;
	ULONG		WertLaenge;
	TEXT		NSymbol[2];
	BOOL		Klein;
};

class DataBase
{
 private:
	TEXT							DataName[256];			// Dateiname
	TEXT							Fehler[256];
	struct DBHeader			AktHeader;				// HeaderZeile jeder DB
	fstream						f;
	LONG							ElementLength;
	LONG							ElementLengthPlus;
	UWORD							*Status;

	UWORD							User;

	void	InitHeader( STRPTR );

	void	WriteElement();
	inline UWORD	LesenDB();
	void	FreeStatus();

	void VersionsUpdate( STRPTR, STRPTR, LONG, LONG );

	ULONG DruckWertLaenge;
	ULONG DruckWertAnzahl;

 protected:
	TEXT Startstring[32];

	struct DruWert				*DruckWert;
	STRPTR						UnDoBuffer[21];		// Undo-Bereich

 public:

	TEXT							DRU_TAB_TEXT[56];

	LONG							AktElementNr;			// Nummer aktuelles Element
	UBYTE							UnDoUsed;				// Anzahl Undo-Elemente
	UBYTE							ReDoUsed;				// Anzahl Redo-Elemente
	STRPTR						UserData;

	void**						Such_DB_Feld;
	UBYTE*						Such_DB_Typ;
	STRPTR*						Such_DB_CS;
	ULONG							Such_DB_Anzahl;
	ULONG							Such_DB_Felder_Laenge;
	STRPTR						Such_DB_Felder_String;
	UBYTE							Such_DB_Nr;

	DataBase(STRPTR, STRPTR, UWORD, LONG, LONG);
	~DataBase();

	friend class DataBaseSearch;

	BOOL ReadHeader();

	void DruckWertInit( struct DruWert* );

	UWORD GetElementNr( ULONG );
	UWORD GetFirstElement();
	UWORD GetLastElement();
	UWORD GetPrevElement();
	UWORD Get10PrevElement();
	UWORD GetNextElement();
	UWORD Get10NextElement();

	ULONG ElementeVorhanden();

	void UpDateElement();

	void UnDo();

	void ReDo();

	void LoeschenAkt();

	void NeuerDatensatz();

	void UserWechsel( UWORD );
	UWORD GetUser(){ return User };

	void Suchen(ListenClass*,	ULONG, STRPTR, LONG, UBYTE, UWORD,
										ULONG, STRPTR, LONG, UBYTE, UWORD,
										ULONG, STRPTR, LONG, UBYTE);

	virtual void Initialisiere( STRPTR );

	void SuchInit( DataBaseSearch*, ULONG, STRPTR, LONG, UBYTE );

	BOOL Vergleich( DataBaseSearch* , UWORD* );

	virtual BOOL SuchVergleich( DataBaseSearch* );

	virtual void SuchListeAnhaengen(ListenClass*);

	virtual void PrintString( ofstream*, STRPTR );
	virtual void PrintTabelle( ofstream*, UBYTE, ULONG, ULONG, DataBaseSearch*, UWORD* );

	virtual ULONG GetRexx( struct RexxMsg *, ULONG );
	virtual ULONG SetRexx( struct RexxMsg *, ULONG );

	STRPTR PSDruckDatum( STRPTR, struct DateStamp* );
	STRPTR PSDruckZeit( STRPTR, struct DateStamp* );
	STRPTR PSDruckBetrag( STRPTR, STRPTR*, DOUBLE, DOUBLE );
	STRPTR PSDruckBetrag( STRPTR, STRPTR*, DOUBLE, DOUBLE, DOUBLE, DOUBLE );

	virtual void PrintVorbereiten( ofstream*, UBYTE );

	virtual void UpdateSatz( STRPTR );

	STRPTR PSAufbereit(STRPTR, STRPTR);
	STRPTR PSAufbereitMZ(STRPTR, STRPTR);
};

