Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Liste in ein DBGrid schreiben (https://www.delphipraxis.net/106364-liste-ein-dbgrid-schreiben.html)

andy21 9. Jan 2008 18:43

Datenbank: Mybase • Zugriff über: DbGrid

Liste in ein DBGrid schreiben
 
Hallo,

ich benutze Mybase und habe bei mir im Programm einmal ClientDataSet, DataSource und DBGrid.

Speichern und laden funktioniert einwandfrei. Manuell (im DBGrid) kann ich ja auch schreiben. Ich habe jedoch einen Extra-Liste, die ich auch so in einzelne Strings teilen kann, jedoch will ich diese Daten in das DBGrid schreiben um es dann ganz normal zu speichern. Ich habe jedoch überhaupt keine Ahnung wie ich die einzelnen Felder ansteuern kann. Es gibt solche Eigenschaften Fields, wenn ich jedoch folgendes Schreibe

dbgrid1.fields[2]:='hallo';

dann erscheint als Fehlermeldung: [Fehler] Unit1.pas(49): Einer Nur-Lesen Eigenschaft kann kein Wert zugewiesen werden.

Wie kann ich da jetzt etwas in das DB-Grid schreiben, so dass ich auf einen Knopf drücke und es sich dann füllt.


Danke im Voraus. :)

DeddyH 9. Jan 2008 18:50

Re: Liste in ein DBGrid schreiben
 
Ich editiere zwar nie in DBGrids, aber geht es evtl. so?
Delphi-Quellcode:
dbgrid1.DataSource.DataSet.fields[2]:='hallo';
[edit] Das setzt aber voraus, dass das DataSet zuvor in den Edit-Modus versetzt wurde. [/edit]

s-off 9. Jan 2008 18:55

Re: Liste in ein DBGrid schreiben
 
Ich glaube, hier liegt eher ein grundlegendes Verständnisproblem zum Umgang mit Datenbanken vor :zwinker:

Schau Dir einfach mal entsprechende Tutorials dazu an.

andy21 9. Jan 2008 18:59

Re: Liste in ein DBGrid schreiben
 
Zitat:

Ich editiere zwar nie in DBGrids, aber geht es evtl. so?
Delphi-Quellcode: markieren
dbgrid1.DataSource.DataSet.fields[2]:='hallo';


[edit] Das setzt aber voraus, dass das DataSet zuvor in den Edit-Modus versetzt wurde. [/edit]

Wenn ich diese Zeile nehme erscheint folgende Fehlermeldung: [Fehler] Unit1.pas(49): Inkompatible Typen: 'TField' und 'String'

Und was ist mit dem letzten Satz gemeint? :?:


Zitat:

Ich glaube, hier liegt eher ein grundlegendes Verständnisproblem zum Umgang mit Datenbanken vor Zwinkern

Schau Dir einfach mal entsprechende Tutorials dazu an.
Von daher habe ich das mit dem Mybase. Oder was meinst du da genau? ^^

DeddyH 9. Jan 2008 19:00

Re: Liste in ein DBGrid schreiben
 
Sorry, mein Versäumnis.
Delphi-Quellcode:
dbgrid1.DataSource.DataSet.fields[2].AsString:='hallo';
Achja, schau auch mal hier (die weiterführenden Links bitte nicht ignorieren ;) )

andy21 9. Jan 2008 19:08

Re: Liste in ein DBGrid schreiben
 
Zitat:

Zitat von DeddyH
Sorry, mein Versäumnis.
Delphi-Quellcode:
dbgrid1.DataSource.DataSet.fields[2].AsString:='hallo';
Achja, schau auch mal hier (die weiterführenden Links bitte nicht ignorieren ;) )

Da erscheint jetzt folgende Fehlermeldung: "Im Projekt project1.exe ist eine Exception der Klasse EDataBaseError aufgetreten. Meldung:'ClientDataSet1:Datenmenge weder im Editier- noch im Einfügemodus'. Prozess wurde angehalten. Mit einzelne Anweisung oder Start Fortsetzen."

Anbei wie kann man eigentlich die Zeilenanzahl des DBGrids erhöhen? Ich kann nur die Spalten einstellen, aber "Rows" finde ich nirgendwo.

DeddyH 9. Jan 2008 19:14

Re: Liste in ein DBGrid schreiben
 
Ein DBGrid dient lediglich der Darstellung einer Ergebnismenge, die ihm zugewiesen wurde. Die Schnittstelle zwischen dieser Ergebnismenge (z.B. einer TTable oder einer TQuery etc.) bildet eine DataSource. Wenn sich nun also die Darstellung ändern soll, musst Du die zugrundeliegenden Daten ändern.

andy21 9. Jan 2008 19:18

Re: Liste in ein DBGrid schreiben
 
Ähm, ich kann doch die Daten durch eintippen in das DBGrid ändern, also wenn ich etwas in das DBGrid schreibe und es dann speichere sind die Daten geändert, oder? Oder wie war das jetzt gemeint? :?:

DeddyH 9. Jan 2008 19:21

Re: Liste in ein DBGrid schreiben
 
Das war nur als Veranschaulichung der Zusammenhänge gemeint. Aber wie die zitierte Fehlermeldung bereits sagt (und ich in meiner ersten Antwort schon angemerkt hatte) musst Du erst in den Editiermodus wechseln. Versuch es mal so:
Delphi-Quellcode:
dbgrid1.DataSource.DataSet.Edit; //in den Editiermodus wechseln
dbgrid1.DataSource.DataSet.fields[2].AsString:='hallo'; //Daten ändern
dbgrid1.DataSource.DataSet.Post; //Änderungen speichern

andy21 9. Jan 2008 19:24

Re: Liste in ein DBGrid schreiben
 
Ah, es klappt. Vielen Dank.
Doch eine Frage bleibt noch. Wie bekomme ich mehr Zeilen hin?

DeddyH 9. Jan 2008 19:30

Re: Liste in ein DBGrid schreiben
 
Was meinst Du mit mehr Zeilen?

andy21 9. Jan 2008 19:34

Re: Liste in ein DBGrid schreiben
 
Na ja, die Tabelle oder DBGrid sit doch in Spalten (Columns) und Zeilen (Rows) geteilt. Ich habe bisher nur eine Zeile. Wie ich die Spalten editieren kann weiß ich ja, aber mir fehlt noch die Anzahl der Zeilen.

DeddyH 9. Jan 2008 19:35

Re: Liste in ein DBGrid schreiben
 
Wieviele Datensätze hast Du denn? Wenn es nur einer ist, wird auch nur einer gelistet.

andy21 9. Jan 2008 19:39

Re: Liste in ein DBGrid schreiben
 
Ich habe ja noch nicht mehr, will ja erst etwas hinzufügen. Bloß wenn ich bei Fields im Index 2 eingebe (ich habe bis jetzt eine Zeile und zwei Spalten) sagt der mir, dass der Wert über die Liste geht oder so ähnlich. Nun würde ich gerne eine neue Zeile haben wo ich dann wieder etwas einfügen kann.

DeddyH 9. Jan 2008 19:43

Re: Liste in ein DBGrid schreiben
 
Fields bezeichnet die Spalten, nicht die Zeilen (Zeilen = Datensätze). Da Du nach eigener Aussage 2 Spalten hast, kannst Du diese mit Fields[0] und Fields[1] ansprechen, Fields[2] gibt es ja nicht, solange Du keine weitere Spalte (Tabellenfeld) anlegst ;)

andy21 9. Jan 2008 19:50

Re: Liste in ein DBGrid schreiben
 
Ach so, ich dachte Fields[0] bezeichnet Spalte 1, Zeile 1; Fields[1] dann Spalte 2, Zeile 1 und Fields[2] (welches nicht existiert) bezeichnet Spalte 1 (da ich ja nur zwei Spalten habe), Zeile 2. Also Fields gleich Feld und somit käme ich nicht auf die Idee mit den Spalten. ^^ Und wie bekomme ich dann eine weitere Zeile (=Datensatz ;) ) und wie spreche ich diese an, wenn nicht über Fields?

DeddyH 9. Jan 2008 19:54

Re: Liste in ein DBGrid schreiben
 
Schau Dir mal die Methoden von TDataSet an. Für einen neuen Datensatz müsste es Append oder AppendRecord heißen (ich bin da nicht ganz sicher, da ich immer mit reinem SQL arbeite).

andy21 9. Jan 2008 19:59

Re: Liste in ein DBGrid schreiben
 
Richtig, Append fügt einen neuen hinzu, wenn ich jetzt allerdings etwas mit fields[1] hinzufüge dann schreibt der in beiden Zeilen "hallo". Kann ich jetzt noch eine gewisse Zeile auswählen?

DeddyH 9. Jan 2008 20:01

Re: Liste in ein DBGrid schreiben
 
Zeig doch mal den Code, mit dem Du den Datensatz anlegst.

andy21 9. Jan 2008 20:04

Re: Liste in ein DBGrid schreiben
 
Delphi-Quellcode:
clientdataset1.append;

DeddyH 9. Jan 2008 20:06

Re: Liste in ein DBGrid schreiben
 
Das war mir klar, vielleicht hab ich mich auch blöde ausgedrückt, ich meinte den vollständigen Code zum Anlegen und Befüllen des neuen Datensatzes.

andy21 9. Jan 2008 20:09

Re: Liste in ein DBGrid schreiben
 
Delphi-Quellcode:
  clientdataset1.append;
  dbgrid1.DataSource.DataSet.Edit; //in den Editiermodus wechseln
  dbgrid1.DataSource.DataSet.fields[1].AsString:='hallo3'; //Daten ändern
  dbgrid1.DataSource.DataSet.Post; //Änderungen speichern
:mrgreen:

DeddyH 9. Jan 2008 20:18

Re: Liste in ein DBGrid schreiben
 
Oha, Du solltest Dir wirklich erst die Tutorials in Ruhe ansehen. Du gehst mit Append in den Einfügemodus und anschließend mit Edit gleich wieder in den Editiermodus.
Delphi-Quellcode:
clientdataset1.append; //in den Einfügemodus wechseln
// diese Zeile ist zuviel dbgrid1.DataSource.DataSet.Edit; //in den Editiermodus wechseln
  clientdataset1.fields[1].AsString:='hallo3'; //Daten eintragen
  clientdataset1.Post; //Änderungen speichern
Ich weiß ja nicht, welche Delphi-Version Du hast, daher mal ein paar Zitate aus der Delphi 7-Hilfe:
Zitat:

Die Methode Append fügt einen neuen, leeren Datensatz am Ende der Datenmenge hinzu.

Delphi-Syntax:

procedure Append;

C++ Syntax:

void __fastcall Append(void);

Beschreibung

Bei Datenmengen, die eine Bearbeitung erlauben, können Sie mit Append folgende Aktionen durchführen:

1 Einen neuen leeren Datensatz am Ende der Datenmenge öffnen.
2 Der neue wird zum aktiven Datensatz gemacht.

Nach dem Aufruf von Append kann die Anwendung den Benutzern die Eingabe von Daten in die Felder des neuen Datensatzes ermöglichen. Anschließend können die Änderungen mit Post in in die Datenbank oder das Änderungsprotokoll eingetragen werden (Client-Datenmengen können die im Protokoll enthaltenen Änderungen durch einen Aufruf von ApplyUpdates in die Datenbank schreiben). Ein neu hinzugefügter Datensatz wird auf eine von drei Arten in die Datenbank eingetragen:

Bei indizierten Paradox- und dBASE-Tabellen wird der Datensatz anhand seiner Indexposition in die Datenmenge eingefügt.
Bei nicht indizierten Paradox- und dBASE-Tabellen wird der Datensatz am Ende der Datenmenge hinzugefügt.
Bei SQL-Datenbanken ist die physikalische Position des Datensatzes von der jeweiligen Implementierung abhängig. Ist die Tabelle indiziert, wird der Index mit den neuen Datensatzinformationen aktualisiert.
Das Beispiel dazu:
Zitat:

In diesem Beispiel wird ein neuer Datensatz an eine Tabelle oder Client-Datenmenge angehängt, wenn der Benutzer auf eine Schaltfläche klickt. Die beiden Felder ALPHANUMERIC und INTEGER werden mit dem Inhalt zweier Eingabefelder gefüllt.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);

begin
  SampleTable.Append;
  SampleTable.FieldValues['ALPHANUMERIC'] := Edit1.text;
  SampleTable.FieldValues['INTEGER'] := StrToInt(Edit2.text);
  SampleTable.Post;
end;

Und zu AppendRecord:
Zitat:

Die Methode AppendRecord fügt einen neuen Datensatz mit Daten am Ende der Datenmenge hinzu und trägt ihn ein.

Delphi-Syntax:

procedure AppendRecord(const Values: array of const);

C++ Syntax:

void __fastcall AppendRecord(const System::TVarRec * Values, const int Values_Size);

Beschreibung

Mit AppendRecord können Sie einen neuen, leeren Datensatz am Ende der Datenmenge erstellen, ihn mit den in Values übergebenen Feldwerten füllen und in die Datenbank oder das Änderungsprotokoll eintragen. Der Parameter Values ist in C++ ein Array von Feldwerten. Der Parameter Values_Size ist der Index des letzten Wertes (um eins kleiner als die Gesamtzahl der Werte).

Ein neu hinzugefügter Datensatz wird auf eine von drei Arten in die Datenbank eingetragen:

Bei indizierten Paradox- und dBASE-Tabellen wird der Datensatz anhand seiner Indexposition in die Datenmenge eingefügt.
Bei nicht indizierten Paradox- und dBASE-Tabellen wird der Datensatz am Ende der Datenmenge hinzugefügt.
Bei SQL-Datenbanken ist die physikalische Position des Datensatzes von der jeweiligen Implementierung abhängig. Ist die Tabelle indiziert, wird der Index mit den neuen Datensatzinformationen aktualisiert.

Der neue Datensatz wird anschließend zum aktiven Datensatz.
Wieder das Beispiel dazu:
Zitat:

Diese Anweisung fügt einen Datensatz an die Daten von Customer an. Für einige der Werte werden Nullen eingegeben. Dies ist jedoch für fehlende Werte am Ende des Arrayarguments (nach dem Feld Discount) nicht erforderlich.

Delphi-Quellcode:
Customer.AppendRecord([CustNoEdit.Text,CoNameEdit.Text, AddrEdit.Text, Null, Null, Null, Null, Null, Null, DiscountEdit.Text]);


andy21 9. Jan 2008 20:28

Re: Liste in ein DBGrid schreiben
 
Ähm ja, also einen neuen Datensatz erstellen und dort etwas einfügen funktioniert ja. Wie kann ich jedoh auf einen speziellen zugreifen und dort etwas ändern. Für mich ist einfach nur unschlüssig wie ich eine Zeile/Datensatz auswählen kann. Wenn man dort so einfach navigieren könnte, wäre das gar nicht so das Problem. Ich brauche ja nur die geringsten Funktionen. ^^

DeddyH 9. Jan 2008 20:30

Re: Liste in ein DBGrid schreiben
 
Wenn Du einen Datensatz im DBGrid anklickst, sollte dieser eigentlich automatisch zum aktuellen werden.

andy21 9. Jan 2008 20:33

Re: Liste in ein DBGrid schreiben
 
Und via Programmcode? Wenn ich beispielsweise eine gewisse Datenmenge habe, die ich aktualisiere? Wie könnte ich denn in den Zeilen wandern. Also quasi wie in einer Schleife oder so ähnlich.

DeddyH 9. Jan 2008 20:37

Re: Liste in ein DBGrid schreiben
 
Vom ersten zum letzten Datensatz durchgehen?
Delphi-Quellcode:
Dataset.First;
while not Dataset.EOF do
  begin
    //mach was mit dem Datensatz
    Dataset.Next;
  end;
Wenn aber datensensitive Komponenten verbunden sind (z.B. das DBGrid), solltest Du aus Performancegründen vorher ein Dataset.DisableControls und anschließend ein Dataset.EnableControls absetzen (am Besten in einem try-finally-Block).

andy21 9. Jan 2008 20:53

Re: Liste in ein DBGrid schreiben
 
Alles klar. Funktioniert super. :-D

Vielen dank für deine ausgiebige Hilfe und tut mir Leid für die Umstände. :mrgreen:

:dp:

DeddyH 9. Jan 2008 20:56

Re: Liste in ein DBGrid schreiben
 
Zitat:

Zitat von andy21
Vielen dank für deine ausgiebige Hilfe und tut mir Leid für die Umstände. :mrgreen:

Kein Problem, aber das nächste Mal erst ausgiebig die Hilfe lesen, dazu ist sie ja da ;)

andy21 9. Jan 2008 21:02

Re: Liste in ein DBGrid schreiben
 
Teilweise habe ich da ja auch gelesen (über Append beispielsweise). Das Problem ist nur, dass ich manchmal nicht weiß wonach ich suchen soll und manchmal (na gut öfter) es auch nicht verstehe. ^^

andy21 13. Jan 2008 09:58

Re: Liste in ein DBGrid schreiben
 
Eine Frage habe ich noch. Wie kann ich etwas genau sortieren? Bei MySQL macht man das ja mit select und order by oder so ähnlich. Doch wie bei Mybase? Ich habe als Beispiel diverse Namen, die eine bestimmte Punktezahl haben und danach will ich die Datensätze Sortieren oder zumindest, dass er mir sie in der Reihenfolge ausgibt.

DeddyH 13. Jan 2008 10:46

Re: Liste in ein DBGrid schreiben
 
Unterstützt MyBase SQL? Dann dürfte sich das Vorgehen nicht von dem in MySQL (oder SQL-Server, Oracle, Firebird etc.pp.) unterscheiden.
SQL-Code:
SELECT [Feldliste] FROM Tabelle
ORDER BY [Sortierfeld] [ASC/DESC]

andy21 13. Jan 2008 11:41

Re: Liste in ein DBGrid schreiben
 
Hä? Wie soll das denn dann ablaufen? Ich kann mir nicht vorstellen, dass ich das da so hinschreibe. Ich kann ja nicht einfach im Delphi-Quelltext select und solch Zeugs schreiben oder wie verpackt man das?

DeddyH 13. Jan 2008 12:05

Re: Liste in ein DBGrid schreiben
 
Das muss natürlich als SQL in eine Query.

andy21 13. Jan 2008 12:21

Re: Liste in ein DBGrid schreiben
 
Ich habe im Internet mal recherchiert und konnte dort wohl herauslesen das Mybase mit Sql nichts zu tun hat und es wohl darüber nicht geht. :(

Gibt es da noch einen anderen Weg?

DeddyH 13. Jan 2008 13:15

Re: Liste in ein DBGrid schreiben
 
Also, ich habe dazu jetzt nichts gefunden, leider.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:55 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