Error en resultado al multiplicar.

Colapsar
X
 
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes
  • DCErick
    Moderator
    • mar
    • 1090

    #1

    Error en resultado al multiplicar.

    Código:
    *valor_ini LIKE mbew-salk3
    *ANFMENGE(09) TYPE P DECIMALS 3,
    *VERPR LIKE MBEW-VERPR,
    
     ti_alv-valor_ini = ( bestand-anfmenge * imbew-verpr ) / 1000.
    Tengo esa operación la cual tengo que dividir el resultado entre 1000 porque me está regresando resultados raros.

    Ejemplo

    Valor_ini = 10.000 * 1.13 = <- Con esos datos en lugar de regresarme 11.30 me regresa 11300.00.

    ¿Alguna idea?
    -------------------
    ¿Dudas para descargar manuales? Ver este tema -> Cómo descargar manuales de la sección "Descargas" ?
  • jtristan
    Senior Member
    • oct
    • 240

    #2
    Hola DcErick,

    ya sé que es una bobada, pero no se me ocurre otra cosa. Podría ser que en el valor 10.000, el punto lo esté interpretando como millares y no decimales. Podrías probar a que te devuelva la parte decimal, por ver qué parte decimal está cogiendo de ese valor.

    Un saludo.

    Comentario

    • daniel1050
      Member
      • oct
      • 58

      #3
      Originalmente publicado por DCErick
      Código:
      *valor_ini LIKE mbew-salk3
      *ANFMENGE(09) TYPE P DECIMALS 3,
      *VERPR LIKE MBEW-VERPR,
      
       ti_alv-valor_ini = ( bestand-anfmenge * imbew-verpr ) / 1000.
      Tengo esa operación la cual tengo que dividir el resultado entre 1000 porque me está regresando resultados raros.

      Ejemplo

      Valor_ini = 10.000 * 1.13 = <- Con esos datos en lugar de regresarme 11.30 me regresa 11300.00.

      ¿Alguna idea?

      Seguramente lo mas posible es como te dijo jtristan, que tenga que ver con el formato de separacion de decimales que estas utilizando.

      Fijate de convertir si queres cada nro al formato correcto antes de hacer la cuenta.

      tendrias que hacer algo asi como te pongo en el ejemplo de abajo, aplicandolo para ambas variables la del 10.000 y la del 1.13 .


      La idea es primero fijarse en que formato estas trabajando , luego convertir las variables que contienen los nros a su formato y por ultimo realizar la operacion.

      DATA: v_importe_actual TYPE bseg-wrbtr.


      *Obtengo el formato decimal del sistema en la variable FORMATO_DEC
      SELECT SINGLE dcpfm
      INTO formato_dec
      FROM usr01
      WHERE bname = sy-uname.

      DATA: v_separador_decimal TYPE c.
      DATA: v_separador_miles TYPE c.

      CASE formato_dec.
      WHEN ' '. " Coma decimal.
      v_separador_decimal = ','.
      v_separador_miles = '.'.
      WHEN 'X'.
      v_separador_decimal = '.'.
      v_separador_miles = ','.
      WHEN 'Y'.
      v_separador_decimal = ','.
      v_separador_miles = ' '.
      ENDCASE.

      CLEAR v_importe_actual.

      * En esta funcion convertis el importe al formato correcto
      CALL FUNCTION 'HRCM_STRING_TO_AMOUNT_CONVERT'
      EXPORTING
      string = t_input-wrbtr
      decimal_separator = v_separador_decimal
      thousands_separator = v_separador_miles
      waers = 'INR'
      IMPORTING
      betrg = v_importe_actual
      EXCEPTIONS
      convert_error = 1
      OTHERS = 2.

      Comentario

      • DCErick
        Moderator
        • mar
        • 1090

        #4
        Ya le probé y no me anda ...

        El formato que estoy usando es "," separador de miles y "." separado decimal.
        -------------------
        ¿Dudas para descargar manuales? Ver este tema -> Cómo descargar manuales de la sección "Descargas" ?

        Comentario

        • daniel1050
          Member
          • oct
          • 58

          #5
          Y si el campo bestand-anfmenge lo pasas a una variable auxiliar que sea del tipo mbew-salk3 en vez de tipo p antes de realizar la operacion ?

          Comentario

          • DCErick
            Moderator
            • mar
            • 1090

            #6
            Originalmente publicado por daniel1050
            Y si el campo bestand-anfmenge lo pasas a una variable auxiliar que sea del tipo mbew-salk3 en vez de tipo p antes de realizar la operacion ?
            jejeej Tambien lo intenté, lo que intento hacer es multiplicar una cantidad(stock) por un precio en este caso es el precio variable, ya lo solucioné al final hice lo que hace la MB52: Dividir el valor total / el stock total obteniendo así el factor.

            Código:
                
            DATA: factor TYPE f.
                  factor = s_mbew-salk3 / s_mbew-lbkum.
               ti_alv-valor_ini = bestand-anfmenge * factor.
            Código MB52:
            Código:
            ************************************************************************
            * Fill the valuation data
            ************************************************************************
                DATA: factor TYPE f.
                LOOP AT bestand.
                  CHECK bestand-waers <> space.  "Do nothing for failed Auth-Checks
                  READ TABLE t_t134m WITH KEY bwkey = bestand-bwkey
                                              mtart = bestand-mtart
                                              BINARY SEARCH.
                  CHECK sy-subrc = 0 AND t_t134m-wertu = 'X'.
            *     Set SY-SUBRC = 4. A successful table read resets it an starts
            *     the value filling.
                  sy-subrc = 4.
                  IF  bestand-sobkz = ' ' OR bestand-sobkz = 'O' OR
                      bestand-sobkz = 'W' OR bestand-sobkz = 'V' OR
                      bestand-kzbws = 'A'.
                    READ TABLE t_mbew WITH KEY matnr = bestand-matnr
                                               bwkey = bestand-bwkey
                                               bwtar = bestand-bwtar
                                               BINARY SEARCH.
                  ELSEIF bestand-sobkz = 'E' AND bestand-kzbws = 'M'.
                    READ TABLE t_ebew WITH KEY matnr = bestand-matnr
                                               bwkey = bestand-bwkey
                                               bwtar = bestand-bwtar
                                               BINARY SEARCH.
                    MOVE-CORRESPONDING t_ebew TO t_mbew.
                  ELSEIF bestand-sobkz = 'Q' AND bestand-kzbws = 'M'.
                    READ TABLE t_qbew WITH KEY matnr = bestand-matnr
                                               bwkey = bestand-bwkey
                                               bwtar = bestand-bwtar
                                               BINARY SEARCH.
                    MOVE-CORRESPONDING t_qbew TO t_mbew.
                  ENDIF.
                  IF sy-subrc = 0.
                    IF t_mbew-lbkum = 0.
            *         Cannot happen, but in R/3 this does not hold in all cases...
                      IF t_mbew-peinh = 0.                                   "353428
                        t_mbew-peinh = 1.                                    "353428
                      ENDIF.                                                 "353428
            *         Calculation of value in case of LBKUM = 0 only possible
            *         for MBEW. EBEW and QBEW are collected over all subitems
            *         (VBELN...), so the data are not available.
                      IF bestand-sobkz = 'E' OR bestand-sobkz = 'Q'.         "388735
                        factor = 0.                                          "388735
                        CLEAR bestand-waers.                                 "388735
                      ELSE.                                                  "388735
                        CASE t_mbew-vprsv.
                          WHEN 'V'. factor = t_mbew-verpr / t_mbew-peinh.
                          WHEN 'S'. factor = t_mbew-stprs / t_mbew-peinh.
                        ENDCASE.
                      ENDIF.                                                 "388735
                    ELSE.
                      factor = t_mbew-salk3 / t_mbew-lbkum.
                    ENDIF.
                    bestand-wlabs = bestand-labst * factor.
                    bestand-winsm = bestand-insme * factor.
                    bestand-wspem = bestand-speme * factor.
                    bestand-weinm = bestand-einme * factor.
                    bestand-wumlm = bestand-umlme * factor.
                    MODIFY bestand.
                  ENDIF.
                ENDLOOP.
            Algo que pude notar al momento de "debuguear" factor toma el valor " 1.2880001628942013E+00" y el campo VERPR al pasarlo a una variable auxiliar tomaba el valor "1.2880000000000000E+03"
            En la MM03 el campo VERPR tiene el valor de 12.88.

            Bueno gracias a todos por su ayuda.
            -------------------
            ¿Dudas para descargar manuales? Ver este tema -> Cómo descargar manuales de la sección "Descargas" ?

            Comentario

            • Mauricio Hidalgo
              Senior Member
              • may
              • 481

              #7
              Estimado hice lo siguiente:

              data valor_ini LIKE mbew-salk3.
              data ANFMENGE TYPE P DECIMALS 3.
              data VERPR LIKE MBEW-VERPR.

              anfmenge = '10.000'.
              verpr = '1.13'.
              valor_ini = anfmenge * verpr.

              write valor_ini.

              *************************
              Si su programa en sus atributos (Menu Pasar\Atributos) no tiene chequeado la opción "Cálculo de coma Fija"....le va a dar el valor que incialmente indicabas. Pero si lo marcas entonces si te hará correctamente el cálculo.

              Saludos

              Comentario

              • DCErick
                Moderator
                • mar
                • 1090

                #8
                Originalmente publicado por Mauricio Hidalgo
                *************************
                Si su programa en sus atributos (Menu Pasar\Atributos) no tiene chequeado la opción "Cálculo de coma Fija"....le va a dar el valor que incialmente indicabas. Pero si lo marcas entonces si te hará correctamente el cálculo.

                Saludos
                Horale, eso no lo probé igual ya quedó con lo que hice con lo que hice en una oportunidad marco ese check y hago el calculo directo, por lo pronto dejemos al usuario feliz con lo que se le entregó .
                Lo que ya verifiqué es que el reporte no tiene marcada esa opción, veo que al crear un reporte ese check sale marcado por default, en mi caso estoy haciendo una copia de la MB5B y el reporte no tiene marcado ese check.

                Gracias.
                -------------------
                ¿Dudas para descargar manuales? Ver este tema -> Cómo descargar manuales de la sección "Descargas" ?

                Comentario

                Trabajando...