Como realizar un Select con SUM en ABAP En este post nos vamos a centrar en como realizar desde código ABAP un select a una tabla de SAP usando SUM, este post está contenido en nuestro curso programador – analista ABAP IV para SAP, el cual puedes consultar pinchando aqui. Algunas veces debemos hacer consultas a tablas para obtener la suma de campos númericos, en especifico los referidos a campos monetarios y cantidades, pero ¿cómo realizamos dicha consulta? pues para explicarlo aplicaremos un ejemplo: Al igual que con los comandos de SQL, vamos a realizar un SELECT con el empleo del comando SUM, el cual permite sumar todos los valores del campo indicado, siguiendo las condiciones puestas y guardándolo en una variable. Como ejemplo tenemos lo siguiente: SELECT SUM( hwbas ), SUM( hwste ) INTO (lv_hwbas, lv_hwste) FROM BSET WHERE bukrs = p_bukrs AND gjahr = p_gjahr. Podemos apreciar que en el ejemplo vamos a sumar 2 campos de la tabla BSET, para lo cual se han colocado como filtros la sociedad y el año, automáticamente el programa sumará los datos que cumplan con la consulta y devolverá dichos valores en las 2 variables que se encuentran dentro de los paréntesis (lv_hwbas, lv_hwste). Si te ha gustado este articulo recuerda compartirlo para que llegue al mayor número de interesados!! Cómo utilizar Excel VBA para imprimir Millones de propietarios de pequeñas empresas y emprendedores de todo el mundo utilizan Microsoft Excel para ayudar con las tareas comunes de contabilidad, previsión e inventario. Con las herramientas integradas de Excel, es relativamente simple enviar una hoja de cálculo o un cuadernillo de trabajo a alguien en un correo electrónico como archivo adjunto. Sin embargo, hay muchas veces que nada supera una copia con la información. Por supuesto, puedes usar la opción del menú “Archivo | Imprimir” en la barra de cinta para crear versiones impresas de la hoja de cálculo. Sin embargo, mediante el uso de Visual Basic para Aplicaciones o VBA, también puedes crear macros o botones de comando para realizar diversas tareas de impresión en Excel mucho más rápido y más eficientemente. Activa la pestaña Programador 1. Inicia Microsoft Excel y abre el libro o plantilla en la que deseas programar funciones de impresión con VBA. Haz clic en “Archivo” en la cinta de Excel y luego en “Opciones”. 2. Localiza y haz clic en el encabezamiento “Personalizar cinta de opciones” en el panel izquierdo de la ventana “Opciones de Excel”. Haz clic en la casilla de verificación junto a “Programador” en la sección de Pestañas principales bajo la etiqueta “Personalizar la cinta de opciones”. 3. Haz clic en el botón “Aceptar” para activar la pestaña “Programador” de la cinta y cerrar la ventana “Opciones de Excel”. Después de hacerlo Excel mostrará la pestaña “Programador” en la cinta de forma automática. Crea un botón de impresión con VBA 1. Haz clic en la pestaña “Programador” de la cinta. Haz clic en el icono “Insertar” de la flecha hacia abajo en la sección de “Controles” de la pestaña “Programador”. Oprime el icono “Botón de control” bajo “Controles de formulario”. 2. Haz clic en la celda de la hoja de cálculo en la que deseas colocar un botón de impresión. Después de hacer clic selecciona una celda, la ventana “Asignar macro” aparecerá automáticamente. 3. Ingresa “PrintCurrentSheet” o algo similar en el campo “Nombre de macro”. No uses espacios en el nombre. Haz clic en botón “Nuevo”. La ventana del editor de Visual Basic para Aplicaciones aparecerá y mostrará una nueva ventana de código. 4. Coloca el cursor del ratón en la línea de espacio entre los valores “PrintCurrentSheet Sub ()” y “End Sub”. Escribe el siguiente comando: ActiveSheet.PrintOut 5. Haz clic en el icono de disquete en la barra de herramientas del editor de VBA para guardar el código. Cierra la ventana del editor de VBA. 6. Haz clic con el botón derecho sobre el nuevo botón de comando y resalta el valor de texto predeterminado “Botón 1”. Cambia el texto de la etiqueta del botón a “Impresión rápida” u otro nombre descriptivo. 7. Haz clic en el botón nuevo de comando. Excel imprime la hoja de cálculo activa en la impresora predeterminada de Windows sin mostrar el cuadro de diálogo “Imprimir” normal. Cómo depurar código Python con PyScripter En este post vamos a daros las claves para aprovechar el uso de PyScripter como editor de código de Python para ArcGIS, tanto para escribir código como para la detección y corrección de errores de programación. Ventajas de usar PyScripter Utiliza diferentes colores, indenta y comenta el código de modo rápido, subraya una palabra determinada, busca y reemplaza, etc. Es personalizable: colores, plantillas, fragmentos completos de código, etc. Tiene predicción de código fuente, que agiliza nuestro trabajo y evita que cometamos errores de escritura. Las ventanas del IDE y de depuración, entre las que destacamos la ventana de Variables y la ventana Intérprete ayudan durante la ejecución del script al seguimiento del código. La utilización de un IDE como PyScripter facilita el trabajo y reduce la posibilidad de introducir errores en nuestros programas. Aún así cometeremos fallos, sobre todo al principio, que es cuando precisamente más nos van a entorpecer. ¿Cómo reparar nuestros errores? Un 50% del error se soluciona cuando descubrimos DONDE ESTÁ EL ERROR. El otro 50% se soluciona cuando descubrimos POR QUÉ SE HA PRODUCIDO EL ERROR. Respecto al primer punto, para localizar el error debemos aprender a DEPURAR EL CÓDIGO. PyScripter cuenta con una barra de herramientas de depuración: Depurar código: Opción 1 –> ejecutando línea por línea: usaremos esta opción cuando creamos saber dónde está el error, para parar en ese punto y examinar el comportamiento del programa, los valores que adoptan las variables, etc. 1.1 Situando el cursor en la línea del script en la que queremos interrumpir la ejecución automática y pulsando la flecha azul “Ejecutar hasta el cursor” o F4. A partir del punto de interrupción cada línea de código se ejecutará cuando el usuario pulse el icono “Avanzar hasta la siguiente línea” o F8, de este modo localizamos la sentencia que falla y los valores que el programa está interpretando. 1.2 Fijando nuestros puntos de interruptor con el círculo rojo “Conmutar punto de parada” o F5 sobre cada línea en la que queramos conmutar parada y pulsando la flechita verde con bicho“Depurar” o F9. Depurar código: Opción 2 –> ejecutando fragmentos de código: utilizaremos esta opción cuando sabemos que el programa funciona antes de haber incluido nuevas sentencias, y queremos comprobar el funcionamiento de las mismas sin tener que ejecutar para ello el script completo. Resaltando las líneas que nos interesan y pulsando Ctl+F7, o con botón derecho Source Code/Ejecutar Selección. ¿Cómo capturar los errores? En cuanto a la segunda cuestión: porqué ha fallado nuestro programa, podemos “capturar el error” y mostrarlo en la ventana Intérprete de PyScripter. Para ello tendremos que utilizar la estructura try & except . Con esta estructura el programa intenta (try) ejecutar todo el código que se encuentre indentado dentro del bloque try:. Si se produce un fallo, el código se dirige al bloque except: en el que se mostrará el mensaje de error generado. ¿Cuales son los errores más típicos y cómo se interpretan? El siguiente listado muestra los errores más típicos y el mensaje de error que muestra la ventana intérprete: 1.- Case Sensitive: Python diferencia las mayúsculas y minúsculas. Ojo con darle un nombre a una variable y pretender usarla llamándola de otro modo. El mensaje de error que se genera depende del la palabra en la que se encuentre la confusión: si se trata del nombre de una capa o de una ruta, el mensaje mostrado nos dirá que no existe dicha capa o que no se localiza: “Input Features: xxx.shp does not exist or is not supported”. Puede incluso no generarse ningún error, pero no darnos la respuesta que queremos. 2.- Indentación: en Python cada bloque de código debe ir sangrado para que el intérprete lo identifique y diferencie. Los fallos de indentación detectados quedan marcados en rojo, además si intentamos ejecutar el script se mostrará el mensaje “IndentationError: expected an indented block”. Ojo, puede que el código funcione, pero una frase mal indentada puede cambiar el curso del programa y su resultado. 3.- Importación de módulos. Antes de trabajar con alguna herramienta de una librería específica debemos importar esta librería. En nuestro caso, si queremos trabajar con la ArcPy para ArcGIS debemos incluir al principio del programa un “import ArcPy” El mensaje de error que nos da en caso de no haber importado la Arcpy es “name ‘arcpy’ is not defined” 4.-Símbolo de igualdad y símbolo de asignación de valor. Cuando Python quiere darle un valor a una variable lo hace a través del símbolo “=”. Cuando queremos comprobar si un valor es igual a otro utilizaremos el símbolo “==”. El mensaje de error en una sentencia como “if coordX = 3500:” será “SyntaxError: invalid syntax”. 5.- Condiciones y bucles mal construidos. Además de la indentación del código, estas construcciones requieren que la primera frase finalice con el símbolo “:”. El mensaje de error en una sentencia como “if coordX = =3500” será igualmente “SyntaxError: invalid syntax”. La sentencia correcta es: if coordX = =3500: coordY = 47000 6.- Incorrecta definición de una ruta. En Python la contrabarra “\” forma parte de sentencias clave como “\n” (nueva línea) o “\t” (tabulador). Una ruta debe precederse de la letra “r” o sustituir el símbolo “\” por “\\” o por “/”. Ojo además con los acentos, los espacios en blanco y las mayúsculas y minúsculas. El mensaje de error puede ser si se trata de la ubicación de una capa Features: “Input xxx.shp does not exist or is not supported”, o si se trata de la identificación de un espacio de trabajo, en cuyo caso, puede tomar un valor como nulo y por tanto no localizar los datos de ese workspace. 7.- Parámetros mal introducidos: en número o en orden. Centrándonos en el uso de herramientas de ArcGIS, aunque también es un error típico de otro tipo de funciones, debemos saber qué argumentos requiere cada herramienta, de qué tipo son y en qué orden deben introducirse. El mensaje de error que se genera en este caso es “Failed to execute. Parameters are not valid.” Si te ha gustado nuestro post de hoy compártelo y ayúdanos a seguir, muchas gracias!! Mini tutorial sobre SOAP. Simple Object Access Protocol En nuestro artículo de hoy desde AEPI (Asociacion Española de Programadores Informáticos) os presentamos un pequeño tutorial sobre SOAP, este artículo forma parte de nuestro curso de PHP avanzado y MYSQL Es un protocolo que permite la comunicación entre aplicaciones a través de mensajes por medio de Internet. Es independiente de la plataforma, y del lenguaje. Esta basado en XML y es la base principal de los Web Services. Los mensajes SOAP son documento XML propiamente dicho, pero esto lo veremos más adelante cuando veamos un ejemplo de un mensaje SOAP. Veamos como es la estructura básica del protocolo y la correspondiente explicación: <?xml version=”1.0″?> <soap:Envelope xmlns:soap=”http://www.w3.org/2001/12/soap-envelope” Soap:encodingStyle=”http://www.w3.org/2001/12/soap-encoding”> <soap:Header> … </soap:Header> <soap:Body> … <soap:Fault> … </soap:Fault> </soap:Body> </soap:Envelope> Explicación del código anterior: <?xml version=”1.0″?> Como podemos ver en esta linea SOAP es un documento XML, y como tal, debe comenzar con el tag <?xml….?> y la versión correspondiente. <soap:Envelope Aquí se indica que comienza el envelope (sobre) del mensaje xmlns:soap = “http://www.w3.org/2001/12/soap-envelope” Un mensaje SOAP debe contener siempre un elemento envelope asociado con el namespace (espacio de nombres)http://www.w3.org/2001/12/soap-envelope Soap:encodingStyle=”http://ww w.w3.org/2001/12/soap-encoding”> En esta línea lo que se hace es indicar donde se encuentran definidos los tipos de datos utilizados en el documento. <soap:Header> Esta línea indica el comienzo del Header (encabezado). En esta sección se incluye información específica del mensaje, como puede ser la autenticación. </soap:Header> Como todo documento XML los tags que son abiertos deben ser cerrados, esta línea indica la finalización del Header(encabezado). <soap:Body> Aquí comienza el cuerpo del mensaje, en esta sección se incorpora toda la información necesaria para el nodo final. Por ejemplo, los parámetros para la ejecución, o la respuesta a una petición. <soap:Fault> Cualquier tipo de fallo que se produzca será notificado en esta sección. La cual esta contenida dentro del cuerpo del mensaje. </soap:Fault> Cierre de la sección Fault. </soap:Body> Indica el final del cuerpo del mensaje. </soap:Envelope> Fin del mensaje SOAP. Como diría aquel eso es todo amigos, si te ha gustado este artículo compártelo por favor y recuerda seguir leyéndonos!! Como usar una base de datos MySQL desde Android Si por alguna razón necesitamos conectarnos a un servidor MySQL desde nuestra aplicación Android, lo más aconsejable y seguro es utilizar un archivo PHP alojado en el servidor en cuestión que acceda a la base de datos y devuelva la información a la aplicación, por ejemplo en JSON u otro formato similar. Si no podemos hacer esto, tenemos la opción de utilizar un driver JDBC, como hariamos en una aplicación java. Para ello seguiremos los siguientes pasos: Descargamos el driver desde aquí: http://dev.mysql.com/downloads/connector/j/3.0.html Creamos en nuestro proyecto una carpeta llamada “libs”. Descomprimimos el archivo indicado y lo copiamos en la carpeta libs. Añadimos el jar al build Path, para ello: Clic derecho en el proyecto > Build Path >Configure Build Path Pestaña Libraries > Add JAR Busca la carpeta libs y selecciona el archivo Jar. Una vez está el driver listo, pasamos a la parte de programación. Como sabemos, Android obliga a hacer las operaciones de acceso a red en un hilo independiente, por tanto debemos elegir una de las formas habituales de crear un nuevo hilo. Por ejemplo, con un AsynkTask. En ese caso añadiríamos este código al método doInBackground. private static final String url = “jdbc:mysql://{URL_SERVER}/{BASE_DATOS}”; private static final String user = “usuario”; private static final String password = “contraseña”; int count = 0; try { //con esto nos aseguramos de que se crean los recursos estaticos necesarios Class.forName(“com.mysql.jdbc.Driver”).newInstance(); Connection con = DriverManager.getConnection(url, user, password); Statement st = con.createStatement(); ResultSet rs = st.executeQuery(“QUERY A EJECUTAR”); while (rs.next()) { publishProgress(++count); // Terminar lo antes posible si se ha llamadao al cancel() del asynctask if (isCancelled()) { break; } } catch (Exception e) { e.printStackTrace(); } } Espero que os sea de utilidad este post, si es así compartid por favor y nos vemos en el próximo.