Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Doppelte durch einfache Hochkommas ersetzen (https://www.delphipraxis.net/202029-doppelte-durch-einfache-hochkommas-ersetzen.html)

Delbor 20. Sep 2019 10:48

Delphi-Version: 10.2 Tokyo

Doppelte durch einfache Hochkommas ersetzen
 
Hi zusammen
Von Workbench habe ich Scripts wie diese exportiert:
Delphi-Quellcode:
CREATE TABLE "PdfOfficerDB"."tblAuthor"("AuthorID" INTEGER PRIMARY KEY NOT NULL,
                                        "Name" VARCHAR(45) NOT NULL,
                                        "Vorname" VARCHAR(45) NOT NULL,
                                        "tblUser_idTblUser" INTEGER NOT NULL,
                                        CONSTRAINT "fk_tblAuthor_tblUser1"
                                          FOREIGN KEY("tblUser_idTblUser")
                                          REFERENCES "tblUser"("idTblUser"));
Und solches soll nun in sowas eingefügt werden:
Delphi-Quellcode:
function TDMLSQLiteOfficerFE.CreateTblFile: string;
  var SQLstring: String;
begin
  SQLstring := 'CREATE TABLE tblFile(FileID INTEGER PRIMARY KEY NOT NULL,'+
                                                     'FilePath" VARCHAR(100) NOT NULL,'+
                                                     'FileType" VARCHAR(5) NOT NULL,'+
                                                     'FileVersion" VARCHAR(3) NOT NULL,'+
                                                     'tblDocuments_DocuID" INTEGER NOT NULL,'+
                                                     'CONSTRAINT fk_tblFile_tblDocuments1'+
                                                       'FOREIGN KEY(tblDocuments_DocuID)'+
                                                       'REFERENCES tblDocuments(DocuID"))';
  Result := SQLString;
end;
Das heisst: einige der doppelten Hochkommas muss ich entfernen, andere durch einfache ersetzen sowie zusätzlich am Ende jeder Zeile den String abschliessen und, wenn der String in dernächsten Zeile fortgesetzt wird, ein + hinzufügen.
Ich hab das erstmal über Suchen und ersetzen versucht, aber da meckert Delphi:
Zitat:

[Content]
Suchbegriff '"' nicht gefunden

[OK]
Gebe ich nichts ein (was im Dialog sichtbar wird, kann zumindest bei mir auch als vier einzelne Hochkommas interpretiert werden), meckert Delphi:
Zitat:

[Content]
Der Suchtext darf nicht leer sein oder leer entsprechen.

[OK]
Versuche ich das mit dem Sync-Arbeitsmodus, kann ich zwar das erste Zeichen löschen, aber gleich danach wird der markierte Bereich aufgehoben.
Wie kriege ich die doppelten Hochkommas weg, ohne jedes einzeln entfernen zu müssen?

Gruss
Delbor

TigerLilly 20. Sep 2019 11:20

AW: Doppelte durch einfache Hochkommas ersetzen
 
Zuerst alle " entfernen, dann MultiPaste nutzen.

Delbor 20. Sep 2019 12:02

AW: Doppelte durch einfache Hochkommas ersetzen
 
TigerLilly
Zitat:

Zitat von TigerLilly (Beitrag 1447231)
Zuerst alle " entfernen, dann MultiPaste nutzen.

Das versteh ich jetzt nur halb - die " also von Hand entfernen, okay, das ist das eine. Aber multipaste? An jeder gewünschte Stelle <Ctrl&V>?
Aber Google ist doch ein schlaues Kerlchen....

Vielen Dank für deine Antwort!

Gruss
Delbor

PS: Ich habs jettzt auch mal mit Notepad++ versucht.
suchen : ",
ersetzen durch '.

Aus
Delphi-Quellcode:
CREATE TABLE "PdfOfficerDB"."tblOrt"("OrtID" INTEGER PRIMARY KEY NOT NULL,
                                     "Ort" VARCHAR(65),
                                     "PLZ" VARCHAR(6));
wurde
Delphi-Quellcode:
CREATE TABLE 'PdfOfficerDB"."tblOrt"("OrtID' INTEGER PRIMARY KEY NOT NULL,
                                     'Ort' VARCHAR(65),
                                     'PLZ' VARCHAR(6));
Ob da mit den beiden Möglichkeiten (Notepad++ oder Multipaste wirklich Zeit und Tipparbeit eingespart würde, bin ch mir nicht sicher. Das Ergebnis von Notepad++ sähe eventuell besser aus, wenn die nicht benötigten Tabellennamen vorher entfernt würden...

p80286 20. Sep 2019 12:31

AW: Doppelte durch einfache Hochkommas ersetzen
 
Ich hoffe das Beispiel
Delphi-Quellcode:
...
'FilePath" VARCHAR(100) NOT NULL,'+
'FileType" VARCHAR(5) NOT NULL,'+
'FileVersion" VARCHAR(3) NOT NULL,'+
'tblDocuments_DocuID" INTEGER NOT NULL,'+
...
war noch nicht fertig, das könnte doch in die Hose gehen!

Gruß
K-H

Delbor 20. Sep 2019 12:44

AW: Doppelte durch einfache Hochkommas ersetzen
 
Hi p80286
Zitat:

Zitat von p80286 (Beitrag 1447243)
Ich hoffe das Beispiel
Delphi-Quellcode:
...
'FilePath" VARCHAR(100) NOT NULL,'+
'FileType" VARCHAR(5) NOT NULL,'+
'FileVersion" VARCHAR(3) NOT NULL,'+
'tblDocuments_DocuID" INTEGER NOT NULL,'+
...
war noch nicht fertig, das könnte doch in die Hose gehen!

Gruß
K-H

Das sollte auch nur das Ergebnis in Notepad++ zeigen, das so natürlich nicht brauchbar ist. Es würde Nachbearbeitung nötig, und da stellt sich dann die Frage, ob damit irgendwas gegenüber der händischen Anpassung gewonnen wurde.

Effizienter würde das eventuell durch ein eigenes kleines Tool gelöst...

Gruss
Delbor

PS: Im Nachinein sehe ich: das war eines der Statements, die ich zuvor händisch angepasst habe - dabei gingen dann einige Sachen vergessen.

HolgerX 20. Sep 2019 13:24

AW: Doppelte durch einfache Hochkommas ersetzen
 
Hmmm..

Wenn ich das richtig sehe, soll aus:

Code:
CREATE TABLE "PdfOfficerDB"."tblAuthor"("AuthorID" INTEGER PRIMARY KEY NOT NULL,
                                        "Name" VARCHAR(45) NOT NULL,
                                        "Vorname" VARCHAR(45) NOT NULL,
                                        "tblUser_idTblUser" INTEGER NOT NULL,
                                        CONSTRAINT "fk_tblAuthor_tblUser1"
                                          FOREIGN KEY("tblUser_idTblUser")
                                          REFERENCES "tblUser"("idTblUser"));
folgendes werden:
Code:
'CREATE TABLE PdfOfficerDB.tblAuthor(AuthorID INTEGER PRIMARY KEY NOT NULL, '+
                                        'Name VARCHAR(45) NOT NULL, '+
                                        'Vorname VARCHAR(45) NOT NULL, '+
                                        'tblUser_idTblUser INTEGER NOT NULL, '+
                                        'CONSTRAINT fk_tblAuthor_tblUser1 '+
                                          'FOREIGN KEY(tblUser_idTblUser) '+
                                          'REFERENCES tblUser(idTblUser)); ';
Wenn das richtig ist, dann würde es z.B. so gehen:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  i : integer;
  sl : TStringList;
  l : integer;
begin
  sl := TStringList.Create;
  try
    // Alle " löschen
    sl.Text := Trim(StringReplace(Memo1.Text,'"','',[rfReplaceAll]));
    for i := 0 to sl.Count-1 do begin
      // Anzahl führende Leerzeichen ermitteln
      l := Length(sl[i]) - Length(Trim(sl[i]));
      // Führende Leerzeichen + in Anführungszeichen setzen (mit Trennleerzeichen je Zeilenende)
      sl[i] := StringOfChar(' ',l) + QuotedStr(Trim(sl[i])+ ' ');
      // '+' bei allen Zeilen, außer der letzten, anhängen
      if i < sl.Count-1 then
        sl[i] := sl[i] +'+'
      else
        // ';' bei letzter Zeilen anhängen
        sl[i] := sl[i] +';';
    end;
    Memo2.Text := sl.Text;
  finally
    sl.Free;
  end;
end;

Delbor 20. Sep 2019 13:52

AW: Doppelte durch einfache Hochkommas ersetzen
 
Hi HolgerX

Danke für dein Codeschnipsel!

Gruss
Delbor

Uwe Raabe 20. Sep 2019 14:27

AW: Doppelte durch einfache Hochkommas ersetzen
 
Wieso können eigentlich die doppelten Anführungszeichen nicht bleiben? Das sind doch nur gequotete Identifier und die sollten auch im Delphi-Code funktionieren.

Delbor 20. Sep 2019 14:39

AW: Doppelte durch einfache Hochkommas ersetzen
 
Hi Uwe Raabe

Zitat:

Zitat von Uwe Raabe (Beitrag 1447255)
Wieso können eigentlich die doppelten Anführungszeichen nicht bleiben? Das sind doch nur gequotete Identifier und die sollten auch im Delphi-Code funktionieren.

Ohne es jetzt wirklich zu wissen: Der SQLString dürfte doch letztlich vom DBMS verarbeitet werden, und nicht von Delphi. So zumindest kann ich mir das erklären.

Gruss
Delbor

Uwe Raabe 20. Sep 2019 14:49

AW: Doppelte durch einfache Hochkommas ersetzen
 
Zitat:

Zitat von Delbor (Beitrag 1447260)
Der SQLString dürfte doch letztlich vom DBMS verarbeitet werden, und nicht von Delphi. So zumindest kann ich mir das erklären.

Genau das wollte ich ja mit meinem Statement ausdrücken! Delphi ist es egal, ob du die SQL-Identifier quotest. Wenn der SQL-String in der Workbench so funktioniert, dann sollte er es auch aus dem Delphi-Code tun.

Delbor 20. Sep 2019 17:13

AW: Doppelte durch einfache Hochkommas ersetzen
 
Hi Uwe Raabe

Das Script 'funktioniert' in Workbench überhaupt nicht. Workbench kann erst genutzt werden, wenn eine aktive Verbindung zum MySQL-Server besteht(*). Für den MySQL-Server generiert MySQL-Workbench (**) zum Beispiel folgendes Script:
Delphi-Quellcode:
-- -----------------------------------------------------
-- Table `ContentMasterData`.`kategorien_tabelle`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `ContentMasterData`.`kategorien_tabelle` ;

CREATE TABLE IF NOT EXISTS `ContentMasterData`.`kategorien_tabelle` (
  `Kath_ID` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `Kategorie` VARCHAR(120) CHARACTER SET 'latin1' NOT NULL,
  PRIMARY KEY (`Kath_ID`))
ENGINE = InnoDB
AUTO_INCREMENT = 3
DEFAULT CHARACTER SET = latin1;


-- -----------------------------------------------------
-- Table `ContentMasterData`.`bildtabelle`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `ContentMasterData`.`bildtabelle` ;

CREATE TABLE IF NOT EXISTS `ContentMasterData`.`bildtabelle` (
  `idBild` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `Thumbnail` BLOB NULL,
  `Bitmap` BLOB NULL,
  `Jpeg` BLOB NULL,
  `FolderId` VARCHAR(32) NULL,
  PRIMARY KEY (`idBild`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = latin1;
Was auffällt: Hier sind die Feldnamen in accents eingeschlossen - den selben accents, die von MySQL-Autoren benutzt werden, um an der Comandozeile MySQL-Tabellen zu erstellen.
Im SQLite-Manual hingegen wird darauf hingewiesen, dass in SQLite einfache Hochkommas verwendet werden wie in Pascal. Allerdings muss ich zugeben, dass mir nicht bekannt ist, in welcher Form SQLite Tabellennamen erwartet. Zur Zeit kann ich das nicht nachschlagen - die Waschküche wartet.:lol: ***

Gruss
Delbor

* Zumindest nur dann kann mit Forward- oder Reverse Engineering gearbeitet werden.
** Sorry, ich hab den Namen "MySQL Workbench daurch abgekürzt,dass ich den ersten Teil weggelassen habe. Das hätte ich gleich im ersten Thread schreiben sollen.

*** PS: Heute Samstag habe ich das Manual durchsucht, aber nirgends etwas explzit zu Tabellennamen gefunden. Beispielcode hingegen steht genug da - und da nirgends Hochkommas, ausser wenn ein Wert in eine Spalte als String geschrieben werden soll:
Delphi-Quellcode:
 CREATE TABLE t1 (a INT, b VARCHAR (10));
 INSERT IN t1 (a, b) VALUES ('123', 456);

jobo 21. Sep 2019 13:59

AW: Doppelte durch einfache Hochkommas ersetzen
 
Ich versteh ehrlich gesagt nicht so recht, warum Du Dich damit so lange aufhältst.

Es dauert 2 Minuten eine Beispieltabelle mit Doppelten Anführungszeichen oder mit einfachen oder ohne in Delphi gegen ein sqlite laufen zu lassen.
die Internetsuche ist eher schneller:
https://www.sqlite.org/lang_keywords.html
Zitat:

If you want to use a keyword as a name, you need to quote it. There are four ways of quoting keywords in SQLite:

'keyword' A keyword in single quotes is a string literal.
"keyword" A keyword in double-quotes is an identifier.
[keyword] A keyword enclosed in square brackets is an identifier. This is not standard SQL. This quoting mechanism is used by MS Access and SQL Server and is included in SQLite for compatibility.
`keyword` A keyword enclosed in grave accents (ASCII code 96) is an identifier. This is not standard SQL. This quoting mechanism is used by MySQL and is included in SQLite for compatibility.
Zitat:

//automatisch übersetzt
Wenn Sie ein Schlüsselwort als Namen verwenden möchten, müssen Sie es angeben. Es gibt vier Möglichkeiten, Keywords in SQLite zu zitieren:

'Schlüsselwort'
Ein Schlüsselwort in einfachen Anführungszeichen ist ein Zeichenkettenliteral.
"Schlüsselwort"
Ein Schlüsselwort in doppelten Anführungszeichen ist ein Bezeichner.
[Schlüsselwort]
Ein in eckige Klammern gesetztes Schlüsselwort ist ein Bezeichner. Dies ist kein Standard-SQL. Dieser Angebotsmechanismus wird von MS Access und SQL Server verwendet und ist aus Kompatibilitätsgründen in SQLite enthalten.
`Schlüsselwort`
Ein in backticks eingeschlossenes Schlüsselwort (ASCII-Code 96) ist ein Bezeichner. Dies ist kein Standard-SQL. Dieser Angebotsmechanismus wird von MySQL verwendet und ist aus Kompatibilitätsgründen in SQLite enthalten.
Wenn Du jetzt in der Situation bist, dass Du noch 200 Tabellen erzeugen musst und einen schlanken, schnellen und reproduzierenbaren Weg suchst, dann vielleicht nicht als Ausgangspunkt das mysql tool nehmen.

10 Tabellen hast Du auch eben mit der Hand geschrieben. Und Du wärst schon seit Tagen dabei, Deine Anwendung zu programmieren.

*Die Quotes werden in der Regel eingesetzt, um non ASCI Zeichen verwenden zu können oder auch Schlüsselwörter.
Wenn Du sowieso deutsche Bezeichner verwendest, dürfte der letzte Fall ausgeschlossen sein und statt Umlauten empfiehlt sich dann die zusammengesetzte Schreibweise ae, ue, oe, ss.
Also bräuchtest Du keine Quotes, sind sie vorhanden, würde es aber auch nicht stören.

Delbor 21. Sep 2019 15:08

AW: Doppelte durch einfache Hochkommas ersetzen
 
Hi jobo

Zitat:

10 Tabellen hast Du auch eben mit der Hand geschrieben. Und Du wärst schon seit Tagen dabei, Deine Anwendung zu programmieren.
Das ist sicher richtig. Hätte ich die Hochkommas bearbeitet, ohne diesen Thread zu schreiben, wäre ich schon längst damit fertig, müsste aber dieselbe Arbeit das nächste mal voraussichtlich wieder machen. So hab ich auch anderes zu SQLite gelernt.

Gruss
Delbor

jobo 23. Sep 2019 10:23

AW: Doppelte durch einfache Hochkommas ersetzen
 
Das sollte meinerseits absolut kein Appel sein, nichts zu lernen. ;-)

Der Gedanke ist eher:
- Ein Tool soll auch wirklich helfen, also vielleicht einen Thread für das beste sqlite Modeling Tool eröffnen.
(mysql tools für sqlite scheint jedenfalls nicht die beste Wahl zu sein.)
- Falls Handbuch und kluge Ratschläge mal nicht erreichbar sind, tut's oft auch ein wenig ausprobieren, ist ja kein Atomkraftwerk.

Delbor 25. Sep 2019 11:02

AW: Doppelte durch einfache Hochkommas ersetzen
 
Hi jobo

Zitat:

Zitat von jobo (Beitrag 1447500)
Das sollte meinerseits absolut kein Appel sein, nichts zu lernen. ;-)

Der Gedanke ist eher:
- Ein Tool soll auch wirklich helfen, also vielleicht einen Thread für das beste sqlite Modeling Tool eröffnen.
(mysql tools für sqlite scheint jedenfalls nicht die beste Wahl zu sein.)
- Falls Handbuch und kluge Ratschläge mal nicht erreichbar sind, tut's oft auch ein wenig ausprobieren, ist ja kein Atomkraftwerk.

Da bin ich schon länger auf der Suche und scheine da was auch gefunden zu haben: DBDesignerFork. Der liegt allerdings als Lazarus-Anwendung vor.

Gruss
Delbor

jobo 26. Sep 2019 07:28

AW: Doppelte durch einfache Hochkommas ersetzen
 
Hab mal nachgeschaut, sieht nicht so aus, als ob sich noch jemand um die Pflege dieses Programms kümmert.
Da würde ich eher nach etwas suchen, wo es mehr Aktivitäten gibt.Bzw. gibt es ja auch von Emba/Idera entsprechende Werkzeuge. Logische und dann physikalische Modellierung mit Produkt spezifischer Syntax sollte bei Kaufsoftware natürlich kein Problem darstellen.

Ich hab mir auch irgendwann mal ein Excelsheet * gebaut, was aus Tabellennamen und Feldlisten, -Typen usw. vollständige Skripte baut. Je nach Bedarf und Problemstellung kann man hier sehr effizient arbeiten. Z.B ist es in Excel besonders einfach, systematisch und flexibel Suffixe oder Präfixe in Feldnamen oder Tabellennamen einzubauen, zu ändern oder Interfaceviews zu generieren.

* Ich meine natürlich Tabellenkalkulationssoftware allgemein, Excel braucht man nicht dafür.

Delbor 26. Sep 2019 09:44

AW: Doppelte durch einfache Hochkommas ersetzen
 
Hi jobo
Zitat:

Zitat von jobo (Beitrag 1447953)
Hab mal nachgeschaut, sieht nicht so aus, als ob sich noch jemand um die Pflege dieses Programms kümmert.
Da würde ich eher nach etwas suchen, wo es mehr Aktivitäten gibt.Bzw. gibt es ja auch von Emba/Idera entsprechende Werkzeuge. Logische und dann physikalische Modellierung mit Produkt spezifischer Syntax sollte bei Kaufsoftware natürlich kein Problem darstellen.

Ich weiss nicht, was die Idera-Tools kosten, aber ich würde vermuten, dass die Preise da in etwa in der Höhe einer IDE anzusiedeln sind, und das übersteigt meine Möglichkeiten.
Tools, mit denen Datenbanken erstellt werden können, gibt es genügend - eines davon ist frei als Plugin für Firefox erhältlich(SQLite-Manager). Aber keines dieser Tools bietet eine Möglichkeiten á la MySQL-Workbench, DB-Modelle erstmal grafisch zu erstellen.
Ich hab hier den SQLite Expert Personal auf der Platte, dessen Professional-Version eine grafische Oberfläche bieten würde, aber kostenpflichtig ist.

Andrerseits hab ich mir aus dem Codeschnipsel von HolgerX ein kleines Tool gebaut, mit dem ich einen SQL-String in das richtige Format bringen kann.

Gruss
Delbor


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