right_side

P L U G O

In:

No quiero convencer a nadie de nada.

Bueno pues hoy no pondré algo referente a programación, les pondré un poema que encontré vagando por la red y me gustó :).

No quiero convencer a nadie de nada.

No quiero convencer a nadie de nada. Tratar de convencer a otra persona es indecoroso, es atentar contra su libertad de pensar o creer o de hacer lo que le dé la gana. Yo quiero sólo enseñar, dar a conocer, mostrar, no demostrar.

Que cada uno llegue a la verdad por sus ropios pasos, y que nadie le llame equivocado o limitado. (¡Quiénes quién para decir “esto es así”, si la historia de la humanidad no es más que una historia de contradicciones y de tanteos y de búsquedas?)

Si a alguien he de convencer algún día, ese alguien ha de ser yo mismo. Convencerme de que no vale la pena llorar, ni afligirse, ni pensar en la muerte. “La vejez, la enfermedad y la muerte”, de Buda, no son más que la muerte, y la muerte es inevitable. Tan inevitable como el nacimiento.

Lo bueno es vivir del mejor modo posible. Peleando, lastimando, acariciando, soñando. (¡Pero siempre se vive del mejor modo posible!)

Mientras yo no pueda respirar bajo el agua, o volar (pero de verdad volar, yo solo, con mis brazos), tendrá que gustarme caminar sobre la tierra, y ser hombre, no pez ni ave.

No tengo ningún deseo que me digan que la luna es diferente a mis sueños.

Jaime Sabines…

In:

Un poco de mejora en performance.

Bueno pues viendo un post en mundosap, acerca de un problema que había con un inner join, también se hicieron ver observaciones para mejorar el rendimiento en un programa desarrollado en abap, por ejemplo se recomienda en lo posible tratar de no utilizar el comando INTO CORRESPONDING FIELDS OF.. ya que si solo se está haciendo un select a una tabla, solo es necesario declarar los campos que sean necesarios y solo eso cargar ya que el into corresponding genera una logica de compatibilidad entre campos para poder colocarlo donde es y eso genera mas carga a la memoria.
Ahora vallamos a un pequeñin ejemplo:


DATA: BEGIN OF TI_RESB OCCURS 0,
AUFNR LIKE RESB-AUFNR,
RSNUM LIKE RESB-RSNUM,
MATNR LIKE RESB-MATNR,
POSNR LIKE RESB-POSNR,
CHARG LIKE RESB-CHARG,
BDMNG LIKE RESB-BDMNG,
MEINS LIKE RESB-MEINS,
ERFMG LIKE RESB-ERFMG,
ERFME LIKE RESB-ERFME,
FLAG TYPE C.
DATA: END OF TI_RESB.


SELECT
AUFNR RSNUM MATNR POSNR CHARG
BDMNG MEINS ERFMG ERFME
INTO TABLE TI_RESB
FROM RESB WHERE AUFNR EQ -AUFNR.


Bueno eso es para las tablas internas, ahora veamos un ejemplo que hize en el for all entries.


*Le decimos al programa que tablas vamos a usar.
TABLES: BKPF,
BSEG.

*Declaramos nuestras tablas internas.
DATA: BEGIN OF t_bkpf OCCURS 0,
bukrs LIKE BKPF-bukrs,
belnr LIKE BKPF-belnr,
gjahr LIKE BKPF-gjahr,
END OF t_bkpf.

DATA: BEGIN OF t_bseg,
bukrs LIKE BSEG-bukrs,
BELNR LIKE BSEG-belnr,
koart LIKE BSEG-koart,
END OF t_bseg.

DATA: it_bkpf LIKE t_bseg OCCURS 0.
DATA: wa_bkpf LIKE LINE OF it_bkpf.

*Le pasaremos por parametro el numero de un documento.
SELECTION-SCREEN BEGIN OF BLOCK block01 WITH FRAME TITLE text-001.
SKIP 1.
PARAMETERS: p_belnr LIKE BKPF-belnr.
ULINE.
SKIP 1.
SELECTION-SCREEN END OF BLOCK block01.

START-OF-SELECTION.
PERFORM data_retrieval USING p_belnr.
PERFORM imprimir_datos.

FORM data_retrieval USING p_belnr.

SELECT bukrs belnr gjahr
FROM BKPF INTO TABLE t_bkpf WHERE
bkpf~belnr LIKE P_belnr AND BKPF~bukrs = '0100'.


SELECT bukrs belnr koart INTO TABLE it_bkpf
FROM BSEG FOR ALL ENTRIES IN t_bkpf WHERE belnr =
t_bkpf-belnr.

ENDFORM.

FORM imprimir_datos.
WRITE: /1 'Documento',15 'Sociedad',30 'Clase cuenta'.
LOOP AT it_bkpf INTO wa_bkpf.
WRITE: /1 wa_bkpf-belnr,15
wa_bkpf-bukrs,30
wa_bkpf-koart.
CLEAR wa_bkpf.
ENDLOOP.
ENDFORM.


Y bien eso sería todo, en este ejemplo le estamos pidiendo que nos inserte en nuestra tabla t_bkpf sociedad, documento y ejercicio, posteriormente le pedimos que nos seleccione los mismos campos y nos los inserte en la tabla it_bkpf pero de la tabla de segmento del documento y para las entradas que obtuvo en nuestra tabla anterior.

In:

BAPI PO CREATE1

Ahora me tocó el tema de las bapis, pues abap es bastante amplio y mucho muy interesante y divertido, esta vez publicaré mi entrada acerca de una bapi que acabo de implementar, se trata de la bapi po_create1 y es para crear ordenes de compra, la transacción para crear una orden de compra es la me21n, pues bien ahora les dejaré la muestra de mi código:


REPORT Z_BAPI_PO_TEST.
*Lo primero es declarar nuestras tablas internas que mantendran los datos *correspondientes, haciendolo de esta manera:

DATA: l_poheader LIKE BAPIMEPOHEADER.
DATA: l_poheaderx LIKE BAPIMEPOHEADERX.
DATA: l_t_poitem LIKE BAPIMEPOITEM OCCURS 0 WITH HEADER LINE.
DATA: l_t_poitemx LIKE BAPIMEPOITEMX OCCURS 0 WITH HEADER LINE.
DATA: l_t_poschedule LIKE BAPIMEPOSCHEDULE OCCURS 0 WITH HEADER LINE.
DATA: l_t_poschedulex LIKE BAPIMEPOSCHEDULX OCCURS 0 WITH HEADER LINE.
DATA: l_t_return LIKE BAPIRET2 OCCURS 0 WITH HEADER LINE.

*Declaramos un espacio para nuestra orden de compra.
DATA : v_purchaseorder LIKE bapiekkoc-po_number.

*En mi caso puse un parametro para la selección de mi proveedor.
SELECTION-SCREEN BEGIN OF BLOCK block01 WITH FRAME TITLE text-001.
SKIP 1.
PARAMETER: p_vendor LIKE l_poheader-vendor OBLIGATORY.
ULINE.
SKIP 1.
SELECTION-SCREEN END OF BLOCK block01.

PERFORM rellenar_bapi_cab USING p_vendor.
PERFORM rellenar_bapi_pos.
PERFORM crear_pedido_compra.

*Y bien comenzamos, esta rutina me rellena la cabezera de mi orden, lo que vendria *siendo de la tabla ekko.
FORM rellenar_bapi_cab USING p_vendor.

CLEAR l_poheader.
CLEAR l_poheaderx.

l_poheader-comp_code = '0200'. "sociedad
l_poheader-doc_type = 'PGOC'. "Clase del documento
l_poheader-creat_date = sy-datlo. "Fecha de creación
l_poheader-created_by = sy-uname. "Responsable que añadió el objeto
l_poheader-vendor = p_vendor. "Proveedor
l_poheader-purch_org = 'OC02'. "Organización de compras
l_poheader-pur_group = 'G03'. "Grupo de compras
l_poheader-doc_date = sy-datum. "Fecha del documento


l_poheaderx-comp_code = 'X'.
l_poheaderx-doc_type = 'X'.
l_poheaderx-creat_date = 'X'.
l_poheaderx-created_by = 'X'.
l_poheaderx-vendor = 'X'.
l_poheaderx-purch_org = 'X'.
l_poheaderx-pur_group = 'X'.
l_poheaderx-doc_date = 'X'.

ENDFORM. " rellenar_bapi_cab

*Ahora la rutina para mi detalle que vendría siendo lo de la tabla ekpo.
FORM rellenar_bapi_pos.

DATA: pos_rep LIKE ekpo-ebelp.

CLEAR pos_rep.

CLEAR: l_t_poitem, l_t_poitemx, l_t_poschedule, l_t_poschedulex.
ADD 10 TO pos_rep.

l_t_poitem-po_item = pos_rep.
l_t_poitem-material = '000000021033017002'.
l_t_poitem-plant = 'B001'. "Centro
l_t_poitem-stge_loc = 'B001'. "almacén
l_t_poitem-quantity = '12'.
l_t_poitem-po_unit = 'PAA'.
l_t_poitem-item_cat = '2'.
APPEND l_t_poitem.

l_t_poitemx-po_item = pos_rep.
l_t_poitemx-po_itemx = 'X'.
l_t_poitemx-material = 'X'.
l_t_poitemx-plant = 'X'.
l_t_poitemx-stge_loc = 'X'.
l_t_poitemx-quantity = 'X'.
l_t_poitemx-po_unit = 'X'.
l_t_poitemx-item_cat = 'X'.
APPEND l_t_poitemx.

l_t_poschedule-po_item = pos_rep.
l_t_poschedule-delivery_date = sy-datum.
l_t_poschedule-quantity = '12'.
l_t_poschedule-deliv_time = sy-uzeit.
APPEND l_t_poschedule.

l_t_poschedulex-po_item = pos_rep.
l_t_poschedulex-po_itemx = 'X'.
l_t_poschedulex-delivery_date = 'X'.
l_t_poschedulex-quantity = 'X'.
l_t_poschedulex-deliv_time = 'X'.
APPEND l_t_poschedulex.

ENDFORM. " rellenar_bapi_pos

*Y por ultimo mandamos a llamar nuestra bapi con exportando nuestras tablas e *importando la orden que se creará =).
FORM crear_pedido_compra .

CALL FUNCTION 'BAPI_PO_CREATE1'
EXPORTING
poheader = l_poheader
poheaderx = l_poheaderx
IMPORTING
exppurchaseorder = v_purchaseorder
TABLES
return = l_t_return
poitem = l_t_poitem
poitemx = l_t_poitemx
poschedule = l_t_poschedule
poschedulex = l_t_poschedulex.

IF NOT v_purchaseorder IS INITIAL.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'
* IMPORTING
* RETURN =
.
WRITE : / v_purchaseorder.
LOOP AT l_t_return.
WRITE: / l_t_return-message.
ENDLOOP.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
*En caso de que halla error, me lo regrese.
LOOP AT l_t_return.
WRITE: / l_t_return-message.
ENDLOOP.

ENDIF.

ENDFORM. " crear_pedido_compra


Y bien eso sería todo, está sencilla pero me costó trabajo estarle investigando :( mas bien me daba flojera pensar jejeje.
Referencia

In:

Función GUI_UPLOAD

Bueno me propuse desde ahora en adelante documentar sobre los requerimientos que me vallan dejando en la empresa, de esa manera como mi memoria aveces falla (mi memoria interna, o sea la de la tatema no la USB xDD), podré entrar y recordar lo que ya hize algún día, solo espero que los blogs no pasen de moda xD o al menos que los tumben y mi info quede intacta.
Ahora veremos la manera de utilizar la función gui_upload en sap, esta función sirve para subir algún archivo y leerlo en mi caso lo pondré en una tabla interna, el programa que hize fué sobre carga de pedidos, en este ejemplo solo subiremos un archivo de texto con 4 datos muy básicos.
Comenzamos creando nuestro reporte:

Z_REPORT_GUI_UPLOAD.
*declaramos un parametro para subir nuestro archivo.
PARAMETERS: p_infile LIKE rlgrap-filename
OBLIGATORY DEFAULT '/ruta/de/tu/archivo'..

DATA: gd_file type string.
*Tabla interna para almacenar los datos que subamos.
TYPES: BEGIN OF t_record,
nombre1 LIKE pa0002-vorna,
nombre2 LIKE pa0002-name2,
edad TYPE i,
ocupacion(15) TYPE c,
END OF t_record.

DATA: it_record TYPE STANDARD TABLE OF t_record INITIAL SIZE 0,
wa_record TYPE t_record.


AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_infile.
CALL FUNCTION 'WS_FILENAME_GET'
EXPORTING
def_filename = p_infile
mask = ',*.txt.'
mode = 'O'
title = 'Upload File'(078)
IMPORTING
filename = p_infile
EXCEPTIONS
inv_winsys = 1
no_batch = 2
selection_cancel = 3
selection_error = 4
OTHERS = 5.


START-OF-SELECTION.
gd_file = p_infile.

CALL FUNCTION 'GUI_UPLOAD'
EXPORTING
filename = gd_file
has_field_separator = 'X' "file is TAB delimited
TABLES
data_tab = it_record
EXCEPTIONS
file_open_error = 1
file_read_error = 2
no_batch = 3
gui_refuse_filetransfer = 4
invalid_type = 5
no_authority = 6
unknown_error = 7
bad_data_format = 8
header_not_allowed = 9
separator_not_allowed = 10
header_too_long = 11
unknown_dp_error = 12
access_denied = 13
dp_out_of_memory = 14
disk_full = 15
dp_timeout = 16
OTHERS = 17.
IF sy-subrc NE 0.
write: 'Error ', sy-subrc, 'returned from GUI_UPLOAD FM'.
skip.
endif.

END-OF-SELECTION.

*los datos de nuestro archivo ahora estan dentro de la tabla interna
*it_record

* Loopeamos nuestra tabla interna y mostramos los datos :)
WRITE:/1 'Nombre',15 sy-vline,
(10) 'Apellido',30 sy-vline,
(10) 'Edad',40 sy-vline,
(10) 'Profesión', sy-vline.

LOOP AT it_record INTO wa_record.
WRITE:/ sy-vline,
(10) wa_record-nombre1,15 sy-vline,
(10) wa_record-nombre2,30 sy-vline,
(10) wa_record-edad,40 sy-vline,
(10) wa_record-ocupacion, sy-vline.
ENDLOOP.

Y bien eso sería todo, como ven es un ejemplo bastante básico pero muy útil, solo restaría crear un archivo .txt con los datos nombre, apellido, edad y ocupación dando un tab entre cada dato =).

In:

Fuck! he has the reason :(

Desear que a uno se le quiera de la misma manera en que nosotros queremos o como se le quiso a alguien más, es como querer ir contra la gravedad salto con salto, hasta que, pasado el tiempo, tus rodillas se dislocan y ya no puedes seguir saltando más. Lo único que nos queda entonces es reconocer la magnitud de lo que se deseaba y aceptar con una sonrisa que no estamos hechos para volar.

..::Falso profeta::..

In:

Cruz Azul waaaaa

Bueno ps como estoy sin requerimiento en el trabajo, decidí pasar un código de mi camarada Hugo que publigó en su blog se trata de una elección aleatoria de uno de los equipos de fucho.
Este fué el código de mi cuate hecho en python:

#!usr/bin/python
import random

equipos = ["Santos", "Atlante", "Pachuca", "Monterrey",
"Puebla", "Indios", "Chivas", "Cruz Azul",
"Pumas", "Morelia", "America", "Tecos",
"Toluca", "San Luis", "Jaguares", "Necaxa",
"Atlas", "Tigres"]

elejido = random.randint(0,18)

print "Tu le iras ahora a: " + equipos[elejido]

Y con ayuda de millan lo pasamos a visual basic XD y asi quedó:

Dim equipos As String() = {"Santos", "Atlante", "Pachuca", "Monterrey", "Puebla", "Indios", "Chivas", "Cruz Azul", "Pumas", "Morelia", "America", "Tecos", "Toluca", "San Luis", "Jaguares", "Necaxa", "Atlas", "Tigres"}
Dim Num As Double
Dim Cadena As String

Randomize()
Num = Rnd()
Cadena = "45"


While (Convert.ToInt32(Cadena) >= 18)
Randomize()
Num = Rnd()
Cadena = Num.ToString().Substring(2, 2)
End While



Console.WriteLine("Tú le iras a: " + equipos(Convert.ToInt32(Cadena)).ToString())
Console.ReadLine()

Y pos m salió el cruz azul :(

In:

I don't wanna feel =(

Kiubo razaa, saludos a toda la prole, y pos ya no había publicado entradas por weva, o por falta de time y eso que según yo stoy de vagaciones... en fin por suerte tengo vida social y no soy un puto ñoño y pos por eso no tengo tiempo, m la paso de pedote o dando el rol con los camaradas jejeje pero en fin, de repente si me sale lo frikki hahaha eso lo acepto pero ps eso que no, y weno e pensado mucho muchoooote estos dias, no es muy común que ponga a trabajar a mi cerebruto así jeje pero esta vez el momento lo amerita, ya que m han pasado cossas no muy agradables...
No puedo detallarles porque no me gustaría mencionar nombres ni mucho menos actos, solo quiero expresar sentimientos, y valla que me han puesto a patinar el coco, hay ciertas actitudes que no comprendo, en si TODAS pero para ser mas preciso no entiendo porque en algún momento me hace sentir de alguna manera digamos no especial pero si agradable, si despues m va a hundir con tan solo un par de palabras, valla no puedo exigir nada ni mucho menos reclamar ya que no estoy en la posición para hacerlo pero al menos si puedo hacer la petición de que deje de hacerlo, más no lo hago! que ironia, pareciera como si yo quiziera que todo estuviese en su lugar, como si todo siguera como si nada pero solo para esa persona y no para mi...
En fin ni en esta narración puedo desplayarme, no tengo las palabras y no a crecido mucho mi vocabulario, creo que tendré que seguir leyendo mas....
Solo de esa manera crecen mis conocimientos y mi léxico.