Pregunta: | 52296 - ORDER BY CON VARIABLE |
Autor: | Manuel Cambronero |
Como puedo pasar a un Order By una variable dada por un usuario de una forma en Oracle. Osea Ordenar por esa variable |
Respuesta: | Manuel Cambronero |
aqui esta un extracto de como se soluciona el problema, basados en que el Form no soporta utilizar el &:
PROCEDURE Ejemplo (p_orden in varchar2, p_fecha in date, p_compania in varchar2)IS connection_id EXEC_SQL.CONNTYPE; cursorID EXEC_SQL.CURSTYPE; sqlstr VARCHAR2(15000); nIgn PLS_INTEGER; cod_cliente varchar2(15); nom_cliente varchar2(100); asesor_cli varchar2(100); part_cli number; fondo Varchar2(100):=mdb_pck_codigos.get_desc_fondo(:global.cod_compania); part_cliente Number; total_participaciones Number:=0; v_monto Number:=0; total_monto Number:=0; /**/ application OLE2.OBJ_TYPE; workbooks OLE2.OBJ_TYPE; workbook OLE2.OBJ_TYPE; worksheets OLE2.OBJ_TYPE; worksheet OLE2.OBJ_TYPE; cell OLE2.OBJ_TYPE; args OLE2.LIST_TYPE; hFontObj2 ole2.obj_type; cell_value varchar2(2000); --OBJ OLE2.OBJ_TYPE; V_fila NUMBER(3); V_columna NUMBER(3); v_catalogo VARCHAR2(20) := 'RPM'; V_num_hoja NUMBER(3); V_PRC_DIA NUMBER; v_contador number:=0; v_ruta varchar2(20); /**/ Begin sqlstr:= 'Select '||'to_number(con.f_cod_cliente)cod_cliente, cli.nombre, mdb_pck_asesor.GET_NOMBRE_ASESOR(con.f_cod_cliente)asesor, -- sum(con.can_participaciones_original)participaciones sum( DM_SALDO_DIA(:compania, con.k_tip_contrato, con.k_num_contrato,'||':fecha'||') ) participaciones'|| ' From '||'admmdb.mdb_contrato con,admmdb.mdb_v_cliente cli,admmdb.mdb_tipo_contrato tip'|| ' Where '||'con.k_cod_compania=:compania'|| ' and '||'con.estado_contrato in ('||'''A'''||','||'''T'''||')' || ' and '||'con.k_tip_contrato = tip.k_tip_contrato'|| ' and '||'tip.tipo ='||'''E'''|| ' and '||' trunc(fec_contrato) <= '||':fecha'|| ' and '||'(fec_terminacion is null or fec_terminacion > '||':fecha'||')' || ' and '||'con.f_cod_cliente = cli.cod_cliente' || ' Group by '||' con.f_cod_cliente,cli.nombre'; IF p_orden = '1' then sqlstr := sqlstr||' Order by 1'; else IF p_orden = '2' then sqlstr := sqlstr||' Order by 2'; else IF p_orden = '3' then sqlstr := sqlstr||' Order by 3'; else sqlstr := sqlstr||' Order by 4'; end if; end if; end if; connection_id := EXEC_SQL.OPEN_CONNECTION('admmdb/admmdb@produc'); cursorID := EXEC_SQL.OPEN_CURSOR(connection_id); EXEC_SQL.PARSE(connection_id, cursorID, sqlstr, exec_sql.V7); EXEC_SQL.BIND_VARIABLE(connection_id, cursorID, ':compania', p_compania); EXEC_SQL.BIND_VARIABLE(connection_id, cursorID, ':fecha', p_fecha); EXEC_SQL.DEFINE_COLUMN(connection_id, cursorID, 1, cod_cliente, 30); EXEC_SQL.DEFINE_COLUMN(connection_id, cursorID, 2, nom_cliente, 100); EXEC_SQL.DEFINE_COLUMN(connection_id, cursorID, 3, asesor_cli, 100); EXEC_SQL.DEFINE_COLUMN(connection_id, cursorID, 4, part_cli); nIgn := EXEC_SQL.EXECUTE(connection_id, cursorID); V_PRC_DIA := mdb_pck_cierre.get_precio_dia(:global.cod_compania,:rec.fecha); V_fila:=11; V_columna:=1; WHILE (EXEC_SQL.FETCH_ROWS(connection_id, cursorID) > 0 ) LOOP --nRows := nRows + 1;--Message('3'); EXEC_SQL.COLUMN_VALUE(connection_id, cursorID, 1, cod_cliente ); EXEC_SQL.COLUMN_VALUE(connection_id, cursorID, 2, nom_cliente ); EXEC_SQL.COLUMN_VALUE(connection_id, cursorID, 3, asesor_cli); EXEC_SQL.COLUMN_VALUE(connection_id, cursorID, 4, part_cli); v_columna := 1; ORACLE_EXCEL.Llenar_Celda(worksheet,V_fila,V_columna,lpad(cod_cliente,6,'0')); v_columna := v_columna +1; ORACLE_EXCEL.Llenar_Celda(worksheet,V_fila,V_columna,nom_cliente); v_columna := v_columna +1; ORACLE_EXCEL.Llenar_Celda(worksheet,V_fila,V_columna,asesor_cli); v_columna := v_columna +1; ORACLE_EXCEL.Llenar_Celda(worksheet,V_fila,V_columna,part_cli); v_columna := v_columna +1; v_monto := part_cli* v_prc_dia; ORACLE_EXCEL.Llenar_Celda(worksheet,V_fila,V_columna,v_monto); v_columna := v_columna +1; total_participaciones:=total_participaciones+part_cli; v_fila:= v_fila + 1; END LOOP; exec_SQL.CLOSE_CURSOR (cursorID); ORACLE_EXCEL.Mostrar_Libro (application,TRUE); End ; espero que se entienda y no se pierda mucho el formato. Gracias |