Power Builder - otra preguntita

 
Vista:

otra preguntita

Publicado por mizalo (113 intervenciones) el 09/07/2010 18:03:59
estoy sacando una cantidad determinada de datos de una tabla, para eso estoy usando un cursor.

el asunto es que estos datos los proceso y debo de ingresarlo a otra tablita.

entonces hago lo siguiente.

declare c_emp cursor for select codigo,nombre,cantidad FROM .............;
open c_emp:
fetch
do while ......

aca hago unos calculos y luego hago un insert..
insert into calculo (codigo,monto,total) values (:codigo,:m_monto,:m_total);

fetch..
loop
close

el problema es q de los 50 registros que lee el cursor, solo inserta el ultimo registro, QUE PASO!!!

GRACIAS POR EL APOYO.
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:otra preguntita

Publicado por JeinnerH (646 intervenciones) el 09/07/2010 18:13:35
Qué base de datos estás utilizando?

Yo en lo personal, prefiero usar un DW y no un cursor, para evitar que se pueda perder el puntero del siguiente registro cuando se hace un Fetch (esto puede producir que nunca termine el While, me ha pasado en procesos grandes) y antes del siguiente Fetch se ha hecho un Insert o Update. Lo que hago es que en la pantalla del proceso creo un DW y en el Open le pongo Visible=FALSE. En el tiempo de desarrollo me sirve para ver que la información que me traer el DW está bien, ya luego lo hago no visible.

Si es mucha la información no es tan recomendable.

Te recuerdo hacer COMMIT, después de cada Insert.

Recuerda actualizar todas las variables del Insert, incluyendo los campos llave, puede ser que no lo estés haciendo.
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

sigue el problema

Publicado por mizalo (113 intervenciones) el 10/07/2010 19:55:34
holas

tome en cuenta tu sugerencia, levanto en dw todo los registros que necesito
luego hago un bucle para sacar registro a registro y dentro del bucle uso una instruccion insert ........
pero dentro del bucle imprimo el contenido de los datos para ver si efectivamente jala el contenido del dw.

Pero, de igual manera se ve que se arma la cadena con los datos, pero aun asi solo inserta el ultimo registro.

que estara pasando?, tambien le puse el commit despues de insert.

gracias por el apoyo
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:sigue el problema

Publicado por JeinnerH (646 intervenciones) el 12/07/2010 18:00:09
Puedes poner aquí el código que empleas para recorrer el DW y hacer el insert, para poder revisar qué puede ser el problema. Según dices todo está bien, no le veo el por qué...

Cuál BD estás usando?
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:sigue el problema

Publicado por mizalo (113 intervenciones) el 12/07/2010 21:29:23
levanto en el dw todos los vendedores, ya en la ventana recorro el DW

string codigo,nombre
decimal monto,cantidad,total
connect using sqlca;
.
.
.
.
.
for nro=1 to dw_1.rowcount()
codigo=dw_1.getitemstring(nro,"cod_emp")
nombre=dw_1.getitemstring(nro,"nombre")
monto=dw_1.getitemdecimal(nro,"monto")
cantidad=dw_1.getitemdecimal(nro,"cantidad")
total =monto*cantidad
insert into cuadre (codigo,nombre,total) values (:codigo,:nombre,:total);
commit;
next
disconnect using sqlca;

Como te comente, pongo unos mesnasjes para ver que este sacando bien los datos y me muestra cada dato que saca.

ahora lo he probado en mysql y trabaja normal, inserta todos loso regsitro, pero lo ejecuto en sql2005 express y solo me inserta el ultimo registro, y el problema es que tiene que almacenar en sql..

gracias por la ayuda.
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:sigue el problema

Publicado por JeinnerH (646 intervenciones) el 12/07/2010 21:48:55
Ok. Después de cada Insert debes revisar qué es lo que está sucediendo.

If SQLCA.SQLCode <> 0 Then
Messagebox('ERROR', 'ERROR('+String(SQLCA.SQLCode)+'): '+SQLCA.SQLErrText)
RETURN
End If

Si lo hace bien en MySQL, debe haber algo con la base de datos en SQL2005.

Si no reporta ningún problema, entonces debes averiguar si para SQL2005 se debe abrir una transacción o algo por el estilo, cada vez que se almacena información.
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:otra preguntita

Publicado por Alfredo (1 intervención) el 13/07/2010 20:51:44
Lo que yo haria es recorrer el programa con el debug para ver que error te da al hacer el insert.
Que condicion pones en el Do While sqlca.sqlcode = 0 ??
Sino tendrías que hacer un commit luego de cerrar el cursor.
Espero que te sirve
Saludos
Alfredo
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:otra preguntita

Publicado por eduardo.v (34 intervenciones) el 13/07/2010 21:59:29
lo mas seguro es que ya tienes datos en esa tabla y se esta duplicando el PK... revisa eso
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

gracias, solucionado el problem

Publicado por mizalo (113 intervenciones) el 17/07/2010 05:07:56
Les agradezco a todos por la ayuda

Cuando le puse que me muestre el error en el momento del insert,
me indicaba que la conexion estaba ocupada. entonce slo que hice fue lo siguiente

connect using sqlca;
dw_1.settransobject(sqlca);
dw_1.retrieve()
disconnect using sqlca;
for i=1 to dw_1.rowcount()
codigo=
nombre=
total=
connect using sqlca;
insert into tabla (codigo,nombre,total) values (........);
discconect using sqlca;
next

al parecer me pedia otra conexion para el insert, pense que abriendo la conexion una vez antes del settransobject y luego cerrarlo al finalizar el prgram despues del next era todo, pero veo que habia que tener otra conexion.

Bueno, asi solucione mi problema, si tienen otra idea para solucionarlo, comentan

les agradesco muchisimo el apoyo
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