AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Tabellenfelder in einen String kopieren
Thema durchsuchen
Ansicht
Themen-Optionen

Tabellenfelder in einen String kopieren

Ein Thema von needatip · begonnen am 1. Mär 2007 · letzter Beitrag vom 6. Mär 2007
Antwort Antwort
Seite 1 von 2  1 2      
needatip

Registriert seit: 11. Jan 2004
246 Beiträge
 
Delphi 10.4 Sydney
 
#1

Tabellenfelder in einen String kopieren

  Alt 1. Mär 2007, 18:04
Datenbank: SQL Server • Version: 2000 • Zugriff über: ADO
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?
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Tabellenfelder in einen String kopieren

  Alt 1. Mär 2007, 19:00
select <feld1> || ', ' || <feld2> ... as <feldname> from <tabelle>;
Markus Kinzler
  Mit Zitat antworten Zitat
needatip

Registriert seit: 11. Jan 2004
246 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: Tabellenfelder in einen String kopieren

  Alt 2. Mär 2007, 07:32
Ok, danke aber hab ich dann nicht viele einzelne Kommas wenn die Felder leer sind im String?
Das würde ich gerne vermeiden.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Tabellenfelder in einen String kopieren

  Alt 2. Mär 2007, 07:35
Dann mußt dui das ganze durch IIFs (oder wie das beim SQlServer heißt) erweitern.
Markus Kinzler
  Mit Zitat antworten Zitat
needatip

Registriert seit: 11. Jan 2004
246 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: Tabellenfelder in einen String kopieren

  Alt 2. Mär 2007, 08:17
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.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Tabellenfelder in einen String kopieren

  Alt 2. Mär 2007, 08:20
StringReplace()
Markus Kinzler
  Mit Zitat antworten Zitat
needatip

Registriert seit: 11. Jan 2004
246 Beiträge
 
Delphi 10.4 Sydney
 
#7

Re: Tabellenfelder in einen String kopieren

  Alt 2. Mär 2007, 08:31
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!
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#8

Re: Tabellenfelder in einen String kopieren

  Alt 2. Mär 2007, 09:53
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
  Mit Zitat antworten Zitat
needatip

Registriert seit: 11. Jan 2004
246 Beiträge
 
Delphi 10.4 Sydney
 
#9

Re: Tabellenfelder in einen String kopieren

  Alt 2. Mär 2007, 11:13
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.
var FieldList = TList; (Hersteller,Bezeichnung,Typ ... usw) oder durch
const FieldList = ['Hersteller','Bezeichnung','Typ'] Kannst du mir hier noch ein wenig helfen?
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#10

Re: Tabellenfelder in einen String kopieren

  Alt 3. Mär 2007, 13:15
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:16 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