Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Mehrzeiligen Text zuweisen incl. ' (https://www.delphipraxis.net/205533-mehrzeiligen-text-zuweisen-incl.html)

norwegen60 21. Sep 2020 07:57

Mehrzeiligen Text zuweisen incl. '
 
In C# gibt es die Möglichkeit, mehrzeiligen Text so zuzuweisen
Code:
            this.AddCmd(@"
            if not exists(select * from information_schema.tables where table_name = 'Tabelle1')
            begin
              create table Tabelle1
              (ID int not null Identity (1,1),
              Datum Datetime,
              Result varchar(15),
              Info varchar(50) null)
              on [primary]
            end
         ");
Diese Zuweisung hat den Vorteil, dass ich den kompletten Textblock kopieren und 1:1 im MsSQL-Manager testen kann

In Delphi kenn ich nur so was
Delphi-Quellcode:
quQuery.SQL.Text := 'if not exists(select * from information_schema.tables where table_name = ''Tabelle1'')';
quQuery.SQL.Add('begin');
quQuery.SQL.Add(' create table Tabelle1');
quQuery.SQL.Add(' (ID int not null Identity (1,1),');
quQuery.SQL.Add(' Datum Datetime,');
quQuery.SQL.Add(' Result varchar(15),');
quQuery.SQL.Add(' Info varchar(50) null)');
quQuery.SQL.Add(' on [primary]');
quQuery.SQL.Add('end');
Entsprechend mühsam ist es den eigentlich relevanten SQL-Text (der auch umfangreicher sein kann) im SQL-Manager zu testen. Zumal auch die doppelten ''Tabelle1'' bei Strings geändert werden müssen.

Hat jemand eine Idee, wie ich den Text ähnlich wie bei C# als ein Block zuweisen kann?

Direkt im quQuery-Editor kann ich es nicht zuweisen, da es viele solcher SQL's hintereinander geben kann.

Vielen Dank im Voraus

Uwe Raabe 21. Sep 2020 08:12

AW: Mehrzeiligen Text zuweisen incl. '
 
Mehrzeilige String-Konstanten gibt es in Delphi leider nicht.

haentschman 21. Sep 2020 08:30

AW: Mehrzeiligen Text zuweisen incl. '
 
Liste der Anhänge anzeigen (Anzahl: 1)
Moin...:P
eine andere Möglichkeit wäre das speichern der SQL außerhalb vom QT...in Ressourcen. https://www.delphipraxis.net/49505-s...einbinden.html

Tool:
PS: Ich liebe es. :drunken: https://www.delphipraxis.net/190316-...e-creator.html

Vorteile:
* Das SQL ist eine Datei, die im bevorzugten Editor testbar ist. :thumb: (Parameter müßten ggf. werttechnisch ergänzt werden :wink:)
* Alle SQL an einem Platz im Dateisystem und nicht über den QT oder DPR verteilt.

QT:
Delphi-Quellcode:
function TDatabaseBase.GetSQLByName(SQLName: string): string;
var
  SQLStream: TResourceStream;
  SQLStrings: TStringList;
  SQLStringsDecrypt: TStringList;
begin
  Result := '';
  SQLStrings := TStringList.Create;
  try
    SQLStringsDecrypt := TStringList.Create;
    try
      SQLStream := TResourceStream.Create(HInstance, SQLName, PWideChar(conDatabaseResourceGroupString)); // MSSQL2012 z.B. entsprechend des Ressourcennamens den du vergeben hast
      try
        try
          SQLStrings.LoadFromStream(SQLStream);
          SQLStringsDecrypt.Text := TToolsCrypt.Decrypt(SQLStrings.Text, conKey); // nur bei verschlüsseltem SQL nötig
          Result := SQLStringsDecrypt.Text;
        except
          Result := '';
        end;
      finally
        SQLStream.Free;
      end;
    finally
      SQLStringsDecrypt.Free;
    end;
  finally
    SQLStrings.Free;
  end;
end;
...
procedure TDatabase.FillList(List: TBlubbFieldList; TableName: string);
var
  I: Integer;
  Qry: TFDQuery;
  Field: TBlubbField;
begin
  Qry := CreateQuery;
  try
    Qry.SQL.Text := Format(GetSQLByName('TABLE_FIELDLIST'), [TableName]);
    Qry.Open;
    if not Qry.Eof then
    begin
      List.Clear;
      for I := 0 to Qry.Fields.Count - 1 do
      begin
        Field := TBlubbField.Create;
        Field.FieldIndex := I;
        Field.FieldName := Qry.Fields[I].FieldName;
        Field.Fieldype := Qry.Fields[I].DataType;
        List.Add(Field);
      end;
    end;
  finally
    Qry.Free;
  end;
end;

norwegen60 21. Sep 2020 08:34

AW: Mehrzeiligen Text zuweisen incl. '
 
Gerade hatte ich geschrieben:

Das habe ich befürchtet. Ich hatte gehofft, es gibt irgendeinen Trick.

Ich könnte es aus einen Textfile auslesen, aber das wäre bei den Kunden verpönt. Das gilt natürlich auch für html. Es wäre vom Kunden änderbar

stifflersmom 21. Sep 2020 08:47

AW: Mehrzeiligen Text zuweisen incl. '
 
Dann wäre haentschmans Ressourcenlösung genau das richtige für Dich

haentschman 21. Sep 2020 08:48

AW: Mehrzeiligen Text zuweisen incl. '
 
Zitat:

Ich könnte es aus einen Textfile auslesen, aber das wäre bei den Kunden verpönt.
Verstehe ich. Das versteht sich aus Gründen der SQL Injection! :warn: Die SQL sind bei Ressourcen einkompiliert. :zwinker:

norwegen60 21. Sep 2020 09:10

AW: Mehrzeiligen Text zuweisen incl. '
 
OK, zu schnell geantwortet. Ich hatte nicht bedacht, dass Ressourcen ja kompiliert sind. Damit wäre es eine Option.

Rollo62 21. Sep 2020 09:24

AW: Mehrzeiligen Text zuweisen incl. '
 
Delphi-Quellcode:
     'create table Tabelle1 '//
    +'(ID int not null Identity (1,1), '//
    +'Datum Datetime, '//
    +'Result varchar(15), '//
    +'Info varchar(50) null) '//
    +'on [primary] '//
Sowas wäre vielleicht noch am wenigsten schmerzhaft, man kann die überflüssigen
+' und '// leichter finden und rauslöschen.

Delphi.Narium 21. Sep 2020 09:31

AW: Mehrzeiligen Text zuweisen incl. '
 
Tool schreiben:

Ein Memo, in das Du das getestete SQL per Copy&Paste reinpappst.
Zweites Memo für die Ausgabe.
Ein Edit für den Namen der Query im Quelltext.
Eine Button für 'ne Routine (sinngemäß) dieser Art:
Delphi-Quellcode:
Memo1.Lines.Clear;
Memo1.PasteFromClipboard;
Memo2.Lines.Clear;
Memo2.Lines.Add(Format('%s.SQL.Clear;',[edQueryName.Text]));
for i := 0 to Memo1.Lines.Count - 1 do Memo2.Lines.Add(Format('%s.SQL.Add(%s);',[edQueryName.Text,QuotedStr(Memo1.Lines[i])]));
Memo2.SelectAll;
Memo2.CopyToClipboard;
Ergebnis per Copy&Paste an die passende Stelle im Quelltext einfügen.

Hab' sowas vor Jahren mal für 'nen ähnlichen "Bedarf" in 'ner vollkommen anderen Entwicklungsumgebung benötigt. Hat wunderbar geklappt und sehr viel Schreiberei erspart.

haentschman 21. Sep 2020 09:35

AW: Mehrzeiligen Text zuweisen incl. '
 
Zitat:

Ein Memo, in das Du das getestete SQL per Copy&Paste reinpappst.
...es geht eher um das testen des SQL in dem DB Editor, was im QT schon mit .Add( steht...quasi umgekehrt. :zwinker:

Delphi.Narium 21. Sep 2020 09:46

AW: Mehrzeiligen Text zuweisen incl. '
 
Ja und?

Routine umdrehen:

Alles bis zum ersten ' weg.
Alles bis zum letzten ' weg.
Doppelte '' durch ' ersetzen?

Macht also genau einen zweiten Button aus.
Delphi-Quellcode:
var
  s : String;
  i : Integer;
begin
  Memo1.Lines.Clear;
  Memo1.PasteFromClipboard;
  Memo2.Lines.Clear;
  for i := 0 to Memo1.Lines.Count - 1 do begin
    s := Memo1.Lines[i];
    s := Copy(s,Pos('''',s) + 1, Length(s);
    s := ReverseString(s);
    s := Copy(s,1,Pos('''',s) + 1,Length(s));
    s := ReverseString(s);
    s := AnsiReplaceText(s,'''''','''');
    Memo2.Lines.Add(s);
  end;
  Memo2.SelectAll;
  Memo2.CopyToClipboard;
end;

Rollo62 21. Sep 2020 09:48

AW: Mehrzeiligen Text zuweisen incl. '
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1473942)
Tool schreiben:

+1 :thumb:
Gemäß: Eat your own dogfood ...
Mache sowas für SVG.

Rollo62 21. Sep 2020 09:51

AW: Mehrzeiligen Text zuweisen incl. '
 
Ich müsste mir mal Allister Chrities neues Buch anschaffen,
womöglich gibt es auch Möglichkeiten in der IDE kleine Scripte o.ä. auszuführen, bei Custom Hotkeys ?

freimatz 21. Sep 2020 09:57

AW: Mehrzeiligen Text zuweisen incl. '
 
Wie dem auch sei halte ich getrennte Dateien (also z.B. in Ressourcen) für besser. In einer Datei mehrere Sprachen zu mischen ist voll unclean.

Rollo62 21. Sep 2020 10:02

AW: Mehrzeiligen Text zuweisen incl. '
 
Zitat:

Zitat von freimatz (Beitrag 1473952)
Wie dem auch sei halte ich getrennte Dateien (also z.B. in Ressourcen) für besser. In einer Datei mehrere Sprachen zu mischen ist voll unclean.

:thumb:

himitsu 21. Sep 2020 12:48

AW: Mehrzeiligen Text zuweisen incl. '
 
Zitat:

Zitat von Rollo62 (Beitrag 1473940)
Delphi-Quellcode:
     'create table Tabelle1 '//
    +'(ID int not null Identity (1,1), '//
    +'Datum Datetime, '//
    +'Result varchar(15), '//
    +'Info varchar(50) null) '//
    +'on [primary] '//
Sowas wäre vielleicht noch am wenigsten schmerzhaft, man kann die überflüssigen
+' und '// leichter finden und rauslöschen.

Ja, die
Delphi-Quellcode:
//
sind total überflüssig und IMHO auch optisch nervend störend .... braucht eh niemand, wenn man den Editor bedienen richtig kann.


Das ist auch nur mehrzeillig im Quellcode, aber NICHT im Text.

Delphi-Quellcode:
     'create table Tabelle1 '#10
    +'(ID int not null Identity (1,1), '#10
    +'Datum Datetime, '#10
    +'Result varchar(15), '#10
    +'Info varchar(50) null) '#10
    +'on [primary] ';
Die StringList macht aus dem #10 schon ein #13#10 (sLineBreak), also nicht nötig da mehr zu schreiben.



Und keine Ahnung, warum man sich bei Emba derartig wehement dagegen wehrt einen MultiLine-String in die Syntax einzufügen-

Rollo62 21. Sep 2020 13:26

AW: Mehrzeiligen Text zuweisen incl. '
 
Zitat:

Zitat von himitsu (Beitrag 1473973)
Ja, die
Delphi-Quellcode:
//
sind total überflüssig und IMHO auch optisch nervend störend ....

Natürlich,
die helfen aber beim Suchen/Ersetzen um eventuell wichtige
Delphi-Quellcode:
,
zu identifizieren, und nicht aus Versehen zu löschen.

Kommt halt immer drauf an was dem TE wichtig ist.

norwegen60 21. Sep 2020 13:27

AW: Mehrzeiligen Text zuweisen incl. '
 
[QUOTE=himitsu;1473973]
Zitat:

Zitat von Rollo62 (Beitrag 1473940)
Delphi-Quellcode:
     'create table Tabelle1 '//
    +'(ID int not null Identity (1,1), '//
    +'Datum Datetime, '//
    +'Result varchar(15), '//
    +'Info varchar(50) null) '//
    +'on [primary] '//

Egal ob so oder so wie modifiziert. Beid ehaben den großen Nachteil, dass es immer noch die doppelten '' gibt um Strings zu kennzeichnen. Die sind bei umfangreichen SQL fast nerviger als der Text davor oder danach.

Meine Frage ist aber beantwortet. Ohne Zusatzaufwand ist es nicht möglich.

Wenn schon, dann gefällt mir die Lösung mit den Resourcen besser.

Im Grunde geht es um das Updaten der DB zwischen verschiedenen Versionen. Da könnte man per Version, die en Update benötig, ein File erstellen

Rollo62 21. Sep 2020 13:34

AW: Mehrzeiligen Text zuweisen incl. '
 
Zitat:

Zitat von norwegen60 (Beitrag 1473978)
Wenn schon, dann gefällt mir die Lösung mit den Resourcen besser.

Mir auch.
Ich lege in DB-Projekten auch gern mal generelle Sql-Abfragen als *.TXT Files in Unterverzeichnissen ab (man muss nicht unbeding Ressourcen nehmen).
Das ist sehr praktisch und Übersichtlich, so kann die Abfrage ohne Compiler optimiert werden, und ich kann den Text auch 1:1 in ein externes SQL-Tool werfen.
Man muss natürlich das FileOpen mit einrechnen, für permanente, schnelle Abfragen könnte das zu viel Overhead sein.

haentschman 21. Sep 2020 13:39

AW: Mehrzeiligen Text zuweisen incl. '
 
Zitat:

Das ist sehr praktisch und Übersichtlich
...hat aber für die SQL Injection Tür und Tor offen. :warn:

himitsu 21. Sep 2020 14:12

AW: Mehrzeiligen Text zuweisen incl. '
 
Zitat:

Zitat von norwegen60 (Beitrag 1473978)
Egal ob so oder so wie modifiziert. Beid ehaben den großen Nachteil, dass es immer noch die doppelten '' gibt um Strings zu kennzeichnen. Die sind bei umfangreichen SQL fast nerviger als der Text davor oder danach.

im cnPack oder GExperts gibt es einen Converter dafür, der macht das automatisch
Text->DelphiKonstante und zurück

Was aber geht, ist eine Ressource, wo man in der .RC einen mehrzeiligen Text einfügen oder Jenen aus einer TXT-Datei laden kann.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:19 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