2015-10-09 4 views
0

Je suis en train d'essayer de récupérer les fichiers spoule en C# et j'ai réussi à afficher la plupart des informations dans WRKSPLF dans mon programme en utilisant le cwbx.dll. Cependant, les formats SPLF0100 et SPLF0300 que j'ai utilisés sont inutiles car le premier ne retourne pas certains champs dont j'ai besoin, et l'autre ne renvoie pas le job interne et l'identifiant du fichier spool dont j'ai besoin. utilisez l'API QSPOPNSP pour lire réellement le fichier. J'ai donc besoin d'utiliser SPLF0200. Le problème est, ce format nécessite que vous passiez un tableau (*) de binary (4) avec les clés des champs que vous voulez retourner, et je ne sais pas comment faire ça sur C#. je vis un exemple RPG qui utilise une structure de données comme ceci:Comment passer un tableau (*) du paramètre binary (4) à l'API IBM iSeries en C#?

IKEYARA  DS  (7) 
I I   201     B 1 40KEY1 
I I   216     B 5 80KEY2 
I I   211     B 9 120KEY3 
C      CALL 'QUSLSPL'  (3) 
C      PARM   SPCNAM 
C      PARM 'SPLF0200'FORMAT 8 (4) 
C      PARM '*CURRENT'USRNAM 10 
C      PARM '*ALL' OUTQ 20 
C      PARM '*ALL' FRMTYP 10 
C      PARM '*ALL' USRDTA 10 
C      PARM   QUSBN 
C      PARM   JOBNAM 26 
C      PARM   KEYARA  
C      PARM 3   KEY# 

j'ai donc essayé d'utiliser cwbx.Structure pour faire la même chose:

Program programSpool = new Program(); 
programSpool.LibraryName = "QSYS"; 
programSpool.ProgramName = "QUSLSPL"; 
programSpool.system = system; 

ProgramParameters parametersQuslpl = new ProgramParameters(); 

//nombre userspace creado anteriormente 
parametersQuslpl.Append("usrspcnam", cwbrcParameterTypeEnum.cwbrcInout, 20); 
StringConverter stringConverterUsrspcnam = new cwbx.StringConverterClass(); 
stringConverterUsrspcnam.Length = 20; 
parametersQuslpl["usrspcnam"].Value = stringConverterUsrspcnam.ToBytes("FLEON  QGPL  "); 
//tipo de formato a leer del spool 
parametersQuslpl.Append("frmname", cwbrcParameterTypeEnum.cwbrcInout, 8); 
StringConverter stringConverterFrmname = new cwbx.StringConverterClass(); 
stringConverterFrmname.Length = 8; 
parametersQuslpl["frmname"].Value = stringConverterFrmname.ToBytes("SPLF0200"); 
//nombre de usuario del spool a bajar 
parametersQuslpl.Append("usrnam", cwbrcParameterTypeEnum.cwbrcInout, 10); 
StringConverter stringConverterUsrnam = new cwbx.StringConverterClass(); 
stringConverterUsrnam.Length = 10; 
parametersQuslpl["usrnam"].Value = stringConverterUsrnam.ToBytes("*CURRENT"); 
//nombre de cola de salida 
parametersQuslpl.Append("cola", cwbrcParameterTypeEnum.cwbrcInout, 20); 
StringConverter stringConverterCola = new cwbx.StringConverterClass(); 
stringConverterCola.Length = 20; 
parametersQuslpl["cola"].Value = stringConverterCola.ToBytes("*ALL"); 
//tipo de formulario 
parametersQuslpl.Append("frmtyp", cwbrcParameterTypeEnum.cwbrcInout, 10); 
StringConverter stringConverterFrmtyp = new cwbx.StringConverterClass(); 
stringConverterFrmtyp.Length = 10; 
parametersQuslpl["frmtyp"].Value = stringConverterFrmtyp.ToBytes("*ALL"); 
//data de usuario 
parametersQuslpl.Append("usrdta", cwbrcParameterTypeEnum.cwbrcInout, 10); 
StringConverter stringConverterUsrdta = new cwbx.StringConverterClass(); 
stringConverterUsrdta.Length = 10; 
parametersQuslpl["usrdta"].Value = stringConverterUsrdta.ToBytes("*ALL"); 
//error? 
parametersQuslpl.Append("error", cwbrcParameterTypeEnum.cwbrcInout, 116);  
StructureClass sc2 = new StructureClass(); 
sc2.Fields.Append("bytesprov", 4); 
sc2.Fields.Append("bytesavail", 4); 
sc2.Fields.Append("messageid", 7); 
sc2.Fields.Append("err", 1); 
sc2.Fields.Append("messagedta", 100);  
parametersQuslpl["error"].Value = sc2.Bytes; 
//nombre trabajo 
parametersQuslpl.Append("nombretrabajo", cwbrcParameterTypeEnum.cwbrcInput, 26); 
stringConverterUsrdta.Length = 26; 
parametersQuslpl["nombretrabajo"].Value = stringConverterUsrdta.ToBytes("*       "); 
//keys 
parametersQuslpl.Append("keys", cwbrcParameterTypeEnum.cwbrcInput, 103); 

StructureClass keys = new StructureClass(); 
keys.Fields.Append("nombrearchivo", 10); //char10 201 
keys.Fields.Append("usuario", 10); //char10 203 
keys.Fields.Append("nombrecola", 10); //206 
keys.Fields.Append("datosusuario", 10); //209 
keys.Fields.Append("estado", 10); //210 
keys.Fields.Append("paginas", 4); //bin 211 
keys.Fields.Append("copias", 4); //bin 213 
keys.Fields.Append("fecha", 7); //216 
keys.Fields.Append("hora", 6); //217 
keys.Fields.Append("idtrabajo", 16); //218 
keys.Fields.Append("idarchivo", 16); //219*/ 
parametersQuslpl["keys"].Value = keys.Bytes; 
//cantidad keys a devolver 
parametersQuslpl.Append("cantidadkeys", cwbrcParameterTypeEnum.cwbrcInput, 4); 
LongConverterClass LongConverterKeys = new cwbx.LongConverterClass(); 
     parametersQuslpl["cantidadkeys"].Value = LongConverterKeys.ToBytes(11); 

Cependant, je reçois l'erreur suivante:

"CPF34C2 - Trop de critères de sélection spécifiés."

Est-ce que quelqu'un a une idée sur la façon de procéder?

Répondre

1

Si vous jetez un coup d'oeil au détail de message en utilisant DSPMSGD ...

cause. . . . . : Lorsque le nom du travail qualifié est spécifié comme critère de sélection
, le nom d'utilisateur, le type de formulaire, les données spécifiées par l'utilisateur et la file d'attente de sortie
doivent être vides.

+0

merci, cette description de l'erreur était utile – fjleon