Importar de Excel y Guardar Nuevo en Power Builder

Buen día experto, tengo el siguiente problema:
Actualmente en la empresa donde estoy haciendo pasantías está llevando la base de datos de los equipos en un archivo de excel, cabe destacar que los registros en el archivo son muchísimos debido a la cantidad de personal en la empresa, por lo cual se requiere un sistema que importe los datos del archivo de excel y lo lleve a la Base de Datos de Power Builder, asimismo se necita para futuros ingresos ingresar los datos por pantalla, ya que la importación de Excel solo se hará una sola vez al momento de arrancar el sistema, de allí en adelante todos los datos serán ingresados directamente por la pantalla del Sistema de Power Builder.
Para la importación estoy usando un Datawindow el cual importa los datos perfectamente desde excel de igual forma te coloco el código:
//Importar de Excel a Una Dw
OLEObject excel
Integer li_RetValue, li_rtn
Boolean lb_sheet_rtn
Boolean lb_exist , lb_exist_base
Long ll_cnt
Long li_rc , ll_rc
String ls_path_excel
String ls_new_excel
// Genero en Base al ExCel de Air uno Nuevo
ls_new_excel =  "C:\Documents and Settings\ainformatica\Escritorio\Programas Power Builder\inventario de Equipos SIDETUR\Inventario fin.xls"
ls_path_excel = "C:\Documents and Settings\ainformatica\Escritorio\Programas Power Builder\inventario de Equipos SIDETUR\Inventario final.xls"
lb_exist_base = FileExists(ls_path_excel)
lb_exist = FileExists(ls_new_excel)
If lb_exist_base = False Then MessageBox("Importación", "No se encuentra la Base : " + ls_path_excel)
// Chek de Existencia para Borrarlo
IF lb_exist= true Then FileDelete(ls_new_excel)
st_1.Text ="Creando Conección a Excel"
//Crear Objeto
Excel = create OLEObject
//Conectar a Excel
li_rtn = excel.ConnectToNewObject("excel.application")
IF li_rtn <> 0 THEN
MessageBox('Excel error','No puede conectarse a Excel')
DESTROY excel
RETURN 0
END IF
//Abrir excel
excel.WorkBooks.Open( ls_path_excel )
excel.Application.Visible = False
excel.windowstate = 2 // Estados 1 : Normal, 2 : Minimize, 3 : Maximize
//Seleccionar un rango y eliminarlo
st_1.Text ="Creando Nuevo Excel"
lb_sheet_rtn = excel.worksheets(1).Activate
excel.application.workbooks(1).saveas(ls_new_excel,-4143)
//Seleccionar todo lo activo y copiarlo al CLip
excel.ActiveCell.CurrentRegion.Select()
excel.Selection.Copy()
st_1.Text ="Importando Excel"
//Importar desde el Clipboard
ll_rc =dw_1.ImportClipBoard (2)
ClipBoard('')
excel.Application.Quit
excel.disconnectobject()
DESTROY excel
El problema esta que para el ingreso de datos por pantalla, estoy usando un segundo datawindow asociado de igual forma que el anterior a la base de datos Power Builder, donde coloco el siguiente código:
string val1,val2,val3,val4,val5,val6,val7,val8,val9,val10,val11,val12,val13,val14
val1=string(sle_2.text)
val2=string(sle_3.text)
val3=string(sle_4.text)
val4=string(sle_5.text)
val5=string(sle_6.text)
val6=string(sle_7.text)
val7=string(sle_8.text)
val8=string(sle_9.text)
val9=string(sle_10.text)
val10=string(sle_11.text)
val11=string(sle_12.text)
val12=string(sle_13.text)
val13=string(sle_14.text)
val14=string(sle_15.text)
INSERT INTO general (planta,usuario,marca,modelo_pc,modelo_serie,serial,disco,ram,cpu,modelo_cpu,nombre_pc,antivirus,version,virus_def_file)
VALUES (:val1,:val2,:val3,:val4,:val5,:val6,:val7,:val8,:val9,:val10,:val11,:val12,:val13,:val14);
dw_2.Update()
commit;
//Si se inserto la fila el campo text vacio
sle_2.text=""
sle_3.text=""
sle_4.text=""
sle_5.text=""
sle_6.text=""
sle_7.text=""
sle_8.text=""
sle_9.text=""
sle_10.text=""
sle_11.text=""
sle_12.text=""
sle_13.text=""
sle_14.text=""
sle_15.text=""
Cabe destacar que ambos datawindow están configurados en el menu Rows>Update Properties, y que ambos los trabajo desde la misma ventana.
En la aplicacion coloco el siguiente codigo:
// Profile Equipos
SQLCA.DBMS = "ODBC"
SQLCA.AutoCommit = False
SQLCA.DBParm = "Connectstring='DSN=equipos'"
connect;
if sqlca.sqlcode<>0 then
else
 open(w_equipos)
end if
 y en el evento open de la ventana:
dw_1.settransobject(sqlca)
long rows
dw_2.SetTrans(SQLCA)
rows = dw_2.Retrieve()
IF rows < 1 THEN MessageBox( &
"Error de Base de Datos", &
"No se retornaron Filas.")
El problema esta en que no guarda los datos que ingreso por pantalla sin embargo los de la importación los guarda perfectamente, agradecería enormemente tu ayuda lo más pronto posible...

3 Respuestas

Respuesta
1
Me dices que la importación de datos ya te resultó y supongo debes tener tu base de datos con tu tabla donde están guardados los datos importados.
El problema está en los tipos de datos que hay en tu tabla no todos deben ser string, y tu estas tratando de grabar solo texto en todos los campos; Tu tabla debe de tener una clave principal, además que los trabajas con sle.
Crea un DW en Archivo - Nuevo, le das click a la pestaña que dice DataWindow y seleccionas FreeForm, le das clic a Ok y luego seleccionas Quick Select, en la parte derecha te debe salir la tabla con la que estas trabajando, le das click y en la parte derecha te salen los campos de la tabla, clic en Add All y OK, luego en siguiente y Finish; ya tiene tu DW creado, guardalo y dale un nombre.
Luego le das a Archivo - Nuevo, click en la pestaña PB Object y le das a Window; en la ventana pones un datawindow control y en la propiedad DataObject seleccionas el datawindow que creaste anteriormente.
Pones dos botones en la ventana Nuevo y Guardar
En nuevo pones
Integer n, codigo
dw_1.enabled=true
n=dw_1.insertrow(0)
dw_1.scrolltorow(n)
dw_1.setfocus()
En Guardar pones
INTEGER codigo, n
dw_1.update()
dw_1.enabled=false
commit;
en el evento open de la ventana pones
dw_1.settransobject(sqlca)
dw_1.retrieve()
dw_1.setsort("campo de la tabla por el que quieras ordenar los archivos")
dw_1.sort()
dw_1.enabled=false
Me cuentas como te fue
Respuesta
1
Vaya pregunta (2 veces hoy). 1) El retorno de 0 en la función Retrieve no se considera error, solamente indica que no hay filas que cumplan la condición. 2) No hace falta conectarse a excel para importar la data, podías haber utilizado la función ImportFile. 3) Deberías separar la importación de datos actuales de lo que es la carga de datos nuevos del sistema final. 4) Ponle nombres más específicos a tus variables.   5) Haces un INSERT en DML embebido y un Update a dw_2 a la vez? No estoy claro de tu modelo, pero esto podría estar generando la falla.
Veo que tu experiencia en sistemas es muy poca por lo que te recomiendo leas más acerca de: desarrollo de software en general, tecnología datawindow e importación de datos en powerbuilder. Definitivamente separa los procesos porque se supone que la importación es algo que realizarás en tu patada inicial del sistema y que luego desecharás, mientras que tu ventana de carga de datos debería quedarse definitiva en el sistema.
Puedes seguirme preguntando, pero ya sabes, lee un poco...
Respuesta
1
Bueno he visto tu código y aparentemente esta bien, bueno nunca he trabajado con exel y power builder yo creaba toda la aplicación y la base de datos no estoy tan seguro en realidad, lamento no poderte ayudar correctamente

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas