He visto por encima el código y hay algo que me ha llamado la atención. No
se si es un error o bien una forma de trabajar con módulos que nosotros no
utilizamos y desconocemos. Me explico:

Nosotros, para trabajar con módulos, tenemos siempre uno principal por
programa , que es el único de los que lo compondrán que termina con LR, y
después módulos no principales, definidos con NOMAIN en la hoja H, los
cuales no tienen un procedimiento principal, y no terminan por LR, funcionan
a modo de 'librerias' de procedimientos y funciones y pueden ser enlzados en
distintos programas. 

A la hora de compilar un programa, hacemos crtbndrpg del módulo principal.
En su fuente tenemos en la hoja H la directiva BNDDIR, que indica el
directorio de enlace del programa (tenemos uno por programa, y en él
indicamos los módulos auxiliares y programas de servicio a enlazar).

En tu programa de prueba no he visto BNDDIR en la hoja H, por lo que creo
que si lo compilas con CRTBNDRPG no estás enlazando ningún otro módulo. De
hecho, por la forma en que yo creo que funcionan estas cosas, me parece que
tu programa de prueba está  llamando a los otros dos programas que habías
creado antes. Eso podría explicar que no te aparezca el módulo B en el
debug.

La comprobación de si lo que estoy diciendo es cierto o te estoy montando el
lío padre la podrás ver de tres maneras:

- Si en los fuentes que definen las cabeceras de procedimientos (los que
usas en /Copy), los procedimientos del módulo A y B los tienes definidos con
EXTPGM, con 'toda' probabilidad estoy en lo cierto, y tus llamadas son a
programas, en lugar de a procedimientos.

- Haz un DSPPGM del programa de prueba y mira los módulos que tiene. Si solo
tiene uno, también es seguro que estoy en lo cierto.

- Borra los objetos de tipo programa de los móudlos A y B, que creaste
inicialmente, y ejecuta el programa de prueba. Si casca en el CallP también
será sintoma de que tengo razón.

Bueno, si no he acertado, perdón por el rollo. 



Saludos.

Fernando Pérez.
Cerámica Saloni. Dpto. Sistemas
*   : 964343434  
<mailto:FPEREZ@;SALONI.COM>


-----Mensaje original-----
De: Sergi Yague [mailto:as4@;doyma.es]
Enviado el: jueves, 24 de octubre de 2002 9:14
Para: [EMAIL PROTECTED]
Asunto: RE: Llamada entre dos Procedimientos ILE.



El principal problema es que casca en el Modulo "A". Comento que no puedo
ver el Modulo "B" en el debug, porque supongo que es un síntoma de que algo
no hago bien. Ambos módulos, primero los he creado como *PGM y funcionaban
correctamente, el problema me ha surgido cuando los he transformado a
*MODULE, le estoy pasando el debug, y yo diría que lo que esta pasando, no
se corresponde con el problema que realmente debo tener. Si desde el modulo
"A" llamo al "B" con un CALLB, no recibo bien el parámetro, pero en cambio
si que consigo ver con el debug el programa que llama al modulo "A", el
modulo "A" y el modulo "B". Me casca concretamente porque intenta grabar un
registro duplicado en el subfichero, cuando es la primera vez que entra a
grabar en el subfichero. El primer programa de tipo *PGM solo lo tengo
temporalmente, para probar ambos modulos.

Gracias por vuestra comprensión.

-----Mensaje original-----
De: [EMAIL PROTECTED]
[mailto:Alex.Corretge@;Frape.Behrgroup.COM] 
Enviado el: jueves, 24 de octubre de 2002 8:50
Para: [EMAIL PROTECTED]
Asunto: RE: Llamada entre dos Procedimientos ILE.


Hola Sergi, por lo que comentas entiendo que el *PGM está correctamente
enlazado con la última versión de *MODULE que tienes. Y el problema lo
tienes en que no puedes ver el debug?

En modalidad de debug haz DSPMODSRC y te mostrará el fuente que estás
debugando, por omisión el *EntryPoint del *PGM, con F14=Trabajar con lista
de módulos  puedes seleccionar los fuentes de otros módulos del mismo
programa o de otros programas y añadirle break-points.

Si estás haciendo un trace con F10, para ver lo que sucede en el interior
de los módulos has de apretar F22=Ejecución pasos internos  y entonces te
vas pasando por los fuentes de todos los módulos.

Bueno no se si me he explicado bién, bueno de hecho no se ni si te he
entendio y estoy respondiendo a lo que tu preguntas... me falta otro café ;
-)

fins aviat....
Àlex Corretgé






"Sergi Yague" <[EMAIL PROTECTED]>@QUIJOTE.COMBIOS.ES con fecha 23/10/2002
17:46:33

Por favor, responda a [EMAIL PROTECTED]

Tramès per:    [EMAIL PROTECTED]


Destinataris:     <[EMAIL PROTECTED]>
Còpia:

Classificat:  |----------------|
              | ( ) Important  |
              | ( ) urgent     |
              | ( ) històric   |
              | ( ) temporal   |
              | ( ) bretolada  |
              | ( ) particular |
              |----------------|
Assumpte: RE: Llamada entre dos Procedimientos ILE.




Lo he montado de la siguiente manera:

El primer programa es temporal, es de tipo *PGM creado con un CRTBNDRPG =
y lo unico que hace es pasar por parametro al primer modulo "A" las =
sentencias SQL.

  /COPY NEWAPLICA/QPROTOSRC,PTCABDET
     DSENTENCIA        S            100A
     DRETORN           S              1A
      *
      *
     C                   EVAL      SENTENCIA =3D 'SELECT CPENUCPED, =
CPCLIEPED, +
     C                             CPNPECPED, CPNOMEPED +
     C                             FROM NEWAPLICA/PFCABEPEDI'
     C                   EVAL      RETORN =3D PR_CABDET(SENTENCIA)
     C                   EVAL      *INLR =3D *ON
=1A

El modulo "A" muestra un fichero de cabeceras en un subfichero. Lo he =
creado con un CRTSQLRPGI con *MODULE. Como retorna un parametro la =
llamada el modulo "B" la hago con una asignaci=F3n.

MODULA "A"
  ********************************************************
      * 20/10/2002  Sergi.                                   *
      * PGM PARA MOTRAR TODAS LAS CABECERAS DEL FICHERO      *
      * PFCABEPEDI Y POR CADA CABECERA MUESTRA EL DETALLE    *
      * DEL FICHERO PFDETAPEDI.                              *
      ********************************************************
     HDATEDIT(*DMY/) BNDDIR('DIENLACE01')
      *
     FPTCABDET  CF   E             WORKSTN
     F                                     SFILE(SFLSFL:NRR)
     F                                     INDDS(Indicadores)
      *
      /COPY NEWAPLICA/QESTRUCSRC,ESINDICADO
     D    ActivarPagi                  N   OVERLAY(Indicadores:80)
     D    Noizq                        N   OVERLAY(Indicadores:82)
     D    Noder                        N   OVERLAY(Indicadores:83)
     D    DeleteSfl                    N   OVERLAY(Indicadores:91)
     D    HayRegSfl1                   N   OVERLAY(Indicadores:97)
     D    HayRegSfl3                   N   OVERLAY(Indicadores:98)
     D    Arriba                       N   OVERLAY(Indicadores:17)
     D    Abajo                        N   OVERLAY(Indicadores:18)
     D    MostrarPie                   N   OVERLAY(Indicadores:66)
      *
     D    NRR          S              5S 0
     D    SSQL         S            100A
      /COPY NEWAPLICA/QPROTOSRC,PTCABDET
      /COPY NEWAPLICA/QPROTOSRC,PTCABDET1
     PPR_CABDET        B                   EXPORT
     DPR_CABDET        PI             1A
     D   SentenciaSql               100A   VALUE
      *
     D    PPSALIR      S              1A   INZ('N')
      *
     C/EXEC SQL PREPARE S1 FROM :SentenciaSql
     C/END-EXEC
      *
     C/EXEC SQL
     C+  DECLARE CUR1 DYNAMIC SCROLL CURSOR FOR S1
     C/END-EXEC
      *
      * BLOQUE PRINCIPAL
      *
     C                   MOVEL     *BLANKS       XLIBXFIL         20
     C                   MOVEL     *BLANKS       PMBR             10
     C                   EXSR      DLTSFL
     C                   EXSR      OBRECURFIT
     C                   EXSR      LLEGIRFIT
     C                   EXSR      TANCARFI
     C                   IF        NRR > 0
     C                   EVAL      HayRegSfl1 =3D *ON
     C                   ELSE
     C                   EVAL      HayRegSfl1 =3D *OFF
     C                   ENDIF
     C                   EVAL      MOSTRARPIE =3D *ON
     C                   WRITE     PIE
     C                   EXFMT     SFLCTL
     C                   DOW       NOT Salir
     C                   IF        MdtoSistema
     C                   CALL      'QUSCMDLN'
     C                   ENDIF
     C                   EXSR      TRATASFL3
     C                   IF        PPSALIR =3D 'S'
     C                   LEAVE
     C                   ELSE
     C                   WRITE     PIE
     C                   EXFMT     SFLCTL
     C                   ENDIF
     C                   ENDDO
     C                   RETURN    'A'
      *
      * Fin de programa
      *
     C                   MOVE      *ON           *INLR
      ********************************************************
      * Subrutina para declarar cursor para PFCABEPEDI       *
      ********************************************************
     C     OBRECURFIT    BEGSR
      *
     C/EXEC SQL
     C+   OPEN CUR1
     C/END-EXEC
      *
     C                   ENDSR
      ********************************************************
      * Subrutina para cargar los registros recuperados      *
      ********************************************************
     C     LLEGIRFIT     BEGSR
     C                   DO        9999
     C/EXEC SQL
     C+ FETCH NEXT FROM CUR1 INTO :PPENUCPED,
     C+                           :PPCLIEPED,
     C+                           :PPNPECPED,
     C+                           :PPNOMEPED
     C/END-EXEC
     C     SQLSTT        IFEQ      '02000'
     C                   LEAVE
     C                   ENDIF
      *
     C*                  EVAL      PPENUCPED =3D WPENUCPED
     C*                  EVAL      PPCLIEPED =3D WPCLIEPED
     C*                  EVAL      PPNPECPED =3D WPNPECPED
     C*                  EVAL      PPNOMEPED =3D WPNOMEPED
     C                   ADD       1             NRR
     C                   WRITE     SFLSFL
      *
     C                   ENDDO
      *
     C                   ENDSR
      ********************************************************
      * Subrutina para cerrar los cursores utilizados        *
      ********************************************************
     C     TANCARFI      BEGSR
     C/EXEC SQL
     C+   CLOSE CUR1
     C/END-EXEC
     C                   ENDSR
      **********************************************************
      * Subrutina para tratar selecci=A2n detalle de una CABECERA*
      **********************************************************
     C     TRATASFL3     BEGSR
      *
     C                   READC     SFLSFL                                =
 95
     C                   EVAL      PPSALIR =3D 'N'
     C                   DOW       NOT *IN95 AND PPSALIR =3D 'N'
     C                   IF        PSELEC =3D 'X'
     C                   EXSR      SENTENCIES
     C                   EVAL      PPSALIR =3D PR_CABDET1(SSQL)
     C                   ELSE
     C                   LEAVE
     C                   ENDIF
     C                   EVAL      Anterior =3D *OFF
     C                   EVAL      PSELEC =3D ' '
     C                   UPDATE    SFLSFL
     C                   READC     SFLSFL                                =
 95
     C                   ENDDO

     C                   ENDSR
      ********************************************************
      * Subrutina para cerrar los cursores utilizados        *
      ********************************************************
     C     SENTENCIES    BEGSR
     C
     C
     C                   EVAL      SSQL =3D 'SELECT DPENPEPED, =
DPNUMFPED,+
     C                             DPCODPPED, DPCANTPED, DPPRECPED, +
     C                             DPIMPOPED, DPDTOCPED, DPCONCPED, +
     C                             DPFOPAPED, DPIVAAPED FROM +
     C                             NEWAPLICA/PFDETAPEDI WHERE +
     C                             PPENUCPED =3D DPENUCPED'
     C                   ENDSR
      ********************************************************
      * Subrutina para inicializar el subfichero             *
      ********************************************************
     C     DLTSFL        BEGSR
     C                   IF        NRR > 0
     C                   EVAL      DeleteSfl =3D *ON
     C                   Z-ADD     0             NRR               5 0
     C                   WRITE     SFLCTL
     C                   EVAL      DeleteSfl =3D *OFF
     C                   ENDIF
     C                   ENDSR
     PPR_CABDET        E
=1A

Para cada cabecera el modulo "B" muestra su detalle en otro subfichero.
Esta creado de la misma manera que el modulo "A". Al pasarle el debug, =
no consigo ver el modulo "B". La unica manera de poder ver los dos =
mudulos es llamando el modulo "B" con un CALLB, lo que passa es que el =
parametro no se passa correctamente.     =09
=09
Modulo "B"=20

********************************************************
      * 20/10/2002  Sergi.                                   *
      * PGM PARA MOTRAR TODAS LAS CABECERAS DEL FICHERO      *
      * PFCABEPEDI Y POR CADA CABECERA MUESTRA EL DETALLE    *
      * DEL FICHERO PFDETAPEDI.                              *
      ********************************************************
      *
     F*IFICHERO IF   E           K DISK    USROPN
     F*                                    EXTFILE(XLIBXFIL) =
EXTMBR(PMBR)
     FPFDETAPEDIIF   E           K DISK
     FPTCABDET  CF   E             WORKSTN
     F                                     SFILE(SFLSFL2:NRR2)
     F                                     INDDS(Indicadores)
     D    NRR2         S              5S 0
      /COPY NEWAPLICA/QESTRUCSRC,ESINDICADO
     D    ActivarPagi                  N   OVERLAY(Indicadores:80)
     D    Noizq                        N   OVERLAY(Indicadores:82)
     D    Noder                        N   OVERLAY(Indicadores:83)
     D    DeleteSfl                    N   OVERLAY(Indicadores:91)
     D    HayRegSfl2                   N   OVERLAY(Indicadores:98)
     D    Arriba                       N   OVERLAY(Indicadores:17)
     D    Abajo                        N   OVERLAY(Indicadores:18)
     D    MostrarPie                   N   OVERLAY(Indicadores:65)
      *
      /COPY NEWAPLICA/QPROTOSRC,PTCABDET1
     PPR_CABDET1       B                   EXPORT
     DPR_CABDET1       PI             1A
     D   SentenciaSql               100A   VALUE
      *
     D    WPENPEPED    S              7S 0
     D    WPNUMFPED    S              7A
     D    WPCODPPED    S              7A
     D    WPCANTPED    S              5S 0
     D    WPPRECPED    S              8S 2
     D    WPIMPOPED    S             11S 2
     D    WPDTOCPED    S              5S 2
     D    WPCONCPED    S              4A
     D    WPFOPAPED    S              2A
     D    WPIVAAPED    S              5S 2
      *
     D    PSALIR       S              1A
      *
      * BLOQUE PRINCIPAL
      *
     C                   MOVEL     *BLANKS       XLIBXFIL         20
     C                   MOVEL     *BLANKS       PMBR             10
     C***                EVAL      XLIBXFIL =3D 'NEWAPLICA/PFDETAPEDI'
     C***                EVAL      PMBR =3D 'PFDETAPEDI'
     C*                  OPEN      MIFICHERO
     C                   EXSR      OBRECURFIT
     C                   EXSR      LLEGIRFIT
     C                   EXSR      TANCARFI
     C                   IF        NRR2 > 0
     C                   EVAL      HayRegSfl2 =3D *ON
     C                   ELSE
     C                   EVAL      HayRegSfl2 =3D *OFF
     C                   ENDIF
     C                   IF        NOT SALIR AND NOT ANTERIOR
     C                   IF        HAYREGSFL2
     C                   EXSR      TRATASFL3
     C                   ENDIF
     C                   WRITE     PIE
     C                   EXFMT     SFLCTL2
     C                   IF        MdtoSistema
     C                   CALL      'QUSCMDLN'
     C                   ENDIF
     C                   ENDIF
     C                   IF        SALIR
     C                   EVAL      PSALIR =3D 'S'
     C                   ENDIF
     C                   EXSR      DLTSFL
     C                   RETURN    PSALIR
      *
      * Fin de programa
      *
     C                   MOVE      *ON           *INLR
      ********************************************************
      * Subrutina para declarar cursor para PFDETAPEDI       *
      ********************************************************
     C     OBRECURFIT    BEGSR
      *
     C/EXEC SQL PREPARE S1 FROM :SentenciaSql
     C/END-EXEC
      *
     C/EXEC SQL
     C+  DECLARE CUR2 DYNAMIC SCROLL CURSOR FOR S1
     C/END-EXEC
      *
     C/EXEC SQL
     C+  OPEN CUR2
     C/END-EXEC
      *
     C                   ENDSR
      ********************************************************
      * Subrutina para cargar los registros recuperados      *
      ********************************************************
     C     LLEGIRFIT     BEGSR
     C                   DO        9999
     C/EXEC SQL
     C+ FETCH NEXT FROM CUR2 INTO :WPENPEPED,
     C+                           :WPNUMFPED,
     C+                           :WPCODPPED,
     C+                           :WPCANTPED,
     C+                           :WPPRECPED,
     C+                           :WPIMPOPED,
     C+                           :WPDTOCPED,
     C+                           :WPCONCPED,
     C+                           :WPFOPAPED,
     C+                           :WPIVAAPED
     C/END-EXEC
     C     SQLSTT        IFEQ      '02000'
     C                   LEAVE
     C                   ENDIF
      *
     C                   EVAL      PPENPEPED =3D WPENPEPED
     C                   EVAL      PPNUMFPED =3D WPNUMFPED
     C                   EVAL      PPCODPPED =3D WPCODPPED
     C                   EVAL      PPCANTPED =3D WPCANTPED
     C                   EVAL      PPPRECPED =3D WPPRECPED
     C                   EVAL      PPIMPOPED =3D WPIMPOPED
     C                   EVAL      PPDTOCPED =3D WPDTOCPED
     C                   EVAL      PPCONCPED =3D WPCONCPED
     C                   EVAL      PPFOPAPED =3D WPFOPAPED
     C                   EVAL      PPIVAAPED =3D WPIVAAPED
     C                   ADD       1             NRR2
     C                   WRITE     SFLSFL2
      *
     C                   ENDDO
      *
     C                   ENDSR
      ********************************************************
      * Subrutina para cerrar los cursores utilizados        *
      ********************************************************
     C     TANCARFI      BEGSR
     C/EXEC SQL
     C+   CLOSE CUR2
     C/END-EXEC
     C                   ENDSR
      **********************************************************
      * Subrutina para tratar selecci=A2n detalle de una         *
      **********************************************************
     C     TRATASFL3     BEGSR
      *
     C                   READC     SFLSFL2                               =
 95
     C                   DOW       NOT *IN95
     C                   IF        PSELEC =3D 'X'
     C*                  CALL      'PGDETALLE'
     C                   IF        NOT SALIR
     C                   EVAL      Anterior =3D *OFF
     C                   EVAL      PSELEC =3D ' '
     C                   UPDATE    SFLSFL2
     C                   READC     SFLSFL2                               =
 95
     C                   ELSE
     C                   LEAVE
     C                   ENDIF
     C                   ENDIF
     C                   ENDDO

     C                   ENDSR
      ********************************************************
      * Subrutina para inicializar el subfichero             *
      ********************************************************
     C     DLTSFL        BEGSR
     C                   IF        NRR2 > 0
     C                   EVAL      DeleteSfl =3D *ON
     C                   Z-ADD     0             NRR2              5 0
     C                   WRITE     SFLCTL
     C                   EVAL      DeleteSfl =3D *OFF
     C                   ENDIF
     C                   ENDSR
     PPR_CABDET1       E
=1A

=BFCu=E1l debo utilizar? =BFcallB? =BFLa asignaci=F3n? Os recuerdo que =
los dos modulos primero los cree como tipo *PGM, y estan bien probados y =
funcionan. Siento enviar los fuentes, y una explicaci=F3n tan larga, =
pero es que estoy deseperado y fustrado.

Muchas gracias por las molestias.

_____________________________________________________
Forum.HELP400 es un servicio más de NEWS/400.
© Publicaciones Help400, S.L. - Todos los derechos reservados
http://www.help400.es
_____________________________________________________

Para darte de baja, envía el mensaje resultante de pulsar
mailto:forum.help400-request@;combios.es?body=LEAVE







_____________________________________________________
Forum.HELP400 es un servicio más de NEWS/400.
© Publicaciones Help400, S.L. - Todos los derechos reservados
http://www.help400.es
_____________________________________________________

Para darte de baja, envía el mensaje resultante de pulsar
mailto:forum.help400-request@;combios.es?body=AVE

_____________________________________________________
Forum.HELP400 es un servicio más de NEWS/400.
© Publicaciones Help400, S.L. - Todos los derechos reservados
http://www.help400.es
_____________________________________________________

Para darte de baja, envía el mensaje resultante de pulsar
mailto:forum.help400-request@;combios.es?body=LEAVE

_____________________________________________________
Forum.HELP400 es un servicio más de NEWS/400.
© Publicaciones Help400, S.L. - Todos los derechos reservados
http://www.help400.es
_____________________________________________________

Para darte de baja, envía el mensaje resultante de pulsar
mailto:forum.help400-request@;combios.es?body=LEAVE

Responder a