Actualizar tabla usando una consulta sql

Amigo, necesito me ayudes a como hacer para actualizar una tabla usando una consulta sql
lo que pasa que cuando uso una consulta sql y quiero actualizar un registro no me lo hace.
Debo hacer una rutina usando la tabla y buscar nuevamente el registro y así actualizarlo, ¿ya qué en la consulta sql uso un cursor "mitablatemp" y no la tabla física
como se hace con un comando o la rutina que digo yo?
Gracias

1 Respuesta

Respuesta
1
¿Con qué base de datos trabajas? , con las DBF de fox?. Esto es importante para mi al responderte, por que si trabajas con mysql es otra sintaxis.
Pero te adelanto algo, si trabajas con fox deberías usar la sentencia UPDATE-SQL, por ejemplo
update clientes set ciudad='Asuncion' where apellido='Perez'
En el ejemplo anterior hicimos una actualización global de todos los clientes que se apellidan perez le pusimos que viven en Asunción, esa es la idea, no se si te va servir.
Hola amigo, si estoy trabajando con dbf de fox mi istruccion es esta
thisform.grid1.recordsource = " "
select fecha,comprobante,vinatero,numero_inv,bruto,tara,neto,variedad,codigo,tenor_azuc,kg_x_tenor,comerciali,observacio,patente,modelo,conductor,cosecha_an ,estado from movimien;
ORDER BY comprobante;
into cursor movimientemp
thisform.grid1.recordsource = "movimientemp"
thisform.Refresh()
luego de hacer una rutina de busqueda con locate
sele movimientemp
locate for movimientemp.comprobante=thisform.txtcomprobante.value
aca es donde quiero cargarle "ACTIVO" al campo estado del registro encontrado pero en la tabla movimien
¿Dónde doy la orden para actualizarla?
Gracias
Tb puedes usar replace for
Seria
Se le movimieTemp
Go top
do while !eof()
     sele LAtABLA oRIGINAL
       replace campo with 'Activo' for comprobante=thisform.txtComprobante.value
        Se le movimieTemp
Enddo
Pero lo que no entiendo es que tu SQL no tiene ninguna condición where, y solo trae de una tabla, esto no tiene sentido, por que hacer SQL en una sola tabla y vincularlo a un grid. Un SQL sin condición por eso no puedo darte una solución ideal.
Hola amigo, te explico detallado que hice.
Tengo un primer formulario donde cargo en una tabla las pesadas en kgrs de una cosecha de uva. Son los datos de un formulario que entrega una institución Vitivinicola.
Toda la carga esta hecha en ese formulario pero resulta que a veces quiero examinar un comprobante que ya ha sido cargado y Anularlo o no.
Ahora bien yo hice un botón Examinar y en el evento click coloque la siguiente instrucción
Do form exampesada
De cual me abre otro formulario donde tengo un optiongroup para seleccionar la forma de búsqueda y ordenarlo por lo que elegí
* Por fecha *Por comprobante *Por viñatero *Por INV *Por variedad de uva
y en cada opcion use el sql cambiando el orden de la tabla, mostrandolo en un grid  y por eso use esta sentencia.
thisform.grid1.recordsource = " "
select fecha,comprobante,vinatero,numero_inv,bruto,tara,neto,variedad,codigo,tenor_azuc,kg_x_tenor,comerciali,observacio,patente,modelo,conductor,cosecha_an from movimien;
ORDER BY fecha; &&& Aca cambio el campo donde quiero buscar y ordenar&&&&&
into cursor movimientemp
thisform.grid1.recordsource = "movimientemp"
thisform.Refresh()
thisform.txtcontenido.setfocus()
Luego en un Text ingreso el contenido de lo que quiero buscar segun la opcion elegida.
y en el evento InteractiveChange del Text coloco lo siguiente
SELE MOVIMIENTEMP
if thisform.optiongroup1.option1.value=1
LOCAL fechaauxi
FECHAAUXI=CTOD(ALLTRIM(THISFORM.TXTCONTENIDO.VALUE))
LOCATE FOR MOVIMIENTEMP.FECHA>=FECHAAUXI
THISFORM.GRID1.REFRESH
ENDIF
if thisform.optiongroup1.option2.value=1
LOCAL comprobanteauxi
COMPROBANTEAUXI=ALLTRIM(THISFORM.TXTCONTENIDO.VALUE)
LOCATE FOR MOVIMIENTEMP.COMPROBANTE>=VAL(COMPROBANTEAUXI)
THISFORM.GRID1.REFRESH
Endif
Y así con cada option; es por eso que no use la condición where porque use el locate no se si me explico. Todo esto me lo hace bien, luego de encontrado el registro tengo un comman button Aceptar que en el evento click cierra el formulario "exampesada" y me muestra todos los datos del comprobante ingresado en el formulario 1
Ahora bien es donde yo hago mi pregunta.
Una vez traído los datos y mostrados en el form1 quiero anularlo y es por eso que he creado un botón Anular y en el evento click coloque este este código:
Titulo = 'Anulación'
mensajeTexto = '¿Desea anular el Comprobante que esta en pantalla?'
DialogoTipo = 4 + 32 + 256
* 4 = Botones Sí y No.
* 32 = Icono del signo de interrogación.
* 256 = El segundo botón es el predeterminado.
pregunta = MESSAGEBOX(mensajeTexto, DialogoTipo, Titulo)
DO CASE
CASE pregunta = 6
* 'Eligió Sí'
WAIT WINDOW 'Se anulo el comprobante' nowait
sele movimien
locate for movimien.comprobante=nrocompaux
if found()
replace movimien.estado with "ANULADO"
else
wait window "No se encontro el comprobante" nowait
endif
CASE pregunta = 7
WAIT WINDOW 'No se anulo el comprobante' nowait
ENDCASE
Mi pregunta es ¿porque no puedo reemplazar en un campo del registro seleccionado en el cursor sql que use para la búsqueda.? Intente y no me lo hizo porque si te das cuenta en el CASE selecciono la tabla física y no la del sql. Hay una manera de usar la tabla en sql y modificar sus campos y que quede registrada en la tabla física.?
Disculpa la demora, estoy de vacaciones y no tengo mucha internet, solo leo mis mensajes cada dos días, es muy largo el tema, pero te respondo la ultima parte de tu pregunta, es posible hacer lo que dices, con VISTAS, si creas una vista usando el asistente puedes marcar la opción ENVIAR ACTUALIZACIÓN, entonces lo que cambies en la vista reflejara en la tabla física, sino tienes experiencia con las vistas es hora de leer un poco. Es bueno conocer bien la herramienta.
Hola amigo, se que es bueno conocer la herramienta es por eso que te pido un poco de ayuda pero si no puedes ayudarme te agradeceré lo mismo, es por eso que al no tener experiencia me gustaría me ayudes si puedes y esta a tu alcance intelectual. Gracias.
SI, PERO basta con leer el manual, o si has leído algún curso de fox en la web, yo recomiendo www.lawebdelprogramador.com/cursos siempre hay un apartado de vistas, lo que debes comenzar es con cosas simples, luego vas complicando, y con los pequeños trancos que tengas es ahí donde nosotros te ayudamos.

Añade tu respuesta

Haz clic para o