![]() |
Datenbank: ABS-DB • Version: 5.12 • Zugriff über: ABSQuery, DataSource
Die Zeilen eines TMemo in die Datenbank (Tabelle) speichern
Seit einiger Zeit versuche ich die Einträge eines TMemos zeilenweise in die ABSTabelle zu speichern, aber ohne Erfolg:
Delphi-Quellcode:
Über Hilfe würde ich mich sehr freuen!
procedure TDemoForm.BtnSpeichernClick(Sender: TObject);
begin with DatenModel, QueryKTxt do begin Append; FieldByName('Zeile1').AsString := Memo1.Lines[0]; ... Post; end; end; Gruß Lombi |
Re: Die Zeilen eines TMemo in die Datenbank (Tabelle) speich
Kommt ein Fehler?
|
Re: Die Zeilen eines TMemo in die Datenbank (Tabelle) speich
Nein das nicht, aber es wird nichts in die Tabelle gespeichert.
|
Re: Die Zeilen eines TMemo in die Datenbank (Tabelle) speich
Hallo Lombi,
wenn kein Fehler kommt, dann könnte ich mir vorstellen, dass sehr wohl etwas in der Tabelle gespeichert wurde. Du hast allerdings kein Schlüsselfeld gefüllt, so dass du den Datensatz nicht an der erwarteten Stelle findest. Die Zeilen eines Memos würde ich nicht unbedingt auf einzelne Felder eines Datensatzes abbilden wollen. Flexibler ist es, wenn der Inhalt gleich in einem Memo-Feld (ABS unterstützt diese Form eines BLOB-Feldes bestimmt) gespeichert wird. Oder, wenn ein BLOB-Feld nicht zur Diskussion steht, dann in einer Detailtabelle TEXTE (ID, ZEILE). Beispiele für das Ansprechen von Blob-Feldern aus Delphi heraus findest du in der ABS-Hilfe unter dem Indexeintrag BLOB. Freundliche Grüße |
Re: Die Zeilen eines TMemo in die Datenbank (Tabelle) speich
Hallo marabu,
genauso ist es! Nach Änderungen werden jetzt die Memozeilen in die Tabelle geschrieben, jedoch nicht in die dafür vorgese- henen Schlüsselfelder von Detailtabelle TxtNr 1, Zeile1, ...
Delphi-Quellcode:
Diese Kurztexte sollen später in Belegen erscheinen.
...
if Locate('TxtNr', 1, []) then begin Append; FieldByName('Zeile1').AsString := Memo1.Lines[0]; FieldByName('Zeile2').AsString := Memo1.Lines[1]; ... Post; Also sinnvoller, die ABS auf den Feldtyp Memo umstellen und eine .txt-Datei verwenden? Grüße |
Re: Die Zeilen eines TMemo in die Datenbank (Tabelle) speich
Bitte nicht einfach umstellen.
Beschreibe erstmal, welche Bedeutung diese Texte haben. Sind das Textbausteine, die du verschlüsseln willst um sie über einen Auswahlmechanismus bei der nächsten Eingabe anbieten zu können? Kannst du ein Beispiel geben? |
Re: Die Zeilen eines TMemo in die Datenbank (Tabelle) speich
Nein, verschlüsseln brauche ich diese Textbausteine nicht.
Diese sollen bei einer Belegerfassung am Anfang und Ende mit TextNr angezeigt werden, vielleicht sogar wählbar mittels einer ComboBox. Text Nr. 1 Rechnung -Anfang- MemoText (Zeile1, Zeile2, ...) Text Nr. 2 Rechnung -Ende- MemoText (Zeile1, Zeile, .... ... |
Re: Die Zeilen eines TMemo in die Datenbank (Tabelle) speich
Es geht also um Standard-Textbausteine? Dann würde ich sie als MEMO (BLOB) speichern.
Mit "Verschlüsseln" bezeichne ich im Datenbankkontext die Speicherung einer Information zusammen mit einem Schlüssel, so dass man über diesen Schlüssel wieder an die Information kommt - also eine Lookup-Table. |
Re: Die Zeilen eines TMemo in die Datenbank (Tabelle) speich
Ja um Standard-Textbausteine.
Habe den ABS-Feldtyp auf "Memo" geändert. Wie bitte bekomme ich jetzt die Einträge (Zeile1, Zeile2...) in die richtigen Schlüsselfelder von TxtNr 1? |
Re: Die Zeilen eines TMemo in die Datenbank (Tabelle) speich
Nehmen wir mal du hättest eine Tabelle TBS: ID, NAME, TEXT - dann ist ID der automatisch vergebene Primärschlüssel, NAME eine kurze Identifikation zur Benutzerauswahl und TEXT der vollständige Textbaustein. In Schlüsselfelder schreibst du also gar nichts und auch das zeilenweise Speichern unterbleibt.
Zitat:
Aus der ABS Online Hilfe
Delphi-Quellcode:
procedure TForm1.btLoadClick(Sender: TObject);
var FileStream: TFileStream; BlobStream: TABSBlobStream; begin ABSTable1.Edit; try FileStream := TFileStream.Create('Comments.txt',fmOpenRead or fmShareDenyNone); BlobStream := ABSTable1.CreateBlobStream(ABSTable1.FieldByName('Comments'),bmWrite); BlobStream.CopyFrom(FileStream,FileStream.Size); FileStream.Free; BlobStream.Free; ABSTable1.Post; except ABSTable1.Cancel; raise; end; end; Der Trick mit dem BlobStream funktioniert mit TField, aber auch mit TParameter. Im Beispiel liest ein Stream aus einem anderen. Du hast deinen Textbaustein in einem TMemo erfasst, also würde ich es umdrehen und mit Memo.Lines.SaveToStream() in den BlobStream schreiben. |
Re: Die Zeilen eines TMemo in die Datenbank (Tabelle) speich
Hallo marabu,
habe die Tabelle für Textbausteine entsprechend deiner Anweisung geändert. Mit den beiden Codes schreibe ich in das TMemo1 bzw. lese aus:
Delphi-Quellcode:
1.) Stimmen die Codes?
procedure TFmTBS.BtnSpeichernClick(Sender: TObject);
var FileStream: TFileStream; BlobStream: TStream; begin ... Edit; FileStream := TFileStream.Create('TBS.Txt',fmOpenRead or fmOpenWrite); BlobStream := CreateBlobStream(FieldByName('Text'),bmWrite); Memo1.Lines.SaveToStream(BlobStream); //Textbaustein, Text-ID 1 schreiben; FileStream.Free; BlobStream.Free; Post; end; procedure TFmTBS.FormCreate(Sender: TObject); ... Edit; FileStream := TFileStream.Create('TBS.Txt',fmOpenRead or fmOpenWrite); BlobStream := CreateBlobStream(FieldByName('Text'),bmRead ); Memo1.Lines.LoadFromStream(BlobStream); //Textbaustein, Text-ID 1 lesen; ... end; end; 2.) TBS.Txt ließ sich nicht automatisch erzeugen und mußte manuell hinzugefügt werden. 3.) Wie schreibe/lese ich die Texte für TMemo2 usw. auf der gleichen FmTBS? Vielen Dank vorab für die Antwort. Gruß Lombi |
Re: Die Zeilen eines TMemo in die Datenbank (Tabelle) speich
Hallo Lombi,
dein Code mag syntaktisch korrekt sein, aber ob er tut was du willst ist ohne Kenntnis deines Konzeptes nicht prüfbar. Ich vermute, dass du eine Form zur Pflege der Textbausteine hast. Wenn du das Lesen eines Textbausteins dann beim FormCreate() erledigst, dann ist das vielleicht nicht so toll. Ich stelle mir eine solche Form eher so vor: In einem Memo kann der Baustein-Text bearbeitet werden. Eine ListBox stellt die Baustein-Namen zur Verfügung. Durch Auswahl eines Namens wird der entsprechende Baustein-Text in das Memo geladen. Bei Änderungen werden zwei Buttons ("Speichern" und "Zurücksetzen") aktiviert, deren Funktionalität du unschwer erkennen kannst. Zwei weitere Buttons ("Neu" und "Löschen") komplettieren die Benutzerschnittstelle. Ich würde zwei Methoden ("LoadText" und "SaveText") entwerfen, die den Transport der Daten zwischen Memo und Datenbank erledigen. Dabei muss entschieden werden, ob man mit einem langlebigen oder einem kurzlebigen Cursor auf dem DataSet arbeiten möchte. Langlebig bedeutet, dass die Datenbank-Tabelle während der Lebensdauer der Form offen gehalten wird, ein kurzlebiger Cursor wird nach jeder Operation sofort wieder freigegeben. Im ersten Fall würde ich eine Table-Komponente einsetzen, im letzten eine Query. Da ich von einer überschaubaren Datenmenge ausgehe, halte ich hier die Table-Lösung für angemessen. Freundliche Grüße |
Re: Die Zeilen eines TMemo in die Datenbank (Tabelle) speich
Liste der Anhänge anzeigen (Anzahl: 1)
Anbei ein kleines Demöchen... nix besonderes und auch nicht unbedingt sauber ausgeproggt, aber zur VEranschaulichung und weiteren Experimenten sollte es genügen ;)
|
Re: Die Zeilen eines TMemo in die Datenbank (Tabelle) speich
Hallo,
bei Klick auf eine Textbez in der Listbox muß der entsprechende Textinhalt in die Memo geladen werden. Wie bekomme ich bitte diese Verbindung? |
Re: Die Zeilen eines TMemo in die Datenbank (Tabelle) speich
Nun...relativ einfach:
1. im OnActivate des Formulares die Listbox.Items mit dem Inhalt der Textbaustein-Tabelle laden (analog der ComboBox in der Demo) 2. im OnClick der Listbox die ID des Textbausteines herausfrickeln (analog ComboBoxClick in der Demo) 3. ID in der Tabelle suchen, Stream erstellen und Inhalt des Tabellenfeldes in das Memo streamen ... That's it :) Oder bin ich auf dem falschen Gleis? Denke eher nicht :gruebel: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:51 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