Power Builder - Agregar campos calculados en ejecucion

 
Vista:

Agregar campos calculados en ejecucion

Publicado por wend (95 intervenciones) el 15/07/2010 16:16:37
Saludos a todos.

Quiero agregar campos calculados(computados) a una consulta en tiempo de ejecución a un DW para luego mostrar valores.

Por ejemplo:

SELECT PAC.PAC_CLASIFICADOR,
PAC.TIPFIN_CODIGO,
PAC.PAC_SUM_CODIGO_CPC,
PAC.PAC_TIPCOM_CODIGO,
PAC.PAC_DETALLE,
PAC.PAC_CANTIDAD,
PAC.PAC_COSTO_UNITARIO,
PAC.PAC_VALOR,
PAC.PAC_UNIDAD,
PROYECTO.PRO_CALIF_PRESU as proyecto,
SUBPROYECTO.SUBPRO_CALIF_PRESU as actividad,
'000' organismo,
PAC.PAC_ORIGEN,
PAC.PAC_CODIGO,
' ' valor_mes_001
FROM PAC,
SUBPROYECTO,
PROYECTO

en esta consulta se añade el campo calculado valor_mes_001. ¿Cómo hacer este desde script para que luego aparezca en la banda Detail?

Gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 37
Ha mantenido su posición en Power Builder (en relación al último mes)
Gráfica de Power Builder

RE:Agregar campos calculados en ejecucion

Publicado por JeinnerH (646 intervenciones) el 15/07/2010 18:33:40
Compañero, puedes grabar la función que adjunto en un archivo con el nombre f_insertar_objeto_derecha.srf Luego lo importas a tu proyecto.

Esta función te inserta un objeto o campo en un DW, a la derecha de otra columna, queda pendiente reacomodar las columnas que quedarían a la derecha de la columna insertada.

La sintaxis del objeto a insertar la puedes obtener de cualquier otra columna. Para obtenerla puedes exportar el DW y de ahí tomas lo que necesitas.

El llamado a la función se puede realizar de la siguiente manera:
f_agregar_objeto_derecha(dw_1, 'nombre_eje'+String(li_row -1), 'nombre_eje'+String(li_row), 'column', ' id='+String(f_obt_id_columna(dw_1, 'nombre_eje'+String(li_row)))+' band=detail alignment="0" tabsequence=32766 border="0" color="16777215" x="2889" y="4" height="52" width="224" format="[general]" visible="1~tif(co_num_linea=1,1,0)" edit.limit=0 edit.case=any edit.focusrectangle=no edit.autoselect=no font.face="MS Sans Serif" font.height="-8" font.weight="400" font.family="2" font.pitch="2" font.charset="0" background.mode="2" background.color="16711680"')

Recuerda que si vas a insertar un campo abría que crearlo en el SQL, para que exista en el momento donde se llama la función.

Si necesitas una función que agrege de forma dinámica los campos a la sintaxis del SQL, me dices para agregarla.

$PBExportHeader$f_insertar_objeto_derecha.srf
global type f_insertar_objeto_derecha from function_object
end type

forward prototypes
global function integer f_insertar_objeto_derecha (datawindow adw_datawindow, string as_nombre_objeto_referencia_izquierda, string as_nombre_objeto_agregar, string as_tipo_objecto_agregar, string as_sintaxis_objeto_crear)
end prototypes

global function integer f_insertar_objeto_derecha (datawindow adw_datawindow, string as_nombre_objeto_referencia_izquierda, string as_nombre_objeto_agregar, string as_tipo_objecto_agregar, String as_sintaxis_objeto_crear);String ls_syntax, &
ls_mensaje, &
ls_xy, ls_w
Integer li_pos, li_columna
Long ll_x, ll_posicion_agregar


li_pos=Pos(as_sintaxis_objeto_crear, '{@}')
Do While li_pos > 0
as_sintaxis_objeto_crear=Replace(as_sintaxis_objeto_crear, li_pos, 3, as_nombre_objeto_agregar)
li_pos=Pos(as_sintaxis_objeto_crear, '{@}')
Loop

ls_syntax=as_tipo_objecto_agregar+'( name='+as_nombre_objeto_agregar+' '+as_sintaxis_objeto_crear+' )'
ls_mensaje=adw_datawindow.Modify('CREATE '+ls_syntax)
If ls_mensaje <> '' then
Messagebox('ERROR', 'Ha ocurrido un ERROR al agregar nuevo Campo('+as_nombre_objeto_agregar+')~n'+ &
'Syntax[ '+ls_syntax+' ]~n'+ &
'ERROR:'+ls_mensaje)
RETURN -1
End If

ls_xy=adw_datawindow.Describe(as_nombre_objeto_referencia_izquierda+'.X')
If ls_xy = '(!)' or ls_xy = '(?)' then
Messagebox('ERROR', 'Ha ocurrido un ERROR al localizar el campo de referencia('+as_nombre_objeto_referencia_izquierda+')')
RETURN -1
End If
ls_w=adw_datawindow.Describe(as_nombre_objeto_referencia_izquierda+'.Width')

ll_x=long(ls_xy)+long(ls_w) +9
ls_xy=string(ll_x)
adw_datawindow.Modify(as_nombre_objeto_agregar+'.X="'+ls_xy+'"')

ls_xy=adw_datawindow.Describe(as_nombre_objeto_referencia_izquierda+'.Y')
If ls_xy = '(!)' or ls_xy = '(?)' then
Messagebox('ERROR', 'Ha ocurrido un ERROR al localizar el campo de referencia('+as_nombre_objeto_referencia_izquierda+')')
RETURN -1
End If
adw_datawindow.Modify(as_nombre_objeto_agregar+'.Y="'+ls_xy+'"')

ll_posicion_agregar=Integer(adw_datawindow.Describe(as_nombre_objeto_agregar+'.Width'))+9
// Modificar Posición de Objetos a la Derecha de la Columna a Insertar.
For li_columna=1 to integer(adw_datawindow.object.DataWindow.Column.Count)
If adw_datawindow.Describe('#'+String(li_columna)+'.band') = 'detail' and &
Upper(Nvl(adw_datawindow.Describe('#'+String(li_columna)+'.name'), '')) <> Upper(as_nombre_objeto_agregar) and &
Integer(adw_datawindow.Describe('#'+string(li_columna)+'.X')) >= ll_x then
adw_datawindow.Modify('#'+String(li_columna)+'.X='+String(Integer(adw_datawindow.Describe('#'+String(li_columna)+'.X'))+ll_posicion_agregar))
End If
Messagebox('f_insertar_objeto_derecha', 'obj('+string(li_columna)+'): '+String(adw_datawindow.Describe('#'+String(li_columna)+'.name')))
Next

RETURN 1
end function
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Agregar campos calculados en ejecucion

Publicado por wend (95 intervenciones) el 16/07/2010 16:15:16
Gracias por tu respuesta, en especial por la consideración que haces que se debe crear el campo en el SQL, caso contrario NO FUNCIONA.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 37
Ha mantenido su posición en Power Builder (en relación al último mes)
Gráfica de Power Builder

RE:Agregar campos calculados en ejecucion

Publicado por JeinnerH (646 intervenciones) el 16/07/2010 16:55:01
Con gusto.

Y correcto, el campo debe existir en el SQL, para que se pueda referenciar, eso si vas a agregar una columna. Si es un campo calculado no es necesario.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar