Está en la página 1de 21

POWER BUILDER

Herramienta de desarrollo de aplicaciones Cliente – Servidor para ambiente Windows, posee muchas áreas de
trabajo para el desarrollo de los objetos o elementos que conforman una aplicación, cada objeto que se crea en
la aplicación o proyecto generalmente debe estar guardado en un archivo de librería o biblioteca(*.pbl) donde
será almacenado para su utilización.

Se pueden tener abierta múltiples áreas de desarrollo, pudiendo cambiarse de una a otra a través del menú
Windows, donde aparece con una marca el área donde está actualmente y el elemento en el que se está
trabajando.

OBJETOS

1. Ventana, la cual puede tener controles (botones, datawindows etc) y estos tiene propiedades como
Name, text, si es visible o no etc. para encontrarlas hacemos doble click sobre el control. El control
puede tener asociados diferentes comportamientos que encontramos haciendo clic derecho y luego
clic en Script, aquí encontramos diferentes eventos que podemos programar por ejemplo que hacer si
dan clic sobre el control, o si lo abrimos o lo cerramos los eventos son diferentes según el control,
por ejemplo un botón tiene el evento clic, una ventana tiene el evento abrir o cerrar, un datawindow
tiene el evento itemchanged o updatestart (este se usa en caso de validaciones en el ingreso de datos)

2. DataWindow, se asocia a un control de dw y se crea en otro lado. Para crear el objeto hay varias
maneras:

a. Si ya existe, clic derecho y Modify DataWindow

b. Si sabemos el nombre, por la librería

c. Si lo vamos a crear, en la barra menú está un icono para DW y clic en el botón New

Estando en el objeto, en el modo diseño, vemos la gráfica y en data source vemos sql fuente, el sql
puede ser gráfico, pero no todo se puede graficar por lo tanto lo utilizamos poco.

Para pasar de un modo a otro, clic sobe el icono sql en la barra de iconos.

Estando en modo fuente para definir los argumentos que necesitamos en el dw object, clic en Design
de la barra menú, Retrival Argument. Cuando lo estamos definiendo le dmos un nombre y un tipo.
Este argumento definido se usa en el sql fuente asi :nombreargumento.

Cuando estamos haciendo el sql fuente y queremos probar que no tiene errores:

- Abrimos en PB la base de datos así: Database y luego DB Administration

- Copiamos el sql fuente y lo pegamos

- Cambiamos los argumentos por valores fijos y colocamos ; al final de la instrucción

- Ejecutamos el Sql hasta que este ok

- Lo copiamos sin el ; y lo pegamos en el sql fuente pero con argumentos.

Haciendo un DW objeto nuevo


Identificar en cual Libreria está el objeto

1. Hacemos la instrucción Sql primero en Database / DB Adimistration y la probamos

2. En la barra de iconos principal encontramos el icono para DataWindow y New

3. Para Source escogemos SQLSelect

4. Para Style hay varias opciones:

a. Composite: Un DW con varias DW

b. Crosstab: Presenta información cruzada por ejemplo compañía contra unidades


de servicios

Compañía urgencias uci hospitalización cx


A 300 5 50 15
B 20 200 300
c. Freeform: Para capturar información de una fila de una tabla, por ejemplo, paciente,
empresa

Nombre:

Documento:

Dirección:

Teléfono:

d. Graph: Para mostrar un gráfico de barras, tortas etc.

e. Grid: El más utilizado, muestra información de muchos registros en forma tabular.


Permite que el ancho de columna sea ajustable, pinta la grilla y se puede cambiar el
orden de los campos.

f. Group: Casi no se utiliza, permite hacer filas de agrupación por ejemplo en un listado
de facturas podría agruparse por empresa y mostrar el total de factura por empresa.

g. Label: Para hacer rótulos

h. N-up: Parecido al grip pero se repite en la misma hoja la información por ejemplo:
Factura Fecha Valor Factura Fecha Valor

i. OLE 2.0: Object Linking and Embedding, por ejemplo, cuando en un campo de una
tabla guardamos un texto de Word, estos campos se definen como binario pero tienen el
inconveniente de ser muy grandes.

j. Rich Text: es como un pequeño editor de texto.

k. Tabular: Lo mismo que Grid pero no permite ajustar el tamaño de la columna, o


muestra la grill etc.

5. Luego seleccionamos la tabla y nos muestra la tabla y seleccionamos los campos que queremos
que aparezcan, en la barra menú seleccionamos la opción Design y luego Convert to syntax.

6. Copiamos la secuencia SQL que teníamos preparada en el punto 1, en DB Administrator

7. Regresamos al diseño con clic en el icono Sql

8. Y pegamos la instrucción Sql


BUSCAR UN OBJETO EN LA LIBRERÍA (La aguja en el pajar)

Ejecutamos la aplicación, vamos al módulo Administración y luego Admon / Administración


Librerías. Tenemos dos opciones:

- Actualización de librerías: Recorre todas las librerías y guarda información en tablas.


Siempre debemos actualizar para que tome los últimos cambios que hayamos hecho. En
Instalación IC es que las librerías son de icono.

- Consulta de Librerías: como sabemos cómo inicia el nombre de nuestro objeto a buscar
clic en la primera fila de entrada y escribimos: like w_aa_% y clic en Consultar

EJERCICIO

Agregar campo compañía a un informe de cartera, en todos los data Windows.

1. Buscar el dw en la librería de cartera

2. Doble clic en la librería

3. Clic en el icono Sql y corrijo la instrucción

4. Si elimine o agregue argumentos o parámetros clic en Design en la barra menú y luego Retrieval
Arguments

5. Si aparece un mensaje indicando que un argumento no se ha usado, no es problema ya que se puede


estar usando solo a nivel del diseño.

6. Clic en guardar

INTRODUCCION

OBJETOS TIENES PROPIEDADES Y METODOS

LOS OBJETOS PUEDEN SER

VISUALES : VENTANA, MENU

NO VISUALES: de los más usados están

 SQLCA

 Message

 Una función.

HERENCIA.

Lo mejor son solo dos niveles de herencia, no se recomienda cambiar el nombre de los controles en los hijos.

Se puede cambiar el código heredado con OVERRIDE

Se puede agregar código al heredado con EXTEND (codigo papa+hijo)

AMBIENTE DE DESARROLLO
SQLCA:

 sqlca.dbms= ODBC

 Sqlca.dbparm=

 Sqlca.sqlcode que código genero la ejecución de un sql.

a. 0 ok y encontré

b. 100 ok pero no encontré nada

c. número negativos que son los errores. Este número depende la BD a la que estemos
conectados son diferente si es Oracle o sybase etc.

 Sqlca.errtext: cuando es error o numero negativo muestra el texto del error.

Message:

Al abrir una nueva ventana, podemos enviar parámetros por ej.: registro = Message.SringParm, si se necesita
enviar más de un parámetro se concatenan separados por un + y así en la nueva ventana se pueden separar.

a.i.1. StringParm, es el que más se usa

a.i.2. ObjectParm

a.i.3. LongParm

Ejemplo de uso message.stringparm :

Si tenemos la ventana w_1 que llama a la ventana w_2 y vamos a pasar parámetros lo hacemos asi
OpenwithParm(w_2,parámetro) y en la w_2 en el evento Open traemos el parámetro asi registro =
Message.StringParm.

Para devolver parámetros Closewithreturn(parent, parámetro)

Si necesitamos pasar más de un parámetro debemos hacerlo concatenando y separando con el signo +

Si necesitamos pasar registro y concepto parámetro = registro+ ‘+’+concepto y en el evento Open usamos la
función

f_decifra_parametros(arreglo,nroparametros)
Arreglo(1) el nro del registro
Arreglo(2) el concepto
Nro_parametros = 2

Openwithparam(w_ventana,regisro+’+’+’ ‘), si w_ventana es de respuesta cuendo esta se cierra regresa a la


siguiente instrucción luego del openwithparam.

SCRIPTS

Un script de PB puede tener:

1. Instrucciones PB

2. Funciones:
a. mid(string,start (,length)) Retorna una cadena que contiene un número especificado de
caracteres, comenzando de una posición indicada.

b. Pos(string1,string2(,start)) Retorna la posición del string 2 en el sring1 comenzando a


buscar en start.

3. Sentencias SQL, cuando se necesita invocar una variable se debe colocar :nombrevariable

TIPS:

 CONEXIÓN A LA BASE DE DATOS: En la ventana de acceso w_acceso se ingresa con el usuario y


la contraseña y en el botón Aceptar es cuando se conecta a la BD así:
Sqlca(DBMS = ‘ODBC’)
Sqlca(dbparm=’DNS = el definido cuando creamos el odbc en el panel del control’,usuario,clave)
Connect;

Y para desconctarnos
Disconnet;

Si usamos otra BD se debe definir otro objeto de transacción por ejemplo sqlca1.

Cuando se usa en dw se hace asi: dw_1.Settransobject(sqlca) y desde SQL sería asi: Select nombre into
:nombre from no_empleado where cedula = :cedula (using sqlca ) lo hace por defecto.

Cuando se programa para la web se debe conectar y desconectar en cada ventana, algo similar debió
progamarse en la aplicación módulo de historia clínica para reconectarse porque Postgres detecta
inactividad y mata el proceso automáticamente.

 Muchas veces se requiere hacer una w o un dw similar a otro ya hecho, para esto debemos abrir el
objeto y por la opción File de la barra del menú y luego Save as, colocar el nombre adecuado y
guardar en la librería que corresponda.

Cuando en una ventana tenemos un dw pero se debe ejecutar un select diferente según la opción que escojan
hay dos soluciones posibles:

1. Elaborar dos dw y en cada uno correr el select correspondiente Ej: Where concepto = ‘LABO’ o
Where concepto in ( ‘RMAG, ‘IMAG’). Es más fácil de hacer.

if rb_sin_servicios.checked=true then
dw_1.DataObject='d_factura_pagos_glosas_sin_serv_imp'
else
dw_1.DataObject='d_factura_pagos_glosas_imp'
end If
dw_1.SetTransObject(sqlca)
2. Cambiar la sintaxis del SQL en el botón Consultar. Es más fácil de mantener. Ver ejemplo en la
librería AUDITOR2 ventana w_facturas_pagos_glosas_imp.

if rb_todas.checked=true then
instruccion_sql= dw_1.GetSQLSelect()
select replace(:instruccion_sql,'( factura.saldo > 0 ) and ',' ') into
:instruccion_sql_nueva from parametro;
if sqlca.sqlcode <> 0 then
Messagebox('Error','En replace de factura.saldo > 0 '+sqlca.sqlerrtext)
Return
End If
dw_1.Object.DataWindow.Table.Select=instruccion_sql_nueva

Para en el código seleccionar un dw:


dw_1.DataObject = ‘nombre del dw’
dw_1.SetTransbject = ‘sqlca’

En el evento OPEN se debe colocar dw_1.SetTransObject(Sqlca) y siempre que se hace un DataObject hay
que hacer un SetTransObject

OBJETO APLICACIÓN: Los eventos más usados son Open y Close. Nuestro objeto aplicación que se
llama Clínica o sihos, está ubicado en la librería Ventana.

USER OBJECTS: Sirve para reutilizar código por ejemplo un dw que contiene varios controles como
botones para Insertar, Guardar y Salir

FUNCIONES: Reusabilidad del código. Cuando un código es muy extenso se puede agrupar una parte en una
función y así se puede entender mejor. Pueden devolver o no un valor mediante la instrucción Return()

Las funciones pueden ser:


 De PB
 Definidas por el usuario: Estas pueden ser
o Global : las nombranos así f_nombrefuncion
o Windows: las nombramos así wf_nombrefuncion y se declaran estando en un script así: En
la barra menú Declare / Window Function
 Externas

Formas como pueden pasar los parámetros


 Valor: Al regresar no camban su valor
 Referencia ( By pass): Al regresar pueden haber cambiado su valor
 Read Only: Poco uso

VENTANAS: Las ventanas pueden ser de deferentes tipos, por ejemplos las PopUp queda abierta y se puede
continuar con la que la abrió. Main, MDI, Respuesta.

Eventos de las ventanas: Open, Close, Activate (cuando está activa), rbottondown (si le dan clic derecho)

CONTROLES: Los mas usados son los datawindows dw, Commandbutton, singleLineEdit, EditMask,
StaticText, Radiobutton.

Los controles tienen Propiedades como nombre, tamaño, posición, letra ect y Eventos como Click, doble
click, click derecho y son diferentes según el control. Uno de los mas usados en el dw es itemchanged y un
SingleLinedit es Modify.

Algunos dw se usan solo para procesos y no los debe ver el usuario por esto se les inactiva la propiedad
Visible

Para poder verlos en la barra menú vamos a la opción Design / Option / Show Invisible
En el control CommandButton se puede activar la propiedad Default o Cancel que se activarían con las teclas
ENTER o ESC respectivamente.

En programación es posible tomar o modificar las propiedades de los controles por ejemplo, cb_1.visible =
true

Normalmente no le cambiamos el nombre a los controles pero si los vamos a manipular en la programación lo
hacemos para que se pueda entender el código. Por ejemplo sl_1 es un texto que se necesita en la
programación le cambiamos el nombre por sl_nombre y así es entendible y en el código quedaría
nombre = sl_nombre.text

Estándares de los DW

Capturas de pantalla debe ser Freeform, las etiquetas van sin borde, los campos de captura color blanco y
borde 3d lowered, el fondo de la ventana debe ser Silver y donde se presenta información por ejemplo un
título debe ser sin borde, color silver y tab order 0.

Cuando se modifica un DW y se van a agregar campos no se mantienen ciertos valores default y hay que
corregirlos.

Por la barra de menú Rows / Update Properties


Siempre seleccionar Allow Update
Table to Update seleccionar el nombre de la tabla que se actualiza
Where clause for Update/Delete siempre debe estar seleccionado Key Columns
En Key Modification debe estar seleccionado Use Update
Updateable Columns, seleccionar las que se usan en el SQL
Unique Key (Columns) seleccionar los campos que conforman la llave de la tabla que se actualiza

Los campos que se adicionaron en la parte de diseño quedan con TAB ORDER en 0 y esto hace que no se
puedan modificar así que siempre hay que modificar los TAB ORDER.

Cuando el texto de la ventana se puede imprimir en las propiedades Position del control hay que seleccionar
Autosize Height y en Slide UP Directly Above

Cuando se va a hacer mantenimiento de una tabla que tiene pocos registros y pocas columnas

Insertar
Modificar
Borrar
Actualizar
Salir

Cuando tiene muchos registros y muchos campos se crea un botón Construir Consulta y otro Reiniciar
Consulta y el botón Adicionar abre una nueva ventana donde se llenan los campos.

Construir consulta
Reiniciar consulta

Adicionar: Abre nueva ventana donde se llena los campos

POWERSCRIPT

Tipos de datos:
Blod: binarios
Boolean: true o false
Char: un solo carácter
Date o DateTime
Etc.
Recomendaciones: Usar Double y no Real, Usar Long en vez de Int

Variables
Para definir una variable
Tipodato Variable1, variable2=0

Es posible darle un valor inicial cuando se define la variable. Por defecto el valor de los datos numéricos es 0
y para los booleanos es False

Ámbito de las variables:

 Locales: Se definen en el Script y solo se pueden utilizar en ese script

 Instancia: Se pueden utilizar en cualquier script de los objetos de una ventana. Para crearlas o verlas
por Declare en la barra menú y luego Instance Variables…

 Globales: Se pueden utilizar en toda la aplicación. Por ejemplo Usuario, periodo o compañía.

 Shared (Recordantes): Se pueden utilizar en cualquier script de los objetos de una ventana pero
tienen la particularidad que mantienen el valor. Para crearlas o verlas por Declare en la barra menú y
luego Shared Variables…

Flujos de control

If ..Then…Else…Endif

Choose Case…Case …Else… End Choose

For…Next

Do Until…Loop

Do While …Loop

Cursores: Tratar de no úsalos porque son poco eficientes lo mejor es usar un dw así:
Contador = rowcount()
For i = 1 to contador
Código
Next

En el código dentro del for es posible modificar los valores del dw con la instrucción Setitem. Y para evaluar
si cambio
If dw_1.Update() = 1 then
Commit;
Else
Rollback;
Endif

Palabras Reservadas: This y Parent

NOTA: Siempre que se ejecute una instrucción SQL se debe verificar evaluando sqlcode y debemos tener en
cuenta no permitir bloqueos por ejemplo:
Select cuenta from co_cuenta where cuenta like ‘4.%’;
If sqlcode <> o
MessageBox(error….)
Rollback;
Endif
Aquí se puede presentar bloqueos mientras se muestra el mensaje y el usuario no cierra esa
ventana lo correcto es así:
Select cuenta from co_cuenta where cuenta like ‘4.%’;
If sqlcode <> o
Mensaje = sqlca.sqlErrText //se toma el mensaje de error xq al ejecutar el rollback este
cambia
Rollback;
MessageBox(…,mensaje)
Endif

Dentro de un Script se pueden utilizar:


 Instrucciones PB: asignaciones, flujos de control etc.
 Funciones
 Instrucciones SQL, tener en cuenta que siempre deben terminar con ;

Los Script se escriben en los eventos de los controles

Para hacer validaciones de los campos se pueden programar en los eventos de un dw:
1. ItemChanged
2. UpdateStart, ya que antes del .update mira este evento

Usualmente la asignación de consecutivos está en el evento UpdateStart y usamos la función


F_consecutivo_no_commit()
DOCUMENTAR LAS ACTUALIZACIONES

 Crear o abrir carpeta ACTUALIZACIONES_AAAA por el año

 Crear o abrir carpeta por cada mes EJ: 01 ENERO, 02 FEBRERO, 03 MARZO, ..

 Dentro de la carpeta del mes, crear una carpeta con el siguiente nombre:
ACT_AAAA_MM_DD_descripcion_de_lo_que_se_hizo

 Dentro de la carpeta anterior crear una carpeta por cada librería que contiene la actualización que
se realizó. En cada una se colocan los objetos que les corresponden y que se modificaron.

 Crear un documento en Word con el nombre LEAME_descripcion_de_lo_que_se_hizo.doc.


Aquí se coloca un título de lo que se actualizó y se inicia con el modulo y la ruta a la opción que
se actualizó, se insertan imágenes de la pantalla en la aplicación y se explica la actualización.

 Si se requirió en la actualización modificar tablas, se copia el archivo


ALTER_TABLE_AAAA.sql del año y se agrega de la siguiente manera el cambio al final del
documento:

/// Febrero 20 se agregó observación encabezado a la consulta Oportunidad en los Resultados


//Sentencia del alter table que se requirió.
 Generar un archivo comprimido .zip o .rar de toda la carpeta de la actualización y se guarda
dentro de la carpeta.

PUBLICAR LA ACTUALIZACION

Desde mi PC en PB, Librerias, Export del objeto(s) actualizado(s) y lo guardamos en la carpeta de la librería
dentro de la carpeta de la actualización.

Nos conectamos al PC de soporte del cliente que solicitó la actualización, para ejemplo vamos al consorcio
CNRUU.
 Pasamos el objeto actualizado al pc de soporte
 En PB, librerías, Import, buscamos al objeto actualizado, en el destino verificar que se elija la
librería que se actualizó. Cuando hay dos aplicaciones, debemos primero abrir la aplicacion
donde se va a hacer la actualización, luego ejecutarla, nos sale un error pero a la siguiente vez
que la ejecutemos corre ok.
 Compilamos: Clic der sobre la librería y Build Runtime Library. Dice que no la puede
reconstruir porque está abierta pero no es problema
 Copiamos el .pbd. Por ejemplo, como vamos a publicar en el consorcio CNRUU hay que
copiarlo en dos lugares 192.168.51.200 F:\aplicaciones\menu\icosalud\sihos y a
10.10.7.26 /var/sihosupdate/sihos con WINscp (usuario: root, password: N0N3*4K.2014)
 Ejecutamos la aplicación para verificar la actualización.

TIPS DE PROGRAMACION EN PB

Dddw con argumento

Ejemplo: Librería ALMAVEN1 w_mtto_catalogo d_tipo_activo_dddw

Se debe crear un evento de usuario ue_dddw

En el evento de usuario debe quedar el siguiente código:


Integer fila
String nulo
DataWindowChild dwc_tipo_activo

Dw_1.GetChild(‘tipo_activo’,dwc_tipo_activo)
Dwc_tipo_activo.SetTransObject(sqlca)
If dwc_tipo_activo.Retrieve(parametros) <=0 then
fila=dwc_tipo_activo.InsertRow(0)
dwc_tipo_activo.SetItem(fila,1,Setnull(nulo))
end if

En el event OPEN de la ventana y antes del retrieve al dw que contiene el dddw con argumento escribir el
siguiente código:
Parent.TriggerEvent(‘ue_dddw’)
Si es con parametro
Parent.Trigger Event ue_dddw(parametro)

Referencia a posiciones anteriores

Ejemplo: Librería CARTERA w_cuenta_medica_virtual_genera_plano

1. Crear un campo computado y para preguntar si registro es diferente al anterior


If registro <> registro [-1]
2. En la columna va Comulativesum() for group 1 ( que es la factura)

Resumido y Detallado por GROUP del datawindow

w_control_facturacion_x_periodo_fegr_imp
w_pacientes_discapacidad_imp
Manejo de intervalos de tiempo

w_referencia_mtto , boton imprimir

string intervalo
intervalo = string(nro_dias_hcl) +' days'
fecha_dt = dw_1.GetItemDatetime(1,'fecha')
select :fecha_dt - cast(:intervalo as interval) into :fecha_inicial from parametro;

Manipular n fila en un datawindow

En Citas

//Primero hacemos que el Background Color NO sea Transparent


dw_agenda.Modify("#2.Background.Mode='0~tIf(getrow()=currentrow(),0,1)'")
//Luego cambiamos por ejemplo a color rojo
dw_agenda.Modify("#2.Background.Color='0~tIf(getrow()=currentrow(),RGB(255,0,0),4)'")

Filtro en un reporte
Contabilidad - Balance de prueba x auxiliar
W_balance_prueba_auxiliar_imp

En Auditor2 : w_factura_glosa_dinamico_imp

Abrir cualquier archivo desde Power BUilder

En Historia Ventanas w_imagen_x_registro_lista

En Declare External Function


FUNCTION long ShellExecuteA(long hwnd, string lpOperation, string lpFile, string lpParameters, string
lpDirectory, long nShowCmd) LIBRARY "SHELL32.DLL"

En el script
path = dw_1.GetItemString(fila11,'path_destino')
archivo = dw_1.GetItemString(fila11,'archivo')
f_reemplaza_caracter(path,'!','\')

path = path+'\'+archivo
long hwnd
string filname
hwnd=handle(parent)
shellexecuteA(hwnd,'open',path,'','',1)

POstgresql.... trabajando con fechas e intervalos

W_tercero_abrir_agenda_mtto

select fecha_hora, duracion, fecha_hora + cast(cast(duracion as text)||' minutes' as interval) as fecha_f from
cita where tercero = '1098640933' ;
select count(*) from agenda
where tercero = '1098640933' and
fecha_hora <= '2018/07/19 6:45' and
fecha_hora + cast(cast(duracion as text)||' minutes' as interval) > '2018/07/19 6:45' and
fecha_hora < '2018/07/19 7:00' and
fecha_hora + cast(cast(duracion as text)||' minutes' as interval) >= '2018/07/19 7:00' ;
Mostrar varias filas como una sola

En la aplicación de Cali,
d_evolucion_imp.... interpretacion de resultados mostrando los resultados

SELECT examen_fisico.registro ,
examen_fisico.fecha ,
examen_fisico.variab ,
examen_fisico.valor_numerico ,
'RESULTADOS:'||chr(10)||(select text_concat(a.texto) as resultados
from
(SELECT servicio.descripcion|| ' ' ||
text_concat(RTRIM(variables_examen.nombre)
||': '|| resultado_examen.valor||' '||resultado_examen.texto ) as texto
FROM resultado_examen , variables_examen, servicio_detalle, servicio
WHERE ( resultado_examen.concepto = variables_examen.concepto )
and
( resultado_examen.servicio = variables_examen.servicio ) and
( resultado_examen.caracteristica = variables_examen.caracteristica ) and
( resultado_examen.concepto = servicio_detalle.concepto ) and
( resultado_examen.servicio = servicio_detalle.servicio ) and
( resultado_examen.numero_servicio = servicio_detalle.numero_servicio ) and
( resultado_examen.concepto = servicio.concepto ) and
( resultado_examen.servicio = servicio.servicio ) and
( resultado_examen.valor is not null AND trim(resultado_examen.valor)
<> '' ) and
( servicio_detalle.registro = :registro ) and
( servicio_detalle.ind_interpretado = 'S' ) and
( servicio_Detalle.fecha_progreso_interpretado =
:fecha )
GROUP BY servicio.descripcion
union all
SELECT servicio.descripcion|| ' ' ||rtrim(resultado_examen_texto.texto)
FROM resultado_examen_texto, servicio_detalle, servicio
WHERE ( resultado_examen_texto.concepto = servicio_detalle.concepto ) AND
( resultado_examen_texto.servicio = servicio_detalle.servicio ) AND
( resultado_examen_texto.numero_servicio =
servicio_detalle.numero_servicio ) and
( resultado_examen_texto.concepto = servicio.concepto )
and
( resultado_examen_texto.servicio = servicio.servicio ) and
( servicio_detalle.registro = :registro ) and
( servicio_detalle.ind_interpretado = 'S' ) and
( servicio_Detalle.fecha_progreso_interpretado = :fecha )
) as a)||'INTERPRETACION:'||chr(10)||examen_fisico.valor as valor ,
variab.nombre ,
variab.secuencia ,
variab.ind_numerico
as resultados
FROM examen_fisico , variab
WHERE ( examen_fisico.variab = variab.variab ) and
( examen_fisico.registro = :registro ) and
( examen_fisico.fecha = :fecha ) and
( variab.tipo = :tipo ) and
( examen_fisico.valor is not null ) and
( trim(examen_fisico.valor) <> '' ) and
( variab.ind_numerico <> 'S' ) and
( variab.ciclo_impresion = :ciclo_impresion ) and
( coalesce(variab.ind_interpreta_resultado,'N') = 'S' )
union all
SELECT examen_fisico.registro ,
examen_fisico.fecha ,
examen_fisico.variab ,
examen_fisico.valor_numerico ,
case when examen_fisico.respuesta is not null then examen_fisico.respuesta ||'. '|| examen_fisico.valor
else examen_fisico.valor end as valor,
variab.nombre ,
variab.secuencia ,
variab.ind_numerico
FROM examen_fisico , variab
WHERE ( examen_fisico.variab = variab.variab ) and
( examen_fisico.registro = :registro ) and
( examen_fisico.fecha = :fecha ) and
( variab.tipo = :tipo) and
( examen_fisico.valor is not null ) and
( trim(examen_fisico.valor) <> '' ) and
( variab.ind_numerico <> 'S' ) and
( variab.ciclo_impresion = :ciclo_impresion ) and
( coalesce(variab.ind_interpreta_resultado,'N') = 'N' )

ORDER BY 7 ASC
Problema con la rueda (wheel )del mouse

Colocar en el evento other el siguiente codigo

CONSTANT integer LCI_MOUSEWHEEL = 522

IF message.number = LCI_MOUSEWHEEL then

//AND & KeyDown (KeyControl!) THEN

message.processed = TRUE

RETURN 1

END IF

Para ver un reporte desde ejecución con print preview

EN el evento open

Dw_1.Object.Datawindow.Print.Preview = “yes”

Dw_1.Object.Datawindow.Print.Preview .Rulers = ‘yes’

array_to_string

select concepto,

array_to_string(array(select servicio from servicio where concepto = concepto.concepto),', ')

from concepto; from servicio_detalle, concepto

where
servicio_detalle.concepto = concepto.concepto and

registro = '827916' and not exists

(select null from plan_manual

where plan_manual.empresa = '800140949' and

plan_manual.manual = '04' and

plan_manual.concepto = servicio_detalle.concepto)),',' ) from parametro;


SQL Dinámico

Ventana: w_pyp_pregunta_mtto1 (updatestar del dw_1) Libreria: HISTORIA_VENTANAS

En este caso solo se necesita ejecutar un comando SQL cambiando el nombre del campo a crear en una tabla

choose case tipo_dato

case 'A'

sintaxis_sql = 'Alter table pyp_registro add '+nombre_campo+' varchar(2500)'

case 'C'

sintaxis_sql = 'Alter table pyp_registro add '+nombre_campo+' varchar(500)'

case 'N'

sintaxis_sql = 'Alter table pyp_registro add '+nombre_campo+' varchar(10)'

case 'F'

sintaxis_sql = 'Alter table pyp_registro add '+nombre_campo+' varchar(10)'

case 'B'

sintaxis_sql = 'Alter table pyp_registro add '+nombre_campo+' varchar(10)'

end choose

EXECUTE IMMEDIATE :sintaxis_sql USING SQLCA;

Ventana: w_pyp_historico_x_columnas_lista (evento: Open) Libreria: HISTORIA_VENTANAS

En este caso además de ejecutar una secuencia sql cambiando el nombre del campo a traer se necesita además
recuperar el dato que devuelve....

ls_select = "Select "+nombre_campo+" from pyp_registro where registro = '"+registro+"' and fecha =
'"+string(fecha_dt)+"'"

EXECUTE IMMEDIATE :ls_select USING SQLCA;

if sqlca.sqlcode < 0 then

Messagebox('Error...','Buscando '+nombre_campo+' para el registro '+registro+' con fecha '+string(fecha_dt)


+' '+sqlca.sqlerrtext)

return

end if
DECLARE micursor DYNAMIC CURSOR FOR sqlsa;

PREPARE sqlsa FROM :ls_select;

OPEN DYNAMIC micursor;

FETCH micursor INTO :valor;

CLOSE micursor;

SQL con interval

En CITAS, imprimir agenda

SELECT tercero.nombre as tercero_nombre,


cast(agenda.fecha_hora as date) as fecha,
cast(agenda.fecha_hora as time) as hora_i,
cast(agenda.fecha_hora + cast(cast(cast((agenda.duracion) as integer) as text)||'
minutes' as interval) as time) as hora_f,
agenda.duracion as duracion,
Extract(dow from agenda.fecha_hora) as dia_semana,
parametro.nombre as parametro_nombre
FROM agenda,
tercero,
parametro
WHERE ( agenda.tercero = tercero.tercero ) and
( agenda.fecha_hora between '2018/05/01' AND '2018/05/31 23:59' ) AND
( agenda.tercero = '13930383' )
ORDER BY agenda.fecha_hora ASC
;

Consultas dinamica, campos con like

EN la wf_retrieve

dw_1.AcceptText()

dw_1.setcolumn(5)
texto=dw_1.Gettext()
if upper(mid(texto,1,4))<>'LIKE' then
if trim(texto) <>'' then
texto='LIKE %'+trim(UPPER(texto))+'%'
End If
End If
dw_1.SetText(texto)

COLORES
black = 0
white = 16777215
red = 255
fuchsia = 16711935
lime = 65280
yellow = 65535
blue = 16711680
aqua = 16776960
maroon = 128
purple = 8388736
green = 32768
olive = 32896
navy = 8388608
teal = 8421376
gray = 8421504
silver = 12632256
mint = 12639424
sky = 15780518
cream = 15793151
medium_gray = 10789024
Usando la funcion FIND

Libreria: auditor2 Entrada: w_radicador_respuestas_glosa


Evento: Itemchanged

cont = this.Find("factura = '"+ factura +"'", 1, this.RowCount() - 1)


if cont > 0 then

También podría gustarte