| Autor |
Beitrag |
D. Annies
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: Sa 05.01.13 09:48
Hi, Delpher,
ich möchte aus einem langen SQL-String den Teil als Dateinamen vergeben, der hinter der
WHERE-Phrase steht, gefolgt von der Endung '.xls'.
Beispiel: aus "Select * from Db.dbf where Klasse = '7a' soll als Dateiname werden: Klasse = 7a.xls
Wo ist denn in meiner Idee der Fehler? Die Anführungszeichen müssen ja auch noch raus.
Delphi-Quelltext 1: 2: 3:
| if pos('where', inputstring) > 0 then fname := copy(inputstring, pos+1, length(inputstring)) + '.xls'; showmessage(fname); |
Der Fehler liegt im Moment bei pos+1
Vielen Dank für Ideen,
D. Annies
_________________ ut vires desint, tamen est laudanda voluntas
|
|
Mathematiker
      
Beiträge: 2623
Erhaltene Danke: 1452
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: Sa 05.01.13 10:05
Hallo,
pos ist eine Funktion, die Parameter benötigt, und keine einfache Variable, d.h.
Delphi-Quelltext 1: 2: 3:
| stelle:=pos('where', inputstring); if stelle > 0 then fname := copy(inputstring, stelle+6, length(inputstring)) + '.xls'; |
funktioniert dann. stelle+6 ist wichtig, da 'where'+Leerzeichen sechs Zeichen lang ist.
Anschließend kannst Du noch mit
Delphi-Quelltext 1: 2: 3: 4: 5:
| stelle:=pos(chr(39), inputstring); while stelle > 0 do begin delete(inputstring,stelle,1); stelle:=pos(chr(39), inputstring); end; |
die '=chr(39) entfernen.
Beste Grüße
Mathematiker
_________________ Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
Für diesen Beitrag haben gedankt: D. Annies
|
|
Horst_H
      
Beiträge: 1654
Erhaltene Danke: 244
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: Sa 05.01.13 10:07
Hallo,
Du brauchst eine Variable, die die Position speichert oder Du fragst es nochmals ab.
HIer frage ich Anfang und Ende ab.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| testString := uppercase(inputstring); posWHERE := pos('WHERE', testString); posXLS := pos('XLS', testString); if (posWHERE > 0) AND (posXLS > posWHERE) then begin inc(posWHERE,length('WHERE')+1); inc(posXLS,length('XLS')+1); fName:= copy(inputstring, posWhere, posXLS-posWhere+1); ... end; |
Gruß Horst
Für diesen Beitrag haben gedankt: D. Annies
|
|
haentschman
      
Beiträge: 285
Erhaltene Danke: 33
DX10 Berlin Professional
|
Verfasst: Sa 05.01.13 10:26
Moin...
Ich bin dafür, das Problem an der Wurzel zu packen.  Wo / wie wird denn der SQL String zusammengesetzt ? Ist der hardcodiert ? Sollte man sich nicht schon zum Zeitpunkt des Zusammensetzens den "where Wert" für den Dateinamen merken als den später wieder rauszufrickeln ?
Zuletzt bearbeitet von haentschman am Sa 05.01.13 10:27, insgesamt 1-mal bearbeitet
|
|
D. Annies 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: Sa 05.01.13 10:26
Vielen Dank für eure schnellen (und richtigen) Antworten!
Jetzt komme ich wieder weiter.
LG, Detlef
_________________ ut vires desint, tamen est laudanda voluntas
|
|
haentschman
      
Beiträge: 285
Erhaltene Danke: 33
DX10 Berlin Professional
|
Verfasst: Sa 05.01.13 10:28
...hast du meinen Einwand gelesen ?
Für diesen Beitrag haben gedankt: D. Annies
|
|
D. Annies 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: Sa 05.01.13 11:35
@ haentschman:
So, jetzt habe ich deinen Einwand gelesen - sehr interessant,
aber der SQL-String ist nicht hardcodiert, sondern ich nehme ihn
aus einer Textdatei und kann ihn zur Laufzeit noch ändern/anpassen.
Ausprobieren werde ich deine Idee aber auch mal, denn die Idee habe
ich schon verstanden.
Danke, Detlef
_________________ ut vires desint, tamen est laudanda voluntas
|
|
haentschman
      
Beiträge: 285
Erhaltene Danke: 33
DX10 Berlin Professional
|
Verfasst: Sa 05.01.13 13:03
...gern geschehen. Alle lernen ständig dazu... 
|
|
Horst_H
      
Beiträge: 1654
Erhaltene Danke: 244
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: Sa 05.01.13 16:30
Hallo,
haentschman hat schon recht, wenn man ohnehin den Abfragestring selbst aufbaut, kann man den Dateinamen frühest möglich extrahieren.
Wenn man schon pos benutzen will, wäre PosEx sicher auch angebracht, da es ab einer vorherigen Fund/Suchstelle suchen könnte.
www.delphi-treff.de/...htigsten-funktionen/
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| const SuchStr1 = 'WHERE'; SuchStr2 = '.XLS';
begin fName := ''; testString := uppercase(inputstring); posWHERE := pos(SuchStr1, testString); if (posWHERE > 0) then begin inc(posWHERE,length(SuchStr1)+1); posXLS := posEX(SuchStr2, testString,posWHERE); IF posXLS >0 then begin inc(posXLS,length(SuchStr2)+1); fName:= copy(inputstring, posWhere, posXLS-posWhere+1); end; end; |
Gruß Horst
Für diesen Beitrag haben gedankt: D. Annies
|
|
D. Annies 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: Sa 05.01.13 16:46
Danke, ich bin begeistert!
Gruß, Detlef
_________________ ut vires desint, tamen est laudanda voluntas
|
|
D. Annies 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: Sa 05.01.13 20:04
Etwas ist mir noch aufgefallen:
Der Dateiname hat (leider) immer vor der Endung .xls eine Leertaste.
Habe es auch schon mit lenght(teilstring)-1 versucht, ohne Erfolg.
LG, Detlef
_________________ ut vires desint, tamen est laudanda voluntas
|
|
D. Annies 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: Sa 05.01.13 22:13
Wie kann man denn diesen SpaghettiCode noch etwas komprimieren?
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35:
| stelle := pos(chr(39), fname); while stelle > 0 do begin delete(fname, stelle, 1); stelle := pos(chr(39), fname); end;
stelle := pos(chr(61), fname); while stelle > 0 do begin delete(fname, stelle, 1); stelle := pos(chr(61), fname); end;
stelle := pos(chr(37), fname); while stelle > 0 do begin delete(fname, stelle, 1); stelle := pos(chr(37), fname); end;
stelle := pos(chr(40), fname); while stelle > 0 do begin delete(fname, stelle, 1); stelle := pos(chr(40), fname); end;
stelle := pos(chr(41), fname); while stelle > 0 do begin delete(fname, stelle, 1); stelle := pos(chr(41), fname); end; fname := fname + '.xls'; |
LG, Detlef
_________________ ut vires desint, tamen est laudanda voluntas
|
|
Mathematiker
      
Beiträge: 2623
Erhaltene Danke: 1452
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: Sa 05.01.13 22:54
Hallo,
D. Annies hat folgendes geschrieben : | | Wie kann man denn diesen SpaghettiCode noch etwas komprimieren? |
Mein Vorschlag wäre, alle Zeichen zu einem String zusammenzufassen.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| loeschstring:=chr(39)+chr(61)+chr(37)+chr(40)+chr(41); for i:=1 to length(loeschstring) do begin stelle := pos(loeschstring[i], fname); while stelle > 0 do begin delete(fname, stelle, 1); stelle := pos(loeschstring[i], fname); end; end; fname := fname + '.xls'; |
Beste Grüße
Mathematiker
_________________ Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
|
|
D. Annies 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: Sa 05.01.13 23:58
Danke, sieht sehr gut aus!
Also:
var loeschstring : String;
oder
var loeschstring : String[10];
ich bin ja immer vorsichtig ...
LG, Detlef
_________________ ut vires desint, tamen est laudanda voluntas
|
|
Mathematiker
      
Beiträge: 2623
Erhaltene Danke: 1452
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: So 06.01.13 00:30
Hallo,
D. Annies hat folgendes geschrieben : | Also:
var loeschstring : String;
oder
var loeschstring : String[10]; |
Beides ist möglich. Ich bevorzuge string, ohne Begrenzung.
Zu Pascal-Zeiten hätte ich den String noch eingeschränkt, aber bei den heutigen Computern ...
Beste Grüße
Mathematiker
_________________ Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
Für diesen Beitrag haben gedankt: D. Annies
|
|
Delphi-Laie
      
Beiträge: 1600
Erhaltene Danke: 232
Delphi 2 - RAD-Studio 10.1 Berlin
|
Verfasst: So 06.01.13 01:24
D. Annies hat folgendes geschrieben : | Der Dateiname hat (leider) immer vor der Endung .xls eine Leertaste.
Habe es auch schon mit lenght(teilstring)-1 versucht, ohne Erfolg. |
Na, wohl nicht Leertaste, sondern Leerzeichen.
Mit Delete bekommt man Teile aus einem String gelöscht, ich glaube, die Syntax lautet: Delete(Stringvariable,Startposition,Anzahl_Löschzeichen).
Für diesen Beitrag haben gedankt: D. Annies
|
|
Perlsau
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: So 06.01.13 08:19
D. Annies hat folgendes geschrieben : | | Der Dateiname hat (leider) immer vor der Endung .xls eine Leertaste. |
Leerzeichen an Anfang und Ende eines Strings entfernt man mit Trim.
Für diesen Beitrag haben gedankt: D. Annies
|
|
D. Annies 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: So 06.01.13 10:47
Gibt es noch einen begabten, der auch diesen Code zusammenfassen kann?
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| stelle := pos('WHERE', teststring); if stelle > 0 then fname := copy(teststring, stelle+6, length(teststring)-1);
stelle := pos('ORDER', teststring); if stelle > 0 then fname := copy(teststring, stelle+6, length(teststring)-1);
stelle := pos('GROUP', teststring); if stelle > 0 then fname := copy(teststring, stelle+6, length(teststring)-1); |
Danke, Detlef
_________________ ut vires desint, tamen est laudanda voluntas
|
|
Mathematiker
      
Beiträge: 2623
Erhaltene Danke: 1452
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: So 06.01.13 11:17
Hallo,
mein Vorschlag:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| const suchstring:array[1..3] of string[6] = ('WHERE','ORDER','GROUP'); ... for i:=1 to 3 do begin stelle := pos(suchstring[i], teststring); if stelle > 0 then fname := copy(teststring, stelle+length(suchstring[i])+1, length(teststring)-1); end; |
Beste Grüße
Mathematiker
_________________ Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
Für diesen Beitrag haben gedankt: D. Annies
|
|
D. Annies 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: So 06.01.13 13:13
Kurze Nachfrage: Warum nicht VAR suchstring: ...
LG Det
_________________ ut vires desint, tamen est laudanda voluntas
|
|
|