Cobol Foro
Navegación en el Foro
Retroceder   Cobol Foro Entornos de desarrollo y compiladores Cobol Fujitsu COBOL PowerCOBOL (ActiveX, v4 - v11)
PowerCOBOL (ActiveX, v4 - v11) Versiones del IDE basadas en ActiveX
 
Respuesta
 
Herramientas

  #1
Antiguo 13 de junio de 2025, 16:34
Fito
Guardián del Foro
Agradecimientos: Por muchos agradecimientos de parte de los Foreros - Issue reason: Por muchos agradecimientos de parte de los Foreros Guardián del Foro: Guardián del espíritu y clima del Foro - Issue reason: Por el Avatar Activista del Foro: Activista del Foro - Issue reason: Por aportar ideas 
Última Actividad 19.09.2026 13:19
Posts Posts: 458
Likes enviados Enviados: 267
Likes recibidos Recibidos: 243
Predeterminado Cobol + Python
0 Inactivo Inactivo

Hola Amigos:

Hay alguna menera de trabajar con PowerCobol y Python que no sea correr por linea de comando y leer un resultado en un txt?

Algo mas tipo funcion u ocx.

Saludos

Fito
Fito is offline   Responder Con Cita
  #2
Antiguo 13 de junio de 2025, 18:09
Jorgeanna
Forero Junior
Última Actividad 25.01.2026 23:59
Posts Posts: 24
Likes enviados Enviados: 0
Likes recibidos Recibidos: 39
Predeterminado Servidor Com
2 Inactivo Inactivo

Quick Start to Server side COM and Python

ayuda para generar un servidor com para utiliza como interface en powercobol
Jorgeanna is offline   Responder Con Cita
  #3
Antiguo 17 de junio de 2025, 13:10
Fito
Guardián del Foro
Agradecimientos: Por muchos agradecimientos de parte de los Foreros - Issue reason: Por muchos agradecimientos de parte de los Foreros Guardián del Foro: Guardián del espíritu y clima del Foro - Issue reason: Por el Avatar Activista del Foro: Activista del Foro - Issue reason: Por aportar ideas 
Última Actividad 19.09.2026 13:19
Posts Posts: 458
Likes enviados Enviados: 267
Likes recibidos Recibidos: 243

Hola Jorge:

Gracias, me voy a poner a ver eso, a ver si entiendo algo...

Saludos...

Fito..
Fito is offline   Responder Con Cita
  #4
Antiguo 19 de junio de 2025, 16:50
Jorgeanna
Forero Junior
Última Actividad 25.01.2026 23:59
Posts Posts: 24
Likes enviados Enviados: 0
Likes recibidos Recibidos: 39

Por si ayuda en algo, te paso un script, que llamado de powercobol, devuelve el resultado de una operacion aritmetica utilizando ROUND_HALF_EVEN para el resultado, y otra que llama y ejecuta un link web, nada que extraordinario pero que te facilitara ver la mecanica de llamadas y respuestas via COM, tenia mas funciones que entregaban diferentes resultados, pero para mejor analisis las exclui y veas que no es dificil interacturar desde powercobol.
Código PYTHON:
  1. import win32com.client as wc
  2. import win32com.server.register
  3. import time
  4. import sys
  5. from decimal import *
  6. import os
  7. import winreg
  8. import pythoncom
  9.  
  10. class MODULOSCOM:
  11.     _public_methods_ = ['Calculo', 'Navegador']
  12.     _reg_progid_ = "MODULOS.COM"
  13.     _reg_clsid_ = "{80317A85-F824-45CD-82AC-3B3546C359EE}"
  14.     _reg_desc_ = "Servidor COM Python Para PowerVISUAL"
  15.  
  16.     def Navegador(self, Texto):
  17.         import webbrowser
  18.         webbrowser.open(Texto)
  19.         return True
  20.  
  21.     def Calculo(self, NumeroA, NumeroB, Operador, CantidadDecimales=2):
  22.         if type(NumeroA) != Decimal:
  23.             try:
  24.                 NumeroA = Decimal(str(NumeroA))
  25.             except:
  26.                 return 0
  27.         if type(NumeroB) != Decimal:
  28.             try:
  29.                 NumeroB = Decimal(str(NumeroB))
  30.             except:
  31.                 return 0
  32.  
  33.         if Operador == '+':
  34.             Operacion = NumeroA + NumeroB
  35.         elif Operador == '-':
  36.             Operacion = NumeroA - NumeroB
  37.         elif Operador == '*':
  38.             Operacion = NumeroA * NumeroB
  39.         elif Operador == '/':
  40.             try:
  41.                 Operacion = Decimal(str(NumeroA)) / Decimal(NumeroB)
  42.             except:
  43.                 return 0
  44.  
  45.         ResultadoPrevio = Decimal(str(Operacion))
  46.         Resultado = ResultadoPrevio.quantize(Decimal('1') / Decimal('10') ** Decimal(str(CantidadDecimales)),
  47.                                              rounding=ROUND_HALF_EVEN)
  48.  
  49.         return Resultado
  50.  
  51. def remove_registry_entry(clsid):
  52.     try:
  53.         reg_key = winreg.OpenKey(winreg.HKEY_CLASSES_ROOT, f"CLSID\\{clsid}", 0, winreg.KEY_SET_VALUE)
  54.         winreg.DeleteKey(reg_key, "")
  55.         print(f"Clave de registro de {clsid} eliminada.")
  56.         winreg.CloseKey(reg_key)
  57.     except Exception as e:
  58.         print(f"Error al eliminar la clave de registro: {e}")
  59.  
  60. def check_registry_clsid(clsid):
  61.     try:
  62.         reg_key = winreg.OpenKey(winreg.HKEY_CLASSES_ROOT, f"CLSID\\{clsid}")
  63.         winreg.CloseKey(reg_key)
  64.         return True
  65.     except FileNotFoundError:
  66.         return False
  67.  
  68. if __name__ == "__main__":
  69.     if len(sys.argv) > 1 and sys.argv[1].lower() == "register":
  70.         # Registra el servidor COM
  71.         win32com.server.register.UseCommandLine(MODULOSCOM)
  72.         print("Servidor COM registrado.")
  73.     elif len(sys.argv) > 1 and sys.argv[1].lower() == "unregister":
  74.         try:
  75.             print("Desregistrando el servidor COM...")
  76.  
  77.             # Intentamos desregistrar usando UseCommandLine
  78.             win32com.server.register.UseCommandLine(MODULOSCOM, unregister=True)
  79.             print("Desregistro usando UseCommandLine completado.")
  80.  
  81.             # Ahora eliminamos manualmente la clave del registro
  82.             remove_registry_entry(MODULOSCOM._reg_clsid_)
  83.  
  84.             # Verificamos si la clave ha sido eliminada
  85.             if not check_registry_clsid(MODULOSCOM._reg_clsid_):
  86.                 print("Servidor COM desregistrado correctamente.")
  87.             else:
  88.                 print("El servidor COM sigue registrado.")
  89.  
  90.             # Liberar las instancias COM si están en memoria
  91.             pythoncom.CoUninitialize()
  92.             print("Instancias COM liberadas.")
  93.  
  94.         except Exception as e:
  95.             print(f"Error al desregistrar el servidor COM: {e}")
  96.     else:
  97.         print("Usar 'register' o 'unregister' como argumento.")

desde POWERCOBOL
Código COBOL:
  1.  ENVIRONMENT     DIVISION.
  2.  DATA            DIVISION.
  3.  WORKING-STORAGE SECTION.
  4.  01 Objeto      pic x(14) value "MODULOS.COM".
  5.  01 ModulosCom      object reference COM.
  6.  01 NumeroA     Pic X(15).
  7.  01 NumeroB     Pic X(15).
  8.  01 Operador        Pic X.
  9.  01 Resultado       Pic X(15).
  10.  PROCEDURE       DIVISION.
  11.      invoke COM "CREATE-OBJECT" using Objeto returning ModulosCom. *> creo el objeto
  12.      
  13.      move "Text" OF CmText3 to NumeroA
  14.      move "Text" OF CmText5 to NumeroB
  15.      move "Text" OF CmText4 to Operador
  16.      invoke ModulosCom "Calculo" using NumeroA NumeroB Operador returning Resultado
  17.      
  18.      move Resultado to "Caption" OF CmStatic6
  19.      move Resultado to "Text" OF pasartexto
  20. *    INVOKE pow-self "DisplayMessage" USING  resultado
  21.      
  22.      set ModulosCom to null
LLAMADO AL NAVEGADOR VIA COM

Código COBOL:
  1.  ENVIRONMENT     DIVISION.
  2.  DATA            DIVISION.
  3.  WORKING-STORAGE SECTION.
  4.  01 Objeto      pic x(14) value "MODULOS.COM".
  5.  01 ModulosCom      object reference COM.
  6.  01 cuit                  pic x(11).
  7.  01 Resultado       Pic X(15).
  8.  01 Texto                 pic x(100).
  9.  PROCEDURE       DIVISION.
  10.      invoke COM "CREATE-OBJECT" using Objeto returning ModulosCom. *> creo el objeto
  11.      move spaces to texto
  12.      move "Text" OF dire to texto
  13.       invoke ModulosCom "Navegador" using texto returning Resultado
  14.      
  15.      set ModulosCom to null

Espero que te sea util la información, no hay mucho en la web que nos pueda ayudar.
Suerte.
Jorgeanna is offline   Responder Con Cita
  #5
Antiguo 20 de junio de 2025, 12:19
Kuk
Administrador
Última Actividad 19.09.2026 20:11
Posts Posts: 2.500
Likes enviados Enviados: 1037
Likes recibidos Recibidos: 1207

Comentario de Moderador
@Jorgeanna, usa los botones de resalto de sintaxis


Muy interesante tu aportación.

Según entiendo, hay que ejecutar primero el código Python que llama al Registro de Windows para agregar la referencia a las funciones definidas en el mismo.
Luego vía COM, PowerCOBOL puede acceder a estas funciones puesto que existen declaradas en el Registro de Windows.
¿Es así?



NORMAS DEL FORO - para garantizar el buen funcionamiento del Foro.
¿Te han ayudado? NO TE OLVIDES de darle a
¿Quieres dirigirte a alguien en tu post? Notifícale haciendo clic en su Nick
Kuk is offline   Responder Con Cita
  #6
Antiguo 20 de junio de 2025, 15:37
Jorgeanna
Forero Junior
Última Actividad 25.01.2026 23:59
Posts Posts: 24
Likes enviados Enviados: 0
Likes recibidos Recibidos: 39

Citación del post de Kuk Ver Mensaje

Muy interesante tu aportación.

Según entiendo, hay que ejecutar primero el código Python que llama al Registro de Windows para agregar la referencia a las funciones definidas en el mismo.
Luego vía COM, PowerCOBOL puede acceder a estas funciones puesto que existen declaradas en el Registro de Windows.
¿Es así?

Es correcto el analisis. Desde Cobol es muy simple pasa datos y la funcion en python la ejecuta y devuelve los resultados.
Todo lo que se te ocurra que puedas llegar a utilizar a traves de un script python se puede ejecutar desde nuestro lenguaje y ademas si lo convertimos a exe o dll, se registra una vez cuando se instala la app y luego solo solo se llama desde nuestra app.
Actua como interface entre ambos lenguajes y nos exime de utilizar archivos de texto para comunicar entre ambos lenguajes.
Lo tengo implementado en diversas necesidades para cubrir algunas funciones que no puedo hacer en cobol y es genial ya que esto amplia las posibilidades de no quedarnos estancados en el tiempo.
Como siempre digo, la imaginacion es el limite!!!
saludos cordiales
Jorgeanna is offline   Responder Con Cita
  #7
Antiguo 14 de agosto de 2025, 06:59
Eslopes
Creador de
PowerRustCOBOL
Guru de los Gurus: Por solidos y amplios conocimientos - Issue reason: Por ámplios conocimientos en la materia Concurso: Tercer puesto: Ganador/a del Tercer puesto en un concurso - Issue reason: Juego  Innovación: Por aportar innovaciones - Issue reason: Por aportar soluciones innovadoras 
Última Actividad 20.09.2026 13:24
Posts Posts: 357
Likes enviados Enviados: 29
Likes recibidos Recibidos: 157

Adjunto un video del código que creé para que GNU Cobol ejecute Python, pasando datos de un informe Cobol al LLM y permitiendo hacer preguntas sobre el contenido.

El video (
) muestra el código en funcionamiento. Todavía estoy evaluando el rendimiento de LLaMa 3 ejecutándose localmente. Mi equipo es un MacBook Pro M3, así que el rendimiento en una estación Windows típica (8 núcleos, 8 GB de RAM) probablemente será deficiente.

Otra posibilidad real es usar un servicio en la nube como Amazon Bedrock. De esta forma, tendríamos acceso a decenas de Foundation Models (FM), con un rendimiento enorme y aptos para producción. El punto es que, usando solo prompt engineering básico, es posible lograr cosas extraordinarias. En el caso del ejemplo del video, estoy pasando un informe generado por un programa COBOL y el LLM interpreta los datos y genera respuestas sobre los mismos, por ejemplo:
(Esta vez cambié el prompt para forzar las respuestas en español.)
Código:
---------------------------------------------------------------------------------------------

How can I help you?
Muéstre los 10 clientes más grandes, listando nombre y ventas hasta la fecha actual.

¡Claro! Aquí te presento los 10 mayores clientes según el informe:

1. **CORAL2INDIA FINANCE** con ventas de **57,481.45**
2. **TATA CONSUMER CO.** con ventas de **57,481.45**
3. **CORAL1INDIA FINANCE.** con ventas de **47,481.45**
4. **SENTIALS LOCAL PVT** con ventas de **37,481.45**
5. **ZINTEC PRVIATE LTD** con ventas de **27,481.45**
6. **TATA COFFEE PRIVATE.** con ventas de **27,483.45**
7. **INFO MANGEMENT CO.** con ventas de **17,481.45**
8. **COAL INDIA PVT LTD** con ventas de **17,481.45**
9. **GENERAL SERVICES CO.** con ventas de **11,444.00**
10. **DAUPHIN DEPOSIT BANK** con ventas de **14,099.00**

Espero que esto te ayude. ¡Si necesitas algo más, no dudes en preguntar!
---------------------------------------------------------------------------------------------
¡Las posibilidades son infinitas!]
Eslopes is offline   Responder Con Cita
  #8
Antiguo 10 de septiembre de 2025, 15:29
fastpho
El Foro es mi casa
Innovación: Por aportar innovaciones - Issue reason: SQLite + OO Cobol class Concurso: Primer puesto: Ganador/a del Primer puesto en un concurso - Issue reason: Acceso a datos Cobol vía web 
Última Actividad 21.08.2026 18:08
Posts Posts: 365
Likes enviados Enviados: 252
Likes recibidos Recibidos: 243

✅ *Interpolaridad de Python con PowerCobol*
ℹEjemplo de geolocalizacion usando la api de Nominatim
para procesar enviando direccion para obtener los datos
y genera un archivo .csv

Gracias a @@Jorgeanna,

Código COBOL:
  1.  ENVIRONMENT     DIVISION.
  2.  DATA            DIVISION.
  3.  WORKING-STORAGE SECTION.
  4.  01 ObjetoGenerico   pic x(21) value "LocPyCOM.elsCOMObject".
  5.  01 URLCom           object reference COM.
  6.  01 TextoDireccion   pic x(100).
  7.  01 ResultadoUrl     pic x(100).
  8.  
  9.  01 Numero           pic s9(9) comp-5.
  10.  
  11.  
  12.  *>Geolocalizacion
  13.  01 ResultadoGeol    pic x(100).
  14.  01 valorEstado      pic x(5).
  15.  01 valorLatitud.
  16.      03 v-Lat        pic x(15).
  17.  01 valorLongitud.
  18.      03 v-Lon        pic x(15).
  19.      
  20.  01 Tiempo           pic s9(9) comp-5.
  21.  01 Url              pic x(512).
  22.  01 url-maps         pic x(34) value "https://www.google.com/maps/place/".
  23.  01 returnvalue      pic s9(9) comp-5.
  24.  01 lang             pic x(3) value "esp".
  25.  PROCEDURE       DIVISION.
  26.     *> Objeto Creo
  27.      invoke COM "CREATE-OBJECT" using ObjetoGenerico returning URLCom. *> creo el objeto    
  28.      
  29.      if URLCom = NULL
  30.               display "ERROR: No se pudo crear objeto URLCom COM"
  31.               exit program
  32.      else
  33.               display "OK: se pudo crear objeto URLCom COM"    
  34.      end-if.
  35.    
  36.      *> Set Atributo numero cliente
  37.      move 530 to Numero.
  38.  
  39.      invoke URLCom "setValue" using Numero returning ResultadoUrl. *>Metodo.
  40. *     display ResultadoUrl.
  41.    
  42. *    *> Get Atributo numero cliente
  43.      move zeros to Numero.
  44.      invoke URLCom "getValue" returning Numero.
  45.      display "Retorno getValue:" , Numero.
  46.    
  47.      
  48.      *> Metodo Geola
  49.      move "Text" OF CmText-DIREC to TextoDireccion.
  50.      move spaces                 to ResultadoGeol.
  51.      invoke URLCom "CrearLocalizacion" using TextoDireccion returning ResultadoGeol. *>Metodo.
  52.      display "ResultadoGeol:" , ResultadoGeol.
  53.      unstring ResultadoGeol delimited by "|" into valorEstado valorLatitud  valorLongitud
  54.      end-unstring.
  55.  
  56. *    CALL "Sleep"        WITH STDCALL USING  BY VALUE Tiempo.    
  57.  
  58.      display "Estado:" , valorEstado.
  59.      display "LAtitud:" , v-Lat.
  60.      display "LOngitud:" , v-Lon.
  61.    
  62. *muestro valores
  63.      move valorLatitud  to "Text" OF CmText-Latitud.
  64.      
  65.      move valorLongitud to "Text" OF CmText-Longitud.
  66.      
  67.      move valorEstado   to "Text" OF CmText-ESTADO.
  68.  
  69.  
  70. *Muestra Maps
  71.  
  72.      string  
  73.          url-maps   delimited by spaces
  74.          
  75.          valorLatitud delimited by spaces
  76.          
  77.          ","           delimited by spaces
  78.          valorLongitud delimited by spaces
  79.          
  80.          into Url
  81.      end-string.
  82.      display Url.
  83.      MOVE Url TO "Text" OF CmText-URL.
  84.  
  85.  
  86. *Rutina OrdoWebView      
  87. *    INVOKE OrdoWebView1 "About".
  88.      MOVE POW-TRUE TO "Anchor" OF OrdoWebView1.
  89.      MOVE "https://www.google.com/" TO "HomeURL" OF OrdoWebView1.
  90.      MOVE Url TO "HomeURL" OF OrdoWebView1.
  91.    
  92.      *> Metodo url
  93.      move spaces                 to ResultadoUrl.
  94.      move Url                    to TextoDireccion.
  95.      invoke URLCom "url" using TextoDireccion returning ResultadoUrl. *>Metodo.
  96.  
  97.      
  98.      MOVE 2 to "SearchEngine" OF OrdoWebView1. *>Google.
  99.      INVOKE OrdoWebView1 "Init" USING Lang.
  100.      move 0 to "MousePointer" OF pow-self.  
  101.    
  102.  
  103. *final.
  104.      set URLCom to NULL.
  105.          
  106.      
  107.      

Código PYTHON:
  1. #Fecha 08-09-2025
  2. #Programa:elsisloc.py
  3. #para ejectuar ambiente desarrollo : python elsisloc.py --register o python elsisloc.py --unregister
  4.  
  5.  
  6. # Método 1: Eliminar claves del registro manualmente
  7. #reg delete "HKEY_CLASSES_ROOT\LocPyCOM.elsCOMObject" /f
  8. #reg delete "HKEY_CLASSES_ROOT\LocPyCOM.elsCOMObject.1" /f
  9. #reg delete "HKEY_CLASSES_ROOT\CLSID\{fc6bf508-392e-45e9-bd6e-44943fcb216f}" /f
  10.  
  11. import pythoncom
  12. import win32com.server.register
  13. from win32com.server.exception import COMException
  14. import ctypes
  15. import csv
  16. import os
  17. import sys
  18. import time
  19. from geopy.geocoders import Nominatim
  20.  
  21. # Configuración
  22. user_agent = "mi_aplicacion_geolocalizacion_v1"
  23. timeout = 10
  24. max_retries = 3
  25. retry_delay = 1
  26.  
  27. # Archivo de salida - usar ruta absoluta para evitar problemas con .exe
  28. if getattr(sys, 'frozen', False):
  29.     # Si estamos en un ejecutable PyInstaller
  30.     base_path = os.path.dirname(sys.executable)
  31. else:
  32.     # Si estamos ejecutando desde Python
  33.     base_path = os.path.dirname(os.path.abspath(__file__))
  34. output_file = os.path.join(base_path, "coordenadas.csv")
  35.  
  36. # Geolocalizador (mover a función para evitar problemas de inicialización)
  37. def get_geolocator():
  38.     return Nominatim(user_agent=user_agent, timeout=timeout)
  39.  
  40. class Controller:
  41.    
  42.    _public_methods_ = ['setValue', 'getValue','url','CrearLocalizacion']
  43.    _reg_progid_ = "LocPyCOM.elsCOMObject"
  44.    _reg_verprogid_ = "LocPyCOM.elsCOMObject.1"
  45.    _reg_desc_ = "Python Test COM Servicio"
  46.    _reg_class_spec_ = "elsisloc.Controller"  
  47.    _reg_clsid_ = "{fc6bf508-392e-45e9-bd6e-44943fcb216f}"
  48.  
  49.    def __init__(self):
  50.       """Constructor de la clase"""
  51.       print("Servidor COM correctamente")
  52.       self.value = 1
  53.       # Inicializar el archivo CSV
  54.       self.inicializar_archivo_csv()
  55.  
  56.  
  57.    def inicializar_archivo_csv(self):
  58.         """Inicializa el archivo CSV si no existe"""
  59.         try:
  60.             if not os.path.exists(output_file):
  61.                 with open(output_file, "w", newline="", encoding='utf-8') as csvfile:
  62.                     writer = csv.writer(csvfile)
  63.                     writer.writerow(["Cliente" , "Dirección", "Latitud", "Longitud", "Estado","Timestamp"])
  64.         except Exception as e:
  65.             print(f"Error al inicializar CSV: {str(e)}")
  66.  
  67.    def CrearLocalizacion(self, direccion):
  68.         """
  69.        Procesa una sola dirección y la geocodifica
  70.        Args:
  71.            direccion (str): La dirección a geocodificar
  72.        Returns:
  73.            str: Resultado del proceso o mensaje de error
  74.        """
  75.         try:
  76.             # Validar que se proporcione la dirección
  77.             if not direccion or direccion.strip() == "":
  78.                 return "ERROR: La dirección no puede estar vacía"
  79.            
  80.             direccion = direccion.strip()
  81.             print(f"Procesando dirección: {direccion}")
  82.            
  83.             latitud, longitud = self.geocodificar(direccion)
  84.            
  85.             if latitud and longitud:
  86.                 resultado = f"Dirección: {direccion}, Latitud: {latitud}, Longitud: {longitud}"
  87.                 print(resultado)
  88.                 self.guardar_resultado(direccion, latitud, longitud, "OK")
  89.                 return f"OK|{latitud}|{longitud}"
  90.             else:
  91.                 error_msg = f"Error al geocodificar la dirección: {direccion}"
  92.                 print(error_msg)
  93.                 self.guardar_resultado(direccion, "", "", "ERROR")
  94.                 return f"ERROR|No se pudo geocodificar la dirección"
  95.            
  96.         except Exception as e:
  97.             error_msg = f"ERROR: {str(e)}"
  98.             print(error_msg)
  99.             return error_msg            
  100.    def geocodificar(self, direccion):
  101.         """
  102.        Geocodifica una dirección con reintentos
  103.        """
  104.         geolocator = get_geolocator()
  105.        
  106.         for attempt in range(max_retries):
  107.             try:
  108.                 print(f"Intento {attempt + 1} para: {direccion}")
  109.                 location = geolocator.geocode(direccion)
  110.                
  111.                 if location:
  112.                     return location.latitude, location.longitude
  113.                 else:
  114.                     print(f"No se encontraron resultados para: {direccion}")
  115.                     return None, None
  116.                    
  117.             except Exception as e:
  118.                 print(f"Error en intento {attempt + 1}: {str(e)}")
  119.                 if attempt < max_retries - 1:
  120.                     time.sleep(retry_delay * (attempt + 1))  # Aumentar delay progresivamente
  121.                 else:
  122.                     print(f"Falló después de {max_retries} intentos")
  123.                     return None, None
  124.  
  125.    def guardar_resultado(self, direccion, latitud, longitud, estado):
  126.         """
  127.        Guarda el resultado en el archivo CSV
  128.        """
  129.         try:
  130.             with open(output_file, "a", newline="", encoding='utf-8') as csvfile:
  131.                 writer = csv.writer(csvfile)
  132.                 timestamp = time.strftime("%Y-%m-%d %H:%M:%S")
  133.                 nrocliente = self.value
  134.                 writer.writerow([nrocliente,direccion, latitud, longitud, estado, timestamp])
  135.         except Exception as e:
  136.             print(f"Error al guardar en CSV: {str(e)}")
  137.  
  138.    def setValue(self, new_value):
  139.       """
  140.      Set Numero del cliente
  141.      """
  142.       try:
  143.          self.value = new_value
  144.          return
  145.       except Exception as e:
  146.          raise COMException(f"Error en el valor enviado: {str(e)}")
  147.  
  148.    def getValue(self):
  149.       """
  150.      Get Numero del cliente
  151.      """
  152.       try:
  153.          return self.value if self.value is not None else "Value not set"
  154.       except Exception as e:
  155.          raise COMException(f"Error al obtener valor: {str(e)}")
  156.      
  157.    def url(self, Texto):
  158.       try:
  159.          import webbrowser
  160.          webbrowser.open(Texto)
  161.          return Texto
  162.      
  163.       except Exception as e:
  164.          raise COMException(f"Error navegador: {str(e)}")      
  165.  
  166. def show_message(message, title="Informacion"):
  167.    ctypes.windll.user32.MessageBoxW(0, message, title, 0x40)
  168.  
  169. def DllRegisterServer(silent=False):
  170.    try:
  171.       pythoncom.CoInitialize()
  172.       win32com.server.register.UseCommandLine(Controller)
  173.       message = "Objeto registrado exitosamente."
  174.    except Exception as e:
  175.       message = f"Error al registrar el objeto: {e}"
  176.    finally:
  177.       pythoncom.CoUninitialize()
  178.    if not silent:
  179.       show_message(message, "Objeto registrado")
  180.  
  181. def DllUnregisterServer(silent=False):
  182.    try:
  183.       pythoncom.CoInitialize()
  184.       win32com.server.register.UnregisterServer(
  185.          Controller._reg_clsid_,
  186.          Controller._reg_progid_
  187.       )
  188.       message = "Objeto anulado exitosamente."
  189.    except Exception as e:
  190.       message = f"Error al anular el registro del objeto: {e}"
  191.    finally:
  192.       pythoncom.CoUninitialize()
  193.    if not silent:
  194.       show_message(message, "Objeto no registrado")
  195.  
  196. if __name__ == '__main__':
  197.    import sys
  198.    silent = False
  199.    if len(sys.argv) > 1:
  200.       if len(sys.argv) > 2:  
  201.          if sys.argv[2] == '--silent':
  202.             silent = True
  203.       if sys.argv[1] == '--register':
  204.          DllRegisterServer(silent)
  205.       elif sys.argv[1] == '--unregister':
  206.          DllUnregisterServer(silent)
  207.       elif "/Automate" in sys.argv:
  208.          import win32com.server.localserver
  209.          win32com.server.localserver.serve([Controller._reg_clsid_])
  210.    else:
  211.          show_message("Use:\nelsisloc.exe --register\nelsisloc.exe --unregister\n--silent: Silent mode", "Ayuda")
Saludos ...

Miniatura de Adjuntos
Pulsar la imagen para la versión amplia
Nombre:  foropython.png
Vistas: 103
Tamaño:  116,3 KB  
fastpho is offline   Responder Con Cita
  #9
Antiguo 11 de septiembre de 2025, 01:44
Jorgeanna
Forero Junior
Última Actividad 25.01.2026 23:59
Posts Posts: 24
Likes enviados Enviados: 0
Likes recibidos Recibidos: 39

Muy bueno, felicitaciones por implementar algo que en el futuro le encontraras multiples uso.

Ajusta el siguiente setup.py a tus necesidades, descarga python 2.7 e instala py2exe, deberas correr: python setup.py py2exe
esto te generara una carpeta dist y en ella vas a encontrar su script xxxx.exe y xxx.dll, te recomiendo por rapidez trabajar con los dll y llamar al mismo como cualquier otra llamada a un objeto com.
Te digo descargues y pruebes con python 2.7 porque el setup.py que te paso esta para py2exe y se complica bastante, por lo menos a mi, ejecutarlo en veriones de la 3.11 en adelante.

Con perseverancia y trabajo todo se logra, adelante!!!.

script: setup.ini
Se puede convertir el ejemplo que puse anteriormente y utilizarlo desde powercobol

Código:
# Created on 02/2021
# @author: fastpho

from distutils.core import setup
import py2exe
import sys 
sys.argv.append('py2exe')
sys.path.append('C:\\WINDOWS\\WinSxS\\x86_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.4148_none_5090ab56bcba71c2')

#Fuente: https://www.iteramos.com/pregunta/27...-un-ejecutable

setup(
    # Nombre de la Clase
    name = "MODULOSCOM", 
    # nombre del script
    com_server = ["ModulosCOM"],
)
Jorgeanna is offline   Responder Con Cita
  #10
Antiguo 11 de septiembre de 2025, 18:53
fastpho
El Foro es mi casa
Innovación: Por aportar innovaciones - Issue reason: SQLite + OO Cobol class Concurso: Primer puesto: Ganador/a del Primer puesto en un concurso - Issue reason: Acceso a datos Cobol vía web 
Última Actividad 21.08.2026 18:08
Posts Posts: 365
Likes enviados Enviados: 252
Likes recibidos Recibidos: 243

Hola @Jorgeanna , el problema que tuve no fue con python en desarrollo
por que me corria perfectamente tengo varias implementaciones que hice
en python , estoy usando la version 3.13 de 64 bits , perdi mucho
tiempo para poder compilarlo a .exe y poder correrlo sin el ide
de python , logre despues de renegar tanto y perder mucho tiempo
por que no hay mucha informacion , inclusive las ia tampoco fueron
de gran ayuda , finalmente con pyinstaller logra hacerlo funcionar a .exe

Todavia tengo que aprender ... , pero la idea es seguir estudiando
python , y poder resolver algunos temas que son muy sencillos , con
un par de api's o librerias resolverlo.

Muchas gracias nuevamente por tu aporte

Saludos....
fastpho is offline   Responder Con Cita
Respuesta



Derechos de Publicación
No puedes publicar nuevos temas
No puedes publicar posts/responder
No puedes adjuntar archivos
No puedes editar tus posts

BB code is habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado

Saltar a Foro


La franja horaria es GMT +2. Ahora son las 16:19.
Powered by: vBulletin, Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.