Fraggla Geschrieben 5. Juni 2012 Geschrieben 5. Juni 2012 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! Zitieren
Guybrush Threepwood Geschrieben 5. Juni 2012 Geschrieben 5. Juni 2012 Was mir auffällt ist das dein Parametername und value das Selbe ist. Zitieren
hbspike Geschrieben 5. Juni 2012 Geschrieben 5. Juni 2012 Mich würde interessieren was denn a) in dem Enum steht 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 Zitieren
Fraggla Geschrieben 5. Juni 2012 Autor Geschrieben 5. Juni 2012 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, } 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 :/ Zitieren
Fraggla Geschrieben 5. Juni 2012 Autor Geschrieben 5. Juni 2012 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 Zitieren
Fraggla Geschrieben 5. Juni 2012 Autor Geschrieben 5. Juni 2012 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 Zitieren
hbspike Geschrieben 5. Juni 2012 Geschrieben 5. Juni 2012 //&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 Zitieren
Fraggla Geschrieben 5. Juni 2012 Autor Geschrieben 5. Juni 2012 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 Danke, danke, danke, danke! Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.