![]() |
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:
Gibt es hierzu eine elegantere Lösung?
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 |
Re: Tabellenfelder in einen String kopieren
SQL-Code:
select <feld1> || ', ' || <feld2> ... as <feldname> from <tabelle>;
|
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. |
Re: Tabellenfelder in einen String kopieren
Dann mußt dui das ganze durch IIFs (oder wie das beim SQlServer heißt) erweitern.
|
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:
oder hast du eine bessere Idee?
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; Danke für deine schnelle Hilfe. |
Re: Tabellenfelder in einen String kopieren
StringReplace()
|
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: |
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:
Getippt und nicht getestet.
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; Grüße vom marabu |
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:
oder durch
var FieldList = TList; (Hersteller,Bezeichnung,Typ ... usw)
Delphi-Quellcode:
Kannst du mir hier noch ein wenig helfen?
const FieldList = ['Hersteller','Bezeichnung','Typ']
|
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:
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ß.
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; Freundliche Grüße |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:53 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 by Thomas Breitkreuz