Formulario: control de salto de página para importe total

Colapsar
X
 
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes
  • kruspex
    Member
    • sep
    • 31

    #1

    Formulario: control de salto de página para importe total

    Hola a tod@s
    Me estoy volviendo loca con un asunto de un formulario. Os cuento:
    Es una ventana main donde se pintan los importes de un pedido y en otra ventana (sumatotal) calcula la suma de dichos importes.
    El caso es que cuando los importes sobrepasan el espacio de la pagina, se crea otra. Hasta aquí todo correcto, pero el importe total de la primera página suma también los importes de la segunda.

    ¿Cómo puedo controlar eso?
    Se pintan 19 registros por página y creemos que el programa entiende que el primero de la siguiente página tb pertenece a la primera.

    Gracias por todo
    Editado por última vez por kruspex; 17/12/2008, 08:53:01.
  • crounly
    Senior Member
    • nov
    • 227

    #2
    Puedes intentar jugar con las opciones del nodo ventana - pestaña condiciones
    Hay tienes para que se ejecute 'antes de fin de ventana principal' y en la ultima pagina.

    Puedes tener una ventana que se ejecute antes del fin de la principal y de salto, esta saca los parciales y otra que se ejecute en la solo cuando sea la ultima pagina con el total....

    Suerte
    http://codigoderetorno.blogspot.com.es/

    Comentario

    • kruspex
      Member
      • sep
      • 31

      #3
      ¿Y cómo se puede hacer eso?
      Verás es que el programa no lo he hecho yo. Tengo una incidencia al respecto y he logrado corregirlo para informes con más de una página y con más de un registro por página y para informes con una página.
      He debuggeado el programa de impresión y he mirado el formulario.
      Como no se mucho de sapcript he controlado los fallos en el programa de impresión.
      No tengo ni idea de como hacer eso que dices y mira que he mirado manuales.

      Comentario

      • crounly
        Senior Member
        • nov
        • 227

        #4
        Si es un sapscript, olvida lo anterior, es solo para smartforms.

        En un sapscript tienes &PAGE& y &SAPSCRIPT-FORMPAGES&

        Pagina actual / total de paginas
        .

        Haber que te parece la idea

        IF &PAGE& = &SAPSCRIPT-FORMPAGES&.

        < IMPRIMES EL TOTAL >

        ELSE.

        < IMPRIMES EL ACUMULADO PARCIAL >

        ENDIF.
        http://codigoderetorno.blogspot.com.es/

        Comentario

        • kruspex
          Member
          • sep
          • 31

          #5
          Te explico lo que he conseguido:

          He conseguido que en la primera página me imprima el parcial correctamente, pero en la siguiente página, deja de sumar el último importe.

          El Sapscript está hecho muy raro, con subprogramas dentro de la ventana main.
          Hay un IF que controla las posiciones que pintar por página pero no lo contempla, porque da igual el valor que pongo, salen siempre 19.

          Grrrrrrrrrrrr

          PD/ gracias por tu empeño

          Comentario

          • crounly
            Senior Member
            • nov
            • 227

            #6
            Si con lo de 'deja de sumar el último importe' te refieres a que no suma el ultimo registro que pinta, revisa donde esta sumando los importes, igual lo pinta antes de sumarlo y al ser el ultimo no entra.

            Mira a ver donde va sumando los importes y orden que sigue.

            Si no nos ayudamos entre nosotros mal vamos....

            Suerte
            http://codigoderetorno.blogspot.com.es/

            Comentario

            • kruspex
              Member
              • sep
              • 31

              #7
              PERFORM DATOS_MAIN IN PROGRAM ZFI_SAPCRIPT_OUT
              NEW-PAGE
              EAC --add comentado por mi no vale
              IF &BSEG-BUZEI& > 19
              NEW-PAGE
              ENDIF.
              EAC --add comentado por mi no vale
              USING &BUKRS&
              USING &BELNR&
              USING &GJAHR&
              USING &BUZEI&
              USING &SHKZG&
              USING &WRBTR&
              USING &MEDIO&
              CHANGING &MEDTXT&
              Si el importe es al 'D' debemos mostrar signo '-'
              CHANGING &IMPORTE&
              CHANGING &ACUMIMP&
              &ACUMIMP& guarda el importe total que debe ir en cada pagína

              FORM DATOS_MAIN:

              FORM datos_main TABLES in_par STRUCTURE itcsy
              out_par STRUCTURE itcsy.

              DATA: d_bukrs LIKE bkpf-bukrs, "Entrada
              d_belnr LIKE bkpf-belnr, "Entrada
              d_gjahr LIKE bkpf-gjahr, "Entrada
              d_buzei LIKE bseg-buzei. "Entrada

              DATA: d_wrbtr(20), "Entrada
              d_medio LIKE bseg-zzmed, "Entrada
              d_shkzg LIKE bseg-shkzg, "Entrada
              d_medtxt LIKE ztradmedio-descripcion, "Salida
              d_importe(20), "Salida
              d_acumimp(21). "Salida

              DATA: d_imppos LIKE bseg-wrbtr,
              d_shkzgp LIKE bseg-shkzg,
              d_impacumulado LIKE glt0-tsl01.

              CLEAR: d_bukrs, d_belnr, d_gjahr, d_buzei,
              d_wrbtr, d_medio, d_shkzg, d_medtxt, d_importe, d_acumimp.

              **-- Lectura de datos
              READ TABLE in_par WITH KEY name = 'BUKRS'.
              d_bukrs = in_par-value.

              READ TABLE in_par WITH KEY name = 'BELNR'.
              d_belnr = in_par-value.

              READ TABLE in_par WITH KEY name = 'GJAHR'.
              d_gjahr = in_par-value.

              READ TABLE in_par WITH KEY name = 'BUZEI'.
              d_buzei = in_par-value.

              READ TABLE in_par WITH KEY name = 'SHKZG'.
              d_shkzg = in_par-value.

              READ TABLE in_par WITH KEY name = 'WRBTR'.
              d_wrbtr = in_par-value.

              READ TABLE in_par WITH KEY name = 'MEDIO'.
              d_medio = in_par-value.


              * Si el importe es al Debe, mostramos signo negativo
              IF d_shkzg = 'S'.
              CONCATENATE d_wrbtr '-' INTO d_importe.
              ELSEIF d_shkzg = 'H'.
              d_importe = d_wrbtr.
              ENDIF.

              * Descripción del Medio
              SELECT SINGLE descripcion INTO d_medtxt
              FROM ztradmedio
              WHERE medio_sap_vtweg = d_medio.


              * Importe acumulado de las posiciones que llevamos escritas
              CLEAR: d_imppos, d_impacumulado, d_shkzgp.
              SELECT shkzg wrbtr INTO (d_shkzgp, d_imppos) FROM bseg
              WHERE bukrs = d_bukrs AND
              belnr = d_belnr AND
              gjahr = d_gjahr AND
              buzei < d_buzei AND
              buzid NE 'T' AND
              koart = 'S'.

              IF d_shkzg = 'S'.
              d_impacumulado = d_impacumulado - d_imppos.
              ELSE.
              d_impacumulado = d_impacumulado + d_imppos.
              ENDIF.

              ENDSELECT.

              * para sumarle el último
              data: reg type i.
              data: begin of i_reg occurs 0,
              wrbtr like bseg-wrbtr,
              buzei like bseg-buzei,
              end of i_reg.

              SELECT wrbtr buzei INTO TABLE i_reg FROM bseg
              WHERE bukrs = d_bukrs AND
              belnr = d_belnr AND
              gjahr = d_gjahr AND
              buzid NE 'T' AND
              koart = 'S'.

              * ordenar la tabla
              sort i_reg by buzei descending.
              * meter en cabecera el maximo buzei
              read table i_reg index 1.

              IF d_buzei = i_reg-buzei.
              * control del debe haber
              IF d_shkzg = 'S'.
              d_impacumulado = d_impacumulado - i_reg-wrbtr.
              ELSE.
              d_impacumulado = d_impacumulado + i_reg-wrbtr.
              ENDIF.
              ENDIF.


              **-- Datos de Salida
              WRITE d_importe LEFT-JUSTIFIED TO out_par-value.
              out_par-name = 'IMPORTE'.
              APPEND out_par.

              WRITE d_medtxt LEFT-JUSTIFIED TO out_par-value.
              out_par-name = 'MEDTXT'.
              APPEND out_par.

              WRITE d_impacumulado TO d_acumimp CURRENCY 'EUR'.
              WRITE d_acumimp LEFT-JUSTIFIED TO out_par-value.
              out_par-name = 'ACUMIMP'.
              APPEND out_par.
              Estoy desesperada

              Comentario

              • kruspex
                Member
                • sep
                • 31

                #8
                Originalmente publicado por crounly
                Si con lo de 'deja de sumar el último importe' te refieres a que no suma el ultimo registro que pinta, revisa donde esta sumando los importes, igual lo pinta antes de sumarlo y al ser el ultimo no entra.

                Mira a ver donde va sumando los importes y orden que sigue.

                Si no nos ayudamos entre nosotros mal vamos....

                Suerte
                Como has podido ver en mi copy-paste de código maldito!! primero lo calcula y luego lo pinta, lo que no tengo tan claro es que en el último caso, llegue a pintarlo. Voy a buscarlo.

                Una pregunta: ¿habría opción de saber cuando está en la última pagina? es decir, en la MAIN poner algo de:

                IF $PAGE$ = $SAPSCRIPT-FORMPAGES$.
                $ACUMIMP$ = $BASIMP$
                ENDIF.

                Donde $BASIMP$ es otra variable que calcula el importe total directamente (es un poco chanchullero pero....)

                Comentario

                • crounly
                  Senior Member
                  • nov
                  • 227

                  #9
                  Jodeee... que caos , y que de esto surga el orden.....

                  Código:
                  * Importe acumulado de las posiciones que llevamos escritas
                  CLEAR: d_imppos, d_impacumulado, d_shkzgp.
                  SELECT shkzg wrbtr INTO (d_shkzgp, d_imppos) FROM bseg
                  WHERE bukrs = d_bukrs AND
                  belnr = d_belnr AND
                  gjahr = d_gjahr AND
                  buzei < d_buzei AND
                  buzid NE 'T' AND
                  koart = 'S'.
                  Como has podido ver en mi copy-paste de código maldito!! primero lo calcula y luego lo pinta, lo que no tengo tan claro es que en el último caso, llegue a pintarlo. Voy a buscarlo.
                  ...buzei < d_buzei ... es decir todas menos la actual, si es la pos 4 calcula hasta la 3. por eso no sumara la ultima.

                  no te valdria con un buzei <= d_buzei ?? y asi selecciona todas hasta la que vas a pintar...
                  http://codigoderetorno.blogspot.com.es/

                  Comentario

                  • kruspex
                    Member
                    • sep
                    • 31

                    #10
                    Originalmente publicado por crounly
                    Jodeee... que caos , y que de esto surga el orden.....

                    Código:
                    * Importe acumulado de las posiciones que llevamos escritas
                    CLEAR: d_imppos, d_impacumulado, d_shkzgp.
                    SELECT shkzg wrbtr INTO (d_shkzgp, d_imppos) FROM bseg
                    WHERE bukrs = d_bukrs AND
                    belnr = d_belnr AND
                    gjahr = d_gjahr AND
                    buzei < d_buzei AND
                    buzid NE 'T' AND
                    koart = 'S'.


                    ...buzei < d_buzei ... es decir todas menos la actual, si es la pos 4 calcula hasta la 3. por eso no sumara la ultima.

                    no te valdria con un buzei <= d_buzei ?? y asi selecciona todas hasta la que vas a pintar...
                    Ayyyy!! Pues ahi empezaron los problemas. Teniamos <= y tuvimos que quitarlo porque lo sumaba en la primera pagina. Poniendo solo < conseguiamos la primera pagina bien porque el último lo metemos más abajo (en el codigo que te he puesto)

                    ¿sabes que pasa? que creo que el "formulario" cree que tiene una pagina en vez de dos. Porque todo lo que afecta al último valor lo pone en la primera pagina.

                    ¿Se puede saber que valor tiene la variable &SAPSCRIPT-FORMPAGES&?
                    ¿Cómo?

                    Por cierto, muchas gracias por seguir mirandome cosas eh

                    Comentario

                    • crounly
                      Senior Member
                      • nov
                      • 227

                      #11
                      Pasalelo a la funcion DATOS_MAIN

                      Ayyyy!! Pues ahi empezaron los problemas. Teniamos <= y tuvimos que quitarlo porque lo sumaba en la primera pagina. Poniendo solo < conseguiamos la primera pagina bien porque el último lo metemos más abajo (en el codigo que te he puesto)
                      Entonces, tirando de &PAGE&

                      Código:
                      PERFORM DATOS_MAIN IN PROGRAM ZFI_SAPCRIPT_OUT
                      NEW-PAGE
                      EAC --add comentado por mi no vale
                      IF &BSEG-BUZEI& > 19
                      NEW-PAGE
                      ENDIF.
                      EAC --add comentado por mi no vale
                      USING &BUKRS&
                      USING &BELNR&
                      USING &GJAHR&
                      USING &BUZEI&
                      USING &SHKZG&
                      USING &WRBTR&
                      USING &MEDIO&
                      USING &PAGE&     <-----------------******
                      CHANGING &MEDTXT&
                      Si el importe es al 'D' debemos mostrar signo '-'
                      CHANGING &IMPORTE&
                      CHANGING &ACUMIMP&
                      Y en la funcion recojes ese valor


                      Código:
                      DATA: pagina type i
                      
                      READ TABLE in_par WITH KEY name = 'PAGE'.
                      pagina = in_par-value.
                      
                      IF pagina  = 1.
                      
                      * Importe acumulado de las posiciones que llevamos escritas
                      CLEAR: d_imppos, d_impacumulado, d_shkzgp.
                      SELECT shkzg wrbtr INTO (d_shkzgp, d_imppos) FROM bseg
                      WHERE bukrs = d_bukrs AND
                      belnr = d_belnr AND
                      gjahr = d_gjahr AND
                      buzei < d_buzei AND
                      buzid NE 'T' AND
                      koart = 'S'.
                      
                      ELSE.
                      
                      * Importe acumulado de las posiciones que llevamos escritas
                      CLEAR: d_imppos, d_impacumulado, d_shkzgp.
                      SELECT shkzg wrbtr INTO (d_shkzgp, d_imppos) FROM bseg
                      WHERE bukrs = d_bukrs AND
                      belnr = d_belnr AND
                      gjahr = d_gjahr AND
                      buzei <= d_buzei AND
                      buzid NE 'T' AND
                      koart = 'S'.
                      
                      ENDIF.
                      http://codigoderetorno.blogspot.com.es/

                      Comentario

                      • kruspex
                        Member
                        • sep
                        • 31

                        #12
                        Voy a probar eso y te cuento.
                        Muchas gracias

                        Comentario

                        • kruspex
                          Member
                          • sep
                          • 31

                          #13
                          Hola de nuevo,

                          He probado tu idea añadiendo un par de cosas y estoy segurisima de que el error es del programa y el formulario original.
                          Porque hago el control de pagina y pinta lo mismo en ambas, asi que hay un desfase que el programa cree que solo hay una.
                          Me han dicho que lo deje porque ya no es asunto nuestro, pero la investigación ha sido intensa.

                          Muchisimas gracias por tu ayuda, porque asi como lo hemos planteado al final, funcionaba perfecto.

                          Un saludo y Feliz Navidad!!

                          Comentario

                          Trabajando...