viernes, 24 de marzo de 2017

RECOMENDACIONES N°2... Z-VK13 / 24.03.2017

Debes leer bien los tips anteriores... están en una publicación más abajo, más temprano... tiene el mismo nombre pero sin el N°2

- Crea una estructura por cada tabla estándar A790, A601 que vayas a usar
así como una tabla donde guardaras todo y su respectivo work área. Por ejemplo...

TYPES: BEGIN OF TY_A970
VKORG TYPE A970-VKORG,
AUART_SD TYPE A970-AUART_SD,
..
..
..
END OF TY_A970...

DATA GT_A970 TYPE STANDAR TABLE OF TY_A970,
         GS_A970 TYPE TY_A970.

(este es solo un modelo, tu crea tus tablas como ya lo has venido haciendo y mejor te parezca)

- Si te das cuenta estas tablas tienen campos en común por tanto crearás un solo GT_REPORTE
que se alimentará de la o las tablas que escogas o dependiendo del radiobutton.

OJO: Cuando digo que el GT_REPORTE tendrá campos combinados por tablas quiere decir esto,
en la A901 y A601 se repiten en campo MATNR por tanto es un campo genérico entre tablas así que tu GT_REPORTE tendrá
un campo MATNR, pero el campo AUART_SD solo lo encuentras en la A601 y en la A901 no. Bueno igual lo agregas en tu GT_REPORTE
pero este solo se llenará cuando tu radiobutton haga referencia a la A901 ya luego en el fieldcat tu escoges que columnas mostrar 
dependiendo del radiobutton escogido

- Para el momento de hacer las consultas puede que te pongas a pensar sobre el campo inicio - fin de validez y es por eso
que te mencioné en los tips anterior el ponerlo como parametro independiente ya que luego en tus consultas lo usarás...
Por ejemplo...

En tu pantalla tendrás P_VALIDEZ, recuerda que tiene un valor P_VALIDEZ-LOW y P_VALIDEZ-HIGH ya que es un SELECT-OPTION
y se comporta como un rango por tanto esos campos deberás separarlos en variables independientes y en tus consultas usar estas
variables independientes...

LV_DATAB = P_VALIDEZ-LOW "INICIO VALIDEZ
LV_DATBI = P_VALIDEZ-HIGH "FIN VALIDEZ

y en tu select

SELECT...
INTO TABLE...
FROM A601
WHERE DATBI LE LV_DATBI "MENOR IGUAL AL FIN DE VALIDEZ
AND DATAB GE LV_DATAB "MAYOR IGUAL AL INICIO DE VALIDEZ

(de esta manera contemplaría bien la consulta)

- En caso sea una sola tabla a usar harás un solo LOOP a dicha tabla en caso sea más de una, harás un LOOP
a cada una que vayas a usar, trata de condicionar esto / amarrarlo con el radiobutton todo en orden.
Por ejemplo...

DATA: GT_REPORTE TYPE STANDAR TABLE OF TY_REPORTE,
           GS_REPORTE TYPE TY_REPORTE.

FORM ARMAR_REPORTE
----------------------------------------------


IF radioubtton_1 EQ 'X'.

LOOP AT lt_A970 INTO ls_A970.
CLEAR GS_REPORTE. "LIMPIAR LA ESTRUCTURA CON CADA LEÍDA PARA EVITAR DATOS PEGADOS
GS_REPORTE-MATNR = LS_A970-MATNR.
GS_REPORTE-VKORG = LS_A970-VKORG.
...

APPEND GS_REPORTE TO GT_REPORTE.
ENDLOOP.

ENDIF.

IF radiobutton_2 EQ 'X'.
"este es en caso debas llenar datos de dos tablas pero no creo ya que como me indicaste el radiobutton indicará que tabla consultar y con 
"la cuál llenarás tu reporte

LOOP AT lt_A601 INTO ls_A601.
CLEAR GS_REPORTE. "LIMPIAR LA ESTRUCTURA CON CADA LEÍDA PARA EVITAR DATOS PEGADOS
GS_REPORTE-MATNR = LS_A601-MATNR.
GS_REPORTE-VKORG = LS_A601-VKORG.
...

APPEND GS_REPORTE TO GT_REPORTE.
ENDLOOP.

LOOP AT lt_A970 INTO ls_A970.
CLEAR GS_REPORTE. "LIMPIAR LA ESTRUCTURA CON CADA LEÍDA PARA EVITAR DATOS PEGADOS
GS_REPORTE-MATNR = LS_A970-MATNR.
GS_REPORTE-VKORG = LS_A970-VKORG.
...
APPEND GS_REPORTE TO GT_REPORTE.
ENDLOOP.

ENDIF.
---------------------------------------------
ENDFORM.

(ten bastante en cuenta validar que cada tabla este llena antes de realizar alguna consulta que dependa de otra tabla para no hacer consulta con vacíos y demore más el reporte al igual que al llenar o loopear una tabla)

- Ya que tu GT_REPORTE tendrá todos los campos a mostrar y los que sean comunes entre las tablas a consultar
crearas un fieldcat dependiendo del radiobutton / tabla o como según lo hayas planeado, es o sería la misma idea de como armas el reporte
Por ejemplo...

FORM CREA_FIELDCAT.
------------------------------------------------------------------------------
define add_fcat.
    clear gs_fcat.
    gs_fcat-col_pos = &1.
    gs_fcat-fieldname = &2.
    gs_fcat-coltext = &3.
    gs_fcat-outputlen = &4.
    append gs_fcat to gt_fcat.
  end-of-definition.

IF radiobutton_1 EQ 'X'.

 add_fcat:
     1 'MATNR' 'Material' 18,
     2 'CTDPG' 'Cantidad Programada' 10.

ENDIF.

IF radiobutton_2 EQ 'X'.

  add_fcat:

  1 'MATNR' 'Material' 18,
  2 'CTDPG' 'Cantidad Programada' 10.
  3 'IDNRK' 'Componente'         30 'X',
  4 'MEINS' 'Unid.Med.' 5 '',
  5 'MENGE' 'Cantidad' 10 ''.

ENDIF.
--------------------------------------------------------------------------------------
ENDFORM.

(si te das cuenta la definición por macros es la misma, más la implementación de el fieldcat, osea, que columnas tendrá, dependerá del radiobutton que escogamos en el ejemplo si escogemos el radiobutton_1 solo mostramos dos campos, pero si escogemos radiobutton_2 mostramos esos dos más
algunos campos más,

Recuerda que la tabla GT_REPORTE contendrá en teoría todos los campos combinados ya que en las tablas estos se repiten esto se explico puntos más arriba)

- Ya teniendo el GT_REPORTE único y el GT_FCAT (columnas a mostrar) amarrado al radiobutton que se entendería es como condicionar a la tabla a mostrar en tu llamada al ALV_GRID simple... enviarias solo un GT_REPORTE y un solo GT_FCAT.

(recuerda que solo te estan pidiendo hacer consultas y mostrarlas en un solo ALV sin mayor chiste o funcionalidad por tanto con un ALV_GRID bastaría
estaría demás crearlo con CONTAINER o EVENTOS, tranquila)

.................

Ya con estos TIPS puedes ir avanzando bien en tu programa ya en el almuerzo me preparas tus dudas y finalmente se haría lo del PDF que como te mencioné para eso debe hacerse un smartform con lo que se mostrara y usando una función SAP se hará la conversión para mostrarse como PDF. Pero dejalo para el final, por ahora ordenate bien, arma todo bien y con calma.
Tú puedes! suerte!

RECOMENDACIONES: Z-VK13 / 24.03.2017


lee con atención 
más allá de lo que vaya a publicar aquí más tarde para ayudarte, lee las siguientes recomendaciones:

1. Los parametros de seleccion que se vayan a ocultar dependiendo del radiobutton, agrupalos por bloque dependiendo del radiobutton y deja el ocultarlos para el final, y estos no los pongas como obligatorio. El resto si, los que son idependiente del radiobutton que escogas, no te centres en detalles si se pueden afinar más tarde.

2. En las tablas A601, A970, etc... hay un campo inicio - fin de validez, incluyelo en tus parametros principales ya que todas las tablas cuentan con esos campos. DATAB y DATBI.

3. Para mostrar en PDF, tienes armarlo en smartform, ya con unas funciones SAP convertira ese smartform y te lo mostrara como una previsualización PDF para que guardes, imprimas.
(osea has un smartform simple con la tabla del ALV, pero en este caso si tendrás que hacer una jugada, te intentaré explicar más a detalle en el blog)

seguiré actualizando el blog en como pueda durante el día para darte tips o bosquejos...
tu puedes!

jueves, 23 de marzo de 2017

URGENTE: VK31 ó V/LD

Ambas son transacciones estandar...
la VK31 se configura para que se pueda usar osea parece se configura para que se active la TX...
y la V/LD si la debes tener activa pero la configuras un reporte de pendiendo de los filtros a usar (si vas a usar la Org. Vtas/Material/etc/etc)...


Si lees esto tocaría investigar estas dos transacciones, la primera como activarla
y la 2da como configurar para armar el reporte con esa tx.


Espero te sirva...
El funcional me paso ese dato así breve nomas que investigue y si me puede ayudar esas dos tx. No le pregunte antes porque estabamos con un problema de FE y recién me salio una y como agradecimiento le pedi me ayudará con ese dato


Tu puedes!

VK 13 - Reporte Indu

La pantalla de selección reune los campos de selección de las distintas combinaciones que ves en la VK13 básicamente en un inicio lo que tendría que hacer es... dependiendo de los filtros que se llenen (según la combinación) se hace la consulta a la tabla correspondiente ...

Este programa aparte de consultar a la tabla principal de la combinación, consulta al resto, por eso que se habre los precios por material hacia la derecha...


Este es el codigo de la pantalla de selección...


martes, 21 de marzo de 2017

CANTP

el archivo se llama CANTP

https://www.dropbox.com/sh/n4ocs14grz5wu49/AAB81ROYn1PGebA_X_BgsE2ma?dl=0

exitos, tu puedes

MARK ALL: check alv marcar

Hay un programa SAP standar que hace eso pero es con un casillero, pero tambien es una propiedad standar del STATUS del ALV intenta copiar un standar a tu pgm y fijate si lo capta.


En la SE16N o cualquier que te muestre un ALV verás esos botones que hacen lo que pides,
pero aqui en este pgm trabaja con un check por fila...

En la SE38 ejecuta este pgm.


BCALV_EDIT_05

lunes, 20 de marzo de 2017

XMENG : Solución

En el siguiente enlace tendrás los dos archivos, una donde esta el EXCEL de tal como viene la STB por la función y otra donde esta en el TXT un bosquejo de la lógica para asignar la cantidad base padre a los componentes hijos.

https://www.dropbox.com/sh/n4ocs14grz5wu49/AAB81ROYn1PGebA_X_BgsE2ma?dl=0

Hay un excel también de tal como se ve en la CS11, recuerda que la función del programa Z te trae cada componente desagregado ni bien encuentre que se trata de un conjunto (STB), más en la CS11 muestra todo por nivel ordenado y luego cada descomposición, no confundirte.

Espero te ayude, tu  puedes!
Ánimos!


CANTIDAD BASE 20.03.2017

Según tu excel hay materiales (componentes) padre que tienen una cantidad base la cuál se hereda a los materiales (componentes) hijos, bueno si es solo eso y entendí bien pese a que pudiste explicar mejor ...
te dejo la siguiente lógica...


En tu tabla interna STB tienes los siguientes campos:
XMENGE -  Cantidad base lista de materiales (siguiente nivel)
OJTXP - Texto breve del objeto (posición), descripción del componente desagregado
OJTXB - Texto breve del objeto (conjunto), descripción del componente padre



Si tedas cuenta hay una relación OJTXB y OJTXP a eso sumale que tiene un campo STUFE (nivel) o MATNR (producto final) que tu le asignas para armar tu reporte, por ejemplo... 


Entonces lo que recomiendo es que hagas un READ TABLE a la STB que traes de la función y que le asignes el campo XMENG del componente padre siempre y cuando su campo XMENG este vacío, esto nos dejara a componentes de el nivel más bajo (desagregado) pero no solo es hacer un READ TABLE también deberas validar que pertenece al mismo material final (producto terminado), osea la idea sería la siguiente ...

tienes tu GT_REPORTE donde tienes el MATNR (producto final) y de la STB habrás jalado también los campos STUFE (nivel), OJTXB (componente padre) y OJTXP (componente hijo), mira la imagen...
así que harás un LOOP a tu GT_REPORTE y para cada que encuentres un XMENG vacío hacer un READ TABLE a la GT_READ TABLE (si, sobre la misma tabla, recomiendo field symbol) WITH KEY matnr = producto final de esa misma linea, mejor te escribo algo de codigo simple ... ojo es un borrador, te estoy dando una idea ya que no se bien como lo has programado pero espero te ayude...

para esto tu gt_reporte imagino estará ordenado y esto lo harías antes del final o donde gustes la cosa que lo que hará es asignar la cantidad base a aquellos que no tienen tomandolos del componente padre...


LOOP AT GT_REPORTE ASSIGNIG <ST_REPORTE>

IF <ST_REPORTE>-XMENG IS INITIAL.
LV_STUFE = <ST_REPORTE>-STUFE - 1.
READ TABLE GT_REPORTE ASSIGNING <FS_REPORTE_AUX> WITH KEY matnr = <ST_REPORTE>-MATNR
stufe = LV_STUFE
ojtxp = <ST_REPORTE>-OJTXB.

IF sy-subrc EQ 0.
<FS_REPORTE>-XMENG = <FS_REPORTE_AUX>-XMENG.
ENDIF.
ENDIF.

Explicación:


Si observas nuevamente y bien esta imagen te darás cuenta que el nivel padre STUFE es uno menos que el nivel hijo, por eso al read le envio un STUFE - 1. Ahora, igualo el OJTXP al OJTXB de la linea que no tiene XMENG ya que estoy leeyendo una posición hija por tanto el OJTXB (componente padre) estara en mi GT_REPORTE como OJTXP con un XMENG con valor. Es decir según la imagen... cuando lea las lineas 2, 3 y 4 sombreadas tienen un componente padre (OJTXB) igual al OJTXP de la linea 1, y su nivel es el mismo pero restado en 1. a eso sumale el MATNR producto final que debes tener en tu GT_REPORTE como ya explique...


Esta logica la puedes agregar al momento de armar tu reporte o luego cuando este todo armado, sería pruebes... te estuve llamando pero esta apagado otra vez... bueno, si puedes comentas para ver como te va...
tu puedes



miércoles, 15 de marzo de 2017

EJEMPLO: ELIMINAR FILA Y ACTUALIZAR ALV

Aquí hay un ejemplo de codigo al incio de un pgm que elimina un registro y actualiza ahi mismo el ALV. Para actualizar hace dos cosas... carga los nuevos datos a la tabla interna (en tu caso antes de esto eliminas de tu tabla Z) y luego refresca el alv con el  RS_SELFIELD-REFRESH = 'X'.

Te tomara algo de tiempo darle una leia pero es facil al final. De la linea 140 a 155 es necesario para que
un REUSE_aLV_gRID te reconozca los cambios, igual entre sus programas deben tener algun
caso parecido de algun reporte mantenedor sería tambien te puedes guiar de ello.

https://archive.sap.com/discussions/thread/261210

Te aviso me avisas como vas, puede actualice si encuentro algo mas explicable... debo
revisar por debug la idcp ya que ha salido otro error pero reportado por chile...
pero tu puedes, suerte!

martes, 14 de marzo de 2017

ACTUALIZADOOO!!!! / CONCLUSIÓN VARIABLE MÁS DE 255 CARACTERES

ACTUALIZACIÓN 14:48 PM
-------------------------------------------------------------------
En caso funcione el ultimo caso de las 14:40pm, ten bastante cuidado en la ultima variable que envias
ya que debe calzar exacto con la cantidad de caracteres que tienes ej:

Mi variable del ejemplo OBSV tenia 1009 caracteres
y quise imprimir en una nueva variable
OBSV2 = OBSV+990(20)

use la sentencia WRITE y me salio DUMP porque mi OBSV solo tenia 1009
y no 1010 (si sumamos desde la 990 las 20 posiciones siguientes, tomara un 1010 pero al no encontrarlo boto un DUMP) derrepenteee es porque asigne esto a una nueva variable..
o solo ocurre con el write
sería que pruebes bien eso
antes prueba el de las 14:40pm a ver como te va

animos!

ACTUALIZACIÓN 14:40 PM
----------------------------------------------------------------------

Si vuelves a leer, esto lo cuál espero que si...
checa esta publicación

la idea sería basicamente la misma, creas un string y simplemente pegas
todo dentro de ese string

y en el smartform harías lo siguiente (post, link de abajo)

https://archive.sap.com/discussions/thread/783842

lo que hace basicamente es imprime la misma variable varias veces
pero desde distintas posiciones es decir

&variable&&variable+255(255)& (esto obviamente en el smartform)

aquí esta imprimiendo la misma variable dos veces
la primera las 255 primeras posiciones
y la segunda, la misma variable pero desde la posición 255 las 255 siguientes...
según el post le dierion respuesta correcta, sería probarlo

en tu programa lo declararías como STRING simplemente y concatenas todo
en el debug puedes ver si se guardo todo... le das doble click a la variable y cambias el modo de visualización (Como esta en la imagen)

espero esta opción te sirva y la llegues a leer, sino caballero ver la segunda opción...
debo volver a trabajar espero haberte ayudado y leas esto



ACTUALIZACIÓN 14:05 PM
-------------------------------------------------------------------------------------------------------------------


Lamento decirlo pero según he buscado rápidamente me encontre con este texto aquí y en otras 3 publicaciones en inglés, lo cuál se entiende basicamente que (aún así pasaras el tema de tener una variable de varios caracteres lo cuál tampoco parece probable)...

más si revisas bien el siguiente link verás que trabajan con una tabla interna de un solo campo de 255 posiciones y se va añadiendo lo que puede ser tu concatenate ... sería hagas una jugada y parece viable, más hay otra forma que sería con el READ_TEXT pero creo no vaya lo tuyo por ahí... lee bien este post y pues con algo de tiempo si sale.

Dale a entender a quien te pida que esto es una nota de SAP y que no solo involucraría crear una variable de mayor tamaño en el pgm sino también modificar el smartform, etc, hacerle cambios.

exitos!

https://blogs.sap.com/2013/07/09/overcome-smartforms-text-limitation-of-255-characters/


miércoles, 8 de marzo de 2017

TIPO NIF OBLIGATORIO (actualizado)

No he podido consultar a quien le pregunte ayer porque estan bien ocupados, pero en lo que pude buscar encontré y probé lo siguiente en el servidor de ITERP te comparto las imagenes... ESPERO PUEDAS VERLAS EN TAMAÑO NORMAL, ESTOY EN PRD URGENTE ACTUALIZO LUEGO







En caso no te funcione podrías todo caso validarlo por la exit, claro, no te aparecera ese check que dice es obligatorio pero si podrias mostrar un mensaje... es una opcion ya que por esta configuracion si te has dado cuenta se pone obligatorio tambien la clase de impuesto...


PUNTO APARTE!!!!
Tengo un tema con facturación electrónica urgente que estan presionando para que salga porque estamos en VIVO en el peor de los casos estoy saliendo diciendo que es urgencia 6:30 pm - 6:45 pm deseame suerte, te la deseo a ti también

exit: EXIT_SAPMF02D_001

El nombre de la exit es la siguiente EXIT_SAPMF02D_001 (dentro debe estar ese include Z de la imagen del centro), si, la misma del título ...

podrías probar actualizando el codigo en la se37 y activando a ver si con eso bastaria, probando en DEV si tienes para hacer pruebas y ver si pasa por tu codigo actualizado o habria que realizar algun paso mas, no puedo probar en este servidor más lo que tengo el tiempo ajustado pero si puedo lo actualizo. Tu puedes!


pd: no olvides filtrar bien tus cambios para que no afecte a otro codigo que este ya dentro, derrepente encapsularlo por condicionales como verificacion de transaccion o de sociedad cosas así...





martes, 7 de marzo de 2017

FOR ALL ENTRIES (ACTUALIZADO V2)

http://www.mundosap.com/foro/showthread.php?t=65718

 En ese link hay una persona que dice lo siguiente: "cuando usas FOR ALL ENTRIES implícitamente se produce un borrado de las filas duplicadas que resulten de la consulta, eso está en la ayuda de la clausula FOR ALL ENTRIES. "
 Lo cual le dan algunas soluciones como el inner join o agregar a su consulta algun campo el cual no sea duplicado en tu tabla a consultar, lo que te comenté por la noche que a tus campos le agregues el campo llave de la tabla que vas a consultar (asi no lo uses) simplemente para que traiga los 6.

 Espero ayude, seguiré buscando y actualizando por aqui, estoy en salida en vivo Exitos, tu puedes!
--------------------------------------------------------------------

Con la ayuda del inglés básico, el cuál debemos estudiar... encontré esta publicación el cuál le responden también que podría probar añadiendo en su consulta los campos clave de la tabla a la cual esta haciendo el select de tal manera que así evite eliminar duplicados... 

https://archive.sap.com/discussions/thread/987076
---------------------------------------------------------------------
Siguiendo lo que me contaste, si quieres consultar a la AUFM y probar lo mencionado por mi ayer y por los de las paginas web, añadir a tu select algún campo (o los campos llave) a la tabla en mención, en este caso a la AUFM, por tanto añades a tu estructura donde guardaras los datos esos tres registros y en tu select también, recuerda el orden siempre para mejor performance tanto de los campos a consultar como los de la condición where.

tu puedes!