Código en SapScript?

Colapsar
X
 
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes
  • Driau
    Senior Member
    • ago
    • 235

    #1

    Código en SapScript?

    Hola a todos. Tengo una dudilla:

    Tengo un programa que actualmente puede imprimir etiquetas de caja (llamando al formulario ZWM_ETQCJ) o etiquetas de palet (llamando al formulario ZWM_ETQPL). Ahora quieren que ademas en la pantalla de selección haya un campo que cuando se marque escriba debajo de todo de la etiqueta "FOLLETO" independientemente de si es de caja o palet. Ésto me lleba a tener 4 tipos de etiquetas.

    Mi pregunta es: Tengo que crear otros dos formularios SapScript de tipo etiqueta/Folleto i palet/Folleto? O puede meter código en los que estan creados para que elles mismo cjequeen si el campo folleto esta marcado y añadan la palabra folleto al final. És decir, un SapScript puede tener lógica?? Como podría implementar esto?? Seria un sencillo "IF"???

    Muchas grácias a todos!
  • Jacampos
    Member
    • feb
    • 70

    #2
    Normalmente, la logica del un Sapscript la haces en un programa aparte, que debe esta asignado en la parametrizacion de este documento. Si habres el Sapscript podras ver que tiene llamadas del tipo :

    Codigo en el SapScript:
    Define &campo_retorno& = ''.
    PERFORM Chequear_folleto IN PROGRAM ZTUPROGRAMA
    CHANGING &campo_retorno&.
    If &campo_retorno& is not initial.
    Folleto
    Endif.


    El codigo que precede a esta linea lo tendrias que poner despues de mostrar los datos.

    Miras el programa en el que tienes la lógica y ahí añades los que necesites chequear.

    Espero que te sirva.
    Saludos.
    Quiero aprender, ayudando a aprender.

    Comentario

    • Driau
      Senior Member
      • ago
      • 235

      #3
      No Puedo Hacer Ésto??

      He visto lo que me has puesto..però..entonces ésto no seria correcto?

      IF &P_FOLLE& EQ 'X'.
      4911S0100520388P012P012&FOLLETO&
      ENDIF.

      Lo he puesto tal cual en el SAPScript...sin performs ni nada. Lo que no entiendo es que si el programa (en mi caso) ZIMPRIME_OF llama al Sapscript con el checkbox P_FOLLETO marcado, el Sapscript no sabe que el Checkbox P_FOLLETO está marcado???

      Comentario

      • Jacampos
        Member
        • feb
        • 70

        #4
        Depende si tu programa pasa esa variable al formulario. Si tu programa pasa esa variable al Sapscript. Los que has puesto es correcto. Pero, por el contrario si tu programa no pasa esa variable al formulario no hara nada.

        Saludos.
        Quiero aprender, ayudando a aprender.

        Comentario

        • Driau
          Senior Member
          • ago
          • 235

          #5
          oK..a ver si así lo finiquito!

          A ver.. el código que he pusto en el Sapscript es el que tu me has proporcionado:

          /: DEFINE &CAMPO_RETORNO& = ''.
          /: PERFORM CHEQUEAR_FOLLETO IN PROGRAM ZIMPRESION_ETIQUETAS
          /: CHANGING &CAMPO_RETORNO&.
          /: IF &CAMPO_RETORNO& IS NOT INITIAL.
          / 4911S0100520368P012P012&FOLLETO&
          /: ENDIF.


          Y luego en mi report he hecho un form del siguiente estilo:

          FORM CHEQUEAR_FOLLETO USING CAMPO_RETORNO.
          IF P_FOLLE EQ 'X'.
          CAMPO_RETORNO = 'X'.
          ENDIF.
          ENDFORM.


          Las barras que van en el sapscript (/ / estan bién puestas??

          Es decir...yo llamo al perform desde sapscript i le paso la variable CAMPO_RETORNO no? Luego el perform le assigna un valor 'X' o ' ' en funcion de si el checkbox P_FOLLE esta marcado y lo devuelve al sapscript no¿?
          Nose si el código del form esta bien ya que esto del "CHANGING" me descoloca un poco.

          Muchas gracias por la ayuda!!

          Comentario

          • Jacampos
            Member
            • feb
            • 70

            #6
            Necesitas el parametro CHANGING para poder devolverle el valor al formulario.

            Y luego en mi report he hecho un form del siguiente estilo:

            FORM CHEQUEAR_FOLLETO CHANGING CAMPO_RETORNO

            IF P_FOLLE EQ 'X'.
            CAMPO_RETORNO = 'X'.
            ENDIF.
            ENDFORM.


            Codigo en el Sapcscript:

            /: DEFINE &CAMPO_RETORNO& = ''.
            /: PERFORM CHEQUEAR_FOLLETO IN PROGRAM ZIMPRESION_ETIQUETAS
            /: CHANGING &CAMPO_RETORNO&.
            /: IF &CAMPO_RETORNO& IS NOT INITIAL.
            * 4911S0100520368P012P012 FOLLETO
            /: ENDIF.

            Saludos.
            Quiero aprender, ayudando a aprender.

            Comentario

            • Driau
              Senior Member
              • ago
              • 235

              #7
              Estoy desanimado...

              He probado el código...pero no imprime la palabra FOLLETO.

              He intetado poner un breakpoint en el FORM CHEQUEAR_FOLLETO del programa ZIMPRESIONA_ETIQUETAS para ver si se ejecuta en algun momento...pero parece que no. Ya nose que probar....no puedo hacer un debugging del sapscript para ver si recibe i envia bien los parametros del PERFORM???

              Tio...disculpa las molestias porque te estoy avasallando de mala manera

              Comentario

              • Driau
                Senior Member
                • ago
                • 235

                #8
                A ver si se me ha pasado por alto..

                Acabo de releer el primer post que me pusiste que ponia:

                El codigo que precede a esta linea lo tendrias que poner despues de mostrar los datos.

                A que te refieres con eso?? A lo mejor he pusto el código en mal lugar. Te he adjuntado mi código de sapscript para que puedas echarle un ojo. Como ves mi intencion es la de que después de la palabra INTERNACIONAL salga justo debajo FOLLETO.

                Muchas grácias,
                Archivos Adjuntos

                Comentario

                • Driau
                  Senior Member
                  • ago
                  • 235

                  #9
                  Por cierto!

                  He probado con todas las possibilidades (por si era eso) de:

                  1. / FOLLETO
                  2. * FOLLETO
                  3. /: FOLLETO

                  I nada....

                  Comentario

                  • Driau
                    Senior Member
                    • ago
                    • 235

                    #10
                    Otro matíz...

                    A pesar de que el programa ZIMPRESIONA_ETIQUETAS (que es donde hay el FORM CHEQUEAR_ETIQUETAS) compila i se activa bién yo no he declarado en ningún momento la variable CAMPO_RETORNO. Es decir, la declaro en el sapscript i el form la recibe (FORM CHEQUEAR_FOLLETO CHANGING CAMPO_RETORNO), pero en ninguna parte del REPORT he declarado la variable CAMPO_RETORNO. Nose si eso puede influir...

                    Grácias nuevamente,

                    Comentario

                    • ballan
                      Senior Member
                      • oct
                      • 671

                      #11
                      Originalmente publicado por Driau
                      A ver.. el código que he pusto en el Sapscript es el que tu me has proporcionado:

                      /: DEFINE &CAMPO_RETORNO& = ''.
                      /: PERFORM CHEQUEAR_FOLLETO IN PROGRAM ZIMPRESION_ETIQUETAS
                      /: CHANGING &CAMPO_RETORNO&.
                      /: IF &CAMPO_RETORNO& IS NOT INITIAL.
                      / 4911S0100520368P012P012&FOLLETO&
                      /: ENDIF.


                      Y luego en mi report he hecho un form del siguiente estilo:

                      FORM CHEQUEAR_FOLLETO USING CAMPO_RETORNO.
                      IF P_FOLLE EQ 'X'.
                      CAMPO_RETORNO = 'X'.
                      ENDIF.
                      ENDFORM.


                      Las barras que van en el sapscript (/ / estan bién puestas??

                      Es decir...yo llamo al perform desde sapscript i le paso la variable CAMPO_RETORNO no? Luego el perform le assigna un valor 'X' o ' ' en funcion de si el checkbox P_FOLLE esta marcado y lo devuelve al sapscript no¿?
                      Nose si el código del form esta bien ya que esto del "CHANGING" me descoloca un poco.

                      Muchas gracias por la ayuda!!
                      El problema lo tienes en el form de tu report, los parametros no se pasan como si fueran parametros normales, aqui te dejo un ejemplo

                      FORM calcular_descuento_linea TABLES in_par STRUCTURE itcsy
                      out_par STRUCTURE itcsy.

                      DATA: lv_ebeln LIKE ekko-ebeln,
                      lv_ebelp LIKE ekpo-ebelp,
                      lv_aux LIKE konp-kbetr,
                      lv_bruto(17),
                      lv_descu(17).

                      DATA: BEGIN OF lt_konp OCCURS 0,

                      kschl LIKE konp-kschl,
                      kbetr LIKE konp-kbetr,
                      konwa LIKE konp-konwa,
                      kpein LIKE konp-kpein,
                      kmein LIKE konp-kmein,

                      END OF lt_konp.

                      CLEAR in_par.

                      READ TABLE in_par INDEX 1.
                      lv_ebeln = in_par-value.

                      READ TABLE in_par INDEX 2.
                      lv_ebelp = in_par-value.

                      SELECT SINGLE *
                      INTO a016
                      FROM a016
                      WHERE kappl = gc_m
                      AND kschl = gc_pb00
                      AND evrtn = lv_ebeln
                      AND evrtp = lv_ebelp.

                      IF sy-subrc = 0.

                      SELECT kschl kbetr konwa kpein kmein
                      INTO TABLE lt_konp
                      FROM konp
                      WHERE knumh = a016-knumh.

                      READ TABLE lt_konp WITH KEY kschl = gc_pb00.

                      IF sy-subrc = 0.
                      lv_aux = lt_konp-kbetr.
                      ENDIF.

                      WRITE lv_aux TO lv_bruto.

                      READ TABLE lt_konp WITH KEY kschl = gc_ra01.

                      IF sy-subrc = 0.
                      lv_aux = lt_konp-kbetr / 10.
                      ENDIF.

                      WRITE lv_aux TO lv_descu NO-SIGN.



                      CLEAR out_par.

                      LOOP AT out_par WHERE name = 'BRUTO'.
                      out_par-value = lv_bruto.
                      MODIFY out_par INDEX sy-tabix.
                      EXIT.
                      ENDLOOP.

                      CLEAR out_par.

                      LOOP AT out_par WHERE name = 'DESCUENTO'.
                      out_par-value = lv_descu.
                      MODIFY out_par INDEX sy-tabix..
                      EXIT.
                      ENDLOOP.

                      ENDIF.

                      ENDFORM. " calcular_descuento_linea

                      La manera de llamarlo en tu sapsript es:

                      /: DEFINE &FORM& = 'CALCULAR_DESCUENTO_LINEA'
                      /: DEFINE &PROGRAMA& = 'ZMEDRUCK_PEDAB'
                      /: DEFINE &DESCUENTO& = ''
                      /: DEFINE &BRUTO& = ''
                      /: DEFINE &SIMBOLO& = '%'
                      /: PERFORM &FORM& IN PROGRAM &PROGRAMA&
                      /: USING &EKKO-EBELN&
                      /: USING &EKPO-EBELP&
                      /: CHANGING &DESCUENTO&
                      /: CHANGING &BRUTO&
                      /: ENDPERFORM

                      Comentario

                      • Jacampos
                        Member
                        • feb
                        • 70

                        #12
                        Hola de nuevo:

                        1º Se puede debugar un SapScript. Entras en la transaccion Se71 --> Menu Utilidades --> Activar debugger.

                        2º. ¿Donde tienes el Checkbox declarado?
                        - Si lo tienes en ZIMPRESION_ETIQUETAS asegurate de que le pasas la variable [tu_checkbox] al formulario. Antes de la llamada del formulario, en la funcion CALL FUNCTION 'WRITE_FORM'.

                        Me imagino que le pasas una tabla, pues incorporale ese campo a la tabla, y en tu formulario haces:

                        /: IF &P_FOLLETO& IS NOT INITIAL.
                        / 4911S0100520368P012P012 FOLLETO
                        /:ELSE
                        / 4911S0100520368P012P012
                        /: ENDIF.

                        Olvidate de los mensajes anteriores. Si necesitas algo mas puedes contactar directamente conmigo en Ja_camseg@hotmail.com
                        Saludos.
                        Quiero aprender, ayudando a aprender.

                        Comentario

                        • Driau
                          Senior Member
                          • ago
                          • 235

                          #13
                          Las coss están así...

                          Para poder "solucionar el problema temporalmente" he creado otro par de formularios de caja y palet con la palabra folleto y luego posteriormente en el código del report ZIMPRESION_ETIQUETAS he hecho un simple IF...si P_FOLLE está marcado llamo a un sapscript sino...llamo al otro.

                          Lo que pasa es que probando el código del que estuvimos hablando pude comprobar que en cierta manera funciona. És decir, el sapscript entra en el IF &P_FOLLETO& IS NO INITIAL i me imprime FOLLETO. El único problema es que lo hace siempre...marque la casilla P_FOLLE en la pantalla de selección del report o no.

                          Lo que si es seguro (leyndo tu anterior post) es que justo antes de la llamada del CALL FUNCTION 'WRITE_FORM' no le paso el valor de P_FOLLE al Sapscript...estoy seguro porque no se como hacerlo ;-)

                          El código que le puse al REPORT es este:


                          *FORM CHEQUEAR_FOLLETO TABLES INPUT1 STRUCTURE ITCSY OUTPUT1 STRUCTURE ITCSY.
                          *
                          * IF P_FOLLE EQ 'X'.
                          * REFRESH OUTPUT1.
                          * OUTPUT1-NAME = '&CAMPO_RETORNO&'.
                          * OUTPUT1-VALUE = 'X'.
                          * APPEND OUTPUT1.
                          * ELSE.
                          * REFRESH OUTPUT1.
                          * OUTPUT1-NAME = '&CAMPO_RETORNO&'.
                          * OUTPUT1-VALUE = ''.
                          * APPEND OUTPUT1.
                          * ENDIF.
                          *ENDFORM. "CHEQUEAR_FOLLETO


                          A pesar de no necesitar mandar datos del sapscript al report, tuve que declarar la tabla input en el report porque sino me petaba. He debuggeado y el report entra en el FORM CHEQUEAR_FOLLETO y evalua bien las condiciones..pero algo debe faltar para que acabe de funcionar todo bien.

                          Nose que te parece....

                          Comentario

                          Trabajando...