FoxPro/Visual FoxPro - Problema update

   
Vista:

Problema update

Publicado por Beatriz (66 intervenciones) el 10/06/2008 22:02:19
Hola amigos de éste Foro, me encuentro con el incoveniente de la Modificación con un conjunto de registros pertenecientes a un detalle, la cuestion es que manejo en mi base de datos un encabezado detalle, en el encabezado guardo el numero de orden de compra y en el detalle guardo el conjunto de productos pertenecientes a una orden en especifico, los relaciono con el codigo de orden de compra, entonces ejecuto la consulta por ejemplo de la orden de compra 1, automaticamente se carga en una grilla el conjunto de registros con el numero de codigo de orden que actualmente tengo en el encabezado, a la hora de realizar la modificacion tengo algo asi:

WAIT WINDOW "Modificando Detalle de la orden Compra" TIMEOUT 2
MSQL=SQLEXEC(mconect,'UPDATE DETALLE SET detalle.cantidad='+'?xvalor1MD,'+' detalle.cod_grupo='+'?xvalor2MD,'+'detalle.codigo_p='+'?xvalor3MD,'+' detalle.cod_unidad='+'?xvalor4MD,'+' detalle.precio_uni='+'?xvalor5MD,'+' detalle.marca='+'?xvalor6MD,'+' detalle.deta_des='+'?xvalor7MD'+' where detalle.cod_orden='+'?xvalor10MD ')

En la parte del where es que modifique donde el codigo de la orden sea igual al codigo del encabezado, la cuestion es que si yo modifico cualquier registro del detalle, a la hora del update, me guarda los demas registros con la informacion identica del registro que modifique, entonces opte por crearme un campo identidad autoincremental con uno, para segun yo diferenciar cada registro del detalle con ese codigo, y agregue al where que el codigo de orden del detalle sea igual al codigo de orden del encabezado y que sea igual a esa columna que me identifica con ese codigo autoincremental......PERO CUANDO ADICIONE ESO, YA NO PUEDO MODIFICAR????QUE ESTARE HACIENDO MAL????
POR FAVOR SI ALGUIEN ME PUEDE AYUDAR MIL 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

RE:Problema update

Publicado por jose camilo (18 intervenciones) el 11/06/2008 14:22:47
problema uno: si agregas un registro nuevo a la orden k haces debes dar update a uno e insert a otros
Dos: el cursor k creaste como lo haces con campos predefinodo o con un * para sacarlo todos

dale un brow despues del select para ver k tienes en el cursor

nota: en mi aplicacion yo borro los detalles de la vieja orden de compra e inserto los cambios como si estuviera grabando todo desde cero. me da resultado
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:Problema update

Publicado por Beatriz (66 intervenciones) el 11/06/2008 15:23:21
Hola Camilo, tienes razon eso ya lo habia analizado, fijate que opte por no deletear los registros porque segun he leido, no me consta...que se dañan las estructuras de sql, al deletear mucho......y con esto del sql soy novata....y tengo mucha incertidumbre, por ejemplo en que moemntos se pueden dañar los indices en sql..y que hacer...etc....Mira...si tienes tiempo..y puedes me podrias ayudar en estas dudas.
Atte Beatriz
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:Problema update

Publicado por Marvin Emilson Pineda (75 intervenciones) el 11/06/2008 16:15:53
Hola Bea...

Wow!!!!... ese es tu código para actualizar.... vamos, ahi que pensar más para programar menos.... compartire con tigo y los demas como se puede mejorar o minizar creando funciones y aplicando modos de almacenamiento en buffer para las tablas...

para empezar, con tu problema... ademas del numero de orden al actualizar deberas utilizar el código del artículo como indice para actualizar... el código del artículo no deberia de cambiar al momento de modificar tu detalle de orden por lo tanto el where deberia de ser asi WHERE detalle.cod_orden = xValor10MD And detalle.Codigo_p = xValor3MD esto actualizara por producto de la orden...

borrar!!!!... naaaa.... seria como ultima alternativa y estar borrando deja de ser un programa eficiente....

mira... te dare un consejo...

VFP maneja tablas en modo de almacenamiento en buffer ... donde te permite campo por campo verificar cual ha cambiado... ojo!!!!... con esto puedes crear dos rutinas.. una para saber que registros cambiaron y deberan ser actualizados y otra para saber que registros fue agregados y deberan ser insertados.

otra cosa.... tu estas creando variables publicas para poder utilizarlas con la sentencia SQLEXEC()... mmmm... noup!!!... ese mantenimiento es muy tedioso... hay mejores maneras para mejorar este mantenimiento...

ok... prueba lo que prodria resolver tu problema y luego hablamos de como mejorar tus aplicaciones
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:Problema update

Publicado por Beatriz (66 intervenciones) el 11/06/2008 17:31:44
Gracias Marvin, pero es justo ahora que estoy programando mi Aplicación, entonces te agradezco tu ayuda,,si me pasas los tips para optimizar codigo en mi aplicación y no estar construyendo mantenimeintos tediosos como los llamas tu....en espera de tus tips¡¡¡y Muy agradecida
Beatriz
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:Problema update

Publicado por Marvin Emilson Pineda (75 intervenciones) el 11/06/2008 18:42:55
Bueno...

Mira lo que yo hago sencillo, trato lo maximo de automatizar con funciones...

trabajando con SQL

los campos de las tablas que creo en SQL, los mismo campos los creo en cursores temporales en VFP para trabajar localmente... en este caso hablando de un sistema de ordenes o facturacion.

creo en SQL dos tablas... una de encabezado y otra de detalle (simplifiquemos)

tabla encabezado
(TiendaID int, FechaVenta datetime, TipoFactura Int, Factura Int, STotal Money, Iva Money, Total Money, Estado Bit)

tabla detalle
(TiendaID int, TipoFactura Int, Factura Int, ProductID varchar(20), Cantidad Numeric, PrecioVenta Money, Iva Money, STotal Money)

con estos dos ejemplos en VFP yo creo la misma estructura en cursores temporales, estos cursores les defino un modo de almacenamiento en Buffer = 5 tengo 2 funciones una que utilizo cuando estoy modificando informacion y otra para cuando estoy creando nuevos registros... utilizo el GetFldState() para saber si el registro se esta insertando o se esta modificando en caso de estar modificando, campo x campo verifico si este sufrio cambio si no sufrio cambio no lo considero como campo para actualizar en SQL.

una tercera función hacer la converción a prepara la información para que sea recibida en SQL con el formato adecuado asi automaticamente creo la linea de comando que insertara o actualizara en SQL... en este momento estoy en mi trabajo y no tengo a la mano estas 3 funciones te las debo para mañana o las publico por la noche...

lo que tambien utilizo es que los campos que no seran incluidos para verificar si fueron modificados o son nuevos los inicio con el siguiente caracter "_" asi... en la tabla de detalle tengo que mostrar la descripcion del articulo pero este campo lo creo de esta manera _DescripcionArticulo varChar(40) en VFP asi en mi rutina cuando la funcion pasa por este campo lo ignora de esta manera yo solo utilizo las funciones de esta manera

local lcSQL As Long
select TempDetalle
scan
if "1" $ GetFldState(-1, "TempDetalle") Then
lcSQL = GetFieldsToUpdate("TempDetalle")
if isblank(lcSQL) then
*!! El registro no sufrio cambios
loop
endif
lcSQL = "UPDATE Detalle Set " + lcSQL + "Where TiendaID = " + ltrim(str(TempDetalle.TiendaID)) +" And ProductID = '" + allt(TempDetalle.ProductID) + "'"
else
lcSQL = "INSERT INTO Detalle " + GetFieldsToInsert("TempDetalle")
endif
if SQLExec(SQLConnectionID, lcSQL) < 0 Then
*!! error al intentar insertar registro se procede a notificar al usuario
*!! Codigo a segir
return .F.
endif
endif
enscan

if SQLCommit(SQLConnectionID) < 0 then
*!! Error al aplicar cambias en tablas, se le notifica al usuario
return .F.
endif

este seria el codigo para cuando se este modificando una factura... para cuando se este creando una factura solo se utilizaria la funcion GetFieldsToInsert().

ojo!!!... solo en VFP9 Se puede utilizar la comando Local <<>> As Long ...mmm...en VFP8 no me fije si se puede usar.... en caso de estar utilizando otra version de VFP podrias utilizar un campo memo en lugar de la variable lcSQL ya que aplicar el As Long estas definiendo que esa variable contendra una cadena larga para que VFP9 la soporte y genere un error...

que mas podriamos agregar!!!... creo que podria kedar a criterio o imaginación del programador como mejorar estas funciones o procedimientos para crear sistemas mas estructurados y eficientes...

Saludos,
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:Problema update

Publicado por Beatriz (66 intervenciones) el 11/06/2008 19:22:59
Excelente Marvin¡¡¡gracias por tus tips¡¡¡¡Muy Agradecida
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