[TUTORIAL] SAP Scripting: Recorrer Listas/Contenedores y obtener sus valores
Вставка
- Опубліковано 15 вер 2024
- ¿Necesitas recorrer un listado de datos en SAP para obtener sus valores y no sabes cómo? ¡Entonces este vídeo es para vos!
Acompáñame durante estos minutos donde te cuento como poder realizar un recorrido sobre un listado de datos, obtener sus valores, interactuar con los mismos y muchas cosas interesantes más.
🔹 Personal webpage:
www.alejandrof...
🔹 LinkedIn:
/ alejandrofranzonig
🔹 Twitter:
/ alefranzonidgk
🔹 Instagram:
/ alefranzoni
☕ ¿Estás disfrutando de este contenido? ¡Podés ayudarme mucho a seguir creando este tipo de contenido invitándome un cafecito! Si residís fuera de la Argentina, también podés apoyarme mediante PayPal.
cafecito.app/a...
www.paypal.com...
Sos grande. Me han sido muy útiles tus guías.
Muchas gracias!
Hola Ale, me has ayudado mucho con todas tus lecciones de SAP. Se entiende a la perfección. Por favor, sigue así
Muchas gracias Jesús por tu comentario, me alegro mucho que te hayan sido de ayuda mis videos. Sí, la idea es seguir compartiendo con ustedes más sobre este contenido tan interesante en cuanto el tiempo me lo vaya permitiendo. Así que en cualquier momento, se vienen nuevos videos!
Me ha servido mucho tu contenido, espero que sigas subiendo más videos de este tipo. Me has ayudado mucho, gracias!!
¡Muchas gracias por tu comentario! Estaré haciendo todo lo posible para poder traerles más contenido.
Muchas gracias por compartir, he aprendido mucho
Con mucho gusto, gracias a vos por comentar!
Gracias genio por los videos, me sirven un montón para simplificar la documentación del SAP!!
Gracias por el comentario Lucas, me alegro de que te sirvan. Saludos!
Justo el que necesito, muchas gracias Ale!!!
Me alegro mucho que te sea útil Héctor! Saludos.
Hola Ale, contenido excepcional!
¡Muchas gracias!
Muy geniales tus videos Ale, excelente la explicación y superútil, tengo una consulta, necesito pegar un rango de datos de excel en SAP para que solo me traiga la información correspondiente a esos datos, algo así como un filtro, de qué modo podría hacerlo?
Muchas gracias, me alegro mucho que te sean de utilidad 🙌🏻. Sobre tu consulta, en que transacción necesitas hacer lo que me comentas? Así puedo guiarte mejor. Saludos.
Gracias por la enseñanza, estoy aprendiendo muchísimo, te lo agradezco. Pregunta: usted sabe de casualidad por qué la función “GetCellValue” no me la reconoce como una función sino como un texto regular y por ende me genera un error? Gracias de nuevo
Me alegro mucho de que estés aprendiendo y te estén siendo de ayuda los videos. ¿Estás usándola correctamente, es decir, sobre una tabla? Puedes dejarme tu porción de código que está fallando y lo vemos. Saludos.
buenas tardes, por favor me puedes ayudar indicandome como traer el texto explicativo de una orden, desde la CO03
Hola Luis, cómo estás? Vos te referís a traer el texto de la cabecera de la orden, es decir, la descripción corta? O a traer el texto explicativo (texto largo) que se puede ver haciendo doble clic sobre este texto corto?
Saludos.
@@alefranzoni Buenos días, si señor traer el texto largo al darle click en texto explicativo
@@LuisfernandoMontoyaMorales Perfecto Luis, gracias por la confirmación. Te comento que como habrás podido apreciar, no hay una forma directa de extraer este texto y además, dependiendo de cada usuario y su instalación de SAP, puede que este texto sea mostrado de diferente manera (dependiendo del editor de texto usado por la instalación de SAP) para cada uno de ellos. Por lo tanto, si queremos hacer una automatización lo más flexible posible, tenemos que recurrir a otros métodos un poco más engorrosos, pero más seguros.
Me llevo este tema para armar un video en estos días, ya que explicarlo por este medio sería mucho y posiblemente tampoco nos entenderíamos bien.
En breve estaré subiendo un video sobre este tópico para que puedas ver el paso a paso de como realizarlo.
Saludos.
@@alefranzoni excelente mi hermano, estaré muy pendiente a sus videos muchas gracias excelente energía!!
Hola Ale....mil y mil gracias...me has ayudado mucho con tus clases...en este momento estoy luchando con la tabla que hay en la transacción cl20n...necesito que solo me traiga una característica específica pero no me sale como tú me indicas como grid... necesito tu ayuda por favor 🙏
Hola Mary, primero que nada gracias a vos por tu comentario. En cuanto a lo que me consultas, necesitaría que me dieras un poco más de detalle para poder ayudarte porque ahora mismo no tengo acceso a esa transacción. Qué es lo que no te funciona? No te trae el valor que vos querés, te trae uno erróneo, o que es lo que está pasando?
Excelente.
Hola maestro Ale, que buen contenido haces crack plox sigue subiendo contenido…🙌
También aprovechó para consultar si sabes cómo puedo controlar si mi listado me devolverá resultados o no? hay veces que el parámetro que envío no me devuelve valores y si esa es la condición debo ingresar a otra transacción para su registro.
Saludos desde 🇲🇽
Hola Israel, muchas gracias por tu comentario, próximamente se viene más contenido. En cuanto a la consulta que me haces, es bastante sencillo, solo tienes que agregar una condición para hacer algo al respecto con el valor que te podría llegar a venir vacío, por ejemplo, supongamos que estoy recorriendo un bucle for (como en el video) y estoy intentando obtener los valores de la descripción (KTEXT), entonces la comprobación sería:
For i = 0 To row_count
' Compruebo si me viene vacio
If tbl.GetCellValue(CInt(i), "KTEXT") = vbNullString Then
' Hago algo si esta vacío
Else
' Hago otra cosa si tiene contenido
End If
Next
Con eso debería bastar. Obviamente, es un ejemplo sencillo, tú tendrás que adaptarlo para tu caso particular.
Saludos hacía México!
Hola Ale, que bueno que encontre tus videos me sirven mucho para mejorar. Ahora te consulto porque no logro capturar informacion en un flujo de documentos. Estoy dentro de vf03 -> visualizar flujo de documentos... uso el boton find pero no logro desplazarme o hacer q seleccione lo que busco, solo lo cambia de color y nada mas pasa. Segui tus indicaciones pero no permite en esa parte el F1 o click derecho. Si el doble click
en la columna seria:
session.findById("wnd[0]/usr/shell/shellcont[1]/shell[1]").pressHeader "HierarchyHeader"
doble click seria:
session.findById("wnd[0]/usr/shell/shellcont[1]/shell[1]").ensureVisibleHorizontalItem " 8","&Hierarchy"
como debo seguir? en la ayuda no supe como buscar... es un shell... un shellcont[n]?
discuplas si me extendi mucho soy nuevo en est. gracias por tus videos
Hola Diego, me alegro mucho de que te estén sirviendo los videos. Mira, tengo acceso a la transacción, pero en el entorno donde realizo todas las pruebas no tengo ningún documento creado para poder visualizar el flujo. Si podes envíame una captura de pantalla a mi correo para poder ver exactamente que es lo que estás viendo y poder darte una mano.
Saludos.
Hola Franzoni!
Estoy teniendo problemas con un script el cual no puedo recorrer sus filas de forma dinamica, pues al intentar pasarle el valor de la fila mediante una variable me envia un error de ejecucion que no encuentra el objeto mediante el FindByID, luego intente agregarle el CInt(i) y pense que quizas eso solucionaria el problema y nada. Sigue arrojandome el mismo error. Si dejo estatico la referencia a las filas en script corre sin problema pero eso dejaria poco flexible la automarizacion.
No se si el error se deba a que quizas no es un listado o tabla de lectura de datos, mas bien en como un contenedor para imputar datos, la transaccion es ME21N para crear pedidos quizas la conozcas.
Hola, probablemente te pase porque si guardas la referencia de la tabla como un objeto no funciona. Lo que tenés que hacer es guardar el nombre de la tabla como string y concatenar la columna que querés obtener.
Te dejo un ejemplo que te arme muy rapidamente para obtener el nombre lo de los materiales de la tabla que esta en la transacción que mencionas.
🔰 *EJEMPLO*
tableName = "wnd[0]/usr/subSUB0:SAPLMEGUI:0013/subSUB2:SAPLMEVIEWS:1100/subSUB2:SAPLMEVIEWS:1200/subSUB1:SAPLMEGUI:1211/tblSAPLMEGUITC_1211"
'Obtengo los primeros tres nombres materiales
For i = 0 To 2
'Formato: [ColNumber, Row]
msgbox session.findbyid(tableName & "/ctxtMEPO1211-EMATN[4," & cint(i) & "]").Text
Next
Espero que te sirva,
Saludos.
Excelente video. Una pregunta como extraer si la tabla es tipo estructura.?
Gracias por tu comentario. Con estructura te referís a las de tipo "árbol"? En que transacción se pueden encontrar este tipo de tablas que me mencionas? Para poder ubicarme y responderte mejor.
Saludos.
Hola, excelente tu video, pregunta, tengo una lista, de 350 líneas (registros), estoy recorriendo la lista, pero solo saca los primero 82 registros, aunque el Rowcount indica los 350 registros, como podría obtener todos esos datos. Gracias.
Hola Miguel, muchas gracias por tu comentario. En cuanto a tu consulta seguramente lo que está pasando es que el listado que estás recorriendo pinta solo los registros que están visibles en pantalla. Por lo tanto, si probas con la propiedad *.visibleRowCount* vas a ver qué te devuelve el número de registros mostrados en pantalla, en este caso, supongo que sería 82. Para recorrer todos lo que vas a tener que hacer es hacer uso del scroll, y una vez que cambies de posición, volver a recorrer los índices, ya que estos no cambian, sino que actualizan su contenido. Es decir, si en la posición 1 había cierto valor, al hacer scroll ya la posición 1 tendrá otro.
Con una combinación del RowCount, visibleRowCount y el scroll es que se recorren esos listados. Se que suena complejo, pero si no te quedó muy claro no te preocupes que en breve estaré subiendo un vídeo en el cual explico y muestro esto en detalle.
Saludos.
Muy bueno el tutorial, lo que faltó fue pegar esa tabla en una pestaña “Xx” de un Excel existente, me ayudas??😊
Gracias por tu comentario. Para pegar la tabla/valor en un Excel, primero deberías portar el script a Excel para hacerlo más sencillo y ejecutarlo desde ahí mismo. Luego, sencillamente cuando lees la información deseada, por ejemplo con GetCellValue, en lugar de solo imprimirla (MsgBox) debes colocar ese valor en la planilla en la celda que quieras (ThisWorkbook.Sheets(x).Range("A1") = GetCellValue[...]).
Gracias!@@alefranzoni
@alefranzoni jajajaj me tira error, mira esto tengo.
hago toda la conexion y puedo visualizar los datos en la ventana inmediato.
hago el ciclo pero no funciona
ingreso a iw29 y por criterio saco un listado el cual despues quier pasar a una hoja de excel llamada IW29, todo bien hasta el ciclo for.
QMNUN es el nombre de la primera fila
i as integer
For i = 0 To session.findById("wnd[0]/usr/cntlGRID1/shellcont/shell").RowCount
session.findById("wnd[0]/usr/cntlGRID1/shellcont/shell").GetCellValue(i, "QMNUM").ThisWorkbook.Sheets("iw29").Range("A1")
Next i
aca me sale otra duda del "session.findById("wnd[0]/usr/cntlGRID1/shellcont/shell").RowCount ", en tu video lo declaras como variable TBL pero yo lo hago en excel pero me da error, por eso en el por lo pongo completo.
como declaro la variable en excel ?
saludos
Hola ale necesito un favor tengo está variable de sap sesión.findByid("wnd[0]/usr/tblsaplkobstc_rules) pero no sé cómo moverme por las filas y columnas si me puedes decir algo te lo agradecería muchisimo el tipo de está variable es GuitableColumn estoy haciendo en VBA
Hola, necesitaría saber en qué transacción o transacciones aparece esa tabla, así puedo observarla y orientarte mejor en tu duda. Saludos.
Hola ale, la transacción por la que me toca entrar es CJ20N hay debo abrir un proyecto, y posteriormente en la parte superior me toca buscar en una pestaña que diga costes y liquidación de costes. Esa es la tabla a manipular.
Hola Carlos, lamentablemente con los datos que tengo en mi base para hacer las pruebas no puedo reproducir el escenario para darte una respuesta concreta, pero sí puedo orientarte.
Si te fijas en la docu oficial para ese objeto, vas a ver que el mismo tiene 2 metodos (ElementAt e Item) y una propiedad que te puede ayudar (Count).
La propiedad te va a dar la cantidad de celdas en la columna en cuestión, y luego, con alguno de los dos metodos nombrados y pasandole el index (que va desde 0 hasta objeto.Count - 1, donde objeto es la columna en cuestión) vas a poder obtener sus valores. Te dejo unos ejemplos con la tabla que me diste:
Dim col as object
Set col = session.findByid("wnd[0]/usr/tblsaplkobstc_rules)
'Primer valor de la columna
MsgBox col.ElementAt(0).Name
MsgBox col.Item(0).Name
'Segundo valor de la columna
MsgBox col.ElementAt(0).Name
MsgBox col.Item(0).Name
Tendrás que ir jugando con eso a ver si te sirve, también te dejo la docu para que puedas ver en profundidad:
help.sap.com/docs/sap_gui_for_windows/b47d018c3b9b45e897faf66a6c0885a8/41e99a52ef504cebbd8a7e7a7b7d4c2f.html?q=GuitableColumn%20
Saludos!
@@alefranzoni muchas gracias Ale voy. Aprobar y te cuento gracias por la luz que me das
maestro!!
¡Muchas gracias por tu comentario Alonso!
¡Hola, Ale! ¡Excelente tu contenido! Me ha servido muchísimo para implementar varias soluciones de automatización en SAP.
Quería aprovechar en consultarte algo... Estoy intentando obtener el número de filas en una tabla particular de SAP, pero no lo consigo y no comprendo qué podría estar mal. La línea de código es la siguiente:
session.findById("wnd[0]/usr/sub:SAPMV13A:3007/txtLV13F-VAKEY[0]").RowCount
La tabla es LV23F y se encuentra en la transacción VBO2.
Espero puedas ayudarme. ¡Gracias de antemano!
Hola Flavio, cómo estás? Primero que nada, muchas gracias por tu comentario, me alegro de que te estén sirviendo los videos y hayas podido implementar este tipo de soluciones. En cuanto a tu consulta, lo que está pasando es que no estás apuntando a la tabla, sino a un elemento de la misma, *txtLV13F[...]* es un objeto que está contenido dentro de la tabla y por eso te está fallando. Por lo tanto, para obtener el número de columnas correctamente, deberías llamar al método de la siguiente manera:
session.findById("wnd[0]/usr/sub:SAPMV13A:3007").RowCount
Con ese cambio ya debería funcionarte 🙌🏻. Espero haberte podido ayudar,
Saludos.
@@alefranzoni gracias por la sugerencia 🙌🏻. Te cuento que no me funcionó... 😶 Al final opté por emplear un bucle Do While para recorrer los registros de la tabla empleando un contador. Para poder salir del bucle utilicé la instrucción On Error GoTo, ya que entiendo que el único error que debería aparecer es cuando el contador de registros de la tabla se desfasa. 😅
@@flaviogarcia9012 Qué raro... Le debemos estar errando a la referencia de la tabla, claramente. Pero de todas maneras me alegro mucho que lo hayas podido solucionar de esa manera, que es totalmente válida, por supuesto. Un saludo, Flavio!
Podrias hacer un ejémplo se como llenar migo desde un libro excel y que se vaya llenando por ejemplo sku, cantidad y almacen para una baja de mercancia y que se vaya generando el bucle para que se vaya desplazando hasta que se llene todo el excel en sap, he intentado pero no lo he logrado 😅
Hola Jesus, ¿cómo estás? Para hacer que se llene todo desde Excel a SAP es bastante sencillo. Deberías en primer lugar grabar un script que haga todo el proceso necesario con un solo material. Una vez hecho eso, en Excel completas una lista con todos los datos que querés que el script reproduzca. Lo próximo es, mediante un bucle For Each, recorrer todo el rango que tengas de información y para cada iteración ir ejecutando tu grabación, pero reemplazando los datos estáticos por los que estés recorriendo. Con eso y unas pocas modificaciones en el script debería funcionar perfectamente.
Saludos.
@@alefranzoni buenos días, muchas gracias así si me funciono pero lo que pasa es que me gustaría hacerlo masivo no importa que yo no lo grabe y me permita revisar el número de filas capturadas antes de darle enter, es que yo comparto un solo documento para que se me autoriza el scrap, no se si hay manera de hacerlo con dos bucles uno en sap y otro en excel?
@@jesusdominguez3594 La verdad que no termine de entender exactamente que es lo que queres hacer. Me podrías volver a explicar con un poco más de detalle? Para poder ayudarte mejor.
Hola como ago si la opción para agrandar la letra esta oculta
Hola, ¿a qué opción para agrandar la letra te referís? Saludos.
Buenos videos, tengo un problema no sé si puedes ayudarme, tengo una transacción en SAP dónde hay una tabla y esa tabla tienen campos vacíos que al hacer click Se abre otra tabla para seleccionar valores, esa tabla necesito extraer los valores para automatizar y no me funciona el método ya que no se puede ver la información técnica de esa tabla. Podría mandarte esa explicación por Whatsapp? para que me entiendas mejor?
Muchas gracias por tu comentario Ramiro. Si te parece mándame por correo o por cualquiera de mis redes y hablamos por dicho medio. Pero, de todas maneras, creo haber entendido el problema y es que no podés capturar la info de la segunda tabla que se abre por no tener como acceder a la info técnica. Ahí podés probar dos cosas; *1)* Parado en alguno de los campos/columnas, podés presionar F1, que es el atajo para abrir los detalles técnicos, si no, *2)* podes directamente hacer, por ejemplo, clic derecho sobre algún header, columna, o lo que sea y ver que es lo que graba el script y basarte en eso 😉. De todas maneras, si querés escribirme por donde te comente para hablar mejor, no hay drama. Saludos.
Ale como es posible confirmar múltiples OT por medio de este medio
Hola Thyago, cómo estás? A qué te referís con _confirmar múltiples_ OT? Dame un poco más de detalles para poder ayudarte con tu duda 🙌🏻
Hola Ale, como puedo hacer esto de recorrer la lista para conocer el numero de filas que contiene para las pantallas de Sap que no te deja seleccionar la columna el tema lo tengo en la transaccion C203 e intentado conocer el numero de registros o mediante do while "" = sesion.FINDBY("wnd[0]/tabsTABSTRIP_RECIPIE/tabVoue/ssubSUBCREEN_RECIPIE:SAPLCPDI:4401/tblSAPLCPDITCTRL_4401/ctxplpod-werks[33, C].text
pero no me funciona y donde puedo conocer mas acerca de la programacion de sap o tienes algun curso q impartas en alguna plataforma estaria excelente en UDEMY.
Excelente video y gracias por compartir
Saludos.
Hola Jose, cómo estás? Discúlpame que no te conteste antes, pero no había visto tu comentario. Ahora, en cuanto a lo que me consultas sobre conocer el número de filas de tu contenedor, al no poder acceder a esa transacción no estoy seguro del tipo de contenedor o tabla que sea, pero podrías probar lo siguiente a ver si te funciona:
⬇️ Primero, corrijo tu línea, como debería ser para funcionar
session.FindById("wnd[0]/tabsTABSTRIP_RECIPIE/tabVoue/ssubSUBCREEN_RECIPIE:SAPLCPDI:4401/tblSAPLCPDITCTRL_4401/ctxplpod-werks[rowNumber, colNumber]").Text
⬇️ Con la siguiente línea deberías obtener el número de filas existentes en tu tabla
session.FindById("wnd[0]/tabsTABSTRIP_RECIPIE/tabVoue/ssubSUBCREEN_RECIPIE:SAPLCPDI:4401/tblSAPLCPDITCTRL_4401").RowCount
⬇️ Con la siguiente línea deberías obtener el número de filas existentes en tu tabla
session.FindById("wnd[0]/tabsTABSTRIP_RECIPIE/tabVoue/ssubSUBCREEN_RECIPIE:SAPLCPDI:4401/tblSAPLCPDITCTRL_4401").VisibleRowCount
⬇️ Con la siguiente línea deberías poder consultar el valor almacenado en las coordenadas dadas
Set rowComponent = session.FindById("wnd[0]/tabsTABSTRIP_RECIPIE/tabVoue/ssubSUBCREEN_RECIPIE:SAPLCPDI:4401/tblSAPLCPDITCTRL_4401").GetCell(rowNumber, colNumber)
rowComponen.Text
⬇️ Con la siguiente línea deberías poder consultar el valor almacenado en las coordenadas dadas, si el método anterior no funciono
session.FindById("wnd[0]/tabsTABSTRIP_RECIPIE/tabVoue/ssubSUBCREEN_RECIPIE:SAPLCPDI:4401/tblSAPLCPDITCTRL_4401").GetCellValue(rowNumber, "AUFNR")
En este último método tenes que pasarle en lugar del número de columna, su nombre, en este caso le puse como ejemplo *AUFNR* que es el nombre identificatorio de “orden”.
Puedes jugar con estos comandos y ver si alguno te sirve y me comentas 😉.
Por último, para aprender más sobre este tema te recomiendo siempre ver la documentación oficial (bit.ly/ScriptingDocumentation). Es donde vas a poder ver los métodos y propiedades de todos los componentes, te va a servir mucho. También comentarte que por ahora no tengo ningún curso, aparte de lo que subo aquí, en ninguna plataforma. De todas maneras, estoy totalmente abierto a escuchar propuestas sobre que temas les gustaría que se toquen en el canal para próximos videos.
Muchas gracias por pasarte y por tu comentario, estamos en contacto.
Saludos.