AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Access - monatlich neue DB erstellen
Thema durchsuchen
Ansicht
Themen-Optionen

Access - monatlich neue DB erstellen

Ein Thema von stephan3309 · begonnen am 16. Aug 2006 · letzter Beitrag vom 9. Sep 2006
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.195 Beiträge
 
Delphi 10.4 Sydney
 
#11

Re: Access - monatlich neue DB erstellen

  Alt 17. Aug 2006, 13:32
Zitat von stephan3309:
Zitat:
Berhard meint eine leere DB mit Bs-Mitteln Umkopierem Umbenennen und dann mit ADO öffnen.
Also müsste ich
- Eine leere DB als Vorlage anlegen,
- Am Ende eines Monats
- Die aktuelle DB-Datei umbenennen (z.B. August_06)
- Die DB-Datei in ein Verzeichnis (z.B. History) kopieren
- eine Kopie der Vorlage in das Arbeitsverzeichnis kopieren

und das innerhalb der 60 Sekunden bis zur nächsten Aktualisierung der DB.
Ich würde eh zwischen Datenempfand und Datenspeicherung eine Pipeline einziehen so das die Speicherung Asynchron vom Empfang erfolgen kann. Evtl. den Empfang in einem Thread verlagern. Damit könntest du Problemlos z.B. (wenn es mal gewünscht würde) auch Statistikauswertungen zeitnah nach dem Empfang der Daten fahren.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
stephan3309

Registriert seit: 16. Aug 2006
15 Beiträge
 
#12

Re: Access - monatlich neue DB erstellen

  Alt 18. Aug 2006, 10:30
Ui, das war jetzt etwas viel auf einmal , könntes du mir erklären wie du das meinst? (Pipeline, Asyncroner Empfang)
  Mit Zitat antworten Zitat
stephan3309

Registriert seit: 16. Aug 2006
15 Beiträge
 
#13

Re: Access - monatlich neue DB erstellen

  Alt 21. Aug 2006, 16:01
So, mit dem kopieren und umbenennen funktionierts.

Jetzt sind nur noch 2 Fragen offen:

- Wie kann ich denn nun herrausbekommen, wann der letzte Tag im Monat ist, um
das kopieren zu starten?

- Wie kann ich die Einträge in der Access DB löschen und gleichzeitig die
DB "aufräumen"?
Als Primary Key habe ich einen AutoWert, der sollte dann auch zurück gesetzt werden,
was er nur tut, wenn ich mit Access eine Reorganisation bzw. Reperatur starte.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#14

Re: Access - monatlich neue DB erstellen

  Alt 21. Aug 2006, 16:08
Zitat:
- Wie kann ich denn nun herrausbekommen, wann der letzte Tag im Monat ist, um
das kopieren zu starten?
Berechnen.

Zitat:
- Wie kann ich die Einträge in der Access DB löschen und gleichzeitig die
DB "aufräumen"?
Delete from ... where datum < ...
Zitat:
Als Primary Key habe ich einen AutoWert, der sollte dann auch zurück gesetzt werden,
was er nur tut, wenn ich mit Access eine Reorganisation bzw. Reperatur starte.
Nein würde ich nicht.
Markus Kinzler
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#15

Re: Access - monatlich neue DB erstellen

  Alt 21. Aug 2006, 16:26
Hallo Leute,

ich habe mir den thread zweimal durchgelesen, aber keine Anforderung entdeckt, die den Einsatz eines DBMS rechtfertigt. Ich würde die beiden Anforderungen - "Aufzeichnung" und "Auswertung" von Messwerten - getrennt umsetzen. Das data logging kann ruhig in eine Textdatei erfolgen. Eine Auswertung oder auch eine Visualisierung wird wohl kaum über ein DBMS erledigt werden. Da bieten sich eventuell spezielle Statistik-Pakete oder auch Software zur Prozessdaten-Visualisierung an oder es genügt sogar eine eigene Anwendung. Bei 15 Messwerten pro Sekunde und 10 Jahren Aufzeichnung scheint mir ein DBMS wirklich nicht das passende Werkzeug zu sein.

Freundliche Grüße vom marabu
  Mit Zitat antworten Zitat
stephan3309

Registriert seit: 16. Aug 2006
15 Beiträge
 
#16

Re: Access - monatlich neue DB erstellen

  Alt 24. Aug 2006, 14:58
So,...
das kopieren und umbennenen,
sowie das Löschen der DB einträge funktioniert.
Soweit schonmal Danke!

Nur mit dem Sichern zum Monatswechsel klappts mir nicht.
Wie könnte ich das berechnen?
Hat evtl. jemand einen Beispiel Code für mich?


Hallo marabu,
warum ich Access verwendet habe (verwenden will) liegt einfach daran,
das ich nicht weiß wies anders funktionieren könnte.
Eine DB zum Abspeichern meiner Messwerte fand ich als einfachste
Lösung schnell ein Programm zu schreiben.

Es war erstmal wichtig ein Programm hinzubekommen, wo
unsere Herrschaften was sehen konnten (hauptsache läuft).

Ändern und Optimieren kann ich das ganze jederzeit.

Über alternativ Vorschläge (vielleicht auch Infos zu passenden Turiotals) würd
ich mich natürlich freuen.
  Mit Zitat antworten Zitat
Jürgen Thomas

Registriert seit: 13. Jul 2006
Ort: Berlin
750 Beiträge
 
#17

Re: Access - monatlich neue DB erstellen

  Alt 24. Aug 2006, 21:19
Zitat von stephan3309:
Nur mit dem Sichern zum Monatswechsel klappts mir nicht.
Wie könnte ich das berechnen?
Hat evtl. jemand einen Beispiel Code für mich?
Wann genau willst Du sichern?
1. mitten in der Nacht um 23:59:01 Uhr?
2. oder um 00:00:01 Uhr?
3. oder am Ultimo zum Arbeitsende, z.B. um 16:59:01 Uhr?
4. oder am Monatsanfang zum Arbeitsanfang, z.B. um 08:00:01 Uhr?

Welche Funktion(en) dies innerhalb der Access-DB regeln könnten, weiß ich nicht; weil als Ergebnis eine neue/leere DB entstehen soll, dürfte die Arbeit sowieso vom Programm aus gesteuert werden. Vorschlag:
Delphi-Quellcode:
function TForm1.Zeit_zum_Sichern: Boolean;
var Year, Month, Day: Word;
    Vergleich: TDateTime;
begin
  // bei Variante 1 oder 3:
  Vergleich := Now + 1;
  // bei Variante 2 oder 4:
  Vergleich := Now;
  // Erklärung:
  // TDateTime sind Dezimalzahlen, bei denen der integer-Anteil dem Tag entspricht;
  // es soll geprüft werden, ob das Vergleichsdatum der Monatsanfang ist
  //
  // Standardfunktion aus SysUtils teilt das Datum auf:
  DecodeDate(Vergleich, Year, Month, Day);
  // einfacher Vergleich auf 'Monatsanfang' genügt:
  Result := Day = 1;
end;
Damit könntest Du weiterkommen. Jürgen
#D mit C# für NET, dazu Firebird
früher: Delphi 5 Pro, Delphi 2005 Pro mit C# (also NET 1.1)
Bitte nicht sauer sein, wenn ich mich bei Delphi-Schreibweisen verhaue; ich bin inzwischen an C# gewöhnt.
  Mit Zitat antworten Zitat
stephan3309

Registriert seit: 16. Aug 2006
15 Beiträge
 
#18

Re: Access - monatlich neue DB erstellen

  Alt 25. Aug 2006, 16:21
Hallo Jürgen,
ich hab mir mal folgendes zurecht geschrieben:

Delphi-Quellcode:
function TForm1.Backup: Boolean;
var Year, Month, Day: Word;
    Vergleich: TDateTime;


begin
  Vergleich := Now;
  DecodeDate(Vergleich, Year, Month, Day);
  Result := Day = 1;
end;

procedure Backup_DB;
var clear_DB:Boolean ;
begin
  if TForm1.Backup.Result := 1 then begin
  Dateiname := 'c:\test\backup\daten' + datetostr(now) + '.mdb';
  copyFileTo('c:\test\db\daten.mdb' , Dateiname );
  clear_DB := 1;
  end;

  if clear_DB := 1 then begin
  DataModule6.ADOTable1.Close;
  DataModule6.ADOTable1.Open;
  DataModule6.ADOCommand1.Execute;
  DataModule6.ADOTable1.Close;
  DataModule6.ADOTable1.Open;
  clear_DB := 0;
  end;

end;
Ich bekomme in der Zeile

if TForm1.Backup.Result := 1 then begin

einen Fehler beim Übersetzen, woran könnte das Liegen?

Könnt ihr sonst noch einen Denkfehler entdecken?
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#19

Re: Access - monatlich neue DB erstellen

  Alt 25. Aug 2006, 16:27
Vielleicht weil es
 if Form1.Backup.Result = 1 then begin oder  if Form1.Backup = 1 then begin heißen müsste
Markus Kinzler
  Mit Zitat antworten Zitat
Jürgen Thomas

Registriert seit: 13. Jul 2006
Ort: Berlin
750 Beiträge
 
#20

Re: Access - monatlich neue DB erstellen

  Alt 25. Aug 2006, 18:04
Zitat von stephan3309:
Ich bekomme ... einen Fehler beim Übersetzen, woran könnte das Liegen?

Könnt ihr sonst noch einen Denkfehler entdecken?
Warum erlaubst Du uns nicht, die vom Compiler gemeldeten Fehler zu lesen? So müssen wir raten...

Allerdings sind diverse Fehler offensichtlich. Ich sehe folgende Problemstellen oder Fehler:
Delphi-Quellcode:
function TForm1.Backup: Boolean;
// ...
procedure Backup_DB;
Backup ist Bestandteil der Klasse TForm1, Backup_DB ist eine (globale?) Prozedur; es bietet sich aber wohl an, beides in derselben Klasse zu deklarieren und zu implementieren - es sei denn, Du willst beides unabhängig voneinander benutzen.

if TForm1.Backup.Result := 1 then begin Hier gibt es folgende Fehler:
1. Du greifst auf TForm1, d.h. auf eine Klasse zu; Du würdest aber eine Instanz - z.B. Form1 - benötigen.
2. Backup ist eine Funktion vom Typ Boolean. Form1.Backup repräsentiert also bereits einen der Werte true/false.
3. Result kann nur als lokale Variable innerhalb einer Funktion verwendet werden; es ist aber kein Bestandteil einer Klasse TForm1.Backup (das wäre auch ein Widerspruch zur Deklaration als Funktion, also Quatsch).
4. Mit Result := 1 weist Du der (nicht existenten) Eigenschaft Result den numerischen Wert 1 zu.
Da muss der Compiler doch durcheinander kommen.

In der Folge gäbe es weitere gleichartige Probleme:
Delphi-Quellcode:
var clear_DB:Boolean ;
// ...
  if
// ...
    clear_DB := 1;
  end;
// ...
  if clear_DB := 1 then begin
    clear_DB := 0;
  end;
end;
Bitte nimm Einrückungen vollständig, d.h. auch innerhalb von if...begin/end vor; dann sollten Dir Fehler selbst auffallen:
1. clear_DB ist als Boolean deklariert, bekommt aber numerische Werte zugewiesen.
2. if clear_DB := 1 ist eine Zuweisung einer Zahl, soll aber ein bool-Vergleich sein.
3. Bei der zweiten if-Abfrage ist nicht sichergestellt, dass clear_DB überhaupt einen Wert hat: Es bekommt weder vor der ersten if-Abfrage noch innerhalb eines else-Zweiges einen Wert zugewiesen.
4. Am Ende bekommt clear_DB noch den Wert 0, mit dem Du aber nichts mehr machst. Wozu?

Ich vermute, dass Du Folgendes erreichen willst:

Delphi-Quellcode:
function TForm1.Neuer_Monat: Boolean;
var Year, Month, Day: Word;
    Vergleich: TDateTime;
begin
  // bei dieser Variante könnte man auf die Variable Vergleich verzichten
  // und DecodeDate(Now...) schreiben; aber zur Vergleichbarkeit lassen wir das
  Vergleich := Now;
  DecodeDate(Vergleich, Year, Month, Day);
  // Rückgabe: Day = 1 => Neuer_Monat ja
  // Rückgabe: Day <> 1 => Neuer_Monat nein
  Result := Day = 1;
end;

// geändert in Funktion innerhalb des Formulars:
// Rückgabe: Kopie erledigt und bearbeitet ja/nein
function TForm1.Backup_DB: Boolean;
var sDateiname: string;
begin
  // Result bezieht sich auf die aktuelle Funktion;
  // Vorgabe: es wurde keine Kopie erstellt
  Result := false;
  // Neuer_Monat ist der Rückgabewert der o.g. Funktion!!!
  if Neuer_Monat then
  begin
    // Versuch einer Kopie mit Fehlerprüfung
    try
      // der Dateiname könnte noch schöner erzeugt werden und benötigt
      // bei einmaliger Verwendung keine Variable
      sDateiname := 'c:\test\backup\daten' + datetostr(now) + '.mdb';
      copyFileTo('c:\test\db\daten.mdb' , sDateiname );
      // wenn kopiert werden konnte
      Result := true;
    except
      // wenn nicht kopiert werden konnte: Fehlermeldung
      on e:exception
      do ShowMessage(e.Message);
      // Result steht weiterhin auf false
    end;
  end;
  // wenn kopiert werden konnte, dann DB anpassen
  if Result then
  begin
    try
      // mit Fehlerprüfung
      DataModule6.ADOTable1.Close;
      DataModule6.ADOTable1.Open;
      DataModule6.ADOCommand1.Execute;
      DataModule6.ADOTable1.Close;
      DataModule6.ADOTable1.Open;
    except
      // wenn DB nicht bearbeitet werden konnte: Fehlermeldung
      on e:exception
      do ShowMessage(e.Message);
      // Result muss jetzt auf false gesetzt werden
      Result := false;
    end;
  end;
end;
Zur Verbesserung könnte man die zweite Funktion noch danach unterscheiden, ob überhaupt nicht kopiert werden sollte (Day <> 1) oder ob nicht kopiert werden konnte oder ob die DB nicht überarbeitet werden konnte. Außerdem kann die erste Funktion lokal in die zweite eingebaut werden (da schreien dann andere User wieder auf - bitte keine neue Diskussion darüber); und je nach Fehlermeldung kannst Du unterschiedlich reagieren.

Aber das solltest Du Dir alles später überlegen. Jürgen
#D mit C# für NET, dazu Firebird
früher: Delphi 5 Pro, Delphi 2005 Pro mit C# (also NET 1.1)
Bitte nicht sauer sein, wenn ich mich bei Delphi-Schreibweisen verhaue; ich bin inzwischen an C# gewöhnt.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:47 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz