Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Memofeld in Tabelle schreiben? (https://www.delphipraxis.net/111191-memofeld-tabelle-schreiben.html)

Borschti 31. Mär 2008 11:56

Datenbank: ADS • Version: 8.1 • Zugriff über: TDataSource u. TTable

Memofeld in Tabelle schreiben?
 
Hallo,

ich habe ein kleines Problem mit dem wegschreiben von Daten in eine Tabelle, und zwar versuche ich den Text eines Memofeldes in ein Feld in einer Tabelle zu schreiben.

Nur das will nicht so ganz klappen, ich gebe euch am besten mal meinen Code damit ihr besser nachvollziehen könnt was ich meine:

Delphi-Quellcode:
for i := 0 to vddTable1.RecordCount do
   begin
     Memo1.Clear;
     Memo1.Text := VddTable1.FieldByName('Langtext').asstring;
     zwischS1 := Memo1.Lines.Count + zwischS1;
     Memo2.Lines.Text := Trim(Memo1.text);
     zwischS2 := Memo2.Lines.Count;
     zaehler := zwischS1 - zwischS2;
     zaehler2 := 0;
     zaehler2 := zaehler2 + zaehler;
     VddTable1.Edit;
     VddTable1.FieldByName('Langtext').asString := Memo2.Text;
     VddTable1.Post;
     vddTable1.Next;
   end;
Ich denke es liegt an einer kleinigkeit die ich außer acht gelassen hab, ist so ziemlich das erste mal das ich was mit .post mache also ist es ganz gut möglich das ich was vergessen hab ;)

Danke schonmal für alle Antworten.

mfg
Alex

mkinzler 31. Mär 2008 12:02

Re: Memofeld in Tabelle schreiben?
 
Was für einen Typ hat das Datenbankfeld?

marabu 31. Mär 2008 12:07

Re: Memofeld in Tabelle schreiben?
 
Hallo Alex,

du möchtest Leerzeilen vor und hinter LANGTEXT entfernen und dabei die Zahl der entfernten Zeilen protokollieren?

Deine Schleife läuft einmal zu oft.
Die Initialisierung von zahler2 gehört wohl nicht in die Schleife.

Und last but not least: Was funktioniert nicht?

Grüße vom marabu

Borschti 31. Mär 2008 12:20

Re: Memofeld in Tabelle schreiben?
 
Also das Datenbankfeld ist auch vom Typ Memo.

Also vorher muss nicht sein, aber wird mit Trim() wohl mit abgedeckt, die entfernten Zeilen möchte Ich dann Zählen, ja.

Die Intialisierung war wirklich fehl am Platze, hatte was getestet und wieder vergessen rauszunehmen ;)

Also die bearbeiteten Inhalte im Feld Langtext werden nicht wieder in die Tabelle zurückgeschrieben, Ich denke das geht mit .post aber es ist wohl ein Fehler drin den ich nicht finde.

mkinzler 31. Mär 2008 12:26

Re: Memofeld in Tabelle schreiben?
 
Versuch mal
Delphi-Quellcode:
VddTable1.FieldByName('Langtext').Value := Memo2.Text;
Das .Next führt den Post mit aus.

Borschti 31. Mär 2008 12:58

Re: Memofeld in Tabelle schreiben?
 
Hmm also danke erstmal für die Antworten, Ich bin jetzt soweit, dass ich mir sicher bin das, dass Problem an dem Memofeld liegen muss, ich habe mal ein Feld vom Typ Character mit:
Delphi-Quellcode:
VddTable1.Edit
VddTable1.FieldByName('Bezeichnung').asstring := 'narf';
VddTable1.Post;
bearbeitet. Hier gabs keine Probleme.

Ist denn .Text eigentlich die richtige Eigenschaft oder wäre .Lines vielleicht angebrachter?

Woran könnte es sonst noch liegen?

mfg
Alex

marabu 31. Mär 2008 13:41

Re: Memofeld in Tabelle schreiben?
 
Memo-Felder einer TTable kannst du so bearbeiten:

Delphi-Quellcode:
const
  LT = 'LANGTEXT';
var
  ms: TStream;
  sl: TStrings;
  n, nTotal: Integer;
begin
  // ..
  ms := TMemoryStream.Create;
  sl := TStringList.Create;
  nTotal := 0;

  with VddTable1 do
    while not Eof do
    begin
      TBlobField(TFieldByName(LT)).SaveToStream(ms);
      ms.Position := 0;
      sl.LoadFromStream(ms);
      n := sl.Count;
      sl.Text := Trim(sl.Text);
      Inc(nTotal, n - sl.Count));
      ms.Size := 0;
      sl.SaveToStream(ms);
      ms.Position := 0;
      Edit;
      if sl.Count = 0
        then FieldByName(LT).Clear
        else TBlobField(FieldByName(LT)).LoadFromStream(ms);
      Post;
      Next;
    end;

  sl.Free;
  ms.Free;
  // ...
end;
Getippt und nicht getestet.

Edit: Tippfehler korrigiert - danke @Peinhard

Borschti 31. Mär 2008 15:12

Re: Memofeld in Tabelle schreiben?
 
Erstmal danke das du dir die Mühe gemacht hast den Code zu tippen, Ich habe aber nun noch das Problem, dass mir angezeigt wird das "TField" kein Element Namens "SaveToStream" enthält, genauso bei LoadFromStream. Units Classes ist eingebunden. Kann man SaveToStream und LoadFromStream garnicht auf FieldByName anwenden? Wenn ja, was könnte man sonst benutzen?

mfg
Alex

Peinhard 31. Mär 2008 15:17

Re: Memofeld in Tabelle schreiben?
 
Auf TBlobField bzw TMemoField casten. Die Zeile

Delphi-Quellcode:
if sl.Count = 0
scheint mir übrigens

Delphi-Quellcode:
if sl.Count > 0
lauten zu sollen.

Borschti 31. Mär 2008 16:20

Re: Memofeld in Tabelle schreiben?
 
Naja habs mal mit dem casten probiert, nun wird mir die Fehlermeldung: 'VddTable1: Error modifying read only blob' angezeigt und mein Programm stürzt komplett ab =(

Ich kann mit der Fehlermeldung nicht viel anfangen...

Vielleicht sagt Sie euch ja mehr als mir.

mfg
Alex

Borschti 1. Apr 2008 09:10

Re: Memofeld in Tabelle schreiben?
 
Ok, Ich glaub Ich hab die Fehlermeldung jetzt verstanden ~~

Anscheind kann das Blobfeld nur gelesen aber nich bearbeitet werden, wie kann man das denn ändern? Oder geht das vielleicht garnicht?

mfg
Alex

joachimd 1. Apr 2008 09:38

Re: Memofeld in Tabelle schreiben?
 
Delphi-Quellcode:
table.edit;
TBlobfield(table.fieldbyname('anyblob')).loadfromstream(anystream);
table.post;

Borschti 1. Apr 2008 11:11

Re: Memofeld in Tabelle schreiben?
 
Danke erstmal, also die Fehlermeldung ist zumindest schonmal weg, aber das alte Problem das es nicht auf die Tabelle übertragen wird besteht immernoch :(

Hier ist mal mein derzeitiger Code, mir fällt einfach nicht auf woran es liegen kann, es wird mir auch nichts angezeigt warum es nicht auf die Tabelle übertragen wird...

Delphi-Quellcode:
var
  ms: TStream;
  sl: TStrings;
  n, nTotal: Integer;
begin
  ms := TMemoryStream.Create;
  sl := TStringList.Create;
  nTotal := 0;


  with VddTable1 do
    while not Eof do
    begin
      TBlobField(FieldByName('Langtext')).SaveToStream(ms);
      ms.Position := 0;
      sl.LoadFromStream(ms);
      n := sl.Count;
      sl.Text := Trim(sl.Text);
      Inc(nTotal, n - sl.Count);
      ms.Size := 0;
      sl.SaveToStream(ms);
      ms.Position := 0;
      Edit;
      if sl.Count > 0
        then
          VddTable1.FieldByName('Langtext').Clear
        else begin
          Edit;
          TBlobfield(VddTable1.FieldByName('Langtext')).LoadFromStream(ms);
          Post;
          Next;
        end;
    end;

  sl.Free;
  ms.Free;

end;
Das wäre Marabus Variante, so wollte ich es probieren:

Delphi-Quellcode:
var zwischS1, zwischS2, i, zaehler2, zaehler : Integer;
begin

 zwischS1 := 0;
 zwischS2 := 0;
 zaehler2 := 0;
 zaehler := 0;
 Memo1.Clear;
 Memo2.Clear;
 VddTable1.First;
 VddTable1.Edit;

 for i := 0 to vddTable1.RecordCount-1 do
   begin
     Memo1.Clear;
     Memo1.Text := VddTable1.FieldByName('Langtext').asstring;
     zwischS1 := Memo1.Lines.Count + zwischS1;
     Memo2.Text := Trim(Memo1.text);
     zwischS2 := Memo2.Lines.Count;
     zaehler := zwischS1 - zwischS2;
     zaehler2 := zaehler2 + zaehler;
     VddTable1.Edit;
     VddTable1.FieldByName('Langtext').Value := Memo1.Text;
     VddTable1.Post;
     vddTable1.Next;
   end;
Beide schreiben nichts in meine Tabelle obwohl sie die eigentliche Aktion ausführen. Mir ist aufgefallen das Ich nur nichts ins Langtextfeld(vom Typ Memo) schreiben kann, wie schon gesagt, in das Feld Bezeichnung welches vom Typ Character ist, konnte Ich mit der gleichen Anweisung etwas reinschreiben(es wurde auch direkt auf die Tabelle übertragen).

Ich denke es liegt an dem Feldtypen...aber genau sagen kann Ichs nicht =(

Vielleicht muss man den Code direkt auf diesen Feldtypen anpassen, hoffe jemand kennt sich damit besser aus als Ich :lol:

Trotzdem nochmal vielen Dank für eure viele Hilfe.

mfg
Alex

marabu 1. Apr 2008 11:21

Re: Memofeld in Tabelle schreiben?
 
Kein Wunder, dass du nichts in das Feld schreiben kannst: Ich hatte in meinem ursprünglichen Code THEN und ELSE vertauscht, es aber nach dem Hinweis von Peinhard korrigiert. Du musst dir einfach nochmal den Code in Beitrag #7 anschauen.

Borschti 1. Apr 2008 11:27

Re: Memofeld in Tabelle schreiben?
 
Hmm hatte Ich schon verändert, aber es geht trotzdem nicht.

joachimd 1. Apr 2008 11:58

Re: Memofeld in Tabelle schreiben?
 
steht denn in Memo1.Text überhaupt etwas drin? Ersetze mal die folgende Zeile
Delphi-Quellcode:
VddTable1.FieldByName('Langtext').Value := Memo1.Text;
mit
Delphi-Quellcode:
VddTable1.FieldByName('Langtext').Value := 'hallo Welt';
Wenn jetzt immer noch nichts in Langtext drinsteht, gibt es eine größeres Problem, ansonsten stimmen einfach deine Routinen zur reformatierung des Textes nicht.
Wenn du nicht weiter kommst, extrahiere das ganze in ein kleines Projekt, packe es zusammen mit den Tabellen und lade es hier hoch. Vielleicht können wir dann gemeinsam debuggen;)

Borschti 1. Apr 2008 12:53

Re: Memofeld in Tabelle schreiben?
 
Danke für den Tipp, hatte das auch schon Probiert, mir ist aber auch grade aufgefallen das ich Memo1 statt Memo2 genommen hatte, in Memo1 stehn ja die unveränderten Inhalte drinne und werden dann mit Trim() in Memo2 ausgegeben, also war es klar das keine Veränderten Feldinhalte übertragen werden konnten, Ich konnte es aber immernoch nicht testen weil aufeinmal mein Notebook wirklich richtig lahm ist, bei den ersten Datensätzen isser noch recht schnell dann wird er immer langsamer bis er sich letzten Endes ganz aufhängt, muss erstmal gucken was da los ist, habs schonmal an einem anderen Rechner ausprobiert, dort klappt es zumindest mit der Geschwindigkeit 1a ;)

Also werde mich dann nochmal melden wenn ich noch weitere Probleme mit dem Thema hab und mein Notebook es endlich wieder auf die Reihe bekommt.

mfg
Alex

Borschti 3. Apr 2008 09:07

Re: Memofeld in Tabelle schreiben?
 
Also das Problem hat sich erledigt, es hing an dem Tabellenfeld welches in dem Programm auf das das Memofeld angewendet wird, ist in den älteren Versionen anders als in den neueren und deswegen konnte man im Endeffekt auch keinen Unterschied erkennnen.

Danke nochmal für die ganze hilfe ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:47 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz