[GELÖST] Aus einem String werte ausschneiden, Sicht einbinde

2. Februar 2007 16:57

Hallo Leute,

nochmal was spezielles. Ich habe eine Tabelle die beinhält eine Spalte, in der folgende Informationen drin stehen (ATTACHMENT).

Es gibt nun das Problem das ich den Anwender natürlich nicht zu jedem Kunden den Inhalt dieser Spalte zeigen möchte, sondern nur den darin evtl. vorkommenden Alarmtext!

In manchen Datensätzen kommt es dann vor das dann dort steht "Alarmtext: " und dann steht ein Text und diesen Text möchte ich pro Datensatz anzeigen.

Also so müsste das aussehen:
"Alarmtext: Zahlt nicht"

Eigentlich brauche ich einen Filter der mir nach dem Wort Alarmtext+1Leerzeichen alles angezeigt an Text, bis zum ersten "\". Ist das möglich mit Navision?

Die Tabelle resultiert aus einer SQL-Sicht. Oder sollte ich lieber versuchen schon über die Sicht nur die Ausschnitte aus den Strings entsprechend zu filtern?
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Zuletzt geändert von tesarolle am 9. Februar 2007 10:48, insgesamt 1-mal geändert.

2. Februar 2007 17:43

mit strpos kannst du start und Endposition ermitteln und mit Copystr den fraglichen Teil extrahieren. Die Onlinehilfe sagt dir, wie genau die Syntax ist.

2. Februar 2007 17:46

So leicht ist es leider nicht, da es keine feste Positionierung gibt für die Stelle an der der eigentlich Alarmtext beginnt! (Siehe Attachment).

Das Schlüsselwort im String ist "Alarmtext: " und dann brauche ich den Text der danach kommt bis zum Begrenzer "\".

Das geht nicht mit festen Positionen.

2. Februar 2007 17:48

Leider krieg ich das PDF nicht geöffnet ... deshalb kann ich nur vermuten worum's geht.
Ich nehme mal an, wir reden von einer Spalte mit Textinhalt, wobei ein Teil des Textes den "Alarmtext" darstellt. Nun willst eben diesen "Alarmtext" soz. ausschneiden und darstellen, den Rest ignorieren.
Ich nehme an der "\" steht für NewLine, also CR/LF.

Dann könnte das Ausschneiden so aussehen:

Code:
AlarmText := COPYSTR(TextSpalte, STRPOS(TextSpalte, 'Alarmtext:'));

2. Februar 2007 17:57

stryk hat geschrieben:Leider krieg ich das PDF nicht geöffnet ... deshalb kann ich nur vermuten worum's geht.
Ich nehme mal an, wir reden von einer Spalte mit Textinhalt, wobei ein Teil des Textes den "Alarmtext" darstellt. Nun willst eben diesen "Alarmtext" soz. ausschneiden und darstellen, den Rest ignorieren.
Ich nehme an der "" steht für NewLine, also CR/LF.

Dann könnte das Ausschneiden so aussehen:

Code:
AlarmText := COPYSTR(TextSpalte, STRPOS(TextSpalte, 'Alarmtext:'));
Hallo Stryk,

was würde ich nur ohne Dich machen *g*!

Ja Du hast es richtig verstanden, die Datensätze sehen in der einen Spalte so aus:

{\rtf1\ansi\ansicpg1252\deff0\deflang1031{\fonttbl{\f0\fnil\fcharset0 Arial;}{\f1\fnil\fcharset0 MS Sans Serif;}} \viewkind4\uc1\pard\fs18 Alarmtext: schwarze Liste \par \f1\fs17 17.01.2007 *Bew\'e4hrung* \par } 11803.0

{\rtf1\ansi\ansicpg1252\deff0\deflang1031{\fonttbl{\f0\fnil\fcharset0 Arial;}{\f1\fnil\fcharset0 MS Sans Serif;}} \viewkind4\uc1\pard\fs18 Alarmtext: schwarze Liste \par \f1\fs17 17.01.2007 *Bew\'e4hrung* \par } 10271.0

{\rtf1\ansi\ansicpg1252\deff0\deflang1031{\fonttbl{\f0\fnil\fcharset0 Arial;}{\f1\fnil\fcharset0 MS Sans Serif;}} \viewkind4\uc1\pard\fs18 Alarmtext: schwarze Liste \par \pard\f1\fs17 17.01.2007 *Bew\'e4hrung*\fs17 \par } 10230.0

{\rtf1\ansi\ansicpg1252\deff0\deflang1031{\fonttbl{\f0\fnil\fcharset0 MS Sans Serif;}} \viewkind4\uc1\pard\f0\fs17 Alarmtext: Frei Haus!!! \par } 10227.0

{\rtf1\ansi\ansicpg1252\deff0\deflang1031{\fonttbl{\f0\fnil\fcharset0 Arial;}{\f1\fnil\fcharset0 MS Sans Serif;}} \viewkind4\uc1\pard\fs18 Alarmtext: schwarze Liste \par \pard\f1\fs17 17.01.2007 *Bew\'e4hrung*\fs17 \par } 10316.0


Naja und ich will alles das was NACH dem Wort "Alarmtext: " (man beachte das Leerzeichen nach dem :) herausschneiden bis zu dem Begrenzer "".

Wo muss ich Deinen Codeschnipsel einbauen? Ich rufe im konkreten Fall eine Sicht auf die auf Adressdaetn zugreift, und die schwarzen Schaafe haben einen Alarmtext. Das Navision greift auf diese externe DB zu und soll ermöglichen das diese Adresse eingefügt wird(nach Auswahl über Lookup), allerdings soll im Falle des vorhandenseins von Alarmtexten dieser mit eingefügt werden in der Navision Tabelle beim entsprechenden Datensatz.

Und deswegen brauche ich das Ausschneiden, damit nur dieser angezeigt wird.

2. Februar 2007 18:03

Du bist ja SQL-Profi, am liebsten würde ich das über die Sicht lösten:

SELECT KUNUMMER, ANREDE, NAME, ANSCHR, ZUSATZ, STRASSE, PLZ, ORT, FAX,
CONVERT(varchar(250), ALARM) AS Alarm, SPRACHE, KONDITION
FROM DATENBANK

Aber das geht vermutlich nicht oder???? Dann hätte ich das Problem in Navision gar nicht erst, weil nur noch die "ausgeschnittenen" Alarmtext zur Verfügung ständen.

2. Februar 2007 21:07

Wenn man die Lösung von Jörg etwas verfeinert, dann sollte es passen:
Code:
TempText := COPYSTR(TextSpalte,STRPOS(TextSpalte,'Alarmtext:'));
Alarmtext := DELCHR(COPYSTR(TempText,1,STRPOS(TempText,'\') - 1),'<>',' '); // Überflüssige Leerzeichen löschen wir gleich mit ;-)

2. Februar 2007 21:33

Hmmm ... das mit dem "\" als Trenner ist ein wenig "tricky", da dieser als Zeilenumbruch in Strings interpretiert wird ... vielleicht kann man ja den Sub-String \par auswerten, dann könnte das in NAV so aussehen:

Code:
AlarmText :=
  COPYSTR(TextSpalte,
    STRPOS(TextSpalte, 'Alarmtext:'),
    STRPOS(TextSpalte, '\par ') - STRPOS(TextSpalte, 'Alarmtext:'));


Was den "SQL Profi" angeht: Danke für die Blumen, dem ist aber nicht wirklich so :oops:
Wenn es z.B. um Stringverarbeitung mit TSQL geht, dann wird's "eng" ... hier ein Versuch:

Code:
SELECT KUNUMMER, ANREDE, NAME, ANSCHR, ZUSATZ, STRASSE, PLZ, ORT, FAX,

  SUBSTRING( CONVERT(varchar(250), ALARM) ,
    CHARINDEX ( 'Alarmtext:' , CONVERT(varchar(250), ALARM)) ,
    (CHARINDEX ( '\par ' , CONVERT(varchar(250), ALARM), CHARINDEX ( 'Alarmtext:' , CONVERT(varchar(250), ALARM)) ) - CHARINDEX ( 'Alarmtext:' , CONVERT(varchar(250), ALARM)))) AS Alarm,

SPRACHE, KONDITION
FROM DATENBANK

2. Februar 2007 22:00

Ich habe es jetzt nicht ausprobiert, könnte mir aber gut vorstellen, dass Navision bei STRPOS den \ nicht als Zeilenumbruch interpretiert, da es bei dem Befehl keinen Sinn ergeben würde.

Falls es doch so sein sollte:
Ich sehe gerade in der PDF-Datei, dass vor dem \par zwei nicht druckbare Zeichen (ungleich Leerzeichen) sind.
Vielleicht könnte man die als eindeutigen Trenner nehmen, man müsste nur mal mit einem HexEditor nachsehen, welche Zeichen es genau sind.

3. Februar 2007 00:35

Hey ihr beiden, Klasse!!!

Also Stryk Du bist ein SQL Profi! Sieht jetzt so aus das Ergebnis:

Alarmtext: Frei Haus!!!
Alarmtext: schwarze Liste
Alarmtext: schwarze Liste
Alarmtext: schwarze Liste
Alarmtext: schwarze Liste
Alarmtext: Schwarze Liste
Alarmtext: schwarze Liste
Alarmtext: schwarze Liste
Alarmtext: schwarze Liste
Alarmtext: schwarze Liste
Alarmtext: Schwarze Liste 3. Mahnung 2.2.04/dst - Status: D
Alarmtext: Schwarze Liste - Status: D
Alarmtext: Schwarze Liste - Status: D
Alarmtext: schwarze Liste

Ein Problem gibt es allerdings noch, was was Timo gesagt hat stimmt, der Trenner sollten diese beiden nicht druckbaren Zeichen sein vor dem \, denn diese"\" werden hinter dem text als so 4 Ecke angezeigt.

Wie kann man das machen mit der Sicht, das ich bei allen anderen Fällen, wo es keinen Alarmtext im String gibt , er das Feld leert? Denn manchmal steht in den Feldern nur Quatsch drin den ich in NAvision nicht gebrauchen kann.

WAs ich noch nicht hinbekommen habe: Also jetzt nur auf die SQL Sicht bezogen, ich will das nur der Text nach dem Doppelpunkt dasteht
also statt:
Alarmtext: schwarze Liste

soll jeweils immer dastehen:

schwarze Liste

also nur der eigentliche Text. Das wäre meine letzte Bitte an dich stryk! Dann kannst Du dir schonmal nen schönen Blumenstrauss aussuchen *zwinker*!

Naja das mit den nicht druckbaren Zeichen (als eindeutiger Trenner) kriegt man unter Sql vermutlich nicht hin was?

Viele Grüße!

3. Februar 2007 04:14

dann addiere zum charindex noch 11 hinzu, um das Wort Alarmtext mit dem Doppelpunkt und dem Leerzeichen zu überspringen.
was die Kästchen angeht, du musst halt ermitteln, welche Chr$ Werte dahinterstecken....

3. Februar 2007 16:29

Hallo Michael,

das mit dem hinzuzählen funktioniert nicht.

Wie kann ich rausfinden was für "Chr$" Werte hinter den Zeichen stehen? Das sind doch die nicht druckbaren Zeichen oder? Mit dem Hexeditor, soweit bin ich schon, aber mit dem kann man doch nicht auf SQL-Tabellen zugreifen??? Kenne mich damit gar nicht aus...

4. Februar 2007 03:26

mit dem Addieren meinte ich so:
SUBSTRING( CONVERT(varchar(250), ALARM) ,
(CHARINDEX ( 'Alarmtext:' , CONVERT(varchar(250), ALARM)) + 11) ,
(CHARINDEX ( '\par ' , CONVERT(varchar(250), ALARM), CHARINDEX ( 'Alarmtext:' , CONVERT(varchar(250), ALARM)) ) - (CHARINDEX ( 'Alarmtext:' , CONVERT(varchar(250), ALARM)) PLUS 11))) AS Alarm,


Statt des Wortes PLUS musst du natürlich ein Plus-Zeichen einfügen, was ich hier aus irgendwelchen Gründen nicht als solches sichtbar machen kann....

und was das ermitteln der Charcodes angeht, du könntest versuchen, einen Datensatz in eine Textdatei zu exportieren und diese dann mit einem HEX-Editor öffnen.

oder aber du ermmittelst die Codes empirisch,
oder, wenn es immer genau 2 Zeichen vor dem /par sind, ziehst du halt 2 von diesem Charindex ab...


[Edit TL: Das Plus-Zeichen '+' funktioniert schon, nur in der Vorschau gibt es wohl ein Problem.]

4. Februar 2007 12:42

Mein nächster Versuch wäre dann:

Code:
SELECT KUNUMMER, ANREDE, NAME, ANSCHR, ZUSATZ, STRASSE, PLZ, ORT, FAX,

  SUBSTRING(
    CONVERT(varchar(250), ALARM),
    CHARINDEX('Alarmtext:', CONVERT(varchar(250), ALARM)) + 11,
    (
      CHARINDEX('\par ', CONVERT(varchar(250), ALARM), CHARINDEX('Alarmtext:', CONVERT(varchar(250), ALARM)))
      - CHARINDEX('Alarmtext:', CONVERT(varchar(250), ALARM))
    ) - 13
  )
  AS Alarm,

SPRACHE, KONDITION
FROM DATENBANK

4. Februar 2007 14:42

Hallo Ihr beiden!!!

Erstmal vielen Dank für Eure Mühe! Habe beide Eure Vorschläge ausprobiert, es entsteht jeweils nun das selbe Problem. Beim Aufrufen der Sicht auf SQL Seite kommt die Meldung: "Ungültiger Längenparameter (length) wurde an die Substring-Funktion übergeben"...

Auf dem SQL-Server zeigt er zumindest das gewünschte Ergebnis an und dann kkommt aber die o..g. Melddung. Wenn ich die Sicht aus Navision heraus aufrufe hängt sich der Client auf...

Noch Ideen auf Euerer Seite?

4. Februar 2007 14:57

das wird vermutlich am 2.Teil liegen, d.h. wenn der Teilstring \par nicht gefunden wird, gibt es einen negativen Wert, was natürlich nicht erlaubt ist.
hier musst du also wohl auch noch eine IF Abfrage mit in den Befehl aufnehmen.
Jörg, du bist wieder dran mit Fleißkärtchen verdienen :mrgreen:

4. Februar 2007 15:15

test
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

4. Februar 2007 15:16

Mhn, hat nun endlich geklappt :-) Oben die Datei muss man in *.txt umbenennen. Ist eine txt datei, komisch das hier keine txt angenommmen werden...

Jedenfalls suche ich nun nach den nicht druckbaren Zeichen hinter mmeinen alarmtexten, sonst führt das nur zu weiteren problemen mit dem +13 - 11 usw...

4. Februar 2007 17:03

Hallo Michael, er ist noch nicht gelöst!

Ich habe nur da oben geschrieben das das hochladen der txt datei endlich geklappt hat. Das Problem mit der Fehlermeldung in der Sicht besteht immer noch...

4. Februar 2007 17:11

Habe noch ne Frage, im Anhang in der Bilddatei habe ich im Hexeditor auf die nicht druckbaren Zeichen gezoomt, wie frage ich das ab???

Die letzte funktionierende Version :-) meiner Sicht ist ja die hier:

SELECT KUNUMMER, ANREDE, NAME, ANSCHR, ZUSATZ, STRASSE, PLZ, ORT, FAX,

SUBSTRING( CONVERT(varchar(250), ALARM) ,
CHARINDEX ( 'Alarmtext:' , CONVERT(varchar(250), ALARM)) ,
(CHARINDEX ( '\par ' , CONVERT(varchar(250), ALARM), CHARINDEX ( 'Alarmtext:' , CONVERT(varchar(250), ALARM)) ) - CHARINDEX ( 'Alarmtext:' , CONVERT(varchar(250), ALARM)))) AS Alarm,

SPRACHE, KONDITION
FROM DATENBANK
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

4. Februar 2007 17:30

Ja, das ist das ganz normale CRLF (Chr$(13) + chr$(10)).
Ich müsste jetzt die Onlinedoku zur Hand haben um die Syntax für den SQL-Befehl nennen zu können....

5. Februar 2007 11:12

Hmmm ... ist natürlich schwierig, wenn man nicht weiß, wie der Fehler zustande kommt ... ich denke, daß es durch so 'ne Konstellation kommt:

Statt ...Alarmtext: schwarze Liste##\par...

steht ...Alarmtext:##\par...

kann das sein? In dem Fall könnte man den Offset ein wenig ändern ...
Also, noch'n Versuch:

Code:
SELECT KUNUMMER, ANREDE, NAME, ANSCHR, ZUSATZ, STRASSE, PLZ, ORT, FAX,

  LTRIM(SUBSTRING(
    CONVERT(varchar(250), ALARM),
    CHARINDEX('Alarmtext:', CONVERT(varchar(250), ALARM)) + 10,
    (
      CHARINDEX('\par ', CONVERT(varchar(250), ALARM), CHARINDEX('Alarmtext:', CONVERT(varchar(250), ALARM)))
      - CHARINDEX('Alarmtext:', CONVERT(varchar(250), ALARM))
    ) - 12
  ) )
  AS Alarm,

SPRACHE, KONDITION
FROM DATENBANK

5. Februar 2007 11:49

Hallo Jörg,

bin ja überhaupt dankbar das Du mir noch schreibst :-)!

Also ich habe mir die komplette Tabelle nochmal angeschaut, das mit dem "\par" als Trenner kann ich wohl knicken, weil in manchen Datensäten die Strings auch wieder etwas anders aussehen können. Der Fehler kommt mit Deinem letzten Versuch leider auch.

Ich habe rausgefunden das man anstatt "\par" den trenner für nicht druckbare Zeichen (CRLF) nehmen kann!

Allerdings versuche ich gerade in Erfahrung zu bringen wie ich das dann abfrage, also das CLRF (:-. Bisher konnte mir das noch niemand sagen!

5. Februar 2007 13:07

Ich stell' mich jeder Herausforderung 8-)

Code:
...
SELECT
  LTRIM(SUBSTRING(
    CONVERT(varchar(250), ALARM),
    CHARINDEX('Alarmtext:', CONVERT(varchar(250), ALARM)) + 10,
    (
      CHARINDEX((char(13) + char(10)), CONVERT(varchar(250), ALARM), CHARINDEX('Alarmtext:', CONVERT(varchar(250), ALARM)))
      - CHARINDEX('Alarmtext:', CONVERT(varchar(250), ALARM))
    ) - 10
  ))
  AS Alarm,
...

5. Februar 2007 14:14

WOW, Super, es funktioniert jetzt!1!!!!!

Noch eine Frage, die letzte!

Jetzt ist es ja so das er wenn er Alarmtexte findet in den Strings das entsprechend ausgibt, aber bei denen wo nicht "Alarmtext" drin vorkommt die bleiben in der Sicht ja unverändert.

Der String ist bei diesen DDatensätzen dann ziemlich lang und sieht unschön aus, ich möchte wenn kein Alarmtext gefunden wurde das das Feld leer ist (mit wert null in der sicht angezeigt wird). Sodass am Ende halt nur die eigentlichen Alarmtexte bei den Datensätzen stehen wo eben welche da sind und wenn es keine Alarmtexte gibt die Felder einfach leer sind.

Geht das in dem Kontext unserer Sicht?