Autor |
Beitrag |
Cancer
      
Beiträge: 17
|
Verfasst: 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
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: 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 
      
Beiträge: 17
|
Verfasst: 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
      
Beiträge: 256
Win XP, Vista, Win 7
Delphi 2005, Turbo Delphi
|
Verfasst: 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
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Do 31.03.05 11:06
_________________ Gruß
Hansa
|
|
Cancer 
      
Beiträge: 17
|
Verfasst: Do 31.03.05 11:54
@Hansa
Dein Code geht irgendwie net.
Bekomme den Fehler das ACol ein Undefenierter Bezeichner ist
|
|
LCS
      
Beiträge: 1305
Erhaltene Danke: 1
WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
|
Verfasst: 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
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: 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:
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:
| Function DBEmpty(dts : TDataSet) : Boolean; begin Result := not dts.Active; if not Result then begin Result := dts.eof and dts.bof; end; end;
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 
      
Beiträge: 17
|
Verfasst: 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
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Do 31.03.05 12:12
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
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Do 31.03.05 12:16
Mein Code reicht völlig. Oder hängt es nur an dem ACol ? LCS meint folgendes :
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.  Hat jemand vielleicht einen Tip, wie man sich so was merkt ? 
_________________ Gruß
Hansa
|
|
jasocul
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Do 31.03.05 12:20
hansa hat folgendes geschrieben: | Hat jemand vielleicht einen Tip, wie man sich so was merkt ?  |
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 
|
|
Cancer 
      
Beiträge: 17
|
Verfasst: 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
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Do 31.03.05 12:45
Cancer 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 
      
Beiträge: 17
|
Verfasst: 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
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: 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
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Do 31.03.05 13:27
_________________ Gruß
Hansa
|
|
Cancer 
      
Beiträge: 17
|
Verfasst: Do 31.03.05 13:28
Also ich habe bis jetzt das hier geschrieben
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
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Do 31.03.05 13:32
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.
Du musst für jede Zeile des StringGrids ein Insert und Post machen.
|
|
Cancer 
      
Beiträge: 17
|
Verfasst: Do 31.03.05 13:38
@jasocul
Cool danke.Das sieht ja richtig gut aus.Also es sieht sogar logisch aus.
@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.
|
|