Seite 1 von 2

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

Verfasst: 2. Februar 2007 16:57
von tesarolle
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?

Verfasst: 2. Februar 2007 17:43
von Michael Schumacher
mit strpos kannst du start und Endposition ermitteln und mit Copystr den fraglichen Teil extrahieren. Die Onlinehilfe sagt dir, wie genau die Syntax ist.

Verfasst: 2. Februar 2007 17:46
von tesarolle
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.

Verfasst: 2. Februar 2007 17:48
von stryk
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:'));

Verfasst: 2. Februar 2007 17:57
von tesarolle
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.

Verfasst: 2. Februar 2007 18:03
von tesarolle
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.

Verfasst: 2. Februar 2007 21:07
von Timo Lässer
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 ;-)

Verfasst: 2. Februar 2007 21:33
von stryk
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

Verfasst: 2. Februar 2007 22:00
von Timo Lässer
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.

Verfasst: 3. Februar 2007 00:35
von tesarolle
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!

Verfasst: 3. Februar 2007 04:14
von Michael Schumacher
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....

Verfasst: 3. Februar 2007 16:29
von tesarolle
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...

Verfasst: 4. Februar 2007 03:26
von Michael Schumacher
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.]

Verfasst: 4. Februar 2007 12:42
von stryk
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

Verfasst: 4. Februar 2007 14:42
von tesarolle
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?

Verfasst: 4. Februar 2007 14:57
von Michael Schumacher
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:

Verfasst: 4. Februar 2007 15:15
von tesarolle
test

Verfasst: 4. Februar 2007 15:16
von tesarolle
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...

Verfasst: 4. Februar 2007 17:03
von tesarolle
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...

Verfasst: 4. Februar 2007 17:11
von tesarolle
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

Verfasst: 4. Februar 2007 17:30
von Michael Schumacher
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....

Verfasst: 5. Februar 2007 11:12
von stryk
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

Verfasst: 5. Februar 2007 11:49
von tesarolle
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!

Verfasst: 5. Februar 2007 13:07
von stryk
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,
...

Verfasst: 5. Februar 2007 14:14
von tesarolle
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?