Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 2 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 11 bis 20 von 31

Thema: SCL Stringzerlegung

  1. #11
    Registriert seit
    30.03.2011
    Beiträge
    25
    Danke
    10
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Ralle Beitrag anzeigen
    Deine Frage ist nicht ganz verständlich, da wir deinen XML-code ja nicht kennen.

    mypos gibt gar nichts aus, sondern find sucht nach einem bestimmten Zeichen oder einer Zeichenkette und gibt dann mit mypos das erste Auftreten dieser Zeichenkette an. Das findest du, wenn du, wenn du in der Standard-Library unter IEC-Functions die Funktion Find markierst und dann "F1" drückst.



    PS: und hier noch Left:
    Das XML file sieht so aus:

    <?xml version="1.0" encoding="UTF-8"?><WMTOID01><IDOC BEGIN="1"><EDI_DC40 SEGMENT="1"><TABNAM>EDI_DC40</TABNAM><MANDT>901</MANDT><DOCNUM>0000000000653782</DOCNUM><DOCREL>640</DOCREL><STATUS>30</STATUS><DIRECT>1</DIRECT><OUTMOD>2</OUTMOD><IDOCTYP>WMTOID01</IDOCTYP><MESTYP>WMTORD</MESTYP><STDMES>WMTORD</STDMES><SNDPOR>SAPG73</SNDPOR><SNDPRT>LS</SNDPRT><SNDPRN>G73CLNT901</SNDPRN><RCVPOR>HRL_660</RCVPOR><RCVPRT>LS</RCVPRT><RCVPRN>HTWAA_680</RCVPRN><CREDAT>20110414</CREDAT><CRETIM>150538</CRETIM><SERIAL>20110213184129</SERIAL></EDI_DC40><E1LTORH SEGMENT="1"><LGNUM>680</LGNUM><TANUM>0000000132</TANUM><BWLVS>601</BWLVS><TRART>A</TRART><BETYP>L</BETYP><BENUM>0000000000</BENUM><BNAME>INABAP-06</BNAME><PERNR>00000000</PERNR><SOLWM> 0.000</SOLWM><SOLEX> 0.000</SOLEX><ISTWM> 0.000</ISTWM><STDAT>00000000</STDAT><ENDAT>00000000</ENDAT><STUZT>000000</STUZT><ENUZT>000000</ENUZT><SWABW>0000</SWABW><VBTYP>J</VBTYP><TAPRI>02</TAPRI><E1LTORI SEGMENT="1"><TAPOS>0001</TAPOS><MATNR>MAOAM-6801-COLA</MATNR><WERKS>1000</WERKS><MEINS>ST</MEINS><LETYP>E1</LETYP><WDATU>20080825</WDATU><WENUM>4900033558</WENUM><WEPOS>0005</WEPOS><VLTYP>682</VLTYP><VLBER>001</VLBER><VLPLA>04-04</VLPLA><VSOLM>1.000</VSOLM><NLTYP>683</NLTYP><NLBER>001</NLBER><NLPLA>WA-ZONE</NLPLA><NSOLM>1.000</NSOLM><MAKTX>Kaubonbon MAOAM Cola</MAKTX><QPLOS>000000000000</QPLOS><QPLOA>000000000000</QPLOA><LGORT>6800</LGORT><SOLPO> 0.000</SOLPO><VOLUM> 0.000</VOLUM><VOLEH>CCM</VOLEH><NWIRM> 0.000</NWIRM><VBELN>0080015424</VBELN></E1LTORI><E1LTORI SEGMENT="1"><TAPOS>0002</TAPOS><MATNR>MAOAM-6801-COLA</MATNR><WERKS>1000</WERKS><MEINS>ST</MEINS><LETYP>E1</LETYP><WDATU>20080825</WDATU><WENUM>4900033558</WENUM><WEPOS>0005</WEPOS><VLTYP>682</VLTYP><VLBER>001</VLBER><VLPLA>03-04</VLPLA><VSOLM>1.000</VSOLM><NLTYP>683</NLTYP><NLBER>001</NLBER><NLPLA>WA-ZONE</NLPLA><NSOLM>1.000</NSOLM><MAKTX>Kaubonbon MAOAM Cola</MAKTX><QPLOS>000000000000</QPLOS><QPLOA>000000000000</QPLOA><LGORT>6800</LGORT><SOLPO> 0.000</SOLPO><VOLUM> 0.000</VOLUM><VOLEH>CCM</VOLEH><NWIRM> 0.000</NWIRM><VBELN>0080015424</VBELN></E1LTORI><E1LTORI SEGMENT="1"><TAPOS>0003</TAPOS><MATNR>MAOAM-6801-ORANGE</MATNR><WERKS>1000</WERKS><MEINS>ST</MEINS><LETYP>E1</LETYP><WDATU>20080825</WDATU><WENUM>4900033558</WENUM><WEPOS>0006</WEPOS><VLTYP>682</VLTYP><VLBER>001</VLBER><VLPLA>05-01</VLPLA><VSOLM>1.000</VSOLM><NLTYP>683</NLTYP><NLBER>001</NLBER><NLPLA>WA-ZONE</NLPLA><NSOLM>1.000</NSOLM><MAKTX>Kaubonbon MAOAM Orange</MAKTX><QPLOS>000000000000</QPLOS><QPLOA>000000000000</QPLOA><LGORT>6800</LGORT><SOLPO> 0.000</SOLPO><VOLUM> 0.000</VOLUM><VOLEH>CCM</VOLEH><NWIRM> 0.000</NWIRM><VBELN>0080015424</VBELN></E1LTORI></E1LTORH></IDOC></WMTOID01>

    Ist ein typischer Sap Transportauftrag, aus dem ich die Lagerplatznummern raussuchen möchte.

    Der Lagerplatz steht zwischen <VLPLA> und </VLPLA>

    Wäre also in diesem Beispiel: <VLPLA>05-01</VLPLA>

  2. #12
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.728
    Danke
    398
    Erhielt 2.406 Danke für 2.002 Beiträge

    Standard

    OK ...
    dann würde ich es so machen :
    - mit FIND nach <VLPLA> suchen und Position merken
    - mit FIND nach </VLPLA> suchen und Position merken
    - den zwischen den gemerkten Positionen liegenden String mit MID ausschneiden.
    - in dem ausgeschnittenen String mit FIND nach '-' suchen und nun wieder mit MID in die beiden Teile zerlegen.

    Gruß
    Larry

  3. Folgender Benutzer sagt Danke zu Larry Laffer für den nützlichen Beitrag:

    Aslof (03.05.2011)

  4. #13
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.224
    Danke
    533
    Erhielt 2.698 Danke für 1.950 Beiträge

    Standard

    Wäre also in diesem Beispiel: <VLPLA>05-01</VLPLA>
    Dann würde ich nach <VLPLA> suchen dir würde dann in mypos das erste Auftreten von <VLPLA> und da das erste Zeichen ausgegeben.
    Dann kannst du noch nach </VLPLA> suchen, auch hier bekommst du die Position des ersten Zeichens ausgegeben.

    Mit diesen Angaben kannst du gezielt 05 und 01 ausschneiden, im Prinzip benötigst du die Suche nach </VLPLA> nicht einmal, das wäre nur zur Sicherheit und Kontrolle, ob die Daten die korrekte Länge haben.

    05: ist das 8.+9. Zeichen + mypos
    01: ist das 11.+12. Zeichen + mypos

    du könntest also mit der Funktion mid

    pos --> (mypos + 8 ) Länge --> 2 Zeichen auschneiden
    pos --> (mypos + 11 ) Länge --> 2 Zeichen ausschneiden
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  5. Folgender Benutzer sagt Danke zu Ralle für den nützlichen Beitrag:

    Aslof (03.05.2011)

  6. #14
    Registriert seit
    30.03.2011
    Beiträge
    25
    Danke
    10
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Erst mal Danke für die Tipps, das hat mir enorm geholfen. Eine Frage hab ich noch:

    In dem Idoc stehen mehrere Lagerplätze, kann ich um die anderen (also alle nach dem ersten) zu finden einfach nochmal einen Find machen oder muss ich dazu den ersten Treffer löschen?

    Mfg Alex

  7. #15
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.224
    Danke
    533
    Erhielt 2.698 Danke für 1.950 Beiträge

    Standard

    Zitat Zitat von Aslof Beitrag anzeigen
    Erst mal Danke für die Tipps, das hat mir enorm geholfen. Eine Frage hab ich noch:

    In dem Idoc stehen mehrere Lagerplätze, kann ich um die anderen (also alle nach dem ersten) zu finden einfach nochmal einen Find machen oder muss ich dazu den ersten Treffer löschen?

    Mfg Alex
    Du mußt die ersten dazu löschen. Ich hab das immer per Delete gemacht, etwas so:


    Code:
    Pos :=                  FIND(IN1 := Auftrag, IN2 := SuchString);
    Car_id_No :=            MID(IN := Auftrag ,L := Pos-1 ,P := 1);
    Auftrag :=          DELETE(IN := Auftrag, L := Pos + Length, P := 1);
    
    Pos :=                  FIND(IN1 := Auftrag, IN2 := SuchString);
    Kind_of_production :=   MID(IN := Auftrag ,L := Pos-1 ,P := 1);
    Auftrag :=          DELETE(IN := Auftrag, L := Pos + Length, P := 1);
    
    Pos :=                  FIND(IN1 := Auftrag, IN2 := SuchString);
    IO_Flag :=              MID(IN := Auftrag ,L := Pos-1 ,P := 1);
    Auftrag :=          DELETE(IN := Auftrag, L := Pos + Length, P := 1);
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  8. #16
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.728
    Danke
    398
    Erhielt 2.406 Danke für 2.002 Beiträge

    Standard

    FIND sucht immer nur bis zur ersten Übereinstimmung. Du müßtest also dann bis Ende </VLPLA> den String löschen und dann wieder suchen. Der Befehl dafür wäre dann DELETE.
    Beachte aber bitte :
    Der String kann nicht unbegrenzt lang sein ...

  9. Folgender Benutzer sagt Danke zu Larry Laffer für den nützlichen Beitrag:

    Aslof (03.05.2011)

  10. #17
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.728
    Danke
    398
    Erhielt 2.406 Danke für 2.002 Beiträge

    Standard

    Heh Ralle - das klappt heute aber wieder mit uns ...

  11. #18
    Registriert seit
    30.03.2011
    Beiträge
    25
    Danke
    10
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Und wie krieg ich die dann am besten in einen DB?

    ich hab jetzt einen Aufgemacht mit 2 Arrays
    einmal die Spalte für die ersten beiden Zahlen
    und einmal die Zeile für die letzten beiden

  12. #19
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.728
    Danke
    398
    Erhielt 2.406 Danke für 2.002 Beiträge

    Standard

    ... die Frage verstehe ich gerade nicht ... wo hängt es da ?

  13. #20
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.224
    Danke
    533
    Erhielt 2.698 Danke für 1.950 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Larry Laffer Beitrag anzeigen
    Heh Ralle - das klappt heute aber wieder mit uns ...
    Yep, geht wie Butter!

    @Aslof
    Oh oh, dein XML ist 2663 Zeichen lang, wenn ich das richtig sehe.
    S7-Strings sind max. 255 Zeichen lang, also mußt du das ankommende Paket sinnvoll zerlegen, um mit den Stringfunktionen zu arbeiten.

    Es gibt noch eine Alternative, die habe ich mal irgendwann genutzt.
    Die Daten kommen ja sicher per Ethernet oder so in einem DB bei dir an. Dort liegt dann ein Array of Byte o.ä.

    Nun könnte man diese Array nach dem ersten Vorkomen von "<" durchsuchen, hat man das, schaut man, ob das zweite Zeichen "V" ist, wenn ja, das dritte Zeichen und so weiter, wenn nein, dann wieder nach "<" suchen. Das ist kein so großes Problem in SCL. So findest du ebenfalls deine Werte und kannst dann die betreffenden Byte ausschneiden.
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •