Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi geändertes DBGrid in Access speichern (https://www.delphipraxis.net/64630-geaendertes-dbgrid-access-speichern.html)

ksh 6. Mär 2006 13:04

Datenbank: Access • Zugriff über: ADO

geändertes DBGrid in Access speichern
 
hallo alle zusammen!

nachdem ich jetzt erfolgreich meine Daten nach Delphi importieren kann, will ich nun in die Tabelle einfach Werte eintragen können und diese dann nach Access exportieren und speichern.
wie kann ich das realisieren?

hier mal der Quellcode bisher:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, DBGrids, StdCtrls, DB, ADODB, Menus;

type
  TForm1 = class(TForm)
    Button1: TButton;
    DataSource1: TDataSource;
    ADOTable1: TADOTable;
    DBGrid1: TDBGrid;
    MainMenu1: TMainMenu;
    Datei1: TMenuItem;
    ffnen1: TMenuItem;
    N1: TMenuItem;
    Speichern1: TMenuItem;
    Speichernunter1: TMenuItem;
    N2: TMenuItem;
    Beenden1: TMenuItem;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Beenden1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  close;
end;

// Hinzufügen der Laufzeitanbindung
procedure TForm1.FormCreate(Sender: TObject);
var verz: string;
begin
  // Ermitteln des aktuellen Pfades
  verz := ExtractFilePath(ParamStr(0));
  with ADOTable1 do
    begin
      try
        ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+verz+'db1.mdb;Mode=Read|Write|Share Deny None;Persist Security Info=False';
        TableName := 'db1';
        Active := true
      except
        Beep;
        ShowMessage('Die Datenbank DB1.MDB befindet sich nicht '+ #10#13 + 'im aktuellen Verzeichnis '+verz)
    end
  end
end;

procedure TForm1.Beenden1Click(Sender: TObject);
begin
  close;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  // hier soll die aktuelle Tabelle in Access gespeichert werden
end;

end.

marabu 6. Mär 2006 14:13

Re: geändertes DBGrid in Access speichern
 
Hallo.

Du arbeitest mit einer Datenbank. Die Änderungen, die du im DBGrid machst, kannst du mit dem DBNavigator explizit bestätigen oder implizit durch das Wechseln des aktuellen Datensatzes. Du erkennst den Erfolg deiner Bemühungen an dem geänderten Symbol im aktuellen Datensatz des DBGrid. Ein Speichern, wie du es von einer Textdatei gewohnt sein magst, gibt beim Arbeiten mit Datenbanken nicht.

Grüße vom marabu

ksh 6. Mär 2006 14:20

Re: geändertes DBGrid in Access speichern
 
aha! :shock:

wäre folgendes auch möglich?
z.B. von Delphi aus Access mit meiner DB öffnen und dann speichern....

habe in dem Kochbuch zwar etwas über Access-Reports drucken gelesen, aber leider steht nichts genaueres da! nur, dass es über die OLE-Schnittstelle geht...

marabu 6. Mär 2006 14:24

Re: geändertes DBGrid in Access speichern
 
Wie meinst du das? Möchtest du bestimmte Daten aus der Datenbank in einer Datei speichern - quasi eine Exportfunktion realisieren?

marabu

ksh 6. Mär 2006 14:34

Re: geändertes DBGrid in Access speichern
 
also, soll folgendermaßen funktionieren:

lese mit Hilfe von ADO aus Access eine DB ein. Dann führe ich (in naher Zukunft) Berechnungen aus und schreibe die Werte in die Tabelle. und jetzt soll die ganze Tabelle wieder ins Access rein.

würde es auch mal als Export betiteln wenn ich das so lese... :wink:

marabu 6. Mär 2006 14:39

Re: geändertes DBGrid in Access speichern
 
Warum willst du die Daten nicht gleich in der Datenbank ändern? Ein Export ist nicht sehr schwer zu realisieren, wenn du das Exportformat erstmal festgelegt hast, aber wenn du keine guten Gründe für diese Vorgehensweise hast, dann empfehle ich dir direkt mit der Datenbank zu arbeiten.

marabu

ksh 6. Mär 2006 14:51

Re: geändertes DBGrid in Access speichern
 
weil es sehr komplexe mathematische Berechnungen sind, die auch zu den jeweiligen Daten umgeändert werden müssen. es werden sozusagen die Ausgangsdaten per Access angegeben.
es existiert ein altes Modell in Pascal, weswegen es jetzt in Delphi umgesetzt werden soll.

und wie ist das jetzt mit dem exportieren?

ksh 6. Mär 2006 16:33

Re: geändertes DBGrid in Access speichern
 
hallooooo!

kann mir denn niemand sagen wie ich das expotieren kann???? :wall:

marabu 6. Mär 2006 16:49

Re: geändertes DBGrid in Access speichern
 
Musst du gleich randalieren, nur weil ich meine Lebensmittel einkaufe?

Zum Exportieren iterierst du über einen DataSet (z.B. ADOQuery) und schreibst die Daten in deinem gewünschten Format weg - hier CSV - so oder ähnlich:

Delphi-Quellcode:
var
  s: TStrings;
begin
  s := TStringList.Create;
  // die Query braucht eine Connection
  with ADOQuery do
  begin
    SQL.Text := 'select * from tabelle';
    Open;
    while not Eof do
    begin
      s.Clear;
      for i := 0 to Pred(FieldCount) do
        // hier besser den Feldtyp auswerten
        s.Add(Fields[i].AsString);
      // anstatt DeinExport() hier eine Anzeige
      ShowMessage(s.CommaText);
      Next;
    end;
    Close;
  end;
  s.Free;
end;
Nimm dir die Online-Hilfe und informiere dich über die verwendeten Klassen und Methoden.

marabu

ksh 7. Mär 2006 08:52

Re: geändertes DBGrid in Access speichern
 
na gut, was zu essen ist noch erlaubt! :wink:

Ich versuche gerade die ganze Zeit schlau zu werden. aber leider will die Hilfe nicht so wie ich oder umgekehrt! :x

Hab ein ADOQuery eingebaut, die DataSource eingestellt und den ConnectionString eingegeben.
Wenn ich den Namen der Tabelle eingebe bekomme ich diese Message mit den Daten.
ABER:
Exportieren mache ich ja gar nicht oder wie? :gruebel:

marabu 7. Mär 2006 09:02

Re: geändertes DBGrid in Access speichern
 
So wie die Daten am Bildschirm ausgegeben werden, so kannst du sie auch in eine Datei wegschreiben. Wenn es nur wenige Datensätze sind, dann geht das bequem so:

Delphi-Quellcode:
var
  s, csv: TStrings;
begin
  csv := TStringList.Create;
  s := TStringList.Create;
  // die Query braucht eine Connection
  with ADOQuery do
  begin
    SQL.Text := 'select * from tabelle';
    Open;
    while not Eof do
    begin
      s.Clear;
      for i := 0 to Pred(FieldCount) do
        // hier besser den Feldtyp auswerten
        s.Add(Fields[i].AsString);
      csv.Add(s.CommaText);
      Next;
    end;
    Close;
  end;
  s.Free;
  csv.SaveToFile('c:\temp\test.txt');
  csv.Free;
end;
Bei zu großen Datenmengen belastet das aber den Hauptspeicher zu sehr. Da ist dann ein Stream besser - Stichwort TFileStream.

marabu

ksh 7. Mär 2006 09:15

Re: geändertes DBGrid in Access speichern
 
erstmal vielen Dank! :-D

in eine txt schreibt er mir das jetzt alles - mit Kommas getrennt. aber sobald ich das jetzt als db oder mdb speichern will, erkennt er das Format nicht.

marabu 7. Mär 2006 09:44

Re: geändertes DBGrid in Access speichern
 
Ich habe nochmal deinen ersten Beitrag gelesen. Ich muss gestehen, dass ich momentan nicht genau weiß, worauf das ganze hinaus läuft. Du liest Daten einer Tabelle aus einer Access-Datenbank ein, veränderst diese Daten interaktiv und willst sie dann wohin genau exportieren?

marabu

ksh 7. Mär 2006 09:48

Re: geändertes DBGrid in Access speichern
 
wieder zurück in Access... :wink:

und jetzt sag bitte nicht, dass das umständlich ist oder so. Ich soll es so machen...

marabu 7. Mär 2006 09:51

Re: geändertes DBGrid in Access speichern
 
Schreibe du jetzt bitte nicht, dass die Daten wieder in die gleiche Tabelle zurück geschrieben werden sollen. (?)

marabu

ksh 7. Mär 2006 09:58

Re: geändertes DBGrid in Access speichern
 
wieso denn nicht? :pale:

marabu 7. Mär 2006 10:12

Re: geändertes DBGrid in Access speichern
 
Dann vergiss schnell, was wir inzwischen erarbeitet haben. Vielleicht magst du dir eine Demo anschauen, die ich vor einiger Zeit mal erstellt habe: klick

Wenn ich mich noch recht erinnere, dann zeigt sie, wie man eine Datenbankverbindung über eine UDL-Datei konfiguriert und die Verwendung von DBGrid und Navigator. Damit änderst du die Daten direkt in der Datenbank.

marabu

ksh 7. Mär 2006 10:20

Re: geändertes DBGrid in Access speichern
 
Könntest du mir bitte erklären warum? Würde es gerne nachvollziehen können!

marabu 7. Mär 2006 10:29

Re: geändertes DBGrid in Access speichern
 
Ich denke, wenn du Daten nur bearbeiten möchtest, dann ist kein Import und Export nötig. Oder möchtest du die Daten etwa aus der einen Datenbank-Tabelle lesen und die veränderten Daten in einer anderen Tabelle (evtl. sogar in einer anderen Datenbank) speichern?

Kannst du nochmal versuchen deine Aufgabe zu beschreiben? Weniger die technischen Aspekte, sondern mehr den Anwendungsteil?

marabu

ksh 7. Mär 2006 10:36

Re: geändertes DBGrid in Access speichern
 
zuerst mal zu deinem download: kann zwar bei Demo meine mdb angeben, allerdings sucht er dann nach einer Tabelle namens employees - wie kann ich das ändern?

also, benötige gewissen Personaldaten (Geb.datum, Firmeneintritt, Gehalt usw.). Mit Hilfe von diesen Daten finden versicherungsmathematische Berechnungen statt, die dann gewisse Beträge "ausspucken" sollen. Diese will ich dann in die vorgesehene Spalte(n) eintragen. und dann alles sozusagen an Access wieder übergeben.

war das verständlich :?:

aber so gesehen hast du recht - sie sollen wieder in die gleiche Datenbank. ich verändere die Daten nicht, sondern füge sozusagen nur neue, berechnete Daten zu.

marabu 7. Mär 2006 10:58

Re: geändertes DBGrid in Access speichern
 
Die Tabelle ist im SQL Statement eingetragen - du musst sie durch deine Tabelle ersetzen. Ich hatte geschrieben:

Zitat:

PS: Wenn du deine eigene Datenbank verwendest, dann musst du auch das SQL-Statement in der ADOQuery-Komponente anpassen. Dass Daten in der entsprechenden Tabelle sind, prüfst du vorher mit Access oder einem anderen Werkzeug.
Deine Erklärung ist gut. Daten, die sich aus anderen Daten in deiner Datenbank berechnen lassen, werden normalerweise nicht gespeichert, sondern in sogenannten berechneten Feldern abgelegt. In der Benutzerschnittstelle sieht es dann so aus, als ob auch diese Daten gespeichert seien. Du kannst auf sie mit den ganz normalen datensensitiven Controls (readonly) zugreifen. Wenn aber auch Daten zur Berechnung herangezogen werden, die nicht in der Datenbank gespeichert sind, dann musst du sie wohl oder übel speichern. Wie willst / musst du vorgehen?

marabu

ksh 7. Mär 2006 12:03

Re: geändertes DBGrid in Access speichern
 
Ok, gefunden!!! :-D

wenigstens etwas! soweit ich alles verstanden habe: eher zweiteres.

marabu 7. Mär 2006 12:53

Re: geändertes DBGrid in Access speichern
 
Das ändern eines Feldwertes in Abhängigkeit von anderen Feldern des gleichen Datensatzes ist einfach:

Delphi-Quellcode:
begin
  with AdoQuery do
  begin
    Edit;
    FieldValues['Ergebnis'] := FieldValues['Faktor'] * Konstante;
    Post;
  end;
end;
Hast du dir schon eine Benutzerschnittstelle überlegt? Üblicherweise bietet man eine Listen-Ansicht zum Suchen und eine Detail-Ansicht zum Bearbeiten. Für die Listen-Ansicht wird oft das DBGrid verwendet. Ich selbst arbeite anders, aber das führt vielleicht zu weit.

marabu

ksh 7. Mär 2006 13:15

Re: geändertes DBGrid in Access speichern
 
es wird wohl so laufen, dass es verschiedene Units oder Methoden gibt, da es unterschiedliche Berechnungen sind - je nach Person.

wahrscheinlich gibt es nur eine Tabelle. aber ich bin für alle Anregungen offen! :wink: wie gehst du vor?

sag mal, kannst du dir noch in den Kopf rufen was du damals gemacht hast und mir das erklären? an Quellcode ist ja nicht viel vorhanden... was macht diese udl?
und noch eine Frage: kann ich das ganze für den Benutzer "komfortabler" machen, indem ich durch Abfragen die jeweilige Datenbank anspreche? also z.B. den connectionString und vom ADOQuery das SQL... weil so muss man ja jedes mal in den Quellcode und den Pfad bzw. den Namen ändern.

ksh 7. Mär 2006 14:49

Re: geändertes DBGrid in Access speichern
 
jetzt wurde mir gesagt, dass es doch zwei verschiedene Access-DB sein müssen!!! :x

kann ich dein Projekt dementsprechend umwandeln? :shock:

habe also meine 1. DB mit den ganzen Infos. Dann soll ich was berechnen, die Berechnungen in neue Spalten einfügen und in eine 2. DB ausgeben...


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:28 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz