etwas in eine datenbank kopieren
-
ich habe folgende Frage:
ich gebe in einem Editfenster Daten an. Diese möchte ich dann in ein DBGrid kopieren. wie geht das.
Wie kann ich außerdem steuern, dass ein neuer Datensatz eingefügt wird, wenn man nicht die Navigationsleiste nutzen möchte. Ich habe nämlich ein extra Formular wo ich die Daten eingebe und diese sollen in das DBGrid übertragen werdenIm normale Grid würde es ja so aussehen:
Form1->StringGrid1->Cells[1][i-1] = Turniereingabe->Label7->Caption; Form1->StringGrid1->Cells[2][i-1] = Turniereingabe->Edit1->Text; Form1->StringGrid1->Cells[3][i-1] = Turniereingabe->Edit3->Text;
-
Äh wie jetzt? Wo - und vor allem - warum?
Ne, ernsthaft. Wenn du eine extra Maske für die Dateneingabe hast, werden von da die Daten wahrscheinlich in eine DB geschrieben, oder?
Wenn dem so ist, einfach das DBGrid mit dieser DB verbinden, AutoUpdate einstellen, vllt. noch ein paar kleinere Modifikationen, und das DBGrid ist up-to-date.grüssle

Oh - mein 222. Beitrag *hicks*
:p
-
ich würde es gerne so haben wollen, dass er die Daten aus der Extramaske dannn in die DB einträgt. weis nur eben nicht wie. Möchte dabei auf die einzelnen felder der DB zugreifen und über einen anderen Button als den DBnavigator einen extra Datensatz hinzufügen.
Hab nämnlich nen MonthCalendar. dort mach ich nen doppelklick auf einen tag und dann kommt die maske. die daten die ich dort eingebe möchte ich gern in die DB übertragen haben.
Aber wie.
-
Hallo,
Wie liest du denn aus der Datenbank? Welche Komponenten benutzt du?
Bei einem TQuery kann man zum Einfügen ein INSERT SQL-Statement verwenden. Zu den BCB-Datenbankkomponenten gibt es auch in der FAQ ein Tutorial (Abschnitt Datenbanken).
-
Was willst Du mit der Maske machen ?
Vor allem vorhanden Datensätze editieren ?
Dann bietet sich eine Datasource mit Navigator sowie DB-Editfeldern an.
Die Source kannst Du wenn Du willst, auch gleich noch mit einem DBGrid koppeln. Das Grid machst Du ReadOnly, wenn der User dort nichts editieren soll.Wenn Du Daten in einem DBEdit geändert(eingetragen) hast, werden diese bei Verlassen des Feldes automatisch in die DB geschrieben und das DB-Grid aktualisiert (wenn DataSource Property AutoEdit=true).
Wenn Du einfach Daten eingeben lassen willst (ohne Updatemöglichkeit), dann kannst Du einen Button Neu nehmen, der die Eingabefelder (Edit's) cleart und einen neuen Primary-Key festlegt (so dieser nicht durch den User einzugeben ist). Dann läßt Du die normalen Edit-Felder ausfüllen und baust aus den Eingaben ein Insert-Kommando (String) zusammen, den Du z.B. mit einem ADOCommand ausführen lassen kannst.
Wenn Du Updates zulassen willst, dann mach das mit den DBEdit. Auch dort kannst Du mit einem expliziten Insert (das z.B. über einen Button gesteuert wird) einen neuen DS einfügen ohne die Navigationsleiste zu benutzen.
Bsp. insert into TABLE (PrimaryKey) values (DataPK)
Falls der User den logischen PK (z.B. Mitarbeiter, Adresse etc.) selbst eintragen können soll, dann schalte einfach einen intern PK (i.d.R. ROWID) vor. Das bietet sich prinzipiell an. (Es sei denn, Dein System arbeitet mit rowguid - z.B. wegen einer Replikation. Dann brauchst die ROWID nicht).
Da habe ich mit meiner Antwort wohl zu lange gebraucht.

-
das mit dem TQuery scheint schon richtig zu sein. aber wie wende ich es an.
habe leider kein beispile gefunden.benutze eine Paradox7 Datentabelle. Eine TTable und DataSource.
-
wie lege ich den einen neuen Primary Key an.
im Prinzip möchte ich daten eingeben und übertragen lassen. habe das mal mit dem DBEdit probiert und funktioniert. nur mit dem erstellen eines neuen Datensatzes klappt es noch nicht.
-
Kann man in einer DB eigentlich auch nach Spalten Sortieren. Wie geht das.
Mit dem Übertragen in die DB habe ich hinbekommen. Auch mit dem automatischen Posten und Datensatzneuerstellung.
FRAGE:
Wie kann ich aber das Datum vom DateTimePicker in die Datenbank übertragen?
Warum kann ich den das ausgewählte Datum vom MonthCalendar nicht in das DBText1 übertragen?
code:Form2->DBText1->Caption = Form1->MonthCalendar1->Date.DateString();
-
Jetzt kenne ich mich mit der Kalenderfunktion nicht aus!
Das DBEdit läßt immer Einträge von dem Datentyp zu, des damit verbundenen DB-Feldes. Ist also das Feld numeric etc. kriegst Du kein Datum, String etc. rein. Ist das DB-Feld date/datetime oder so (je nach DB) kriegst Du dort ein Datumswert rein aber keinen String oder ähnliches. Du mußt also möglicherweise konvertieren.
Sortieren nach Spalten? Jetzt weiß ich allerding nicht genau, was Du meinst?
Welchen Sinn macht es Datensätze nach Spalten zu sortieren?Oder meinst Du, die Spalten in einer bestimmten Reihenfolge anzuzeigen z.B. Spalte1,Spalte2 ....
Falls es das ist, dann mach nicht <<select * from Table>> sondern <<select spalte1,spalte2,spalte3 ... from table order by ...>> (sortiert dann gleich noch die Datensätze(Zeilen))
Solltest Du die Sortierung der Datensätze nach einer bestimmten Spalte (z.B. Datum) meinen, dann nimm SQL <<order by>> <<asc>> für aufsteigend=A->Z sertiert, <<desc>> für absteigeng=Z->A sortiert.
-
ne, dann meine Ich wahrscheinlich eher nach zeilen. Ich möchte genauer gesagt nach dem Datum sortieren.
Es geht hauptsächlich darum bei DBText das Datum zu implementieren. Siehe Code.
Hier funktioniert es nicht.
code:Form2->DBText1->Caption = Form1->MonthCalendar1->Date.DateString();wenn ich jetzt aber folgendes eingebe und statt DBText jetzt StaticText verwende geht es.
Code:Form2->StaticText1->Caption = Form1->MonthCalendar1->Date.DateString();
-
Hallo
ist doch klar, ein TDBText bekommt seine Caption aus einem Feld aus der angeschlossen DataSource. Es ist nicht gedacht, das die Caption-Eigenschaft manuell geändert wird, also hast du darauf keinen Zugriff.
Entweder nimmst du ein anderes Control oder schreibst den Wert den du anzeigen willst erstmal in die Datenbank, um es dann in DBText anzeigen zu lassen.bis bald
akari
-
@ Akari
Ich gehe mit Doppelklick auf MonthCalendar. Dieses datum welches ich angeklickt habe, soll gleich in meiner Eingabemaske erscheinen. Dieses Datum soll dann mit den ganzen anderen Einmträgen in die Datenbank übertragen werden.
Alle anderen Date bekomme ich übertragen. Nur nicht das Datum und das Datum vom DateTimePicker.
-
Entweder nimmst du ein anderes Control oder schreibst den Wert den du anzeigen willst erstmal in die Datenbank
Wie kann ich also z.B. den Capture-Wert von StaticText in der Datenbank in der Aktuellen Zeile und z.b. Spalte 2 anzeigen lassen?
Meine Grundidee war ja dies schon. ich bekomme es nur nicht umgesetzt.
-
Anders herum wird ein Schuh draus.
Du schreibst was in die DB, was Du dann anzeigst - in einem mit einer Datenmenge (DataSource) verbundenen Objekt, wie z.B. DBGrid, DBEdit etc.Du nimmst also den Datumswert, den die aus Deinem Kalender gekriegt hast, fügst über ein Insert-Kommando einen neuen DS in Deine Tabelle ein (mit dem Datum als einzig ausgefülltem Wert).
Wenn Deine DataSource automaisch aktualisisert wird, dann erscheint darauf hin die aktualisierte Anzeige in Deinem z.B. DBGrid-Objekt.Wenn Deine Datasource mehr als einen DS enthält, macht ein PrimaryKey als Identifier Sinn. Du wirst ja mehr als einen DS mit dem gleichen Datum anlegen können (Es sei denn Deine Spalte Datum ist unique). Nenn das Ding ROWID, das ist ein Std-Begriff. Normalerweise ist das eine fortlaufende Nummer (gelegentlich eine NummernBuchstabenkombination). Die Nummer ist einmalig je Tabelle, so daß Du den Datensatz anhand dieser eindeutig identifizieren kannst.
Viele DB-Systeme unterstützen diese Funktion von sich aus.
Z.B.: MS-SQL-SERVER
create Table <<Table>>
(ROWID int identity (1,1) NOT NULL unique,
...
)
Bei Paradox weiß ich nicht. Wenn nicht ist das auch kein Problem. Hole Dir die maximale Nummer von Rowid (select max(ROWID) from TABLE) und zähle diese weiter.Das geht sogar in einem Kommando
insert into TABlE (ROWID,DATUM)
select MAX(ROWID)+1,<<Wert des Datums>>
from TABLE <- falls Deine DBMS sowas zuläßt. Sonst machst Du das halt in C++.Um den aktuellen DS anzuzeigen gibt's mehrere Möglichkeiten.
Du kannst die Auswahl einschränken -> select * from TABLE where ROWID = WertROWID (wenn Du den Wert kennst weil Du ihn z.B. in C++ erzeugt hast.)Du kannst die Abfrage auch mit einer Unterabfrage einschränken
select *
from TABLE
where rowid = (select MAX(ROWID) from TABLE) (wenn Du die erzeugte ROWID nich kennst)Du kannst Dich in Deiner DataSource zum letzten DS bewegen (Methode Last). Das klappt dann, wenn Dein Select nicht sortiert ist, weil Datensätze immer ans Ende der Tabelle angehängt werden.
usw. usf.
Du kannst auch in Deiner DS den gewünschten DS aktuell setzen (z.B. Methode Locate), wenn Du Deinen DS identifizieren kannst.
Ein Datum reicht dafür meistens nicht aus, weil mehrfach vorkommen kann -> "Ich kann X dumme, lange Post's am Freitag, den 13. 2006 schreiben".Du kannst auch den Inhalt einer Zelle des aktuellen DS an ein unverbundes Objekt/Variable übergeben.
Bsp.nVglSz=ADOQuery1->FieldValues["SZWERKSTATT"]; // einfach aus einem meiner Progrämmchen kopiertDas Beispiel geht einem Query mit bekannten Spalten (zur Entwurfzeit) aus.
Das sollte bei Dir passen.