miércoles, 30 de agosto de 2023

Solución a Setup is running in another window, use ALT+TAB to switch between windows.


Después de mucho intentar volver a "levantar" la versión 11.5 del PowerBuilder, pude encontrar la solución a este problema en este foro https://groups.google.com/g/sybase.public.powerbuilder.general/c/ZZ5zYC8mCXA?hl=en

El cual indica que hay que reiniciar el equipo en modo Prueba de Fallos

- Tecla WIN+R

- Escribimos msconfig

- Vamos a la pestaña de Arranque, marcamos Arranque a prueba de errores

- Marcamos Minimo, aceptamos, reiniciamos el equipo

- La PC se iniciara en el MODO A PRUEBA DE FALLOS

Cuando ya hemos iniciado en este modo, instalamos nuestro PowerBuilder el cual debería correr sin inconvenientes, una vez listo, de nuevo sacamos del modo PRUEBA DE FALLOS siguiendo los pasos anteriormente dichos pero esta vez desmarcando la opción ARRANQUE A PRUEBA DE FALLOS, reiniciamos y listo.

Espero te ayude este tip.






jueves, 16 de abril de 2020

Parpadeo y/o Titilar un texto en Ventana

En el Evento TIMER de la ventana colocamos 


this.st_obs.text ='Obs.: Aqui puedes poner el texto que Desees..'
// Si el st_help esta visible
If this.st_obs.Visible = True Then
 // entonces lo oculta
  this.st_obs.Hide( )
// de caso contrario
Else
 // lo muestra
 st_obs.Show( )
End If

En el Evento OPEN de la misma ventana

Timer(0.5) //puedes colocar el tiempo que se te de la gana... listo!

martes, 22 de octubre de 2019

Como trabajar con estructuras para paso de Parámetros
1. Primeramente Creamos la estructura con los datos y tipo de los mismos que vamos a almacenar en ellos
 Ejemplo.
es_impresion_cheque
- orden decimal
- banco  integer

2. En la ventana desde la cual vamos a pasar los parámetros declaramos una variable tipo estructura (la que creamos)
Ejemplo:
es_impresion_cheque v_impresion_cheque

Dependiento desde donde enviaremos los parámetros (en que evento), asignamos los valores a los mismos
v_impresion_cheque.banco = cdw_det1.object.banco[fila]
v_impresion_cheque.op = cdw_det1.object.op[fila]

Aquí podemos decir que la estructura esta cargada con los datos que queremos...
A continuación..... se envia la estructura como parámetro para la ventana en la cual queremos recibir éstos parámetros

openwithparm(w_imprimir_cheques, v_impresion_cheque, parent)

3. En la ventana que recibe el parámetro... en nuestro ejemplo w_imprimir_cheques... en el evento open() recibimos éstos
parámetros

if isvalid(message.PowerObjectParm)then
v_impresion_cheque = message.PowerObjectParm
cdw_argumento.object.banco[1] = v_impresion_cheque.cuenta_banco
end if

Al leer los datos
ld_cant_filas = cdw_datos.retrieve(v_impresion_cheque.op, ld_cuenta_banco)

jueves, 30 de mayo de 2019

Hallar el digito verificador a partir del número de Cédula - Sybase

CREATE FUNCTION "f_digito_verificador_fv"( IN p_cedula varchar (7)  )
RETURNS VARCHAR(1)

BEGIN    /*FUNCION QUE HALLA EL DIGITO VERIFICADOR A PARTIR DEL NUMERO DE CEDULA - BY .:fativilla:. 2019.05.30*/
    /*SET - PARAGUAY*/
    DECLARE i numeric (1);
    DECLARE mult numeric (1);
    DECLARE valor varchar(1);
    DECLARE valor_num NUMERIC (4);
    DECLARE v_Digit NUMERIC (4);
    DECLARE DV varchar(1);

    SET i = 1 ;
    SET mult=LENGTH(p_cedula)+1;
    SET valor_num=0;

    WHILE i <= 8 LOOP
       SET valor = substring(p_cedula, i, 1);
       SET valor_num= valor_num + ( cast ( valor as numeric) * mult  ) ;
       SET mult=mult-1;
       SET i=i+1;
    END LOOP ;

  
    IF  MOD (valor_num, 11)>1 THEN
       SET  v_digit = 11 - MOD (valor_num, 11);
    ELSE
       SET  v_Digit = 0;
    END IF;
   
   
    SET DV=CAST(v_Digit AS VARCHAR(1));
  
    RETURN "DV";
END

viernes, 26 de abril de 2019

Abrir Archivos con Api de Windows

1. Como primer paso declaramos la API en el Global Functions

/**********************API'S DE WINDOWS*********************/
//--API PARA ABRIR CARPETAS DE WINDOWS--fativilla 2019.04.25
FUNCTION long ShellExecute(ulong ihwnd,string lpszOp,string lpszFile,string lpszParams,&
string lpszDir,int wShowCmd ) LIBRARY "shell32.dll" ALIAS FOR "ShellExecuteW"
/*************************************************************/

2. Crear una Funcion, que recibirá como parametro la ruta de tipo String (funcion en mi caso de window)


//-------------------------------------------------------------------------
// Función    : long gf_Ejecutar(String spRuta)
// Propósito  : Ejecuta un fichero, sea lo que sea (doc, pdf, xls, mp3...)
// Parámetros : spRuta.- Ruta del fichero a ejecutar.
// Devuelve   : 1.- Todo bien
//             -1.- Hay error.
//-------------------------------------------------------------------------
Long   lRetorno
String sError, sNulo

SetNull(sNulo)
// Se ejecuta la ruta pasada.
lRetorno = ShellExecute(Handle(this), sNulo, spRuta, sNulo, sNulo, 3)
//El último argumento es el estilo de la ventana:
//SW_HIDE 0
//SW_SHOWNORMAL 1
//SW_NORMAL 1
//SW_SHOWMINIMIZED 2
//SW_SHOWMAXIMIZED 3
//SW_MAXIMIZE 3
//SW_SHOWNOACTIVATE 4
//SW_SHOW 5
//SW_MINIMIZE 6
//SW_SHOWMINNOACTIVATE 7
//SW_SHOWNA 8
//SW_RESTORE 9
//SW_SHOWDEFAULT 10
//SW_MAX 10

IF lRetorno <= 32 THEN
 // Hay error
 CHOOSE CASE lRetorno
  CASE 2
   sError = "Fichero no encontrado"
  CASE 3
   sError = "Ruta no encontrada"
  CASE 5
   sError = "Acceso denegado"
  CASE 8
   sError = "Fuera de memoria"
  CASE 32
   sError = "DLL no encontrada"
  CASE 26
   sError = "A sharing violation occurred"
  CASE 27
   sError = "Asociación a fichero no válida o incompleta"
  CASE 28
   sError = "DDE Time out"
  CASE 29
   sError = "DDE transaction failed"
  CASE 30
   sError = "DDE busy"
  CASE 31
   sError = "No existe ninguna asociación a la extensión del fichero"
  CASE 11
   sError = "Invalid EXE file or error in EXE image"
  CASE ELSE
   sError = "Error desconocido"
 END CHOOSE
 Messagebox("Error..." + String(lRetorno),sError)
 Return -1
END IF

// Todo bien.
Return 1

3. Finalmente podemos llamar a nuestra funcion desde donde necesitemos

     gf_executar("path" )



Fuente: http://picarpiezas.blogspot.com/2011/04/como-ejecutar-cualquier-fichero-en.html


miércoles, 18 de enero de 2017

Sumar Mes a una Fecha en Sybase

SELECT MONTHS( CAST( TODAY()
AS DATETIME ), 5).
Ejemplo: Si tenemos la fecha '05/05/1990' lo siguiente nos devuelve '05/10/1990'.

miércoles, 21 de septiembre de 2016

Recuperar datos de campo ubicado en un datawindow Composite

Me sucedió que quise recuperar un dato que se encontraba en un datawindow Composite, lo hice de la siguiente manera:
ls_prome=cdw_listado.object.dw_3.object.compute_5[1]
Donde: cdw_listado es el datawindow "normal" y
             dw_3 es el datawindow composite.

Espero haya sido de provecho.

sábado, 15 de febrero de 2014

Utilidades De las tablas SYS en SYBASE

* Estas son utilidades muy básicas, pero debido al poco material sobre esta herramienta en Español, lo comparto con todos Uds. espero que les sea de mucha utilidad como lo fué y es para mi.

- En la tabla Sysobjects podemos ver todas las tablas del sistema que nos puedan servir para hallar alguna otra información....
select * from sysobjects 


         1) Ver en que tablas hay un campo especifico

   --> SELECT * FROM SYSTAB WHERE table_id in (select table_id 
          from SYSTABCOL
          where COLUMN_NAME='nombre_del_campo' 
                1.1 Listar campos de una tabla.
                     SELECT column_name FROM SYSCOLUMN WHERE table_id=
                    (SELECT table_id        FROM SYSTABLE WHERE table_name = 'vnt_ventas_cab')
2) Ver tablas del sistema         
     --> select * from  SYSTAB
         3) Funciones y palabras reservadas
               --> select * from  SYSCAPABILITIES
         4) Todos los triggers
               --> select * from  SYSTRIGGERS
         5) Procedimientos y Funciones 
              --> select * from   SYSPROCEDURE






martes, 17 de julio de 2012

Setear Impresora

Si deseamos setear un dw a una impresora que no sea la predeterminada necesariamente, una opcion es utilizar.
this.Object.DataWindow.Printer = "\\IP_de_donde_tienes_instalado\Nombre_de_la_impresora"
this.print()

jueves, 5 de julio de 2012

Contar caracteres que se va ingresando a un campo

Esta funcionalidad nos sirve para ir contando los caracteres que ingresamos en un campo, algo similar a lo que nos ofrecen los telefonos móviles cuando estamos escribiendo un mensaje de texto.
Primeramente creamos un objeto tipo text, en mi caso lo llamo t_contar y le asigno un valor 0.
 
Creo un Evento que lo llamo ue_lencampo, donde cuento cuantos carateres tiene el campo, no hace falta que el evento reciba parametros y tampoco que lo retorne, yo lo hice en un evento nuevo, uds. ya veran si crean o lo hacen en alguno que ya lo tengan, todo depende de la aplicabilidad que se le dará.


 Luego creamos un Evento, al cual yo le llamo ue_key con las siguientes caracteristicas y en el colocamos el scrip que continua
/*trabaja en conjunto con el evento ue_lencomentarios para ir mostrando cantidad de
caracteres ingresados*/
if this.getcolumnname() = 'comentario' then
        if this.object.t_contar.text='0' then this.TriggerEvent('ue_lencomentarios')
        /*si presionamos teclas de arriba, abajo, costados, no hacer nada*/
        if KeyDown(KeyLeftArrow!) or KeyDown(KeyUpArrow!) or KeyDown(KeyRightArrow!) or KeyDown(KeyDownArrow!) then return
        If KeyDown(KeyBack!) or KeyDown(KeyDelete!) then //si borramos caracteres, restamos sino sumamos
            this.object.t_contar.text=string(long(this.object.t_contar.text)-1)
        else
            this.object.t_contar.text=string(long(this.object.t_contar.text)+1)
        end if
        if long(this.object.t_contar.text)=290 then     messagebox( "Atención", "Esta llegando al límite del texto!",Exclamation!)
end if


*No olvides alimentarme con un comentario y/o calificación.



viernes, 29 de junio de 2012

Verificar la Existencia de una carpera y/o archivo

Scrip para Verificar la existencia de un directorio
IF FileExists("C:\PDF\carta_oferta.pdf") THEN
    ls_ruta='C:\PDF\carta_oferta.pdf'
else
    messagebox( "Atención ",'NO EXISTE C:\PDF\carta_oferta.pdf~n~r' +&
    'NO SE ADJUNTARA EL ARCHIVO!!!')
end if

Abrir window con varios parametros - PowerBuilder

Como podriamos abrir una ventana enviandole varios parametros, he aqui una solución que me sirvió mucho. El ejemplo esta basado en mi experiencia
1. Creamos una structura con los parametros que vamos a enviar y recibir.
     A mi structura lo llamé st_parametros_email
 2. Luego vamos a crear el Scrip desde donde enviaremos los parametros.
     En mi caso el el Evento Clicked de un boton.
     w_frame lw_frame
     w_sheet lw_sheet
     st_parametros_email lstr_parm //Aqui declaramos el parametro como
     //la structura que creamos anteriormente
     string ll_mail, ls_ruta, ls_parametros
     ll_mail = tabpage_1.dw_1.object.personas_mail[1]
     ls_ruta='C:\PDF\carta_oferta.pdf'
    //le asignas los valores para la structura
    lstr_parm.st_para =ll_mail
    lstr_parm.st_adjunto =ls_ruta
    lstr_parm.st_asunto ='Presupuesto'
    lstr_parm.st_cuerpo = 'Sr./es Cliente/s.: Adjuntamos Presupuesto'
    //aqui utilizo solo funciones del PFC, si no trabajas con PFC solo haz el  
    //clasico openwithparm(w_miventana,lstr_parm) y ya....
    if gnv_appmanager.of_getframe( lw_frame )  <> 1 then return
           opensheetwithparm(lw_sheet,lstr_parm,"w_send_mail",lw_frame,2,original! )
3. Y por ultimo este scrip lo ponemos en el evento OPEN de la ventana que recibirá los parametros.
    st_parametros_email lstr_parmr
    lstr_parmr = Message.PowerObjectParm
   //aginar los valores a cajas
   Sle_to.text = lstr_parmr.st_para
   lb_archivos.Additem(string( lstr_parmr.st_adjunto))
   sle_sub.text = lstr_parmr.st_asunto
   mle_mail.text = lstr_parmr.st_cuerpo

Scrip PowerBuilder para Guardar directo a PDF

Este scrip nos permite guardar en PDF un reporte, ya que con el dw.saveas() si bien figura en la lista el formato, no guarda, o guarda pero al querer abrirlo nos da un Error.
Como primer paso debes tener Instalado una impresora Virtual, podria se el PDFCreator, cuando ya lo tengas instalado, renombralo con "PDF" (en el scrip llamaremos a esa impresora, si lo nombras de otra manera no lo encontrará), luego instalas el gs871w32.exe para S.O. de 32bits, y el gs871w64.exe para S.O. de 64bits, lo puedes descargar de algun sitio de internet, mas adelante sugeriré el sitio de donde yo lo descargué.
Y a continuación el Scrip, que yo lo puse en el evento clicked de un boton, cada uno verá donde ubicarlo de acuerdo a sus necesidades.

//por fativilla 27.06.2012 \m/
string ls_arc_pdf
CreateDirectory(GetCurrentDirectory( ) +'\PDF\') //SI no existe la carpera lo crea en el directorio del app
ls_arc_pdf= GetCurrentDirectory( ) +'\PDF\carta_oferta.pdf'
tabpage_5.dw_10.Object.DataWindow.Export.PDF.Method = Distill!
tabpage_5.dw_10.Object.DataWindow.Printer = "PDF"//PDF Nombre de la impresora virtual
tabpage_5.dw_10.Object.DataWindow.Export.PDF.Distill.CustomPostScript="YES"     // Permitir Postscript
if tabpage_5.dw_10.SaveAs(ls_arc_pdf,PDF!,true) <> 1 then
  messagebox("Error","Hubo un error al generar el archivo PDF~n~r"+&
                      "1. Puede que no haya instalado gs871w32.exe~n~r"+&
                    "2. Puede que no tenga una impresora virtual con el nombre 'PDF'~n~r", StopSign!)
else
    messagebox("Atención","El archivo se generó con EXITO!!~n~r"+&
                      ls_arc_pdf)
 end if

* Sitio de donde puedes descargar el gs871w32.exe
http://es.sourceforge.jp/projects/sfnet_ghostscript/downloads/GPL%20Ghostscript/8.71/gs871w32.exe/

martes, 26 de junio de 2012

Para saber relaciones de una tabla específica, cambias "AJUSTE" por la tabla de la cual quieres averiguar.

SELECT * FROM RDB$RELATION_CONSTRAINTS WHERE RDB$CONSTRAINT_NAME NOT STARTING WITH  'INTEG'
AND RDB$RELATION_NAME = 'AJUSTES'

Obtener directorio de la aplicación

Si quieres extraer el direcctorio donde se encuentra tu app, en mi caso lo busque para colocar el logo de la empresa en un reporte.
string ls_direcctorio_aplicacion
ls_direcctorio_aplicacion = GetCurrentDirectory( )
tabpage_5.dw_10.object.p_logo.Filename=ls_direcctorio_aplicacion+'\CR_Superior.JPG'
tabpage_5.dw_10.object.p_logo1.Filename=ls_direcctorio_aplicacion+'\CR_Inferior.JPG'

lunes, 7 de mayo de 2012

Crear Archivos .txt y/o .sql

En el ejemplo creo un archivo .sql a partir de un mle_1.text, ya le daran la utilidad que deseen y dependiendo del requerimiento de cada uno. En mi caso lo hice en el evento clicked de un boton.

//Exportar a un archivo
Int li_archivo
String ls_registro ,as_path_salida,as_archivo
as_path_salida     ='C:\Trigger\'
as_archivo = 'generado.sql'
CreateDirectory ( as_path_salida ) //crea la carpeta si no existe
//borramos el archivo si existiera
FILEDELETE(as_path_salida + as_archivo )
//Abrimos el archivo
li_archivo= FileOpen(as_path_salida + as_archivo ,LineMode!,Write!,lockwrite!)
ls_registro=mle_1.text
FileWrite(li_archivo, ls_registro)
FileClose(li_archivo)
messagebox( "Atención", 'Archivo guardado en: '+as_path_salida)

miércoles, 9 de noviembre de 2011

Como Restaurar una Base de Datos FIREBIRD

Es muy sencillo. Les dejo como hacerlo esto lo deben de grabar en un archivo .bat, lo ejecutan y ya.
Agradeceria comentarios y/o puntuacion asi puedo saber si les fue de provecho y seguir posteando.

c:\trabajo\gbak -r -n -user SYSDBA -password masterkey c:\trabajo\backup_de_la_BD.fbk c:\trabajo\BD_RESTAURADA.fdb

Aclaro que deben de cambiar la ruta, nombre de usuario y pass de acuerdo a la BD de uds... pueden consultar si no esta claro.

miércoles, 28 de septiembre de 2011

Mas orden en DataWindow

// Permite ordenar ascendentemente o descendentemente la columna sobre la cual se ha hecho doble clic...
String ls_header, ls_temp, is_lastheader , is_order

// Para el caso que la columna sea de tipo texto...
IF dwo.Type = "text" THEN
       ls_header = dwo.Name
       IF ls_header = is_lastheader THEN
               IF is_order = "D" THEN
                       is_order = "A"
               ELSE
                       is_order = "D"
               END IF
       ELSE
               is_lastheader = ls_header
       END IF
      
       // Como los títulos de las columnas por defecto son <campo>_t recortamos los dos últimos caracteres
       ls_temp = Left(ls_header, Len(ls_header) - 2) + " " + is_order
       This.SetRedraw(False)
       This.SetSort(ls_temp)
       This.Sort()
       This.SetRedraw(True)
END IF

miércoles, 24 de agosto de 2011

Colores PowerBuilder

Algunos truquitos numericos para colorear text o backgroup
* Cambie la numeracion por el color que desea segun tabla de colores
   this.Modify( ls_dia+".Background.Color='12632256'")
   this.Modify( ls_dia+".Color='12632256'")
  • Colores Especiales
Button Face 79741120
Text 33554432
Background 1090519039
App. Workspace 276856960
  • Colores Clásicos

 Color             Red  Green Blue 

 Black 0 0 0 0
White 255 255 255 16777215
Gray 192 192 192 12632256
Dark Grey 128 128 128 8421504
Red 255 0 0 255
Dark Red 128 0 0 128
Green 0 255 0 65280
Dark Green 0 128 0 32768
Blue 0 0 255 16711680
Dark Blue 0 0 128 8388608
Magenta 255 0 255 16711935
Dark Magenta 128 0 128 8388736
Cyan 0 255 255 16776960
Dark Cyan 0 128 128 8421376
Yellow 255 255 0 65535
Brown 128 128 0 32896

jueves, 28 de julio de 2011

Función para encriptar y desencriptar cadena de texto

Para esto creamos dos funciones, una que encripta y otra que desencripta el texto.
PARA ENCRIPTAR
Función 1: f_encripta(as_origen)

String vls_char, vls_result
String vls_str1, vls_str2
int    j

vls_str1 = "ABCDEFGHIJKLMNÑOPQRSTUVWXYZabcdefghijklmnñopqrstuvwxyz1234567890/"
vls_str2 = "zaq1xsw2cde3vfr4bgt5nhy6mju7ki8lo9ñp0ZAQXSWCDEVFRBGTNHYMJUKILOÑP&"
vls_result = ""

FOR j=1 TO len(a_origen)
     
      vls_char = mid(a_origen,j,1)
      vls_result += mid(vls_str2, pos(vls_str1, vls_char), 1)

NEXT
RETURN vls_result
PARA DESENCRIPTAR
Función 2: f_des_encripta(a_origen)

String vls_char, vls_result

String vls_str1, vls_str2
int    j

vls_str2 = "ABCDEFGHIJKLMNÑOPQRSTUVWXYZabcdefghijklmnñopqrstuvwxyz1234567890/"
vls_str1 = "zaq1xsw2cde3vfr4bgt5nhy6mju7ki8lo9ñp0ZAQXSWCDEVFRBGTNHYMJUKILOÑP&"
vls_result = ""

FOR j=1 TO len(a_origen)
     
      vls_char = mid(a_origen,j,1)
      vls_result += mid(vls_str2, pos(vls_str1, vls_char), 1)

NEXT
RETURN vls_result