22 08 2012

Field Groups – Como funcionan ? caso del famoso LOOP.

Los Fields Groups son muy comunes al momento de usar Base de datos lógicas. Por lo tanto seguramente lo veremos mucho en reportes standard de HR y de FI.

Seguramente alguna vez nos hemos cruzado con el famoso “LOOP. … ENDLOOP.” y nos habremos preguntado que es eso.

Como funcionan ?

Los fields groups trabajan de la siguiente manera:

INSERT field1 field2 INTO fg
EXTRACT fg.
SORT BY fg.
LOOP. … ENDLOOP.

INSERT field1 field2 INTO fg : La instrucción INSERT es usado para crear el field grupo de forma dinámica. Algo importante es que solamente variables globales pueden ser insertados en un field group. Así que si estamos dentro de una subrutina no podemos usar una variable declarada en forma local.

EXTRACT fg: Esta instrucción “combina” todos los campos en el field group y los va grabando en forma secuencial.

SORT BY fg: Simplemente ordena el field group.

LOOP AND ENDLOOP: Va recorriendo el field group creado. Se pueden usar cortes de control AT.

LOOP.
AT ***
……
….
ENDAT.
AT ***
…..
….
ENDAT.
ENDLOOP.

Cuando usarlos ?

En simples palabras técnicamente los field groups no están en memoria sino que están en un espacio de paginado. así que deberían ser usado cuando estamos tratando con más de 50.000 registros. Sino no tiene sentido.

Como usarlos ?

Dejo un reporte simple de ejemplo que encontré por la web usando las tablas de de SPFLI típicas en los tutoriales de SAP.

*************************************************************************
*& Report  ZSPFLI                                                       *
*************************************************************************
REPORT  ZSPFLI  LINE-SIZE 132 LINE-COUNT 65(3)
NO STANDARD PAGE HEADING.
TABLES:SPFLI,SCARR, SFLIGHT, SBOOK.
SELECT-OPTIONS: MYCARRID FOR SPFLI-CARRID.FIELD-GROUPS: HEADER, SPFLI_FG, SFLIGHT_FG, SBOOK_FG.

INSERT:
SPFLI-CARRID
SPFLI-CONNID
SFLIGHT-FLDATE
SBOOK-BOOKID
INTO HEADER,

SPFLI-CARRID
SPFLI-CONNID
SPFLI-CITYFROM
SPFLI-AIRPFROM
SPFLI-CITYTO
SPFLI-AIRPTO
SPFLI-DEPTIME
SCARR-CARRNAME
INTO SPFLI_FG,

SFLIGHT-FLDATE
SFLIGHT-SEATSMAX
SFLIGHT-SEATSOCC
SFLIGHT-PRICE
INTO SFLIGHT_FG,

SBOOK-BOOKID
SBOOK-CUSTOMID
SBOOK-CUSTTYPE
SBOOK-SMOKER
INTO SBOOK_FG.

SELECT * FROM SPFLI WHERE CARRID IN MYCARRID.
SELECT SINGLE * FROM SCARR WHERE CARRID = SPFLI-CARRID.
EXTRACT SPFLI_FG.

SELECT * FROM SFLIGHT
WHERE CARRID = SPFLI-CARRID AND  CONNID = SPFLI-CONNID.
EXTRACT SFLIGHT_FG.

SELECT * FROM SBOOK
WHERE CARRID = SFLIGHT-CARRID AND
CONNID = SFLIGHT-CONNID AND FLDATE = SFLIGHT-FLDATE.
EXTRACT SBOOK_FG.
CLEAR SBOOK.
ENDSELECT.
CLEAR SFLIGHT.
ENDSELECT.
CLEAR SPFLI.
ENDSELECT.

SORT.
LOOP.
AT SPFLI_FG.
FORMAT COLOR COL_HEADING.
WRITE: / SCARR-CARRNAME,
SPFLI-CONNID, SPFLI-CITYFROM,
SPFLI-AIRPFROM, SPFLI-CITYTO, SPFLI-AIRPTO, SPFLI-DEPTIME.
FORMAT COLOR OFF.
ENDAT.

AT SFLIGHT_FG.
WRITE: /15 SFLIGHT-FLDATE, SFLIGHT-PRICE, SFLIGHT-SEATSMAX,
SFLIGHT-SEATSOCC.
ENDAT.

AT SBOOK_FG.
WRITE: /30 SBOOK-BOOKID, SBOOK-CUSTOMID,
SBOOK-CUSTTYPE, SBOOK-SMOKER.
ENDAT.
ENDLOOP.

************************************************************************
*&      END OF REPORT                                                  *
************************************************************************

Tabstrip – Solapas en reportes

Una manera de organizar distintos grupos de parámetros de selección es escondiendo y mostrando los parámetros con un radio buton dinámico por ejemplo como se explica en la siguiente entrada.

Radio Buttons dinámicos – ocultar/mostrar grupos de parámetros de selección

Otra forma es dividir la pantalla de selección con TabStrip sin tener que usar Module Pool

image

En el ejemplo de abajo si corremos el reporte en la primer solapa mostrará 20 clientes, si se ejecuta en la segunda solapa mostrará 20 acreedores y si se ejecuta en la tercera mostrará un simple ‘Hola Mundo’.

REPORT  zreport_tab.

*———————————————————————*
*   Declaraciones                                                     *
*———————————————————————*
TABLES: kna1, lfa1.
DATA: ti_kna1 TYPE TABLE OF kna1 WITH HEADER LINE,
ti_lfa1 TYPE TABLE OF lfa1 WITH HEADER LINE,
g_tab(1) VALUE ’1′.

*———————————————————————*
*   selection screen                                                  *
*———————————————————————*
* Primer Tab
SELECTION-SCREEN BEGIN OF SCREEN 101 AS SUBSCREEN.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-t00.
SELECT-OPTIONS so_kunnr FOR kna1-kunnr.
SELECTION-SCREEN END OF BLOCK b1.
SELECTION-SCREEN END OF SCREEN 101.

* Segundo Tab
SELECTION-SCREEN BEGIN OF SCREEN 102 AS SUBSCREEN.
SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE text-t02.
SELECT-OPTIONS so_lifnr FOR lfa1-lifnr.
SELECTION-SCREEN END OF BLOCK b2.
SELECTION-SCREEN END OF SCREEN 102.

* Tercer Tab
SELECTION-SCREEN BEGIN OF SCREEN 103 AS SUBSCREEN.
SELECTION-SCREEN BEGIN OF BLOCK b3 WITH FRAME TITLE text-t03.

SELECTION-SCREEN END OF BLOCK b3.
SELECTION-SCREEN END OF SCREEN 103.

* Pantalla de Tabs
SELECTION-SCREEN BEGIN OF TABBED BLOCK t1 FOR 20 LINES.
SELECTION-SCREEN TAB (10) name1 USER-COMMAND ucomm1 DEFAULT SCREEN 101.
SELECTION-SCREEN TAB (20) name2 USER-COMMAND ucomm2 DEFAULT SCREEN 102.
SELECTION-SCREEN TAB (30) name3 USER-COMMAND ucomm3 DEFAULT SCREEN 103.
SELECTION-SCREEN END OF BLOCK t1.

INITIALIZATION.
* Nombre de los Tabs
name1 = ‘Primer Tab ‘.
name2 = ‘Segundo Tab’.
name3 = ‘Tercer Tab’.

AT SELECTION-SCREEN.
* Control de que tab fue elegido
CHECK sy-ucomm = ‘UCOMM1′
OR sy-ucomm = ‘UCOMM2′
OR sy-ucomm = ‘UCOMM3′.
CASE sy-ucomm.
WHEN ‘UCOMM1′.
g_tab = ’1′.
WHEN ‘UCOMM2′.
g_tab = ’2′.
WHEN ‘UCOMM3′.
g_tab = ’3′.
ENDCASE.

START-OF-SELECTION.
* Al ejecutar el reporte, dependiendo del tab seleccionado
* Correrá una lógica o la otra.
CASE g_tab.
* Primer Tab
WHEN ’1′.
SELECT * UP TO 20 ROWS FROM kna1 INTO TABLE ti_kna1.

CALL FUNCTION ‘REUSE_ALV_GRID_DISPLAY’
EXPORTING
i_callback_program = sy-repid
i_structure_name   = ‘KNA1′
i_grid_title       = ‘Datos de Clientes’
TABLES
t_outtab           = ti_kna1
EXCEPTIONS
program_error      = 1
OTHERS             = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
* Segundo Tab
WHEN ’2′.
SELECT * UP TO 20 ROWS FROM lfa1 INTO TABLE ti_lfa1.

CALL FUNCTION ‘REUSE_ALV_GRID_DISPLAY’
EXPORTING
i_callback_program = sy-repid
i_structure_name   = ‘LFA1′
i_grid_title       = ‘Datos de Acreedores’
TABLES
t_outtab           = ti_lfa1
EXCEPTIONS
program_error      = 1
OTHERS             = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
* Tercer Tab
WHEN ’3′.
WRITE ‘Hola Mundo’.
ENDCASE.

Agregar Botones en Toolbar dentro de la pantalla de selección

El siguiente código es un ejemplo de como agregar botones en la toolbar dentro de la pantalla de selección.

image

REPORT zreport .
TABLES: sscrfields.DATA smp_dyntxt TYPE smp_dyntxt.

SELECTION-SCREEN FUNCTION KEY 1.
SELECTION-SCREEN FUNCTION KEY 2.
PARAMETERS : p_m TYPE mara-matnr .

*&———————————————————————*
*& INITIALIZATION
*&———————————————————————*
INITIALIZATION .

CLEAR smp_dyntxt.
smp_dyntxt-text = text-t01.
smp_dyntxt-icon_id = ‘@1U@’.
smp_dyntxt-icon_text = ‘Icon 1′.
smp_dyntxt-QUICKINFO = ‘Tooltip 1′.
sscrfields-functxt_01 = smp_dyntxt.

CLEAR smp_dyntxt.
smp_dyntxt-text = text-t02.
smp_dyntxt-icon_id = ‘@A8@’.
smp_dyntxt-icon_text = ‘Icon 2′.
smp_dyntxt-QUICKINFO = ‘Tooltip 2′.
sscrfields-functxt_02 = smp_dyntxt.

*&———————————————————————*
*& AT SELECTION-SCREEN
*&———————————————————————*
AT SELECTION-SCREEN.

CASE sscrfields-ucomm.
WHEN ‘FC01′.
“PERFORM custom_button_a.
WHEN ‘FC02′.
“PERFORM custom_button_b.
ENDCASE .

Iconos en pantalla de selección

Si deseamos que nuestra pantalla de selección salga por ejemplo así:

image

Lo único que debemos hacer es editar los textos de parámetro de selección de la siguiente forma:

 image

Para saber que código de ID es cada ícono dejo un programa que lista todos los íconos disponibles en SAP con su ID.

DATA :
gs_icon TYPE ICON,
gt_icon TYPE TABLE OF ICON.

SELECT * FROM icon INTO TABLE gt_icon.

LOOP AT gt_icon INTO gs_icon.

WRITE:/
gs_icon-name,
33 ‘@’,
34 gs_icon-id+1(2),
36 ‘@’,
40 gs_icon-id.

ENDLOOP.

Este reporte muestra lo siguiente:

image

Bajar un reporte de fondo en .xls

El usuario requería bajar la información de un ALV grid a un xls, pero la corrida iba a ser en fondo. Y la bajada tenía que ser tal cual el ALV grid, mismo orden de columnas, nombres, etc.

En resumen, antes de la ejecución del ALV se uso la función  ‘LT_DBDATA_READ_FROM_LTDX’ para leer el catálogo de una variante de disposición, después por medio de una tabla dinámica parseo los datos y son bajados en el servidor por medio de OPEN DATASET en un texto plano separado con tabuladores pero con extensión .xls

El Excel ya automáticamente lo abre correctamente.

Dejo el código para darse una idea del desarrollo.

DATA: l_varkey    TYPE LTDXKEY,
TI_LTDXDATA TYPE TABLE OF LTDXDATA WITH HEADER LINE,
WA_LTDXDATA TYPE LTDXDATA,
flag_no_out(1),
l_variante  TYPE ZRPT_HPARAM1-DESCRIPCION,
l_ruta      TYPE ZRPT_HPARAM1-DESCRIPCION,
l_archivo   TYPE ZRPT_HPARAM1-DESCRIPCION,
l_path(120).

l_varkey-REPORT = sy-repid.
l_varkey-VARIANT = l_variante.
l_varkey-TYPE = ‘F’.

* Se lee el catálogo de la variante
CALL FUNCTION ‘LT_DBDATA_READ_FROM_LTDX’
EXPORTING
I_TOOL             = ‘LT’
IS_VARKEY          = l_varkey
TABLES
T_DBFIELDCAT       = TI_LTDXDATA
EXCEPTIONS
NOT_FOUND          = 1
WRONG_RELID        = 2
OTHERS             = 3 .
IF SY-SUBRC = 0.

LOOP AT TI_LTDXDATA.
WA_LTDXDATA = TI_LTDXDATA.
AT NEW KEY1.
CLEAR flag_no_out.
ENDAT.

IF WA_LTDXDATA-PARAM = ‘NO_OUT’ AND WA_LTDXDATA-VALUE = ‘X’.
flag_no_out = ‘X’.
ENDIF.

AT END OF KEY1.
IF flag_no_out IS INITIAL.
ti_columns-name = TI_LTDXDATA-KEY1.
APPEND ti_columns.
ENDIF.
ENDAT.
ENDLOOP.
ENDIF.

* Creación de tabla interna dinámica
TYPE-POOLS : abap.
FIELD-SYMBOLS: <dyn_table> TYPE STANDARD TABLE,
<dyn_wa>,
<dyn_field>.

DATA: dy_table TYPE REF TO data,
dy_line  TYPE REF TO data,
xfc TYPE lvc_s_fcat,
ifc TYPE lvc_t_fcat,
l_string(1024),
l_xls(1024).

class cl_abap_char_utilities definition load.
DATA: tab type x value 9,
htab(1) type c,
l_newline(1),
f_flag(1),
ls_fieldcat TYPE LINE OF slis_t_fieldcat_alv..

htab = cl_abap_char_utilities=>horizontal_tab.
l_newline = cl_abap_char_utilities=>CR_LF.

DATA: begin of ti_lines OCCURS 0,
texto(40),
END OF ti_lines.

LOOP AT ti_columns.
CLEAR xfc.
xfc-fieldname = ti_columns-name .
xfc-datatype = ‘CHAR’.
xfc-OUTPUTLEN = ’40′.
APPEND xfc TO ifc.
ENDLOOP.

* Create dynamic internal table and assign to FS
CALL METHOD cl_alv_table_create=>create_dynamic_table
EXPORTING
it_fieldcatalog  = ifc
i_length_in_byte = ‘X’
IMPORTING
ep_table         = dy_table.
ASSIGN dy_table->* TO <dyn_table>.

* Create dynamic work area and assign to FS
CREATE DATA dy_line LIKE LINE OF <dyn_table>.
ASSIGN dy_line->* TO <dyn_wa>.

CONCATENATE l_ruta l_archivo ‘.xls’ INTO l_path.

OPEN DATASET l_path FOR OUTPUT IN TEXT MODE ENCODING DEFAULT .
IF sy-subrc <> 0.
WRITE: / text-M05, l_path.
ENDIF.

CLEAR: l_xls, f_flag.
LOOP AT ti_columns.
READ TABLE gt_fieldcat WITH KEY fieldname =     ti_columns-name INTO ls_fieldcat.
IF sy-subrc = 0.
IF f_flag IS INITIAL.
l_xls = ls_fieldcat-seltext_l.
f_flag = ‘X’.
ELSE.
concatenate l_xls ls_fieldcat-seltext_l INTO l_xls SEPARATED BY htab.
ENDIF.
ENDIF.
ENDLOOP.
TRANSFER l_xls TO l_path.

DATA: TYP(1),
col(40),
l_i TYPE I,
col_wa(40).

FIELD-SYMBOLS: <col_value> TYPE ANY,
<column> TYPE ANY.

CLEAR: l_xls, f_flag.
LOOP AT gt_outtab. “gt_outtab es la tabla que muestra el ALV con sus datos y columnas.
MOVE-CORRESPONDING gt_outtab TO <dyn_wa>.
LOOP AT ti_columns.
READ TABLE gt_fieldcat WITH KEY fieldname = ti_columns-NAME INTO ls_fieldcat.
IF sy-subrc = 0.
CONCATENATE ls_fieldcat-tabname ‘-’ ls_fieldcat-fieldname INTO col.
CONCATENATE ‘<dyn_wa>-’ ls_fieldcat-fieldname INTO col_wa.
ASSIGN (col) TO <col_value>.
ASSIGN (col_wa) TO <column>.
CLEAR typ.
DESCRIBE FIELD <col_value> TYPE typ LENGTH l_i.
IF typ = ‘D’.

CONCATENATE <col_value>+6(2) <col_value>+4(2) <col_value>(4) INTO <column> SEPARATED BY ‘-’.
ELSEIF typ = ‘P’.
<column> = <col_value>.
TRANSLATE <column> USING ‘.,’.
ELSEIF typ = ‘I’.
<column> = <col_value>.
IF <col_value> < 0.
<column>  = <col_value>.
CALL FUNCTION ‘CLOI_PUT_SIGN_IN_FRONT’
CHANGING
VALUE         = <column>.
ENDIF.
ENDIF.

CONDENSE <column>.
IF f_flag IS INITIAL.
l_xls = <column>.
f_flag = ‘X’.
ELSE.
concatenate l_xls <column> INTO l_xls SEPARATED BY htab.
ENDIF.
ENDIF.
ENDLOOP.

TRANSFER l_xls TO l_path.
CLEAR: l_xls, f_flag.
ENDLOOP.

CLOSE DATASET l_path.
ENDIF. “Variant

Signo Negativo a la izq. en ALV GRID

Por default, el ALV siempre muestra el signo negativo del lado derecho. Si deseamos mostrar un valor numérico negativo con signo a la izq. sin tener que pasarlo a CHAR (porque si se tenemos que hacer sumatorias, no nos sirve).

En el Catálogo setear la siguiente máscara de edición.

LV_FIELDCAT-EDIT_MASK = 'RRV________,__'.

Esto dará como resultado:

-        82,90

Footer (Pie de Página) en un ALV GRID

Buscando otra cosa por la web me cruce con esta página, quizás en algún momento tenga que usarla, así que la agrego en mi blog, poniendo el link original del artículo. Es como agregar un footer en un ALV GRID con la restricción que no va a salir impreso.

Artículo original: http://www.sapdev.co.uk/reporting/alv/alvgrid_endlist.htm

In order to add a footer which is always displayed on screen to an ALV grid report you need to perform the steps below. Please note this will not be displayed in the printed output
Step 1. Update ‘REUSE_ALV_GRID_DISPLAY’ FM call to include parameter ‘i_callback_html_end_of_list’
Step 2. Create new FORM ‘END_OF_LIST_HTML’ for building footer

 call function 'REUSE_ALV_GRID_DISPLAY'
       exporting
            i_callback_program      = gd_repid
            i_callback_top_of_page   = 'TOP-OF-PAGE'
            i_callback_html_end_of_list = 'END_OF_LIST_HTML'
            is_layout               = gd_layout
            it_fieldcat             = fieldcatalog[]
            i_save                  = 'X'
       tables
            t_outtab                = it_ekko
       exceptions
            program_error           = 1
            others                  = 2.
*&-----------------------------------------------------------*
*&      Form  end_of_list_html
*&-----------------------------------------------------------*
*       output at the end of the list - not in printed output*
*&-----------------------------------------------------------*

FORM end_of_list_html USING end TYPE REF TO cl_dd_document.
  DATA: ls_text TYPE sdydo_text_element,
        l_grid     TYPE REF TO cl_gui_alv_grid,
        f(14) TYPE c VALUE 'SET_ROW_HEIGHT'.

  ls_text = 'Footer title'.

* adds and icon (red triangle)
  CALL METHOD end->add_icon
    EXPORTING
      sap_icon = 'ICON_MESSAGE_ERROR_SMALL'.

* adds test (via variable)
  CALL METHOD end->add_text
    EXPORTING
      text         = ls_text
      sap_emphasis = 'strong'.

* adds new line (start new line)
  CALL METHOD end->new_line.

* display text(bold)
  CALL METHOD end->add_text
    EXPORTING
      text         = 'Bold text'
      sap_emphasis = 'strong'.

* adds new line (start new line)
  CALL METHOD end->new_line.

* display text(normal)
  CALL METHOD end->add_text
    EXPORTING
      text         = 'Normal text'.

* adds new line (start new line)
  CALL METHOD end->new_line.

* display text(bold)
  CALL METHOD end->add_text
    EXPORTING
      text         = 'Yellow triangle'
      sap_emphasis = 'strong'.

* adds and icon (yellow triangle)
  CALL METHOD end->add_icon
    EXPORTING
      sap_icon = 'ICON_LED_YELLOW'.

* display text(normal)
  CALL METHOD end->add_text
    EXPORTING
      text         = 'More text'.

*set height of this section
  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      e_grid = l_grid.

  CALL METHOD l_grid->parent->parent->(f)
    EXPORTING
      id     = 3
      height = 14.

ENDFORM. "end_of_list_html.

image

Salvar datos en ALV editable con un status bar Z

El otro día me cruce con un error muy bizarro. Yo tenía un ALV editable al cual tuve que agregarle un status bar Z por agregar un botón nuevo.

Copie la status bar standard a mi programa y lo modifique. La status bar STANDARD que esta en el grupo de funciones SALV, no tiene definido el Function Code del boton Grabar (SAVE). entonces le setee el nombre &SAVE.

Que paso ? Si yo cambiaba el valor de algun campo editable del ALV al llegar al USER_COMMAND no veía el nuevo valor ingresado sino que veía el antiguo. Y eso andaba bien por lo cual el error debía estar en la status bar. Y efectivamente así fue.

Para que los datos de un ALV editable sea visibles en el FORM USER_COMMAND, el function code de la status bar tiene que ser &DATA_SAVE. De tener otro nombre la información no es pasada al USER_COMMAND.

Colores en ALV

Si corremos el reporte DEMO_LIST_FORMAT_COLOR_1, podemos ver los números que podemos usar para los determinados colores en el ALV

CODIFICACION DE COLORES: El color del ALV sigue el siguiente formato CXYZ donde…
C-> indica que es un color
X-> indica el numero de color, que debe ser del 1 al 9
Y-> indica la intensidad: (’0′=off / ’1′=on).
X-> indica si el color es inverso (’0′=off / ’1′=on).

Ejemplo para ver facilmente

image

Por ejemplo C500 mostrará un verde claro.

Radio Buttons dinámicos y ocultar/mostrar grupos de parámetros de selección

Una vez necesite hacer una pantalla de selección dinámica, es decir que si elegía un radio button debía mostrar X cantidad de parámetros y ocultar otros, y viceversa sin la necesidad de que tengamos que apretar un ENTER para que se dispare el evento AT-SELECTION-SCREEN.

El siguiente código lo arme como modo ejemplo para que se den cuenta de como usarlo

REPORT ZRADIO_BUTTONS.
PARAMETERS: p_1(10) MODIF ID A,
p_2(2)   MODIF ID B,
p_3(5).
PARAMETERS: p_A RADIOBUTTON GROUP rad1 USER-COMMAND ACT DEFAULT ‘X’,
p_B RADIOBUTTON GROUP rad1.

AT SELECTION-SCREEN OUTPUT.
LOOP AT screen.
IF p_A = ‘X’.
IF screen-group1 = ‘B’.
screen-active = 0.
ENDIF.
ELSEIF p_B = ‘X’.
IF screen-group1 = ‘A’.
screen-active = 0.
ENDIF.
ENDIF.

MODIFY screen.
ENDLOOP.

El MODIF ID lo que hace es darle un identificador a cada parámetro por lo cual no es necesario ocultar cada uno de los parámetros, sino que es más práctico ocultar directamente todos los elementos de un grupo.

La adición USER-COMMAND es la que permite que la selección sea dinámica y que no haya que apretar un enter para ejecutar un PAI.

NOTA: Al usar este método es muy molesto tener parámetros de selección OBLIGATORIOS, porque de no estar completos nos va a saltar la validación y los radio button no funcionarán de la forma deseada. Así que de usar Radio buttons dinámicos la validaciones las deberemos hacer manualmente nosotros mismos.


Acciones

Information

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s




A %d blogueros les gusta esto: