tag:blogger.com,1999:blog-64290801202117697252024-03-12T22:10:57.064-03:00Blog SisteParBlog sobre programación, tecnologías y TI en general.Roberthttp://www.blogger.com/profile/14895827793936030496noreply@blogger.comBlogger36125tag:blogger.com,1999:blog-6429080120211769725.post-68190511649868575862021-08-27T21:20:00.007-04:002021-09-29T21:49:16.700-04:00Cómo crear links cortosSi tienes una Url que es muy larga o complicada y quieres compartir en tus redes de forma sencilla y a su vez obtener estadísticas de los clics?<div><a name='more'></a><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgM4sM6Nu3iqEgNyL998NwKqPp-yElWoVFneUdCaWZTmnes-jFzIGv37eJhpsR7arwbMT4dIFyucGMSsMu_ytU7Jd7s-CNlDAbyEizyk6LERVtypcS6bRUzrcz_BGI5cJy0-qj7WVhG_wNR/s1080/Photo_1630008252170.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1080" data-original-width="1080" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgM4sM6Nu3iqEgNyL998NwKqPp-yElWoVFneUdCaWZTmnes-jFzIGv37eJhpsR7arwbMT4dIFyucGMSsMu_ytU7Jd7s-CNlDAbyEizyk6LERVtypcS6bRUzrcz_BGI5cJy0-qj7WVhG_wNR/s320/Photo_1630008252170.png" width="320" /></a></div><br /><div><br /></div><div><br /></div><div>En este caso la solución es <b>RvR.link </b>en donde puedes crear tu cuenta de forma totalmente gratuita con tu email o directamente ingresando con tu cuenta de Google o Facebook.</div><div><br /></div><div>Para empezar accedemos a su web <a href="https://rvr.link" target="_blank">https://rvr.link</a> luego ingresamos en la opción de Register o en el link <a href="https://rvr.link/register">https://rvr.link/register</a> el registro es muy sencillo una vez que nos valida el sistema ya directamente tenemos la posibilidad de empezar a crear nuestros links cortos.</div><div><br /></div><div>Con la cuenta gratuita podemos crear hasta 20 links además puedes personalizar el ID de tu link corto por ejemplo <a href="https://rvr.link/9TRI0">https://rvr.link/9TRI0</a>, también tienes la opción de usar otro dominio <a href="https://nlac.me/9TRI0">https://nlac.me/9TRI0</a></div>SisteParhttp://www.blogger.com/profile/16110160144217471377noreply@blogger.com0tag:blogger.com,1999:blog-6429080120211769725.post-61018656387587486192021-08-22T13:28:00.005-04:002021-09-29T21:50:17.464-04:00App para Descargar estados de WhatsApp<p><b>Deyago:</b> App gratuita disponible para Android</p><a name='more'></a><div><div class="separator" style="clear: both; text-align: center;"><div class="separator" style="clear: both; text-align: center;"><div class="separator" style="clear: both; text-align: center;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEjCDIy6rPk_Waya4yCGLxDbIos0l2S9Uq_YFC00_awEA_j9FSg2WidS2gzK5XDbL1M1r6ALSlHj9cFEcJRGZ7bvrMLBaQEfQ5VoCqFZcrj-AS3YEq-BfaCnXuB2KKI284sgf5ZZPuNCjYu9QhUSI_y2asGBe6519ooyPpESRW4i8v7PNEvhfhHOfm_s7g=s2048" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="2048" data-original-width="1152" height="320" src="https://blogger.googleusercontent.com/img/a/AVvXsEjCDIy6rPk_Waya4yCGLxDbIos0l2S9Uq_YFC00_awEA_j9FSg2WidS2gzK5XDbL1M1r6ALSlHj9cFEcJRGZ7bvrMLBaQEfQ5VoCqFZcrj-AS3YEq-BfaCnXuB2KKI284sgf5ZZPuNCjYu9QhUSI_y2asGBe6519ooyPpESRW4i8v7PNEvhfhHOfm_s7g=s320" width="180" /></a></div></div><br /><div class="separator" style="clear: both; text-align: center;"><br /></div></div></div></div><div>Con esta app puedes descargar las imágenes y videos de los estados que previsualizaste previamente en la app de whatsapp, los archivos se almacenan dentro de tu galería, además puedes visualizarlo y compartir desde la app.<p></p><div><br /></div><div>Link de descarga de la App:</div><div><a href="https://rvr.link/appdeyago">https://rvr.link/appdeyago</a></div><div><br /></div><div>Link de descarga en App Gallery:</div><div><a href="https://appgallery.huawei.com/#/app/C102602775">https://appgallery.huawei.com/#/app/C102602775</a></div><div><br /></div><div><br /></div></div>Roberthttp://www.blogger.com/profile/14895827793936030496noreply@blogger.com0tag:blogger.com,1999:blog-6429080120211769725.post-29826052638132672222021-05-25T19:00:00.113-04:002021-05-26T11:16:42.863-04:00MIUI 12.5 - Las Novedades mas interesantes<p> Te presentamos algunas de las novedades mas interesantes de la capa de personalización MIUI de Xiaomi sobre Android en su version 12.5.</p><span><a name='more'></a></span><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinzca8u01ZuwfPHwuVdtJwVsGb5wtGF6avd8O4doHbB62-zQ_kLpDabjXji0EVQbHAJhGADrLeYCgaAIev8N0ycA44X0WW3m4-kDfGovdoQLyJE4MRQe9a9nOgaLk3PqDsQStnf79NqQJX/" style="margin-left: 1em; margin-right: 1em;"><br /><img alt="" data-original-height="904" data-original-width="1608" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinzca8u01ZuwfPHwuVdtJwVsGb5wtGF6avd8O4doHbB62-zQ_kLpDabjXji0EVQbHAJhGADrLeYCgaAIev8N0ycA44X0WW3m4-kDfGovdoQLyJE4MRQe9a9nOgaLk3PqDsQStnf79NqQJX/" width="320" /></a></div><p><br /></p><p>La versión fue lanzada a principios de este mes de Mayo, algunos ya lo pueden disfrutar sino te tocará esperar un poco más o si prefieres puedes esperar la gran versión 13 que tendrá aún muchas mas novedades.</p><p><br /></p><p></p><ul style="text-align: left;"><li>Como primer cambio que vas a notar es el nuevo diseño del botón de Volumen con diseño mas simple y con opciones que uno puede acceder a ajustes del volumen multimedia <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7UcwYDJL75a-eDFXoiFalB22OO7BiDB3xJKNRImc1Zt7MjCwvQxxaGhv7JbswJIeTDjp15Sj4lKgtKJF8UcyHmp12oY4uB6aMHpWLcRKGWZ4mjEMPOdceRjH8bN0SQhIF-ShdDCyQntgf/" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img alt="" data-original-height="547" data-original-width="532" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7UcwYDJL75a-eDFXoiFalB22OO7BiDB3xJKNRImc1Zt7MjCwvQxxaGhv7JbswJIeTDjp15Sj4lKgtKJF8UcyHmp12oY4uB6aMHpWLcRKGWZ4mjEMPOdceRjH8bN0SQhIF-ShdDCyQntgf/w194-h200/image.png" width="194" /></a> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiBRs_QzdPlsfeZEePMvrqhDGlBk0guixOXE3UpPkPYtaNvnUn5q5Rt4kBQ2h99WiXX9sptwPRjUXTrEu6oxxG-FDZMwpn5irOybjKZm1dB5XxRzY1WIhybjfYIStZo4WILtNGP2b0NgG-/" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img alt="" data-original-height="542" data-original-width="536" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiBRs_QzdPlsfeZEePMvrqhDGlBk0guixOXE3UpPkPYtaNvnUn5q5Rt4kBQ2h99WiXX9sptwPRjUXTrEu6oxxG-FDZMwpn5irOybjKZm1dB5XxRzY1WIhybjfYIStZo4WILtNGP2b0NgG-/w198-h200/image.png" width="198" /></a></li></ul><p></p><div><br /></div><div><br /></div><div><ul style="text-align: left;"><li>También hay cambios en los iconos de selección del modo en la Cámara con iconos mas diferenciadores y mas grandes</li></ul></div><div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJNLbocaz9LllRuW3kTzuXpMtdJSCyibU0pX14lLJf4azZF5Hz-yQQIVCxRD-DhmJ1VY4fgXoO05uiVw3u9CpiG_2G2qQdsSMw9DJ_9Z4YaKpPaHV90Ce6f4_sdNIztyZv-P7m8GyyzS_Y/" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="534" data-original-width="468" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJNLbocaz9LllRuW3kTzuXpMtdJSCyibU0pX14lLJf4azZF5Hz-yQQIVCxRD-DhmJ1VY4fgXoO05uiVw3u9CpiG_2G2qQdsSMw9DJ_9Z4YaKpPaHV90Ce6f4_sdNIztyZv-P7m8GyyzS_Y/" width="210" /></a></div><div><br /></div><div><br /></div><br /><ul style="text-align: left;"><li>Los iconos mostraran informaciones relevantes como el clima, espacio disponible, etc. Además se podrá elegir en la ventana de multitareas el diseño actual en forma de cuadricula y la nueva en forma de ventanas horizontales </li></ul><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9od-vKy_CAHxD0u9FT1wpwFldfX2Xsd6yTzqoLEPjBViuC_BtQbCW4VIKaqIXd0gT7UbYcd8HjyGe6izDfAXgr-WVrryAnANEkXywl0FbFyiFdpCwKxFmDE2537XMcDRvJzjJVWqjHZgA/" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="515" data-original-width="442" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9od-vKy_CAHxD0u9FT1wpwFldfX2Xsd6yTzqoLEPjBViuC_BtQbCW4VIKaqIXd0gT7UbYcd8HjyGe6izDfAXgr-WVrryAnANEkXywl0FbFyiFdpCwKxFmDE2537XMcDRvJzjJVWqjHZgA/" width="206" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;"><ul style="text-align: left;"><li>Otra novedad interesante es en el apartado de Blockware donde Xiaomi presume de ser el que menos apps necesita para su funcionalidad con tan solo 9 aplicaciones preinstaladas algo que se agradece si uno tiene poco espacio</li></ul></div><div class="separator" style="clear: both; text-align: left;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1QjQrnhpTwZW029nyJQZwLb6mD56QYgRtAJ538UsUHvRnuHt3kGw_lRy_ojUcg5Epy2ou2eNOajDEKkrc_O8FTNLNSjbvyQDYj1rTIbJMsst7GgdAcPh1OUhtK7QtOb_X-V2jeDTQA_hB/" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="350" data-original-width="193" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1QjQrnhpTwZW029nyJQZwLb6mD56QYgRtAJ538UsUHvRnuHt3kGw_lRy_ojUcg5Epy2ou2eNOajDEKkrc_O8FTNLNSjbvyQDYj1rTIbJMsst7GgdAcPh1OUhtK7QtOb_X-V2jeDTQA_hB/" width="132" /></a></div><br /><br /></div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;"><ul style="text-align: left;"><li>En la sección de Privacidad ahora podrás elegir algunas opciones de metadatos si quieres o no compartir ciertas informaciones de la fotografía</li></ul></div><div class="separator" style="clear: both; text-align: left;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilsC_QsDOOaCjKy7QkwV5tZclkYrk6PfqrQzzhEun-Wgh5Cgui3J0LTuo70vLcNjhh9TXHCS2EF0rLTuOG8mFmZpWJ1mZJMOWmvmv3MWWVYZGJvdlogpeNIWdd3iKPJlKeHiNAGoDpMFKA/" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="411" data-original-width="401" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilsC_QsDOOaCjKy7QkwV5tZclkYrk6PfqrQzzhEun-Wgh5Cgui3J0LTuo70vLcNjhh9TXHCS2EF0rLTuOG8mFmZpWJ1mZJMOWmvmv3MWWVYZGJvdlogpeNIWdd3iKPJlKeHiNAGoDpMFKA/" width="234" /></a></div><br /><br /></div><div class="separator" style="clear: both; text-align: left;"><ul style="text-align: left;"><li>En la aplicación de Notas ahora tendrás la funcionalidad de Mapas Mentales para detallar por niveles tus notas, por ejemplo puedes crear Cosas a reparar en mi auto e ir subdividiendo en detalles</li></ul></div><div class="separator" style="clear: both; text-align: left;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyKm99fKdrFk4eZQQEiTlCsRNLbVh4OSdRi8dzktt3_Bf2SoF-REQhVjzJ9sb-BY5e2XQ72bVpWndmqVwS9whcZ5qah_s5ynKgwlgnxqctd-_MUETg5FnI9uAWMoiILC3vOmSJjxhAo3Si/" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="560" data-original-width="613" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyKm99fKdrFk4eZQQEiTlCsRNLbVh4OSdRi8dzktt3_Bf2SoF-REQhVjzJ9sb-BY5e2XQ72bVpWndmqVwS9whcZ5qah_s5ynKgwlgnxqctd-_MUETg5FnI9uAWMoiILC3vOmSJjxhAo3Si/" width="263" /></a></div><br /><br /></div><div class="separator" style="clear: both; text-align: left;"><ul style="text-align: left;"><li>También ha incluido nuevos gestos por ejemplo con los nudillos de los dedos con doble toques puedes configurar que te habrá la cámara</li></ul></div><div class="separator" style="clear: both; text-align: left;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCVN9CUSncdzxN-jhAJTSCoZjZZgsM13eUKu3hAaR0SPhn1KvpVDwvGC0fJKMzdaeu_ce-U77tCapZ6GolHxHHU7a_8ZqcSrgIAM_80a_-18Nu54fYjWfZpK-yAyA3kLb2PLn6rv3POhTX/" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="548" data-original-width="436" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCVN9CUSncdzxN-jhAJTSCoZjZZgsM13eUKu3hAaR0SPhn1KvpVDwvGC0fJKMzdaeu_ce-U77tCapZ6GolHxHHU7a_8ZqcSrgIAM_80a_-18Nu54fYjWfZpK-yAyA3kLb2PLn6rv3POhTX/" width="191" /></a></div><br /><br /></div><div class="separator" style="clear: both; text-align: left;"><ul style="text-align: left;"><li>Una cosa interesante es que han hecho es la de reversar siempre recursos disponible para los gestos donde según Xiaomi te garantiza que siempre y todos los gestos irán fluidos</li></ul></div><div class="separator" style="clear: both; text-align: left;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiowfh_6sgGV6N2ZIRUSnI9BBEOTtK52xcQ-Ms2M48oF0JX_d1q4PmAKCCsBCZZK6k7Dadhv9yDs2yW_Mfr8342GQKI8_bmHzCrGRO56_ALSGQg5p9xvo6OpPwCNWL3AfC1fdAuI8Pw6T-B/" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="405" data-original-width="809" height="160" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiowfh_6sgGV6N2ZIRUSnI9BBEOTtK52xcQ-Ms2M48oF0JX_d1q4PmAKCCsBCZZK6k7Dadhv9yDs2yW_Mfr8342GQKI8_bmHzCrGRO56_ALSGQg5p9xvo6OpPwCNWL3AfC1fdAuI8Pw6T-B/" width="320" /></a></div><br /><br /></div><br /></div><div>Otras novedades son tonos tematizados para los tonos de llamadas como ser sonidos de la naturaleza y demás</div><div><br /></div><div><br /></div><div>También existen cosas negativas menores como los textos en españoles en los iconos que no entran todo en la caja de texto, en inglés entran todo al ser mas cortitos los textos, además el gesto de deslizar para moverte entre aplicaciones ahora lo han cambiado y el gesto para hacerlo es distinto como que tienes deslizar un poco de la parte de abajo y desde ahí deslizar a la derecha o izquierda, pero la experiencia no es tan fluida y la costumbre de usar algo tipo universal pero es cuestión de que uno vuela a la costumbre diríamos.</div><div><br /></div><div><br /></div><div>Espero que te sean de utilidad estas informaciones 😊</div><p></p>Roberthttp://www.blogger.com/profile/14895827793936030496noreply@blogger.com0tag:blogger.com,1999:blog-6429080120211769725.post-8230646535481368542020-08-04T18:09:00.003-04:002020-08-04T18:11:30.822-04:00Google Drive Empresas vs Microsoft OneDrive Empresas vs Dropbox EmpresasQuieres guardar las informaciones de tu empresa o hacer copia de tus backups en la nube y no sabes cual elegir en esta nota te daremos algunos tips que te pueden servir para tomar una decisión.<span><a name='more'></a></span><div>Hoy en día esta de moda migrar a la nube los datos de las empresas pero cual elegir cual me conviene cual me da mas beneficios o cual se adapta mejor a lo que necesito.</div><div><br /></div><div>Antes de comenzar, que es la Nube? Es básicamente un servicio ofrecido en la red, en el caso de almacenamiento son servicios que uno utiliza mediante protocolos de Internet para acceder a sus archivos remotos desde cualquier parte del mundo con conexión a Internet, los archivos se almacenan físicamente en algún lugar del mundo dentro de un Disco de un servidor y por los servicios de la red uno puede acceder a ellos remotamente.</div><div><br /></div><div>Te daremos una breve reseña acerca de los 3 mas populares en la actualidad.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://www.isunshare.com/blog/wp-content/uploads/2019/09/Comparisons-of-Dropbox-VS-Google-Drive-VS-OneDrive.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="420" data-original-width="680" height="336" src="https://www.isunshare.com/blog/wp-content/uploads/2019/09/Comparisons-of-Dropbox-VS-Google-Drive-VS-OneDrive.png" width="544" /></a></div><div><br /></div><div><br /></div><div><ul style="text-align: left;"><li><b>GOOGLE DRIVE</b></li></ul><div><span> </span>Quizás sea la marca que más popularizo el tema de almacenamiento de archivos en la Nube al venir integrado con el sistema operativo Android de Google. </div></div><div><span> </span>En la actualidad Google le llama <b>G Suite </b>a su conjunto de soluciones business donde integra sus productos para empresas como GMail, Documentos, Drive, Calendario, Meet, Chat, entre otros. Además incluye Apps Scripts una herramienta para crear APP de forma interactiva utilizando Hojas de Cálculos de Google que te permite tener tu .apk o publicarlo directamente en la Play Store.</div><div><span> </span>En cuanto a su consola de Administración ofrece una interfaz sencilla e intuitiva donde te ofrece todas las herramientas necesarias.</div><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/C-Qi8mTpJpfjbLB8P5i1A42bF8fqSuagtRfXlFw0tzqGv69t1lTZepS8w_3AYm0kWBo9NX6o286POo3atCxPGPvzFgg4snslqZfRpHU=s768" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="542" data-original-width="768" src="https://1.bp.blogspot.com/C-Qi8mTpJpfjbLB8P5i1A42bF8fqSuagtRfXlFw0tzqGv69t1lTZepS8w_3AYm0kWBo9NX6o286POo3atCxPGPvzFgg4snslqZfRpHU=s640" width="640" /></a></div><div class="separator" style="clear: both; text-align: left;"><span> </span>También tienes la posibilidad de administrar dispositivos externos como un Android instalando un agente donde podrás permitir o controlar que aplicaciones puede tener instalado, tener su ubicación, etc. Otra posibilidad es instalar extensión para Chrome y poder controlar las URL para monitorear o controlar que sitios web son accesibles.</div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;"><i><span> </span>PRECIOS</i></div><div><span> </span>Comienza con 5.4$ por usuario.</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUPPf7nHSD9ly406j2CNC3q_kIcqgthGNiAm1romMPf2F952EmZQj-rxsgNj9lSaSj6lTAn39hvIws21RHKGj2wG7-yRnLsfgIuzDq-sh37dAr2DmTkk7cWkSPrApKCAhY3l-DNJZEAu5i/s923/Captura.PNG" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="893" data-original-width="923" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUPPf7nHSD9ly406j2CNC3q_kIcqgthGNiAm1romMPf2F952EmZQj-rxsgNj9lSaSj6lTAn39hvIws21RHKGj2wG7-yRnLsfgIuzDq-sh37dAr2DmTkk7cWkSPrApKCAhY3l-DNJZEAu5i/s640/Captura.PNG" width="640" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: left;">Más info en: <a href="https://gsuite.google.com/" target="_blank">https://gsuite.google.com/</a></div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;"><ul style="text-align: left;"><li><b>MICROSOFT ONEDRIVE</b></li></ul></div><div><span> </span>El menos conocido quizás y el que vino después de Google Drive, donde anteriormente se llamaba SkyDrive.</div><div><span> </span>Ha ido evolucionando a pasos agigantados introduciendo nuevas funcionalidades y mejoras en cortos tiempos con una interfaz al mas estilo de Windows.</div><div><span> </span>OneDrive for Business forma parte de la suite <b>Microsoft 365</b> con un precio promedio uno puede acceder a licencias de Office básica como Word, Excel, Teams entre otros.</div><div><span> </span>Su consola de administración también al estilo Windows siempre pero con todas las herramientas a disposición no tan amigable su uso pero cumple su cometido.</div><div class="separator" style="clear: both; text-align: center;"><a href="https://gxcuf89792.i.lithium.com/t5/image/serverpage/image-id/29576iCAF30EC5B0F4886F?v=1.0" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="551" data-original-width="800" height="373" src="https://gxcuf89792.i.lithium.com/t5/image/serverpage/image-id/29576iCAF30EC5B0F4886F?v=1.0" width="540" /></a></div><div class="separator" style="clear: both; text-align: left;"><br /></div><div><i><span> </span>PRECIOS</i></div><div><i><span> </span></i>Comienza con 5$ por usuario.</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5k7cdRu2xA5Y_F4yPbgqghEd29iWSqm_SZqQ6aC_4qYOIfbxc1la5e5LufKHlNtd-cNzbHnFbAn7eNBBKXK7DyBmXIJGBEcil1JYx5BOQMDiKdNeBc_UKrY0X2XG-AGkl9fYbedCXt7X-/s762/Captura.PNG" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="667" data-original-width="762" height="560" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5k7cdRu2xA5Y_F4yPbgqghEd29iWSqm_SZqQ6aC_4qYOIfbxc1la5e5LufKHlNtd-cNzbHnFbAn7eNBBKXK7DyBmXIJGBEcil1JYx5BOQMDiKdNeBc_UKrY0X2XG-AGkl9fYbedCXt7X-/w640-h560/Captura.PNG" width="640" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;"><span> </span>Más info en: <a href="https://www.microsoft.com/es-ww/microsoft-365" target="_blank">https://www.microsoft.com/es-ww/microsoft-365</a></div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;"><ul style="text-align: left;"><li><b>DROPBOX BUSINESS</b></li></ul><div><span> </span>El más antiguo y más experimentado entre los mencionados arriba pero que últimamente en su versión gratuita Personal ha perdido usuarios por ofrecer poco espacio de almacenamiento comparado con sus competidores.</div><div><span> Su versión Business esta enfocado a los trabajos en equipos y de tener control total sobre los archivos.</span><br /></div></div><div><span> También cuenta con herramientas de ofimática en la nube para trabajar sobre documentos en su plataforma. Posee controles avanzados de permisos de usuarios sobre carpetas y/o usuarios.</span><br /></div><div><span><span> Su consola de administración es muy fácil de utilizar.</span><br /></span></div><div><span><div class="separator" style="clear: both; text-align: center;"><a href="https://cfl.dropboxstatic.com/static/images/business/bermuda/zeus/business-hero-vfl7rJQfl.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="450" data-original-width="800" height="346" src="https://cfl.dropboxstatic.com/static/images/business/bermuda/zeus/business-hero-vfl7rJQfl.png" width="614" /></a></div><div class="separator" style="clear: both; text-align: left;"><span><i> PRECIOS</i></span><br /></div><div class="separator" style="clear: both; text-align: left;"><span><i> </i>Comienza en 19.99$ Personal y para Equipos desde 3 usuarios es 15$ por usuario.<br /></span></div><div class="separator" style="clear: both; text-align: left;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjC9VHKHcRYg6DYKrkw2OCC7GYVXC6h3PFeEnqWKZC8HsUynhNtCjTWMDvEpqIklj1eop8LH5DvZsha_4Vb65xYO_UZsyHUImy0YE99NXVyFeNrYBVyDqZtE24jiTtmyDRjTMYk07tJUSH5/s908/Captura.PNG" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="777" data-original-width="908" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjC9VHKHcRYg6DYKrkw2OCC7GYVXC6h3PFeEnqWKZC8HsUynhNtCjTWMDvEpqIklj1eop8LH5DvZsha_4Vb65xYO_UZsyHUImy0YE99NXVyFeNrYBVyDqZtE24jiTtmyDRjTMYk07tJUSH5/s640/Captura.PNG" width="640" /></a></div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">Más info en: <a href="https://www.dropbox.com/es/business" target="_blank">https://www.dropbox.com/es/business</a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: center;"><b>COMPARATIVA DE PLAN INICIAL</b></div><div class="separator" style="clear: both; text-align: left;"><b> PROVEEDOR<span> </span><span> </span><span> </span><u>COSTO</u><span> </span><span> </span><span> <span> </span><span> </span><u>CAPACIDAD</u><span> </span><span> <span> </span><span> </span><span> </span><span> </span></span><span><u>TAMAÑO ARCHIVO</u><span> </span></span></span></b></div><div class="separator" style="clear: both; text-align: left;"><b><span><span><span><span> <span> </span><span> </span><span> </span><span> </span></span></span></span></span></b></div><div class="separator" style="clear: both; text-align: left;"><b><span><span><span><span><span><span> </span></span>. DRIVE<span> </span><span> </span><span> <span> </span></span><span> </span>5.40$<span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span>30GB<span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> SIN LIMITES</span></span></span><br /></span></span></span></b></div><div class="separator" style="clear: both; text-align: left;"><b><span><span><span><span><span> . ONEDRIVE<span> </span><span> </span><span> 5$<span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> 1TB<span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> 15GB</span></span></span></span><br /></span></span></span></span></b></div><div class="separator" style="clear: both; text-align: left;"><b><span><span><span><span> . DROPBOX<span> </span><span> </span><span> 19.99$<span> </span><span> </span><span> </span><span> </span><span> 3TB<span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> 100GB</span></span></span></span><br /></span></span></span></b></div><div class="separator" style="clear: both; text-align: left;"><b><span><span><span><span><span><span><span><br /></span></span></span></span></span></span></span></b></div><div class="separator" style="clear: both; text-align: left;"><b><span><span><span><span><span><span><span><br /></span></span></span></span></span></span></span></b></div><div class="separator" style="clear: both; text-align: left;"><b><span><span><span><span><span><span><span><br /></span></span></span></span></span></span></span></b></div><div class="separator" style="clear: both; text-align: center;"><b>CONCLUSIONES</b></div><div class="separator" style="clear: both; text-align: left;">Las 3 opciones presentan propuestas bastantes interesantes, si estas muy ligado a productos de Office tu mejor opción es sin dudas OneDrive además podrás usar Outlook y vincularlo con tu dominio personalizado o utilizar el default. Si tu ideal es tener varias herramientas integradas tu opción es Drive ya que tienes muchas herramientas a tu disposición y la posibilidad de usar Gmail con tu propio dominio y de administrar dispositivos remotos. Si no quieres estar ligado a las grandes corporaciones como Google y Microsoft entonces opta por Dropbox donde también tienes herramientas incorporadas no tan avanzadas pero cumplen su prometido ademas de buen tamaño personal cifrado.</div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">En mi experiencia personal me ha gustado bastante OneDrive por la velocidad de su sincronización de archivos con Windows, Google Drive tuve la mala experiencia de que su sincronización es muy lenta o algunas veces ni sube, con Dropbox también la experiencia fue muy buena pero con la desventaja que el costo es bastante elevado.</div><div class="separator" style="clear: both; text-align: left;"><b><span><span><span><br /></span></span></span></b></div><div class="separator" style="clear: both; text-align: left;"><b><span><span><span><br /></span></span></span></b></div><div class="separator" style="clear: both; text-align: left;"><b><span><span><span><br /></span></span></span></b></div><div class="separator" style="clear: both; text-align: left;"><b><span><span><span><br /></span></span></span></b></div><div class="separator" style="clear: both; text-align: left;"><b><span><span><span> </span><span> </span></span></span><br /></b></div><span><br /></span></div><span><br /></span></span></div>Roberthttp://www.blogger.com/profile/14895827793936030496noreply@blogger.com0tag:blogger.com,1999:blog-6429080120211769725.post-39797234430147945282020-04-16T17:24:00.000-04:002020-04-22T18:56:58.175-04:00Ocultar datos de Variables en Cordova Mobile APPSi estas haciendo una APP con Cordova, capaz estes necesitando ocultar la URL, Token de tu API o algún otro dato sensible, para proteger un poco mas he creado un Plugin para Cordova en las plataformas Android y iOS.<br />
<br />
<a name='more'></a>Documentación del Plugin en Gitlab <a href="https://gitlab.com/sistepar.com/cordova-plugin-privatevar">https://gitlab.com/sistepar.com/cordova-plugin-privatevar</a><br />
<br />
Para instalar solo basta con<br />
<blockquote class="tr_bq">
cordova plugin add cordova-plugin-privatevar</blockquote>
Roberthttp://www.blogger.com/profile/14895827793936030496noreply@blogger.com0tag:blogger.com,1999:blog-6429080120211769725.post-73097956778545644432019-08-30T09:16:00.000-04:002019-08-30T09:16:11.566-04:00Ejecutar aplicación de PowerBuilder sobre Debian/UbuntuEn este post veremos como poder ejecutar nuestra aplicación sobre Linux que esta desarrollada y compilada en PowerBuilder en este caso sobre la distro de Debian/Ubuntu y sus derivados.
<a name='more'></a>
<br/>
Gracias a la ayuda de Wine y WineTricks es posible hacerlo.
<br/>
Primeramente necesitamos instalar todas las dependencias que necesitaremos:
<pre><code>
$: sudo apt -y build-essential make cmake scons curl git \
ruby autoconf automake autoconf-archive \
gettext libtool flex bison \
libbz2-dev libcurl4-openssl-dev \
libexpat-dev libncurses-dev
</code></pre>
<br/>
Ahora necesitamos instalar el manejador de paquetes Brew para instalar las dependencias de Wine necesarias:
<pre><code>
$: sh -c "$(curl -fsSL https://raw.githubusercontent.com/Linuxbrew/install/master/install.sh)"
</code></pre>
<br/>
Además es necesaria que tengamos en el perfil del usuario el path del brew para usar el comando brew:
<pre><code>
$: echo 'eval $(/home/linuxbrew/.linuxbrew/bin/brew shellenv)' >>~/.profile
$: eval $(/home/linuxbrew/.linuxbrew/bin/brew shellenv)
</code></pre>
<br/>
A continuación ya podemos proceder a instalar el Wine y Winetricks y sus dependencias:
<pre><code>
$: brew install gcc // compilador
$: brew install wine // emulador windows
$: brew install winetricks // helper instalador de librerías para wine
$: winetricks corefonts eufonts lucida opensymbol tahoma cjkfonts
$: winetricks vb6run
$: winetricks mdac28
$: winetricks msxml4 mfc42 jet40 native_oleaut32
</code></pre>
<br/>
Para entrar en la configuración de Wine usar el comando <u>winecfg</u> si queremos ingresar a la configuración de panel de control que es donde se encuentra el ODBC para configurar usar el comando <u>wine control</u>
<br/>
La ruta del wine donde tenemos que alojar nuestro software ejecutable .exe es en: <u>/home/user/.wine/drive_c/</u>
<br/>
Si todo te ha ido bien ya podrás usar tu software bajo Linux.SisteParhttp://www.blogger.com/profile/16110160144217471377noreply@blogger.com1tag:blogger.com,1999:blog-6429080120211769725.post-91678065436690438372019-08-23T08:55:00.000-04:002019-08-23T08:55:01.370-04:00Llamar a Procedimiento de una BD con parámetros IN-OUT desde PHPMuchas veces tenemos la necesidad de usar un procedimiento almacenado en nuestra base de datos que contienen parámetros de entrada y salida para devolver valores y usarlo posteriormente.
<a name='more'></a>
<br/>
En este ejemplo usaremos la extensión PDO de PHP para poder obtener el valor del OUT.
<br/>
Supongamos que tenemos un Procedimiento creado:
<pre><code>
Procedure pr_prueba(in vparm_in varchar(10), out vparm_out varchar(30))
Begin
set vparm_out = 'Valor in: ' + vparm_in;
End
</code></pre>
Para este ejemplo nos conectaremos a nuestra base de datos por medio de ODBC mediante PDO:
<pre><code class="php">
function fnConnDB() {
try {
$conn = new PDO('odbc:NOMBRE_ODBC', '', '',
array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
));
return $conn;
} catch (PDOException $e) {
exit($e->getMessage());
} catch (Exception $e) {
exit('Exception: '.$e->getMessage());
}
}
</code></pre>
Ahora utilizando los métodos del PDO vamos a preparar nuestra consulta y a enlazar los parámetros del procedimiento.:
<pre><code class="php">
// Conn DB
$connDB = fnConnDB();
// resultado out del procedure
$sp_result = '';
// prepare procedure
$oPrepare = $connDB->prepare('CALL pr_prueba(?,?)');
$oPrepare->bindValue(1, 'Parametro de entrada', PDO::PARAM_STR); // vparm_in
$oPrepare->bindParam(2, $sp_result, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 30); // vparm_out
if ($oPrepare->execute()) {
echo $sp_result;
} else {
echo $connDB->errorInfo();
}
</code></pre>
Con el método <i>prepare</i> invocamos nuestra consulta SQL en este caso usamos CALL podría ser también EXECUTE dependiendo de la base de datos que utilices, luego usando <i>bindValue</i> definimos como el parámetro número 1 y de tipo string, usando <i>bindParam</i> que es la que nos permite indicar que el parámetro sera de tipo OUT añadiendo <u>PDO::PARAM_INPUT_OUTPUT</u> al lado del tipo de dato en este caso string y el último parámetro es la cantidad de bytes a devolver.
<br/>
<br/>
Luego ejecutamos con <i>ejecute</i> para ejecutar nuestra consulta preparada donde en la variable <u>$sp_result</u> tenemos el dato devuelto por nuestro procedimiento almacenado con parámetro de tipo OUT.SisteParhttp://www.blogger.com/profile/16110160144217471377noreply@blogger.com0tag:blogger.com,1999:blog-6429080120211769725.post-53556377431429228482017-02-21T15:13:00.000-03:002019-08-27T09:58:15.036-04:00LLamar al WebService de Informconf-Equifax con PHPUn código funcional de como realizar una llamada al webservice de Informconf - Equifax Paraguay, hecho en PHP.<br />
<br />
<a name='more'></a>
<br />
<div>
Les dejo el link del repositorio en Github: <a href="https://github.com/SistePar/informconf-ws">https://github.com/SistePar/informconf-ws</a>
</div>
<br/>Roberthttp://www.blogger.com/profile/14895827793936030496noreply@blogger.com1tag:blogger.com,1999:blog-6429080120211769725.post-26490430139373125712017-02-06T08:59:00.001-03:002019-08-22T17:35:25.665-04:00Cargar manualmente un DropDownDW en PowerBuilderBueno, como sabemos en PowerBuilder tenemos el elemento DropDownDW dentro de un Datawindow que nos sirve para mostrar un listado de opciones dentro de un Listbox mirando otro Datawindow al tener activada la propiedad AutoRetrieve nos hará automáticamente el retrieve para traer la información.<br />
<a name='more'></a><br />
<br />
Os mostraré un pequeño ejemplo para poder hacer nuestro Retrieve en forma manual ya que en algunos casos necesitaremos actualizar dinámica mente el listado ya sea pasando parámetros al datawindow o simplemente actualizar el listado.
<br />
<br />
Primeramente necesitamos des-tildar la propiedad AutoRetrieve:
<br />
<div style="text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKZpIEagrpUi2VHe7hD_qtOc49P4gWtQHMpa8teutb_F3UN3JytfGQ9sfKzUIg4Ix4lqTtzi3Vacz8X87fVZ3KaeSX1XzREF5FA0uLJ83R36MJPrzQ_DqTAJJaKc_Ld0SW9cYrbZ9YcJvi/s1600/Captura.JPG" imageanchor="1" style="margin-bottom: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKZpIEagrpUi2VHe7hD_qtOc49P4gWtQHMpa8teutb_F3UN3JytfGQ9sfKzUIg4Ix4lqTtzi3Vacz8X87fVZ3KaeSX1XzREF5FA0uLJ83R36MJPrzQ_DqTAJJaKc_Ld0SW9cYrbZ9YcJvi/s320/Captura.JPG" width="140" /></a></div>
<br />
<br />
<div>
Luego con el sgte. código ejecutamos el Retrieve de nuestro DropDownDW
<br />
<pre><code>
DataWindowChild dddw_obj
dw_1.GetChild("nombre_campo", dddw_obj)
dddw_obj.SetTransObject (sqlca)
dddw_obj.Retrieve()
</code></pre>
<br />
En el código declaramos primero la instancia del objeto hijo ya que el DDDW es un hijo dentro de un Datawindow, luego llamamos a la función Retrieve(), y en esta función podemos pasar parámetros como a un datawindow normal por ejemplo dddw_obj.Retrieve('hola','123') y en el datawindow definimos nuestro Retrieval Arguments y listo.
</div>
Roberthttp://www.blogger.com/profile/14895827793936030496noreply@blogger.com1tag:blogger.com,1999:blog-6429080120211769725.post-49627945554374837702016-07-22T13:00:00.000-04:002019-08-22T17:21:02.307-04:00Detectar acentos y ñ con phpMuchas veces queremos saber si es que una cadena posee acentos, ñ u otros caracteres raros.
<br />
<div>
Con esta función podrás detectar esos caracteres.</div>
<div>
<a name='more'></a></div>
<div>
<pre><code class="php">
function esUnicode($cadena){
$letrasUnicode = 'ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûýýþÿŔŕ';
for ($i=0; $i<strlen($cadena); $i++) {
if ( strstr($cadena, substr($letrasUnicode, $i, 1) ) ) {
return true;
}
}
return false;
}
</code></pre>
</div>
<br />
<div>
Simplemente hay que pasar como parámetro la cadena de texto el cual se desea comparar y la función devuelve True en caso que encuentre las letras que definimos en $letraUnicode sino, devuelve false</div>
Roberthttp://www.blogger.com/profile/14895827793936030496noreply@blogger.com0tag:blogger.com,1999:blog-6429080120211769725.post-57770822996679865252015-10-07T16:12:00.000-03:002019-08-22T17:40:24.663-04:00Recorrer Menú en Power BuilderEn esta entrada mostraré un pequeño ejemplo de como recorrer los items de un menú dentro de nuestra aplicación.<br />
<br />
<a name='more'></a>
Por ejemplo tenemos una ventana llamada w_principal donde contiene un menú con dos items, uno con el nombre de Archivo y otro Definiciones:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnH1QY9OBP5NjC3FzLcixtbSwxdJpoobGeami3e_cc5fuYN0EvP-EKkv4nwOgZuFOVpCMk7uwAWR21Zux3SsUCppqGPpuc-LEV4OkmX2CBotZxrMJ1ReoSqgElcE1KZboXzfDbT5k5wBnx/s1600/Captura.PNG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnH1QY9OBP5NjC3FzLcixtbSwxdJpoobGeami3e_cc5fuYN0EvP-EKkv4nwOgZuFOVpCMk7uwAWR21Zux3SsUCppqGPpuc-LEV4OkmX2CBotZxrMJ1ReoSqgElcE1KZboXzfDbT5k5wBnx/s1600/Captura.PNG"/></a>
</div>
<br />
Para saber la cantidad de sub items que posee el menú usaremos la función upperbound() el cual devuelve la cantidad de índices de un Array.<br />
<br />
Ejemplo:
<pre><code>
upperbound(w_principal.Menuid.Item[2].Item)
</code></pre>
Item[2] usamos porque queremos saber la cantidad de sub items del menú Definiciones.<br />
Una vez sabido la cantidad podemos recorrerlo dentro de un ciclo.<br />
<pre><code>
FOR i=1 to upperbound(w_principal.Menuid.Item[2].Item)
w_principal.Menuid.Item[2].Item[i].enabled = false
NEXT
</code></pre>
En nuestro ejemplo de ciclo recorremos con un For el menú Item[2] luego la posición del subitem en i Item[i] y usamos la propiedad enabled para desactivar el menú, un caso práctico sería recorrer las subitems y controlar permiso de acceso a ellos y controlamos si no tiene el permiso desactivamos.Roberthttp://www.blogger.com/profile/14895827793936030496noreply@blogger.com0tag:blogger.com,1999:blog-6429080120211769725.post-65694161910092399652012-08-09T08:31:00.000-04:002019-08-22T17:35:02.702-04:00Pasar variables a un archivo php con jQueryCon jQuery podemos pasar parámetros como variables a nuestro script php como si fuera que estamos insertando en la barra de URL del navegador manualmente las variables parecido al método GET del protocolo http.<br />
<a name='more'></a><br />
JQuery gracias a la tecnología AJAX nos da dos funciones .get y .post el cual cumplen las mismas funciones del traspaso de variables de php con el GET uno puede observar en el navegador hacer pasar mediante la url y el método POST sin embargo lo maneja el servidor web y es transparente para el usuario donde no se visualiza en la url.<br />
<br />
Mostraremos un ejemplo con el método .get:<br />
<br />
Primero crearemos nuestro archivo php donde recibiremos las variables:<br />
<pre><code>
isset($_GET['var1']) ? $var1 = $_GET['var1'] : $var1 = '';<br />isset($_GET['var2']) ? $var2 = $_GET['var2'] : $var2 = '';<br />echo 'Esto retorna desde mi php: ' . $var1 . ' ' . $var2;
</code></pre>
<br />
<span style="color: #073763;"><br /></span>
Ahora crearemos nuestro archivo js para llamar a nuestro archivo php con la función .get() de jquery en el primer parámetro indicamos la url del archivo php, en el segundo especificamos como array la o las variables, en el tercero podemos llamar a otra función o simplemente declarar una variable dentro de ella para recibir el mensaje retornado por nuestro archivo php en nuestro caso nos retornara la sentencia echo pero si hubiese algún error producido por php nos alojara ese mensaje:<br />
<pre><code>
var datos = {var1: 'ola', var2: 'mundo'}<br />.get('archivo.php', datos, function(vretorna){<br /> alert(vretorna);<br />});
</code></pre>
<br />
Ahora al ejecutar el código nos debería de retornar 'Esto retorna desde mi php: ola mundo'.<br />
El cual si se fijan es lo mismo que poner en la url de nuestro navegador archivo.php?var1=ola&var2=mundo<br />
<br />
Y lo mismo podes hacer con el método .post() de jquery no hay diferencia de manejo solo en el tratado de recibir las variables ya que tendremos que recibirlo con el método $_POST[] de php.Roberthttp://www.blogger.com/profile/14895827793936030496noreply@blogger.com1tag:blogger.com,1999:blog-6429080120211769725.post-92179329466399334812012-08-06T13:34:00.000-04:002019-08-22T11:41:32.853-04:00Conectarse a sybase con PHPBueno para conectarnos con php tenemos la opción de conectarnos mediante las extensiones de php sybase o mediante odbc.<br />
<a name='more'></a><br />
<br />
<ul>
<li>El primer ejemplo es para conectarnos por medio de la extensión <i>sybase</i> o <i>sybase_ct</i> para versiones mayores a php 5.3.0.</li>
</ul>
<br />
<br />
Primeramente nos conectaremos:<br />
<pre class="brush:php">$conn = sybase_connect('192.168.1.100:2638', 'usuario', 'clave') or die('no se pudo conectar');
echo 'conectado con exito';
</pre>
<br />
Ahora que ya nos conectamos con éxito ya podemos hacer las transacciones a nuestra base de datos, podemos probar con un SELECT:<br />
<pre class="brush:php">$result = sybase_query("SELECT nombre,apellido FROM personas");
while($row = sybase_fetch_assoc($result)){
echo $row['nombre'] . ' ' . $row['apellido'] . '';
}
</pre>
<br />
<br />
<ul>
<li>Otro método es con la extensión <i>ODBC</i> de php:</li>
</ul>
<br />
<pre class="brush:php">$conn = odbc_connect('nombre odbc', 'usuario', 'clave');
if(!odbc_error()){
odbc_autocommit($conn, false);
echo 'conectado con exito';
} else {
echo 'error al conectarse' . odbc_errormsg();
}
</pre>
<br />
De esta forma ya nos hemos conectado mediante ODBC, ahora probemos hacer un SELECT de nuestra base de datos:<br />
<pre class="brush:php">$result = odbc_exec("SELECT nombre,apellido FROM personas", $conn);
while($row = odbc_fetch_array($result)){
echo $row['nombre'] . ' ' . $row['apellido'] . '';
}
</pre>
<br />
Con estas dos formas podemos conectarnos a sybase a través de php.Roberthttp://www.blogger.com/profile/14895827793936030496noreply@blogger.com0tag:blogger.com,1999:blog-6429080120211769725.post-83453195558175422832012-06-29T11:52:00.000-04:002013-11-11T08:23:17.017-03:00Cargar dinamicamente un DropDownListBox con PowerBuilderComo sabemos el objeto dropdownlistbox(ddlb) en power builder es una simple lista desplegable de opciones en html seria como usar la etiqueta 'select'. Bien en como ya sabras en PB los items se agregan manualmente pero afortunadamente tiene una funcion llamada additem() el cual recibe como parametro una cadena string para la descripcion del item, bueno para nuestro ejemplo obtendremos los datos de unos array almacenados pero tu lo puedes obtener por ejemplo con un procedure.<br />
<a name='more'></a><br />
<pre class="brush:php">
string valores[]
integer ids[], i
valores = {'paraguay','programacion','sourcepy'}
ids = {1,2,3}
for i=1 to upperbound(valores[])
ddlb_datos.additem('(' + string(ids[i] +') '+ valores[i]))
next
</pre>
<br />
En este ejemplo agregamos los items con su codigo separando lo entre parentesis para que hacemos eso? para despues recuperar el id asociado a ese valor.<br />
Y para ello utilizaremos una funcion que nos sirve para extraer parte de un texto el cual pueden ver en este enlace: <a href="http://sourcepy.blogspot.com/2011/12/extraer-partes-de-un-texto-con-power.html" title="http://sourcepy.com/2011/12/extraer-partes-de-un-texto-con-power-builder/">extraer-partes-de-un-texto-con-power-builder</a>.<br />
Y para obtener el id guardado lo recuperamos de la sgte forma:<br />
<pre class="brush:php">
string vdatos
integer vid_dato
vdatos = ddlb_datos.text
vid_dato = integer( fn_buscarextexto(vdatos, '(', ')') )
</pre>
<br />
Con este simple codigo hemos recuperado el id separandolo de la descripcion bueno esto ya queda a criterio de cada programadorRoberthttp://www.blogger.com/profile/14895827793936030496noreply@blogger.com0tag:blogger.com,1999:blog-6429080120211769725.post-91066624415119251672012-06-14T07:02:00.000-04:002014-09-26T16:33:38.362-04:00Recorrer registros de un datawindow con la tecla ctrl + flechas en Power BuilderEn este post le mostrare un script muy útil para el usuario que lo hice por necesidad, básicamente consiste en ir recorriendo los registros de un datawindow con clave primaria numérica apretando combinaciones de teclas el cual yo elegí la tecla ctrl mas la flecha izquierda o derecha la izquierda para registro anterior y derecha para registro posterior.<br />
<a name='more'></a><br />
<pre class="brush:php">
/*Leer registro con tecla ctrl + flechas*/
//@author: Robert Galeano Fernandez - @rgfpy
integer vregistro
string col_valor
col_valor = 'nombre_col_pk' // nombre de la columna del cod de registr
IF keyflags = 2 then // tecla ctrl
IF key = keyleftarrow! then //tecla nav izq
vregistro = (this.getitemnumber(1, col_valor) - 1)
this.setitem(1, col_valor, vregistro)
// aca ejecutamos el retrieve()
ELSEIF key = keyrightarrow! then // tecla nav der
vregistro = (this.getitemnumber(1, col_valor) + 1)
this.setitem(1, col_valor, vregistro)
// aca ejecutamos el retrieve()
END IF
END IF
</pre>Roberthttp://www.blogger.com/profile/14895827793936030496noreply@blogger.com0tag:blogger.com,1999:blog-6429080120211769725.post-53960779456921393232012-05-24T13:37:00.000-04:002013-11-11T08:34:40.379-03:00Obtener valor de buffer de un datawindow con Power BuilderEn esta post veremos como con una funcion podemos obtener los valores de un campo dentro de un datawindow sin estar preguntando que tipo de datos es el campo del cual queremos obtener el dato asi ya no nos preocuparemos en que si es number usar la funcion getItemNumber o si es string getItemString() con solo llamar a la funcion ya obtendremos el dato.<br/>
<a name='more'></a><br/>
Creamos una funcion que se llame por ej fn_get_valor_buffer():<br/>
<strong>Return type:</strong> any<br/><strong>Parámetros:</strong><br/><strong>1.</strong> Pass by: value, Type: datawindow, Name: cdw_datos<br/><strong>2.</strong> Pass by: value, Type: string, Name: col_dato<br/><br/>
<pre class="brush:php">
any dato
string tipo
long fila
tipo = cdw_datos.describe(""+col_dato+".coltype")
fila = cdw_datos.getrow()
IF tipo = "number" or left(tipo,7) = "decimal" or left(tipo,7) = "integer" or left(tipo,4) = "long" then
dato = cdw_datos.GetItemNumber(fila, col_dato)
ELSEIF left(tipo,4)="char" then
dato = cdw_datos.GetItemString(fila, col_dato)
ELSEIF tipo ="date" then
dato = cdw_datos.GetItemDate(fila, col_dato)
ELSEIF tipo ="time" then
dato = cdw_datos.GetItemTime(fila, col_dato)
ELSEIF tipo ="datetime" then
dato = cdw_datos.GetItemDateTime(fila, col_dato)
ELSE
dato = "error - tipo de dato desconocido"
END IF
return dato
</pre>
<br/><br/>
<strong>Ejemplo de uso:</strong>
<pre class="brush:php">
any vnombre
// acá obtenemos el dato como tipo any luego tenemos que castear el dato al tipo que necesitemos usar.
vnombre = fn_get_valor_buffer(dw_personas, 'nombre');
messageBox('', string(vnombre))
</pre>Roberthttp://www.blogger.com/profile/14895827793936030496noreply@blogger.com1tag:blogger.com,1999:blog-6429080120211769725.post-6639770750112844502012-05-02T11:10:00.000-04:002013-11-11T09:15:45.973-03:00Script para comprobar si un Vector esta duplicado con Power BuilderEn este post les mostrare un script de como poder recorrer un vector y verificar si los datos son duplicados muy util en algunos casos, mas todabia si trabajamos mucho con vectores, hice el algoritmo por necesidad y espero que a alguien mas le sirva.
<br/><a name='more'></a><br/>
<pre class="brush:php">
// comprobar si un array(vector) esta duplicado de datos
// @author: Robert Galeano Fernandez - @rgfpy
string varray[]
integer cant_array, k
varray = {'paraguay', 'info', 'PB', 'Paraguay'}
cant_array= upperbound(varray[])
FOR i = 1 to cant_array
FOR k = cant_arrayto 1 step -1
IF upper(varray[i]) = upper(varray[k]) and i <> k then
messagebox('.....', 'Existe duplicacion de array en el indice ' + string(k))
i = cant_array
exit
END IF
NEXT
NEXT
</pre>
<br/><br/>Bueno este es un script de ejemplo como veran en mi variable varray[] ya cargo mis datos pero ustedes seguramente obtendran el dato de otra manera es cuestion de ajustar nada mas a sus necesidades.<br/><br/>Otro uso recuiente que le pude dar es poder verificar si una cantidad determinada corresponde a la cantidad de datos iguales contenidos en el arrar, ejemplo quiero verificar que la cantidad de datos de mi array sean todos datos iguales para eso ejecuto el script y almaceno los datos iguales por ultimo verifico con mi dato si corresponde la cantidad.<br/><br/>
<pre class="brush:php">
// @author: Robert Galeano Fernandez - @rgfpy
integer i, k, cant, cant_array
string varray[]
varray = {'valor1','valor1','valor1','valor1'}
cant_array = upperbound(varray[])
FOR i = 1 to cant_array
FOR k = cant_array to 1 step -1
IF upper(varray[i]) = upper(varray[k]) and i <> k then
cant += 1
exit
END IF
NEXT
NEXT
IF cant <> cant_array then
//ok. existen datos iguales en mi vector
ELSE
//false. no son iguales
END IF
</pre>Roberthttp://www.blogger.com/profile/14895827793936030496noreply@blogger.com0tag:blogger.com,1999:blog-6429080120211769725.post-45976715162502021332012-03-14T07:52:00.002-03:002020-06-15T13:43:48.834-04:00Función explode en PowerBuilderEn este post le mostrare una función que encontré por la web el cual es la función de explode si usas php te familiarizaras con esta función el cual tiene la función de dividir una cadena por el patrón a dividir en varias partes.<br />Creamos una función que se llame por ej fn_explode():
<br /><a name='more'></a><br />
<pre><code>
<strong>Return type:</strong> integer
<strong>Parámetros:</strong>
<strong>1.</strong> Pass by: value, Type: string, Name: as_source
<strong>2.</strong> Pass by: value, Type: string, Name: as_delimiter
<strong>3.</strong> Pass by: reference, Type: string, Name: as_array[]
</code></pre>
<pre><code>long ll_DelLen, ll_Pos, ll_Count, ll_Start, ll_Length
string ls_holder
//Check for NULL
IF IsNull(as_source) or IsNull(as_delimiter) Then
long ll_null
SetNull(ll_null)
Return ll_null
End If
//Check for at leat one entry
If Trim (as_source) = '' Then
Return 0
End If
//Get the length of the delimeter
ll_DelLen = Len(as_Delimiter)
ll_Pos = Pos(Upper(as_source), Upper(as_Delimiter))
//Only one entry was found
if ll_Pos = 0 then
as_Array[1] = as_source
return 1
end if
//More than one entry was found - loop to get all of them
ll_Count = 0
ll_Start = 1
Do While ll_Pos > 0
//Set current entry
ll_Length = ll_Pos - ll_Start
ls_holder = Mid (as_source, ll_start, ll_length)
// Update array and counter
ll_Count ++
as_Array[ll_Count] = ls_holder
//Set the new starting position
ll_Start = ll_Pos + ll_DelLen
ll_Pos = Pos(Upper(as_source), Upper(as_Delimiter), ll_Start)
Loop
//Set last entry
ls_holder = Mid (as_source, ll_start, Len (as_source))
// Update array and counter if necessary
if Len (ls_holder) > 0 then
ll_count++
as_Array[ll_Count] = ls_holder
end if
//Return the number of entries found
Return ll_Count
</code></pre>
<br /><br />
<strong>Ejemplo de uso:</strong><br />
<pre><code>string array_explode[]
// esta variable es de referencia, funciona como variable de instancia desde el objeto que declaras.
integer cant_explode, i
cant_explode = fn_explode('sourcepy-com', '-', array_explode[]);
for i = 1 to cant_explode
messagebox('Valor', array_explode[i])
next
</code></pre>Roberthttp://www.blogger.com/profile/14895827793936030496noreply@blogger.com1tag:blogger.com,1999:blog-6429080120211769725.post-36416012171778516202012-02-07T13:15:00.000-03:002014-04-02T17:40:36.339-04:00Identificar claves primarias de un datawindow con Power BuilderEn este articulo les mostrare como podemos identificar el nombre o el id de las claves primarias de una tabla definida en el update properties del datawindow.<br/>Esto lo lograremos casi todo con la función describe() del DW bueno la idea básica es primero recorrer todas las columnas de la tabla y de ahí identificar cuales son primarias e ir almacenando con la necesidad en nuestro caso almacenaremos en un array.
<a name='more'></a>
<pre class="brush:php">
string claves[], claves_id[]
integer cant_cols, i, cant_claves
cant_cols = integer(cdw_datos.describe('datawindow.column.count'))
FOR i=1 to cant_cols
IF cdw_datos.describe('#'+string(i)+'.key') = 'yes' then
cant_claves += 1
claves[cant_claves] = cdw_datos.describe('#'+string(i)+'.name') //por nombre
claves_id[cant_claves] = integer(cdw_datos.describe('#'+string(i)+'.id')) //por id
END IF
NEXT
</pre>
Con esta simple función hemos podido detectar y almacenar las claves primarias, espero que le sea útil a alguien.Roberthttp://www.blogger.com/profile/14895827793936030496noreply@blogger.com2tag:blogger.com,1999:blog-6429080120211769725.post-19879485910579566062011-12-17T07:57:00.000-03:002014-04-02T17:51:39.144-04:00Extraer partes de un texto con Power BuilderEn este post compartiré con ustedes una función para buscar partes de un texto o extraer partes de un texto con parámetros de inicio y fin con la cual indicaremos con que texto va a comenzar a buscar y con cual texto va a parar para devolvernos ese trozo de texto.
<a name='more'></a>
Creamos una funcion llamada por ejemplo <strong>fn_buscar_en_texto()</strong>
<br/>
<strong>Return:</strong> string
<br/>
<strong>Parametros:</strong>
<ul>
<li>
Pass by: value – Type: string – Name: vtexto
</li>
<li>
Pass by: value – Type: string – Name: texto_ini
</li>
<li>Pass by: value – Type: string – Name: texto_fin
</li>
</ul>
<pre class="brush:php">
long pos_ini, pos_fin, cte
string mensaje
cte = len(texto_ini)
pos_ini = pos(vtexto, texto_ini, 1)
IF pos_ini > 0 then
pos_fin = pos(vtexto, texto_fin, pos_ini + cte)
IF pos_fin > 0 then
mensaje = mid(vtexto, pos_ini + cte, ((pos_fin - 1) - (pos_ini + cte) + 1))
END IF
END IF
return mensaje
</pre>
Para usar la funcion es muy simple por ejemplo:
Queremos extraer de un texto la palabra source
<pre class="brush:plain">
string vtext = 'is the best source code site'
messagebox('', fn_buscar_en_texto(vtext, 'best', 'code'))
</pre>Roberthttp://www.blogger.com/profile/14895827793936030496noreply@blogger.com2tag:blogger.com,1999:blog-6429080120211769725.post-24046407612578942802011-12-08T08:01:00.000-03:002019-06-07T12:26:01.578-04:00Como declarar y usar cursor en Power BuilderEn este post veremos como declarar y usar un cursor básico en power builder, bueno el cursor básicamente lo que ace es recorrer todos los registros devueltos por una consulta sql, el cual lo recorremos mediante bucles una vez abierto el cursor.
<br />
<a name='more'></a>Lo primero que necesitamos saber es cuantos registros va a tener la consulta que necesitamos hacer para recorrer en el bucle entonces podiamos hacerlo mediante un select count(*)
<br />
<pre class="brush:sql">select count(*)
into :cant_filas
from cuentas
</pre>
Ahora que ya tenemos la cantidad de filas a ser recorridas ya podemos declarar nuestro cursor:
<br />
<pre class="brush:sql">declare vcursor cursor for
select cuenta, saldo_inicial
from cuentas
</pre>
Ya tenemos declarado nuestro cursor nada mas nos falta abrirlo:
<br />
<pre class="brush:plain">open vcursor;
</pre>
Ya hemos abierto, entonces ya podemos recorrer nuestro cursor:
<br />
<pre class="brush:plain">string vcuenta
double vsaldo_inicial
for i=1 to cant_filas
fetch vcursor into :vcuenta, :vsaldo_inicial;
messagebox('test', 'cuenta:'+vcuenta+' - saldo:' + string(vsaldo_inicial))
next
</pre>
Con esto ya hemos recorrico el cursor con la palabra clave fetch seguido del nombre del cursor y a continuación con into almacenamos en las variables los campos que habiamos seleccionado en el select al declarar el cursor, ahora que ya hemos recorrido todo nos queda cerrar nuestro cursor:
<br />
<pre class="brush:plain">close vcursor;
</pre>
Y con estos pasos ya hemos logrado recorrer las filas devueltas por una consulta sql.
Pero también podriamos hacer mas simple con el bucle DO WHILE y sqlca.sqlcode por si no necesitemos saber la cantidad de fila que nos retornara el sql.Roberthttp://www.blogger.com/profile/14895827793936030496noreply@blogger.com1tag:blogger.com,1999:blog-6429080120211769725.post-9084868454963738222011-11-17T06:42:00.002-03:002022-09-27T18:08:18.000-04:00Calcular el Dígito Verificador de Paraguay con Power BuilderCon este material les mostrare una función de como calcular el dígito verificador de un numero de RUC o CI paraguyo, el script es original de www.set.gov.py y adapte para que pueda funcionar en power builder, asi que espero que les sea útil.
<br />
<a name='more'></a>Github: <a href="https://github.com/SistePar/DV-RUC-en-PowerBuilder/blob/main/fn_calcular_dv_ruc.srd">https://github.com/SistePar/DV-RUC-en-PowerBuilder/blob/main/fn_calcular_dv_ruc.srd</a><br /><div><br /></div><div>Bueno crearemos una función que se llame por ejemplo fn_calcular_dv()<br />
<strong><br /></strong>
<strong>Return type:</strong> integer<br />
<strong><br /></strong>
<strong> Parámetros:</strong><br />
<strong> 1.</strong> Pass by: value, Type: string, Name: vruc<br />
<strong> 1.</strong> Pass by: value, Type: integer, Name: vbase_max<br />
<br />
<pre><code>// Funcion para calcular el digito verificador de un ruc - py
// @author en PL/SQL: www.set.gov.py
// @author en Power Builder: Robert Galeano Fernandez - @rgfpy
/**
PARAMETROS
Arg1(string): vruc: numero de cedula o numero de ruc sin dv
Arg2(integer): vbase_max: numero max que puede obtener el digito verificador
Return: retorna el numero de digito verificador
*/
double vnuevo_ruc_aux = 0
double vresto
long i1
long k = 2
string vnuevo_ruc
string vletra_ruc
integer vdigito
// generamos nuevo ruc, comprobamos si el caracter obtenido es numerico o string si es string convertimos en su valor ascii
FOR i1 = 1 to len(vruc)
vletra_ruc = upper(mid(vruc,i1,1))
IF not (vletra_ruc >= "0" and vletra_ruc <= "9") then
vnuevo_ruc += string(asc(vletra_ruc))
ELSE
vnuevo_ruc += vletra_ruc
END IF
NEXT
// generamos el nuevo numero de ruc aux partiendo en orden DESC de acuerdo al nuevo ruc generado, tomando cada letra en el ciclo y multiplicarlo por el acumulador k
FOR i1 = len(vnuevo_ruc) to 1 step -1
IF k > vbase_max then k = 2
vnuevo_ruc_aux += integer(mid(vnuevo_ruc,i1,1)) * k
k += 1
NEXT
// obtener el resto de la division de vnuevo_ruc_aux entre 11
vresto = mod(vnuevo_ruc_aux, 11)
// si el resto es mayor a 1 restamos con 11 sino igualamos a 0
IF vresto > 1 then
vdigito = 11 - vresto
ELSE
vdigito = 0
END IF
return vdigito
</code></pre>
</div>Roberthttp://www.blogger.com/profile/14895827793936030496noreply@blogger.com0tag:blogger.com,1999:blog-6429080120211769725.post-73189549763502522002011-11-15T14:32:00.000-03:002019-08-30T08:54:56.799-04:00Extraer números de una cadena con Power BuilderBueno con este material les mostrare como extraer solamente los caracteres numéricos de una cadena de texto.
<br />
<a name='more'></a>
Primeramente crearemos una función que se llame por ejemplo <strong>fn_devolver_solo_nro()</strong>
<br />
<strong>Return:</strong> double
<br />
<strong>Parámetros:</strong>
<br />
Pass by: value - Type: string - Name: cadena
<br />
<br />
<pre><code>
// Funcion para retornar solamente caracteres numéricos de una cadena
// @author: Robert Galeano Fernández - @rgfpy
// Version: 18-08-2011 10:25
string vretorna
long cant_letras, i
string parte_letra
cant_letras = len(cadena)
FOR i=1 to cant_letras
parte_letra = mid(cadena, i, 1)
IF isNumber( string(parte_letra) ) then
vretorna += parte_letra
END IF
NEXT
return double(vretorna)
</code></pre>
<br/>
Bueno recibimos como parámetro en la variable cadena el valor del texto el cual procesaremos en el script. La idea básica es conocer cuantas caracteres posee la cadena y de ahí pasar a recorrer cada una de ella e ir preguntando si ese carácter es del tipo numérico y si lo es ir almacenando para luego devolver los caracteres almacenados.
<br />
<br />
Explicando un poco el codigo con la funcion len() obtenemos la cantidad de caracteres de una cadena de texto, luego con el ciclo FOR ejecutamos asta esa cantidad. Con la funcion mid() obtenemos parte de una cadena en este caso en la posicion de nuestro vector i con una unidad, con la funcion isnumber() nos devuelve true en caso de que sea numerico la cadena que le pasemos como parametro.
<br />
<br />
<strong>Ejemplo de uso:</strong>
<br />
<pre><code>
string cadena_string
integer cadena_int
cadena_string = 's1o2u3r4c5e6p7y'
cadena_int = fn_devolver_solo_nro(cadena_string)
messageBox('Result', cadena_string +' - '+ string(cadena_int))
</code></pre>
Roberthttp://www.blogger.com/profile/14895827793936030496noreply@blogger.com1tag:blogger.com,1999:blog-6429080120211769725.post-88992118746638392462011-11-08T05:56:00.005-03:002020-11-12T09:13:36.985-03:00Login simple de usuarios con PowerBuilderBueno es este pequeño material les mostrare como conectarnos a una base de datos con distintos usuarios a la base de datos en nuestro caso usaremos power builder version 11.5 y base de datos postgres 9.
<br />
El material consiste en crear una pequeña ventana de usuario y contraseña y verificar que esos datos correspondan con el usuario creado en la BD y para entender el material necesitaras un previo conocimiento básico de power builder.
<br />
<a name='more'></a>Lo primero que necesitamos es crear una base de datos en postgres suponiendo que ya tenemos creado la BD y después necesitaremos agregar el ODBC de postgres puedes mirar en este post como <a href="http://sourcepy.com/como-agregar-odbc-de-sybase-y-conectarnos-a-travez-de-db-profile-de-power-builder/" title="Como agregar ODBC de Sybase y Conectarnos a travez de DB Profile de Power Builder">agregar ODBC</a>.
<br />
<br />
<strong>1er Paso: </strong>Necesitamos primeramente crear un nuevo workspace de power builder en nuestro caso llamaremos <i>ws_login</i> notemos la nomenclatura ws_ que se refiere a workspace es importante utilizar nombres estándares en nuestro proyecto bueno una vez creado nuestro espacio de trabajo necesitaremos crear nuestro tipo de objetivo nosotros usaremos solamente application definimos un nombre para nuestra aplicación y lo llamaremos login y automáticamente ya nos crear una librería con ese nombre el cual dejaremos asi y ahí ya tenemos nuestra librearía <i>login.pbl</i> y ya podemos crear los objetos que necesitamos en ella.
<br />
<br />
<strong>2do Paso: </strong>Ahora que ya tenemos nuestra librería como nuestro objetivo es hacer una ventana de login a una base de datos y una vez conectados abrir una ventana principal pues bien comencemos creando el PB Object (Window) lo creamos y guardamos como <i>w_login</i> (<i>w_</i> refiriendo a window) y necesitaremos crear 6 controles de PB 2 textos 2 cajas de texto y 2 botones.
<br />
El 1er texto podíamos llamarlo como Usuario: de seguido por la 1ra caja de texto el cual usaremos el single line edit lo llamaremos <i>sle_usuario</i> luego podemos poner debajo el 2do texto como Contraseña y la 2da caja de texto llamarlo como <i>sle_pass</i> pero como es una contraseña y este control en una de sus propiedades PB nos ofrece la opcion de tildar como password para ocultar los caracteres que escribamos dentro de ella bueno tildamos la propiedad password a true, debajo ponemos los botones usaremos el control command button al 1ro llamaremos <i>cb_login</i> al otro cb_cancelar.
<br />
<br />
<strong>3er Paso: </strong>Ahora que ya diseñamos nuestra ventana metámonos manos al código como es un simple login no necesitaremos poner ningún control en las cajas de textos cuando modifique o entre en el foco pero podríamos poner por ejemplo en <i>sle_usuario</i> en el evento modified! que al modificar el texto y dar enter que pase el foco(cursor) al campo <i>sle_pass</i> para ello usaremos la función de PB setfocus() que nos sirve para posicionar el cursor en algún control dentro de nuestra ventana y solo necesitamos poner en el evento modified! de <i>sle_usuario</i> la sentencia sle_pass.setfocus() así de fácil el nombre del control (.) nombre función o atributo = valor.
<br />
<br />
Ahora programaremos en el boton <i>cb_login</i> las sentencias necesarias para conectarnos y validar los datos lo primero que necesitamos es obtener los valores introducidos en los campos <i>sle_usuario</i> y <i>sle_pass</i> pues nos vamos al evento clicked! de <i>cb_login</i> ya que lo que nosotros queremos es que al dar clic en el botón procese e intente conectarse con la BD abrimos el evento y necesitaremos 2 variables para almacenar los valores de los campos lo llamaremos <i>vusuario</i> y <i>vpass</i> los dos de tipo string
<br />
<pre><code>string vusuario, vpass</code></pre>
<br />
<br />
luego una vez creados las variables capturamos los valores en ellas
<br />
<br />
<pre><code>vusuario = sle_usuario.text
vpass = sle_pass.text
</code></pre>
<br />
como verán usamos la propiedad .text de los campos el cual es la propiedad que contiene los caracteres escritos dentro de la caja si escribimos en <i>sle_usuario</i> robert en nuestra variable <i>vusuario</i> nos devolverá robert.
<br />
<br />
Para prevenir espacios vacíos podemos usar la funcion trim() de PB el cual elimina espacios vacíos innecesarios de una cadena y nuestra nueva línea quedaría asi:
<br />
<pre><code>vusuario = trim(sle_usuario.text)
vpass = trim(sle_pass.text)
</code></pre>
<br />
<br />
Bueno ahora que ya tenemos almacenado nuestros valores en nuestras variables ya es ora de tratar de conectarnos a nuestra base de datos y el cual lo haremos con la sentencia básica que nos provee PB para conectarnos:
<br />
<pre><code>SQLCA.DBMS = "ODBC"
SQLCA.LogId = vusuario
SQLCA.LogPass = vpass
SQLCA.AutoCommit = false
SQLCA.DbParm = "ConnectOption='SQL_DRIVER_CONNECT,SQL_DRIVER_NOPROMPT',ConnectString='DSN=login;UID="+vusuario+";PWD="+vpass+"'"
connect using sqlca;
</code></pre>
<br />
Explicando un poco sqlca es el nombre que usaremos para nuestra transacción en las conexiones, DBMS indicamos que nos conectaremos por ODBC, LogId nombre de usuario, LogPass contraseña, AutoCommit ponemos a false para el caso que tengamos varias transacciones al mismo tiempo y en el caso que si uno de ellos da error para que el resto no guarde los cambios, DbParm indicamos los parámetros de conexión: ConnectOption=(SQL_DRIVER_CONNECT,SQL_DRIVER_NOPROMPT) esto es para que no pregunte para elegir el ODBC a la hora de conectarnos. ConnectString = (DSN) el nombre de nuestro ODBC (UID) nombre de usuario (PWD) contraseña y finalmente tratamos de conectarnos mediante la sentencia connect using sqlca el cual establece la conexión a la base de datos.
<br />
Y para comprobar si no hubo ningún error al tratar de conectarnos y mostrar el mensaje de erro si hubiese usaremos dos palabras reservadas de PB:
<br />
<pre><code>IF sqlca.sqlcode <> 0 then
messagebox('Error', sqlca.sqlerrtext)
ELSE
messagebox('Ok', 'Muy bien te has conectado con el usuario: ' + vusuario)
END IF
</code></pre>
<br /><i>
sqlcode</i> nos devuelve el código del resultado de la transacción nos devuelve 0 en caso de éxito y <i>sqlerrtext</i> nos muestra el mensaje de error alojado por la base de datos.Roberthttp://www.blogger.com/profile/14895827793936030496noreply@blogger.com0tag:blogger.com,1999:blog-6429080120211769725.post-83756574409445100282011-09-24T07:14:00.000-04:002019-08-30T08:51:10.418-04:00Extraer números de una cadena con PHPBueno he hecho una función simple para poder extraer solo letras numéricas pasando como parámetro palabras compuestas como por ejemplo si tenemos una variable $rgf = 'e1x2a3m4p5l6e'; y queremos solamente los números de esa cadena pues esta función nos va a servir.<br />
<a name='more'></a><br />
<pre><code>
// @uthor: Robert Galeano Fernandez - @rgfpy
function ReturnNumbers($var){
$i = 0;
$return = "";
$part_var = "";
$len_var = strlen($var);
for ($i=0; $i<$len_var; $i++) {
$part_var = substr($var, $i, 1);
if (is_numeric($part_var)) {
$return .= $part_var;
}
}
return $return;
}
?>
</code></pre>
<br />
Como verán el script es muy sencillo lo primero que necesitamos es recorrer la cadena para preguntar si cada una de las letras es numérica y si es numérica vamos guardando pero para recorrer necesitamos saber cuantas letras contiene nuestra cadena.<br />
Teniendo todo empezamos, con la función strlen() obtenemos la cantidad de caracteres que posee nuestra cadena, con la función substr() extraemos parte de nuestra cadena, con la función is_numeric() verificamos si la cadena que le pasamos es de tipo numérico.Roberthttp://www.blogger.com/profile/14895827793936030496noreply@blogger.com2