Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Tabellenfelder in einen String kopieren (https://www.delphipraxis.net/87511-tabellenfelder-einen-string-kopieren.html)

needatip 1. Mär 2007 17:04

Datenbank: SQL Server • Version: 2000 • Zugriff über: ADO

Tabellenfelder in einen String kopieren
 
Hallo,
ich habe eine Tabelle mit ca. 30 Feldern.
Nun möchte ich davon ca. 15 Feldinhalte in einen einzigen String kopieren.
Insgesamt hat der String dann je nachdem zwischen 30 und 1000 Zeichen.
Die einzelnen Inhalte sollen dann mit einer Bezeichnung vorangestellt und durch Komma getrennt
dargestellt werden.
Beispiel:
HERST - BMW
Typ - 328
Bj - 2004
KM - 42.000
ZUST - 2
usw.
Ergebnis-String:
'Hersteller BMW, Typ 328, Baujahr 2004, Km-Stand 42.000, Zustand 2'
Ich hab so angefangen:

Delphi-Quellcode:
procedure dbText;
var s: string;
begin
if db.HERST <> '' then
      s: = 'Hersteller '+db.HERST.FieldByName('HERST').Value + ', ';
    if db.TYP <> '' then
      s: = s + 'Typ '+db.HERST.FieldByName('TYP').Value + ', ';
    if db.BJ <> '' then
      s: = s + 'Baujahr '+db.HERST.FieldByName('BJ').Value + ', ';
...
usw
Gibt es hierzu eine elegantere Lösung?

mkinzler 1. Mär 2007 18:00

Re: Tabellenfelder in einen String kopieren
 
SQL-Code:
select <feld1> || ', ' || <feld2> ... as <feldname> from <tabelle>;

needatip 2. Mär 2007 06:32

Re: Tabellenfelder in einen String kopieren
 
Ok, danke aber hab ich dann nicht viele einzelne Kommas wenn die Felder leer sind im String?
Das würde ich gerne vermeiden.

mkinzler 2. Mär 2007 06:35

Re: Tabellenfelder in einen String kopieren
 
Dann mußt dui das ganze durch IIFs (oder wie das beim SQlServer heißt) erweitern.

needatip 2. Mär 2007 07:17

Re: Tabellenfelder in einen String kopieren
 
i. O.,
leider hab ich vergessen zu erwähnen, dass ich ein Blobfeld habe, in dem ein relativ langer Beschreibungstext steht.
Dieser ist auch noch mit CRs #10#13 behaftet, so dass ich die auch noch rausputzen muss.
Mein Ansatz wäre dieser
Delphi-Quellcode:
function LinesToString(Text: PChar): PChar;
var i: integer;
begin
  for i := 0 to StrLen(Text) do
  begin
    if (Text[i] = #13) and (Text[i + 1] = #10) then
    begin
      Text[i] := ',';
      Text[i + 1] := ' ';
    end;
  end;
  LinesToString := text;
end;
oder hast du eine bessere Idee?
Danke für deine schnelle Hilfe.

mkinzler 2. Mär 2007 07:20

Re: Tabellenfelder in einen String kopieren
 
StringReplace()

needatip 2. Mär 2007 07:31

Re: Tabellenfelder in einen String kopieren
 
Ok, damit muss ich mich erst ein wenig einarbeiten.
Kann damit auch ein ganzes Blobfeld durchsucht werden und gleichzeitig Zeichen ersetzt werden,
oder muss ich hier auch alle einzelnen Zeilen durchgehen?
Blöde Frage, ich weiß - bin halt kein Profi! :oops:

marabu 2. Mär 2007 08:53

Re: Tabellenfelder in einen String kopieren
 
Hallo,

die von dir gewünschte Umformung dient wahrscheinlich der Darstellung deiner Daten. Auch wenn dir SQL gewisse Operatoren und Funktionen zur Verfügung stellt um eine solche Umformung vorzunehmen, solltest du diesen Weg nur dann gehen, wenn die Daten ohne weitere Verarbeitung auch genau so ausgegeben werden sollen. Oft ist es "besser" solche Textumformungen nicht mit SQL zu erledigen, da sie eigentlich der Präsentationsschicht deiner Anwendung zugerechnet werden:

Delphi-Quellcode:
procedure FetchNamedValues(ds: TCustomADODataSet; s: TStrings);
var
  i: Integer;
begin
  s.Clear;
  with ds do
    for i := 0 to Pred(FieldCount) do
      if Fields[i].IsNull then
        Continue
      else
      if Fields[i].IsBlob then
        s.Values[Fields[i].FieldName] := BlobToStr(Fields[i] as TBlobField, True)
      else
        s.Values[Fields[i].FieldName] := Fields[i].AsString;
end;

procedure TDemoForm.ButtonClick(Sender: TObject);
const
  NVS = ':';
var
  s: TStrings;
  line: string;
begin
  s := TStringList.Create;
  s.NameValueSeparator := NVS;
  FetchNamedValues(query, s);
  line := StringReplace(Trim(s.Text), sLineBreak, ', ', [rfReplaceAll]);
  line := StringReplace(line, NVS, NVS + ' ', [rfReplaceAll]);
  ShowMessage(line);
  s.Free;
end;
Getippt und nicht getestet.

Grüße vom marabu

needatip 2. Mär 2007 10:13

Re: Tabellenfelder in einen String kopieren
 
Danke marabu,
ich bin immer wieder fasziniert von deinen genialen Beiträgen.
Kann ich eigentlich mit der 1. Prozedur auch best. Felder angeben?
z.B.
Delphi-Quellcode:
var FieldList = TList; (Hersteller,Bezeichnung,Typ ... usw)
oder durch
Delphi-Quellcode:
const FieldList = ['Hersteller','Bezeichnung','Typ']
Kannst du mir hier noch ein wenig helfen?

marabu 3. Mär 2007 12:15

Re: Tabellenfelder in einen String kopieren
 
Hallo,

hier ein Beispiel, wie du eine Liste mit Feldnamen übergibst und diese Liste mit Name-Wert-Paaren zurück bekommst:

Delphi-Quellcode:
procedure FetchNamedValues(ds: TCustomADODataSet; s: TStrings);
var
  i: Integer;
  f: TField;
begin
  with ds do
    for i := 0 to Pred(s.Count) do
    begin
      f := Fields.FindField(s[i]);
      if Assigned(f) then
        if Fields[i].IsNull then
          s.ValueFromIndex[i] := ''
      else
      if Fields[i].IsBlob then
        s.ValueFromIndex[i] := BlobToStr(f as TBlobField, False)
      else
        s.ValueFromIndex[i] := f.AsString;
    end;
end;
Das ist keine Universallösung. Du kannst auch eine getrennte Namensliste oder ein Namen-Array verwenden. Oder du ersetzt einfach die Feldnamen durch ihre Feldwerte. Nimm es einfach als Denkanstoß.

Freundliche Grüße


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:35 Uhr.
Seite 1 von 2  1 2      

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