Power Builder - Actualizacion de Tablas sin Indices

 
Vista:

Actualizacion de Tablas sin Indices

Publicado por Herbert Morales (1 intervención) el 22/06/2005 18:54:30
Hola Amigos :

Estuve creando una aplicacion, que permita realizar una modificacion de bases de datos en Sql, pero mi compañero que no domina muy bien el manejo del Analizador de Consultas del Sql o el Administrador Corporativo, se pierde en algunas opciones.
Asi que le cree una aplicacion que le permite seleccionar la base de datos y la tabla a modificar, para su Documentacion de Informacion le muestra la Estructura de la tabla seleccionada y le Agregue un Sle para que pudiera ingresar una condicion para el where.
Luego con el nombre la tabla y el where construyo el Dw en tiempo de Ejecucion, el modifica los datos que desee, le permite borrar o agregar registros o migrar el resultado a excel.
Tiene lo basico necesario para su labor y funciona bien pero mi problema se presenta cuando se quiere actualizar tablas que fueron migradas de Dbase a Sql, ya que estas tablas no se les creo un primary key.
Puedo crearles manualmente, pero si quiero que esta herramienta se adapte a cualquier necesidad, quise hacerlo en tiempo de ejecucion a la hora de presionar el botom de Grabar.
Para esto en el botom puse el sgte. Scrip :

string ls_sintax, ls_usuario, ls_nombre, ls_archivo, ls_colcount, ls_campo, ls_where, sqlvar, new_syntax, error_syntaxfromSQL
integer li_ret, li_pk, li_countCol, li_col
long li_id

If dw_2.RowCount() > 0 Then

li_id = dw_3.GetItemNumber( dw_3.GetRow(), 2 )

select count(id) into :li_pk from sysobjects where parent_obj = :li_id Using SqlCa ;

If li_pk = 0 Then

ls_usuario = Trim ( dw_3.GetItemString( dw_3.GetRow(), 26 ) )
ls_nombre = Trim ( dw_4.GetItemString( 1, 1 ) )
ls_archivo = ls_usuario + "." + ls_nombre
ls_sintax = "Alter TABLE " + ls_archivo + " ADD column_pk INT IDENTITY CONSTRAINT
column_n_pk PRIMARY KEY "

EXECUTE IMMEDIATE :ls_sintax Using SqlCa;

Disconnect Using SqlCa ;

ls_where = Trim ( sle_2.Text )

If Len ( ls_where ) > 0 Then
sqlvar = 'SELECT * ' + &
'FROM ' + ls_archivo + ' WHERE ' + ls_where + " "
Else
sqlvar = 'SELECT * ' + &
'FROM ' + ls_archivo + ' '
End If

Connect Using SqlCa ;

new_syntax = SQLCA.SyntaxFromSQL(sqlvar,'Style(Type=Grid)', error_syntaxfromSQL)
dw_2.modify( new_syntax )

dw_2.modify( "datawindow.table.updatetable=~"" + ls_archivo + "~"" )

ls_colcount = dw_2.Object.DataWindow.Column.Count
li_countCol = Integer ( ls_colcount )

For li_col = 1 to li_countCol
ls_campo = "#" + String( li_col ) + ".Update = Yes "
dw_2.modify( ls_campo )
End For

dw_2.modify( "column_pk.key = yes " )

dw_2.SetTransObject( SqlCa )
li_ret = dw_2.Update() ;

ls_sintax = "Alter TABLE " + ls_archivo + " DROP constraint column_n_pk "
EXECUTE IMMEDIATE :ls_sintax Using SqlCa;
ls_sintax = "Alter TABLE " + ls_archivo + " DROP COLUMN column_pk "
EXECUTE IMMEDIATE :ls_sintax Using SqlCa;

Else

dw_2.SetTransObject( SqlCa )
li_ret = dw_2.Update() ;

End If

If li_ret = 1 or SqlCa.SqlNrows > 0 Then
Commit Using SqlCa ;
messagebox( "Informacion","Grabacion Satisfactoria" )
Else
Rollback Using SqlCa ;
messagebox( "Advertencia","No se pudo Grabar, Error : " + Sqlca.SqlErrText )
End If

End If

Con esto, trato de generarle en tiempo de ejecucion el primary key y despues de actualizar, borrarlo pero, al tratar de actualizar el dw el Windows me arroja su tipo error "El programa ha efectuado una operacion no permitida y la aplicacion se cerrara"
Pense que se debia a que el cambio de Structura no se reflejaba en ese momento, asi que trate de desconectarme de la BD y reconectarme para luego releer la Structura de la Tabla, pero aun asi me da el mismo error.
Cuando hago el SyntaxFromSQL y lo reviso en el Debug me doy cuenta que la sintaxis permite la actualizacion de los campos y ya esta definido el primary key, pero no me permitia actualizar el DW, por eso despues le agregue, la especificacion de la tabla, campos y primary key. con eso ya me permite actualizar el DW, pero me sale el error de Windows.
El Primary Key lo crea la primera vez, y la proxima que entro al programa ya me permite actualizar, pero quisiera poder actualizar la tabala sin el error y luego poder borrar el Indice.
La verdad es que tengo poco tiempo en Power, y la mayoria de aplicaciones las hago revisando los ejemplos y los helps, pero este error si que no lo entiendo, es como si el DW ya fue creado con una structura inicial, y no pudiera controlar los cambios salvo de algun modo se refresque.

De antemano les agradezco su ayuda.

Herbert Morales
Lima-Peru
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