Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

Hey ho,

versuch gerade ein wenig mit C# und der AS/400, i5, iSeries (was auch immer) zu kommunizieren.

Ich möchte ein Programm schreiben, welches unter Windows ein Call auf die i5 absetzt und anschließend die Daten weiter verarbeitet.

Die Verarbeitung an sich ist nicht das Problem, Daten der i5 werden im CSV Format an ein Transferlaufwerk, welches unter Windows erreichbar ist exportiert und verarbeitet.

Das Problem ist vielmehr der Call.

Nach diversen Internetrecherchen bin ich auf die cwbx (Active X) Schnittstelle der i5 gestoßen.

Nach diesem Tutorial (Calling AS/400 (AS400) RPG Programs From ASP.NET)

habe ich dann auch meine Klasse gebaut.

Normale Calls ohne Parameter funktionieren dabei einigermaßen Sorgenfrei.

Da ich das ganze allerdings zum ersten Mal überhaupt sehe, tu ich mir mit der Parameterkonstruktion ein wenig schwer. Versteh nicht so wirklich, was da in dem Artikel mit enum, Byte usw. gemeint ist. Hab jetzt diverse Möglichkeiten ausprobiert und scheitere leider immernoch. Das Debuggen bringt mich hier leider nicht weiter, da der Fehler auf der i5 sitzt und die Nachrichten dort keine Erkenntniss bringen.

Ich bau anscheinend die Parameter falsch auf, und weiß leider nicht, wie ich das ganze ausbessern kann.

Übergeben werden soll: 3 Parameter, erster 3 Stellen lang, die beiden anderen 2 Stellen lang (varchar/string)

String Parm1 = "001";

            String Parm2 = "25";

            String Parm3 = "26";


            parameters.Append(Parm1, cwbrcParameterTypeEnum.cwbrcInput, 3);

            parameters[Parm1].Value = stringConverter.ToBytes(Parm1.PadRight(3, ' '));

            parameters.Append(Parm2, cwbrcParameterTypeEnum.cwbrcInput, 2);

            parameters[Parm2].Value = stringConverter.ToBytes(Parm2.PadRight(2, ' '));

            parameters.Append(Parm3, cwbrcParameterTypeEnum.cwbrcInput, 2);

            parameters[Parm3].Value = stringConverter.ToBytes(Parm3.PadRight(2, ' '));


            Test.Invoke(true ,parameters );

Falls jemandem was auffällt und mir das erklären könnte, wäre extremst nett!

Mich würde interessieren was denn

a) in dem Enum steht

B) was das append macht

Hängt es quasi nur die Sachen aneinander? Wenn ja dann sollte da ja sowas rauskommen wie.

parameter.[001[EnumString]3].value = Das Ergebnis aus (stringConverter.ToBytes(Parm1.PadRight(3, ' '))

Du hast dann quasi nur eine Parametermap mit key-value paar.

Man müsste jetzt wissen, was genau die i5 denn für eine Parameter-Map verlangt

  • Autor

a) in dem Enum steht nichts, weil ich den Enum nicht übernommen habe, weil ich nur 2 verschiedene längen habe, die ich auch so angeben kann.

Bei "ihm" dem Tutorial Ersteller steht:

protected enum DataLengths : int

{

    PartId     = 12,

    PartPrice  = 15,

}

B)

hab ich im Debugger noch nicht 100% raussehen können, was da dann drinn steht, versuch ich noch raus zu bekommen.

falls da nur "001250260" steht wärs klar. wie der aber die strings auseinander zieht wäre interessant zu wissen.

Ich habs auch anders probiert und den call direkt übergeben, das mag er aber noch weniger.

Call wäre "Call usrber/cstest PARM("001" "25" "26") Mit dem Befehl gehts z.B wenn ich direkt mich selbst auf der i5 anmelde :/

  • Autor

So in der Dokumentation doch noch Beispielcode gefunden:


' Variablen deklarieren

Dim parms As New cwbx.ProgramParameters

Dim strCvtr As New cwbx.StringConverter

Dim longCvtr As New cwbx.LongConverter


' Eingabeparameter anhängen (Parameterlänge ist auf die Länge des

' Eingabeparameterwerts festgelegt).

parms.Append "first name", cwbrcInput

parms("first name") = strCvtr.ToBytes("Maggie")


' Ein-/Ausgabeparameter anhängen. Der Eingabewert ist nur 6 Zeichen lang,

' es soll jedoch ein Puffer für 50 Zeichen zum Empfangen des

' Ausgabewerts zugeordnet werden. Daher wird die Länge bei der Methode Append

' ausdrücklich festgelegt.

parms.Append "last name", cwbrcInout, 50

parms("last name") = strCvtr.ToBytes("Baxter")


' Ausgabeparameter anhängen. Die Länge muss festgelegt werden, damit ein Puffer für

' den Ausgabewert zugeordnet werden kann.

parms.Append "age", cwbrcOutput, 4


' Wert des ersten Parameters anzeigen und hierbei seinen Namen

' als Index verwenden.

MsgBox "Erster Parameter = " & _

        strCvtr.FromBytes(parms.Item("first name").Value)


' Wert des zweiten Parameters anzeigen und hierbei seine Position

' in der Objektgruppe als Index verwenden.

MsgBox "Zweiter Parameter = " & _

        strCvtr.FromBytes(parms.Item(2).Value)


' Inhalt der Objektgruppe löschen, um diese beim Aufruf eines

' anderen Programms erneut zu verwenden.

parms.Clear


' Anderen Parameter an die Objektgruppe anhängen.

parms.Append ("different parameter"), cwbrcInput

parms("different parameter") = longCvtr.ToBytes(5)


' Neuen Parameter anzeigen

MsgBox "Anderer Parameter = " & _

        longCvtr.FromBytes(parms.Item("different parameter").Value)

Quelle: IBM iSeries Access für Windows ®IBM 1980-2004

  • Autor

o.g teil in


 //&FIR &SAIS1 &SAIS2

            String Parm1 = "001";

            String Parm2 = "25";

            String Parm3 = "26";


            parameters.Append("&FIR", cwbx.cwbrcParameterTypeEnum.cwbrcInput, 3);

            stringConverter.Length = 3;

            parameters["&FIR"].Value = stringConverter.ToBytes(Parm1.PadRight(3, ' '));


            parameters.Append("&SAIS1", cwbx.cwbrcParameterTypeEnum.cwbrcInput, 2);

            stringConverter.Length = 2;

            parameters["&SAIS1"].Value = stringConverter.ToBytes(Parm2.PadRight(2, ' '));


            parameters.Append("&SAIS2", cwbx.cwbrcParameterTypeEnum.cwbrcInput, 2);

            stringConverter.Length = 2;

            parameters["&SAIS2"].Value = stringConverter.ToBytes(Parm3.PadRight(2, ' '));

geändert

//&FIR &SAIS1 &SAIS2

            String Parm1 = "001";

            String Parm2 = "25";

            String Parm3 = "26";


            parameters.Append("&FIR", cwbx.cwbrcParameterTypeEnum.cwbrcInput, 3);

            stringConverter.Length = 3;

            parameters["&FIR"].Value = stringConverter.ToBytes(Parm1);


            parameters.Append("&SAIS1", cwbx.cwbrcParameterTypeEnum.cwbrcInput, 2);

            stringConverter.Length = 2;

            parameters["&SAIS1"].Value = stringConverter.ToBytes(Parm2);


            parameters.Append("&SAIS2", cwbx.cwbrcParameterTypeEnum.cwbrcInput, 2);

            stringConverter.Length = 2;

            parameters["&SAIS2"].Value = stringConverter.ToBytes(Parm3);

Ich hät ja jetzt eher so gesagt xD

  • Autor

So habs gelöst, vielen Dank an alle für die Hilfe.

Auflösung:

Aufruf in C#


  //&FIR &SAIS1 &SAIS2

            String Parm1 = "001";

            String Parm2 = "25";

            String Parm3 = "26";


            parameters.Append("&FIR", cwbx.cwbrcParameterTypeEnum.cwbrcInput, 3);

            stringConverter.Length = 3;

            parameters["&FIR"].Value = stringConverter.ToBytes(Parm1);


            parameters.Append("&SAIS1", cwbx.cwbrcParameterTypeEnum.cwbrcInput, 2);

            stringConverter.Length = 2;

            parameters["&SAIS1"].Value = stringConverter.ToBytes(Parm2);


            parameters.Append("&SAIS2", cwbx.cwbrcParameterTypeEnum.cwbrcInput, 2);

            stringConverter.Length = 2;

            parameters["&SAIS2"].Value = stringConverter.ToBytes(Parm3);




            Test.Invoke(true ,parameters );

Dann alles soweit wie normal in nem CL auf der i5 + Variablen Bearbeitung der ersten Variable vor der SQL Übergabe:

 CHGVAR     VAR(&FIRN) VALUE('''' *TCAT &FIR + 

              *TCAT '''')                      

Ganz ehrlich: Keine Ahnung warum, und warum so.

Und vor den Aufrufen noch im CL die Bibliotheksliste entsprechend angepasst, nun funktionierts :D

Danke, danke, danke, danke!

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.