Autor Beitrag
Cancer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: Do 31.03.05 01:03 
Wie kann ich den Inhalt eines TStringrids in ein DBGrid übernehmen?

Da ich eine Online abfrage mach und den Inhalt in einDtringgrid schreibe wolllte ich das ganze nun in einen Db speichern da ich das aber am besten mit einem DBGrid machen kann wollte ich nun den Inhlt vom SringGrid ins DBGrid schreiben oder gibt es auch einen schnelle lösung den Inhalt eines StringGrid in einen Db zu schreiben??
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Do 31.03.05 08:14 
Für die ERfassung der Daten benötigst du überhaupt kein DBGrid. Das DBGrid visualisiert nur die Daten. Was du benötigst ist TTable oder TQuery.
Mit denen kannst du die Daten in die Datenbank schreiben.
Sieh dir dazu die Methoden Insert und Post der Komponenten an oder beschäftige dich mit dem SQL-Befehl Insert.
Cancer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: Do 31.03.05 10:53 
Ok da gibt es aber folgendes Problem ich habe schon alles soweit fertig.Also ich meine ich habe es ja schon geschafft die Daten aus der MySQL-DB zu laden und habe alles in ein StringGrid geladen,was ja auch schon eine tortur war.Deswegen wäre es für einfacher den Code einfach etwas abzuändern damit ich die Daten aus dem StringGrid in die TTable schreiben kann.Es hört sich etwas kompleziert an,aber für mich wäre es einfacher.Nur ich weiß net wie das gehen soll.
Mike19
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 256

Win XP, Vista, Win 7
Delphi 2005, Turbo Delphi
BeitragVerfasst: Do 31.03.05 11:01 
Hallo,

wie bereits von jasocul bemerkt, brauchst Du doch kein DBGrid. Wenn die Daten in einem StringGrid vollständig vorhanden sind, kannst Du diese einfach über ein Table in eine Datenbank übernehmen. Oder ich habe Deine Frage falsch verstande.

Mike
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Do 31.03.05 11:06 
user profile iconCancer hat folgendes geschrieben:
...Also ich meine ich habe es ja schon geschafft die Daten aus der MySQL-DB zu laden und habe alles in ein StringGrid geladen...


Du brauchst doch nur Zeile für Zeile durchzugehen und dann eben wie gesagt ein insert/update durchzuführen. Also quasi umgekehrt wie beim Lesen.

ausblenden Delphi-Quelltext
1:
2:
3:
DS.FieldbyName ('blabla-Feld').AsInteger := stringgrid.cells [ACol,ARow];
... weitere Felder
DS.Insert;

_________________
Gruß
Hansa
Cancer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: Do 31.03.05 11:54 
@Hansa

Dein Code geht irgendwie net.
Bekomme den Fehler das ACol ein Undefenierter Bezeichner ist
LCS
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1305
Erhaltene Danke: 1

WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
BeitragVerfasst: Do 31.03.05 11:59 
Hi
das musst du natürlich in eine Schleifenkonstruktion einbinden, die alle Zeilen (ARow) und alle Spalten (ACol) durchläuft. Und die zwei Variablen musst du logischerweise deklarieren.

Gruss Lothar

_________________
Der BH ist für die Brust, der Plan ist für'n Ar...
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Do 31.03.05 12:00 
Du hast den falschen Lösungsansatz gewählt.
Du hättest die Daten gar nicht ins StringGrid einlesen müssen.

Deine Online-Abfrage greift vermutlich ebenfalls auf eine DB zu. Du hättest die Daten einfach (wie oben angedeutet) in deine lokale Datenbank ablegen können.
Danach hättest du das ganze in einem DBGrid darstellen können.

So ähnlich hätte es laufen können:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
//Hilfsfunktion
Function DBEmpty(dts : TDataSet) : Boolean;
begin
  Result := not dts.Active;
  if not Result then begin
    Result := dts.eof and dts.bof;
  end;
end;

// Kopier-Prozedur
procedure KopiereDatensatz(qQuelle, qZiel : TDataset);
var
  cnt : Integer;
  arr : array of variant;
begin
  if not DBEmpty(qQuelle) then begin
    SetLength(arr, qQuelle.FieldCount);
    for cnt := 0 to qQuelle.FieldCount - 1 do begin
      arr[cnt] := qQuelle.Fields[cnt].AsVariant;
    end;

    qZiel.Append;
    for cnt := 0 to qZiel.FieldCount - 1 do begin
      qZiel.Fields[cnt].AsVariant := arr[cnt];
    end;
    qZiel.Post;
  end;
end;

Um die Kopier-Prozedur hättest du eine Schleife bauen können und dadurch alle Datensätze übertragen können. Bei dieser Prozedur ist sogar egal, ob du TTable oder TQuery benutzt. Schreibrechte auf deiner Datenbank-Tabelle müssen natürlich vorhanden sein.

Unde bevor wieder Kommentare kommen: "Variant" ist nicht die beste Lösung, aber hier ganz praktisch, da man damit diese Routine universell einsetzen kann.
Cancer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: Do 31.03.05 12:03 
Oh ja stimmt.Ist ja logisch.

So nun habe ich aber ein anderes Problem wie mache ich das?Könnte mir einer vieleicht einen Code geben da ich mit einem StringGrid leider noch keine erfahrungen gemacht habe.Wäre cool wenn mir da einer weiter helfen würde.
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Do 31.03.05 12:12 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure Tform1.Kopiere;
var
  zeile, spalte : integer;
begin
  for zeile := 0 to stringgrid1.rowcount-1 do
  begin
    table1.append;
    for spalte := 0 to stringrid1.colcount-1 do
    begin
      table1.fields[spalte].asstring := stringgrid1.cells[spalte,zeile];
    end;
    table1.post;
  end;
end;

ungetestet.
Die Bezeichner musst du noch anpassen und die Prozedur korrekt in dein Programm einbauen.
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Do 31.03.05 12:16 
Mein Code reicht völlig. Oder hängt es nur an dem ACol ? LCS meint folgendes :

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
for i := 1 to RowCount do begin
  DS.FieldbyName ('blabla-Feld').AsInteger := stringgrid.cells ["gewünschte Spalte",i];  
... weitere Felder   
  DS.Insert; 
end;


Und passe auf mit den Grenzen der for-Schleife. Ich zumindest weiß nie, ob es bei 0 oder 1 anfängt und bei RowCount oder RowCount-1 endet. :P Hat jemand vielleicht einen Tip, wie man sich so was merkt ? :mrgreen:

_________________
Gruß
Hansa
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Do 31.03.05 12:20 
user profile iconhansa hat folgendes geschrieben:
Hat jemand vielleicht einen Tip, wie man sich so was merkt ? :mrgreen:

iirc fängt es nur bei Strings bei 1 an.
Bei allen anderen Dingen, wo mit der Anzahl (z.B. RowCount) gearbeitet wird und man bei "0" startet, muss man demnach bis Anzahl-1 laufen.

Also ist dein Source falsch 8)
Cancer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: Do 31.03.05 12:39 
@Hansa

meinst du dein Insert Befehl ist da richtig??
Habe es mal probiert aber ich bekomme eine Fehlermeldung das ich nicht im Editier oder Einfügemodus bin habe auch schon versucht die Table in den einfügemodus zu bringen,aber es kommt immernoch der fehler.
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Do 31.03.05 12:45 
user profile iconCancer hat folgendes geschrieben:
@Hansa

meinst du dein Insert Befehl ist da richtig??
Habe es mal probiert aber ich bekomme eine Fehlermeldung das ich nicht im Editier oder Einfügemodus bin habe auch schon versucht die Table in den einfügemodus zu bringen,aber es kommt immernoch der fehler.

Der steht an der falschen Stelle. Erst Insert (oder append) und dann die Feldzuweisungen.
Cancer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: Do 31.03.05 13:11 
@Hansa

Habe deinen Befehl mal genommen und es GEHT,aber auch net wirklich!
Und zwar fügt das Prog nun das was im StringGrid ist in die Table,aber immer nur den letzten Datensatz.
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Do 31.03.05 13:22 
Hast du dir mal meinen Source angesehen?
Der von Hansa ist nur ein Schnipsel. Da fehlt z.B. ein Post.
Zeig doch mal, was du bis jetzt programmiert hast.
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Do 31.03.05 13:27 
user profile iconjasocul hat folgendes geschrieben:
...Also ist dein Source falsch 8)


Der Source der hier steht, ist etwas falsch. Das stimmt. :mrgreen: Also : das Insert muß als erstes kommen. Dann kommen die Felder und zum Schluß noch ein Post. Und Rowcount geht dann bis -1 weil es bei 0 anfängt. Wobei wir bei den FixedRows wären. Die gilt es auch zu beachten. Also z.B.:
ausblenden Delphi-Quelltext
1:
2:
for i := Stringgrid.FixedRows to Stringgrid.Rowcount-1 do 
bla bla


Leider habe ich wenig Zeit, da ich morgen nach Kassel muß, wegen dringendem Termin. :lol:

_________________
Gruß
Hansa
Cancer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: Do 31.03.05 13:28 
Also ich habe bis jetzt das hier geschrieben

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TFormUpdaten.BitBtn1Click(Sender: TObject);
var
        i : integer;
begin
  DataModul.TableOnUp.Insert;
for i := 0 to StringGrid2.RowCount-1 do begin
  DataModul.TableOnUp.FieldbyName ('Titel').AsString := StringGrid2.cells [2,i];
  DataModul.TableOnUp.FieldbyName ('Land').AsString := StringGrid2.cells [3,i];
end;
  DataModul.TableOnUp.Post;
end;


Wobei da noch zellen hinzukommen
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Do 31.03.05 13:32 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TFormUpdaten.BitBtn1Click(Sender: TObject);
var
  i : integer;
begin
  for i := 0 to StringGrid2.RowCount-1 do begin
    DataModul.TableOnUp.Insert;
    DataModul.TableOnUp.FieldbyName ('Titel').AsString := StringGrid2.cells [2,i];
    DataModul.TableOnUp.FieldbyName ('Land').AsString := StringGrid2.cells [3,i];
    DataModul.TableOnUp.Post;
  end;
end;

Ansehen, Vergleichen und AHA sagen. :wink:
Du musst für jede Zeile des StringGrids ein Insert und Post machen.
Cancer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: Do 31.03.05 13:38 
@jasocul

Cool danke.Das sieht ja richtig gut aus.Also es sieht sogar logisch aus. :D

@all

SO jetzt bekomm ich so einen blöden Indexfehler.Ich werd noch bek....!
was kann das denn jetzt sein es ist doch alles richtig an dem Code nur so ein blöder Indexfehler.