![]() |
AW: An welcher Position war/ist die Variable im Template
Ich habe ein Problem. Ich verstehe die Diskussion um die Herkunft der Werte für die Variablen %year% und %counter% nicht. Ich möchte doch nur eine einfache String Bearbeitung haben, die mir aus dem Ergebnis den Wert einer Variable vom Template zurückgibt.
Warum muss man jetzt wissen, woher die Variablen Ihre Werte bekommen ? Nach meiner Meinung, ist das doch völlig irrelevant oder übersehe ich hier etwas ? |
AW: An welcher Position war/ist die Variable im Template
Es ist halt nicht klar, was zum Zeitpunkt der benötigten Funktion vorliegt und was nicht und ob Du an den Gegebenheiten noch etwas optimieren kannst.
Beantworte doch mal meine 5 Fragen. Vielleicht hilft das weiter... Wenn Du NUR die Ergebnisstrings hast ohne irgendwelche Infos zu den zu Grunde liegenden Templates, dann wird es schwierig. Die Frage ist, wozu diese Strings dann gespeichert werden, wenn man diese nachher eh nicht mehr vernünftig interpretieren kann. |
AW: An welcher Position war/ist die Variable im Template
Hallo,
ich versuche mal ein bisserl "rumzuspinnen". Dazu mache ich folgende Annahmen: 1. Dir sind alle Templates bekannt. 2. Dir sind für alle Variabeln die möglichen Maximalwerte bekannt. 3. Alle aus den Templates erstellten Werte sind rein nummerische Werte. Stimmt eine der Annahmen nicht, dann vergiss den Rest. Für jedes Template werden folgende Schritte ausgeführt: 1. Das Template wird mit den Maximalwerten befüllt. 2. Per SQL suchst Du nun in der Datenbank den höchsten Wert, der kleiner als der soeben erstellte Wert ist.
Code:
3. Da Dir zu diesem Zeitpunkt der Aufbau des Templates und der deraus erstelle Wert bekannt sind, müsstest Du nun durch entfernen aller der Teile, die nicht durch %counter% in den Wert "hineingekommen" sind, den von Dir gesuchten %counter%-Wert erhalten.
Select max(Spalte) from tabelle where Spalte < "Ergebnis von 1."
Sollte ich um zu viele (und vor allem fehlerhafte) Ecken gedacht haben, dann vergiss das Geschreibsel von mir bitte. |
AW: An welcher Position war/ist die Variable im Template
Das bringt mir doch alles nichts. Es geht doch nur lediglich um den Importvorgang und nach diesem den Counter entsprechend hochzusetzen. Die ganzen Spekulationen und Fragen habe ich in meinen Beiträge beantwortet oder bestätigt.
Ich formuliere es nochmal als letzten Versuch: Ich möchte aus einem Ergebniswert (kann alle Zeichen enthalten) mit Hilfe des Templates den Wert des Counters bestimmen. Alles andere muss und soll so bleiben. Welche Möglichkeiten habe ich ? |
AW: An welcher Position war/ist die Variable im Template
Zitat:
|
AW: An welcher Position war/ist die Variable im Template
@Sir Ruf: Auf welche Frage antwortest Du jetzt ?
|
AW: An welcher Position war/ist die Variable im Template
Ich versuche dann mal etwas konstruktives (nur die Theorie):
Wir haben das Template, was irgendwo die Zeichenfolge
Delphi-Quellcode:
enthält.
'%counter%'
Oder anders betrachtet besteht das Template aus 3 Abschnitten:
Code:
100%counter%3081%year%
Vorne 100 => 3 Zeichen Hinten 3081%year% (year immer 4 Ziffern) => 30810000 => 8 Zeichen
Code:
100217830812016
3 Zeichen vorne entfernen => 217830812016 8 Zeichen hinten entfernen => 2178 heureka! |
AW: An welcher Position war/ist die Variable im Template
Also noch ein Versuch einer Lösung:
Du musst für jedes Template den entsprechenden höchsten Wert aus Deinen Daten ermitteln, alles aus diesem Wert entfernen, was nicht durch den Platzhalter %counter% in den Wert eingeflossen ist und schon hast Du den Wert für %counter%. Da wir keine konkreteren Informationen über den Ursprung der Daten und den Aufbau der Templates haben als: "kann so P%counter%%year% oder so ähnlich aussehen", können wir auch keine konkretere Lösung entwickeln, als es könnte so oder so ähnlich gehen. Und Vorschläge für so oder so ähnlich gibt es jetzt schon einige. Sir Rufo beschrieb in seinem letzten Beitrag das, was ich mit meinem Vorschlag meinte. Man nehme aus dem größten vorhandenen Wert alles heraus, was "fest" im Template enthalten ist, entferne das Jahr und schon hat man den Counter. Da es unterschiedliche Templates gibt, muss für jedes Template eine eigene Counterextrahiermethode her. Die bisherigen Informationen lassen nicht erkennen, dass es eine allgemeingültige Lösung für beliebige Templates geben könnte. |
AW: An welcher Position war/ist die Variable im Template
Eigentlich bin ich ja der Letzte, der sowas vorschlagen würde, aber nach dem Vortrag von Daniel bei der CodeRage DE:
Delphi-Quellcode:
uses
System.RegularExpressions; function ExtractCounter(const Template, Value: string): Integer; var pattern: string; begin pattern := Template.Replace('%counter%', '([\d]+)', [rfIgnoreCase]).Replace('%year%', '(?:[\d]{4})', [rfIgnoreCase]); result := TRegEx.Match(Value, pattern).Groups[1].Value.ToInteger; end; |
AW: An welcher Position war/ist die Variable im Template
Oder eben nach alter Väter Sitte:
Delphi-Quellcode:
PS: leider allgemeingültig :mrgreen:
program Project4;
{$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils; function GetCounterFromTemplatedString( const Str, Template: string ): Integer; const CCounter = '%counter%'; CYear = '%year%'; CYearDefault = '0000'; var tmp : string; lFirst, lTail, lLength: Integer; begin tmp := Template.Replace( CYear, CYearDefault ); lFirst := tmp.IndexOf( CCounter ); if lFirst = -1 then raise Exception.Create( 'Fehlermeldung' ); lTail := tmp.Length - lFirst - CCounter.Length; lLength := Str.Length - lFirst - lTail; tmp := Str.Substring( lFirst, lLength ); Result := Integer.Parse( tmp ); end; procedure Check( const Str, Template: string; expected: Integer ); begin if GetCounterFromTemplatedString(str,template) <> expected then raise Exception.Create('Fehlermeldung'); end; procedure Test; begin Check( '1001030812016', '100%counter%3081%year%', 10 ); Check( '10012530812016', '100%counter%3081%year%', 125 ); Check( '100217830812016', '100%counter%3081%year%', 2178 ); Check( '10047930812016', '100%counter%3081%year%', 479 ); Check( 'P12016', 'P%counter%%year%', 1 ); Check( 'P1002016', 'P%counter%%year%', 100 ); end; begin try Test; except on E: Exception do Writeln( E.ClassName, ': ', E.Message ); end; ReadLn; end. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:10 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-2025 by Thomas Breitkreuz