actualizar campos de la base de datos PRPS

Colapsar
X
 
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes
  • romario2
    Senior Member
    • abr
    • 233

    #1

    actualizar campos de la base de datos PRPS

    Hola,

    tengo que actualizar la tabla PRPS por medio desta función:
    'CJVB_PRPS_POST'.

    CALL FUNCTION 'CJVB_PRPS_POST'
    * EXPORTING
    * DUMMY = ' '
    TABLES
    tdelete =
    tinsert =
    tupdate =
    tchange =
    * EXCEPTIONS
    * ERR_DELETE = 1
    * ERR_INSERT = 2
    * ERR_UPDATE = 3
    * ERR_CHANGE = 4
    * OTHERS = 5
    .
    IF sy-subrc <> 0.
    * MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
    * WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
    ENDIF.
    Desconozco la manera y en internet hay poca información.

    Alguna sugerencia, imagino que se debe hacer lo mismo que se hace con otras tablas.

    Saludos y buen año
  • romario2
    Senior Member
    • abr
    • 233

    #2
    fiabilidad

    Hola Foro,

    he hecho una búsqueda por referencia. Y el tratamiento que hace SAP de esta función es el siguiente:

    IF LOC_UPD_PRPS = CON_YES.
    CALL FUNCTION 'CJVB_PRPS_POST' IN UPDATE TASK
    TABLES
    TINSERT = PRPS_ITAB
    TUPDATE = PRPS_UTAB
    TDELETE = PRPS_DTAB
    TCHANGE = PRPS_CTAB.
    ENDIF. "PRPS_GO

    La pregunta es:

    puedo hacer lo mismo?
    El update no es un poco peligroso? Quizás sea la única forma, no lo se.

    Comentario

    • VLozano
      Senior Member
      • nov
      • 124

      #3
      ¿Quién te ha dicho que uses esa función? ¿Es de fiar? ¿Asumirá la responsabilidad si pasa algo o te las cargarás tú?

      Esa función al final acaba haciendo una modificación de la tabla mediante SQL puro. No hace comprobación alguna en ningún lado. Eso quiere decir que si los datos de PRPS tienen repercusiones en otras tablas (cosa que sería de lo más normal teniendo en cuenta los datos que guarda), podrías cargarte la coherencia de todo el sistema de proyectos.

      Yo NO lo haría.

      Si alguien te ha pedido que uses esa función de forma específica, exígele que te dé argumentos convincentes (pueden ser del palo "soy tu jefe y si no lo haces te despido", pero no valen del tipo "lo hicimos en un proyecto y funcionó").

      Tiene que haber alguna función que actualice los elementos PEP (si la encuentras, a usarla se ha dicho). Si no la hay (que lo dudo), tiene que haber una transacción que lo haga (si la encuentras, batch input al canto, por mucho que me duela decirlo). Si no la hay... si no la hay es que nada ni nadie usa esos datos, cosa que sabemos que NO es cierta.

      (las palabras del reCAPTCHA que me salen para responder aquí son "planned wartime"... ¿premonición por software?)
      "Porque algunos sabemos que somos parte del problema"
      - Pequeña guía para escribir mensajes en foros técnicos -

      Comentario

      • romario2
        Senior Member
        • abr
        • 233

        #4
        gracias VLOZANO

        Tienes toda la razón, me dijeron que investigara esta función y al ver lo del Update Task me dio mala pinta.
        Voy a seguir investigando, voy a buscar una función que no use " SQL puro" como bien dices. Soy consciente que eso provoca inconsistencias.Pero aún no soy tan experto para separar el polvo de la paja. Eso si, cuando veo un update se que hay que evitarlo.

        Saludos abaperos

        Comentario

        • romario2
          Senior Member
          • abr
          • 233

          #5
          actualizar PRPS sin generar inconsistencias

          He encontrado un código en el que metes un texto grande en la dynpro,
          y luego ese valor actualiza el campo de una base de datos.

          Es el siguiente: ( en el command)

          WHEN 'INSERT'.
          CALL METHOD editor->get_text_as_stream
          IMPORTING
          text = text_tab.


          CLEAR text_tab.
          REFRESH text_tab.
          CLEAR it_zccbmm_t_agnts_f.
          REFRESH it_zccbmm_t_agnts_f.
          LOOP AT text_tab INTO wa_itab.

          zccbmm_t_agnts_f-factura = p_doc.
          zccbmm_t_agnts_f-exercici = p_exer.
          zccbmm_t_agnts_f-societat = p_soc.
          zccbmm_t_agnts_f-posicio_f = p_posi.
          zccbmm_t_agnts_f-ruta = p_ruta.

          zccbmm_t_agnts_f-rebuig_txt = wa_itab.

          APPEND wa_itab TO it_zccbmm_t_agnts_f.

          ENDLOOP.

          MODIFY zccbmm_t_agnts_f FROM it_zccbmm_t_agnts_f.


          La pregunta es si esta sentencia:

          MODIFY zccbmm_t_agnts_f FROM it_zccbmm_t_agnts_f.

          genera inconsistencias igual que lo haría un UPDATE.


          ¿Cuales son las sentencias que evitan " SQL PURO" e inconsistencias y pueden modificar campos Z de una base de datos standard ?

          Comentario

          • romario2
            Senior Member
            • abr
            • 233

            #6
            función CJVB_PRPS_POST Actualizar PRPS

            Hola Foro, hola Vlozano,

            en el proyecto me comentan que como la función es estandard y no es una función Z, el update podemos decir que es " correcto" y que por tanto puedo usar esa función ( aunque tenga el UPDATE TASK) dentro.

            Comentario

            • VLozano
              Senior Member
              • nov
              • 124

              #7
              Por partes:

              1- el MODIFY que tienes en ese ejemplo es contra una tabla Z. Eso quiere decir que alguien ha hecho un estudio sobre una parte de los datos bien definida, y ha considerado correcto el MODIFY. Un MODIFY sobre una tabla estandar tendrá el mismo resultado que cualquier otro método de actualización (INSERT, UPDATE, DELETE): el caos más absoluto y la destrucción del mundo (que sepáis que cada vez que alguien hace una modificación de una tabla estándar, Chuck Norris mata un gatito).

              2- Esa función es estándar, pero esa palabra sólo quiere decir que la ha programado un tío en/para Waldorf. SAP nunca jamás te aconsejará que la uses. Es más, si la usas y algo se escogorcia, SAP se lavará las manos.

              /* SPOILER ALERT */
              Como reconocer una función "utilizable"
              En la pestaña de atributos hay una fecha para el campo "released". Además, suelen tener la documentación completita, como mínimo en inglés.
              /* FIN DEL SPOILER */

              En definitiva, esa función es un "NO, POR FAVOR, NO ME USES" escrito en luces de neón de doce metros en lo alto de una señal de "peligro, desastre inminente". Da igual si la ha programado un tío de SAP, no es utilizable por programas Z.
              (a ver, poder se puede, pero sólo si piensas cambiar de trabajo en un tiempo récord, y si tu contrato te exime de toda responsabilidad)

              Y ahora, un poco de ayuda "personalizada" (gentileza de nuestro inestimable patrocinador [ponga_aquí_la_marca_que_le_apetezca]):

              Le he echado un ojo a la tabla PRPS (siempre entrando al sistema en inglés, por cuestiones prácticas). La descripción de la tabla dice: "WBS (Work Breakdown Structure) Element Master Data" (que no tengo ni idea de lo que significa).
              Luego me he ido a la transacción BAPI, y he usado la pestaña (que no el pestiño) "Alphabetical". En ella he bajado hasta la "W" y me he encontrado algo que tenía buena pinta: "WBSPI" (el PI supongo que quicir "puñetera idea", porque yo NPI). Y haciendo clic sobre el nombre, ha aparecido cierta información del objeto. Entre ella, el Object type: "BUS2054001".
              Huele bien, así que he hecho doble clic sobre el BUS2054001, y me ha aparecido una lista desplegable, con métodos, atributos y todo eso que los genios del diseño consideran útil para la programación OO (orientada a objetos, pero con los ojos muy abiertos). Hay un método que apunta maneras:
              "WBSPI.ChangeMultiple........Change WBS Elements Using BAPI"

              Es una BAPI, que nadie esperaría encontrarla vía SE37 por el nombre críptico: "BAPI_BUS2054_CHANGE_MULTI".

              En sus atributos vemos:
              Person Responsible SAP
              Last Changed By SAP
              Changed on 10.03.2009
              Package CNIF_PI
              Program Name SAPLCJ2054
              INCLUDE Name LCJ2054U02
              Original Language DE
              Released on 15.01.2003
              La última línea nos dice: "por favor, utilízame, que soy un montón de molona, y no romperé nada". Aunque leyendo entre líneas dice "y si rompo algo, SAP se responsabilizará o al menos te echará una mano con el estropicio".

              A ver si hay suerte y con esa BAPI solventas el problema.

              (y la próxima vez que alguien te recomiende una función, acuérdate de mirar la fecha de liberación de la misma, porque si no la hay, mejor no usarla)
              "Porque algunos sabemos que somos parte del problema"
              - Pequeña guía para escribir mensajes en foros técnicos -

              Comentario

              • romario2
                Senior Member
                • abr
                • 233

                #8
                thanks

                Sensacional explicación VLOZANO , argumentando punto por punto.He seguido tus comentarios al milímetro. Tengo poca experencia en OO y nunca he montado una Bapi, pero por lo que indicas, es la mejor opción.
                Ya te iré contando, un saludo agradecido.

                Comentario

                • VLozano
                  Senior Member
                  • nov
                  • 124

                  #9
                  No te dejes engañar por los nombres... una BAPI no es más que una función con un par de brazos más. Pero se utiliza igual que cualquier otra función: le das unos parámetros de entrada/salida, controlas sus excepciones, y comentas lo bien que ha ido con tus compañeros de trabajo (con los amigos no, que te llamarán "raro").

                  Eso sí, después acuérdate de llamar a la función BAPI_TRANSACTION_COMMIT o no habrá servido de nada (si quieres hacer pruebas con la BAPI, actualizando datos, tienes que ejecutar la función desde la SE37 usando la secuencia de test del menú: Módulo de función -> Test -> Secuencia de test)
                  "Porque algunos sabemos que somos parte del problema"
                  - Pequeña guía para escribir mensajes en foros técnicos -

                  Comentario

                  • romario2
                    Senior Member
                    • abr
                    • 233

                    #10
                    programa bapi

                    Hola Vlozano, hola FORO,

                    hemos hecho un programa con tus indicaciones.
                    Estoy viendo que se pueden actualizar los campos estandard pero aún no puedo conseguir resultados con los campos Z.

                    REPORT ZBAPI.
                    DATA: ITABLE TYPE TABLE OF BAPI_BUS2054_CHG WITH HEADER LINE.
                    DATA: ITABLE1 TYPE TABLE OF BAPI_BUS2054_UPD WITH HEADER LINE.

                    *Inicialitzar el procés de modificació
                    CALL FUNCTION 'BAPI_PS_INITIALIZATION'.

                    ITABLE-WBS_ELEMENT = 'S-AA-00005-P'.
                    ITABLE-DESCRIPTION = 'Test A CAMBIAR'.
                    APPEND ITABLE.
                    ITABLE1-WBS_ELEMENT = 'S-AA-00005-P'.
                    ITABLE1-DESCRIPTION = 'X'.
                    APPEND ITABLE1.
                    CALL FUNCTION 'BAPI_BUS2054_CHANGE_MULTI'
                    EXPORTING
                    i_project_definition = 'S-AA-00005'
                    tables
                    it_wbs_element = ITABLE
                    it_update_wbs_element = ITABLE1
                    * ET_RETURN =
                    * EXTENSIONIN =
                    * EXTENSIONOUT =
                    .

                    CALL FUNCTION 'BAPI_PS_PRECOMMIT' .

                    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
                    * EXPORTING
                    * WAIT =
                    * IMPORTING
                    * RETURN =


                    Quizás la solución tenga que ver con estos parámetros:
                    EXTENSIONIN LIKE BAPIPAREX
                    EXTENSIONOUT LIKE BAPIPAREX



                    Agradecería algún consejo/ código GRACIAS DE ANTEMANO!

                    Comentario

                    • VLozano
                      Senior Member
                      • nov
                      • 124

                      #11
                      Debo suponer que estás intentando actualizar un campo Z de la tabla PRPS... ahí ya no puedo echarte un cable. Sé que en el pasado me encontré con un problema parecido, y que tuve que tocar algunas cosillas para que la BAPI me reconociera esas ampliaciones de tabla.

                      Te remito a la fuente de mi conocimiento en ese momento: el help de SAP (help.sap.com). Ni siquiera recuerdo lo que utilicé para buscar, pero si tuviera que repetir usaria "BAPI extension" o algo así.

                      Suerte.
                      "Porque algunos sabemos que somos parte del problema"
                      - Pequeña guía para escribir mensajes en foros técnicos -

                      Comentario

                      • romario2
                        Senior Member
                        • abr
                        • 233

                        #12
                        es eso

                        Exactamente Vlozano,

                        tengo la incidencia que dices. Tendré que investigar en la Bapi.
                        Parece que la Bapi te obliga a meter TODOS los campos Z, todo el churro de campos, por orden :-(
                        Y si se hiciera un tratamiento aparte de los campos Z?
                        (un update pero solo para los campos Z de la PRPS)

                        Comentario

                        • VLozano
                          Senior Member
                          • nov
                          • 124

                          #13
                          Lo del update de "sólo los campos Z" es algo que ya he oído en alguna parte. Y siempre se me erizan los pelos de la nuca.

                          Yo NO lo haría. Ni siquiera estando el 99% seguro de que nunca cascaría el SQL.

                          Si tienes tiempo, inviértelo buscando cómo hacer que una BAPI trabaje con extensiones de tablas, porque te servirá en el futuro (ya puestos, cuando lo sepas nos lo explicas :P). Y si no lo tienes, intenta montar aunque sea un batch input lanzado desde un job con un usuario con autorización. Cualquier cosa antes de meterle mano a una tabla SAP mediante SQL.

                          Nunca sabes cuándo va a llegar alguien detrás tuyo y va a decir: "mira, si actualiza PRPS-ZCAMPOCHORRA, yo también puedo actualizar PRPS-VERNR". Y se lía parda (supongo... no sé qué campo es ése :P)
                          "Porque algunos sabemos que somos parte del problema"
                          - Pequeña guía para escribir mensajes en foros técnicos -

                          Comentario

                          Trabajando...