FoxPro/Visual FoxPro - CODIGO

 
Vista:
sin imagen de perfil

CODIGO

Publicado por A. GUZMAN (20 intervenciones) el 19/05/2005 13:24:19
HACE ALGUNOS DIAS PEDI UNA AYUDA, TENGO UN CODIGO PARA ACTUALIZAR UNA VISTA Y ESTE CODIGO NO ME HA SERVIDO, Y NO ES EL UNICO QUE HE HECHO, LO HE HECHO DE MUCHAS FORMAS Y NO FUNCIONA EL ASUNTO ES QUE QUIERO ACTUALIZAR EL CAMPO CANTIDAD DE LA TABLA ARTICULOS Y SOLO ME ACTUALIZA UNO SOLO, CUANDO EL CASO ES QUE LA TABLA DE SALIDAS TIENE VARIOS REGISTROS QUE SON FACTURA,CODIGO DE ARTICULOS Y EL CAMPO SALIDA

MUCHO LES AGRADECERIA DE ANTEMANO. POR FAVOR
SELECT varticulos
cCode = Thisform.Grid1.Column2.Text1.Value
nCantidad = Thisform.Grid1.Column3.Text1.Value
nCant = varticulos.cantidad + nCantidad
DO WHILE !EOF()
SELECT varticulos
LOCATE FOR cCode = varticulos.codigo
IF FOUND()
UPDATE varticulos SET cantidad = nCant WHERE varticulos.codigo = cCode
TABLEUPDATE(0,.F.,"varticulos")
UNLOCK ALL IN varticulos
ENDIF
SKIP IN varticulos
ENDDO
Thisform.refresh
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

RE:CODIGO

Publicado por Manuel (344 intervenciones) el 19/05/2005 16:34:33
Te toma sólo uno, porque cCode,nCantidad y nCant con sus valores deben estar dentro del "Do While" y los has puesto antes.
Podría sugerirte lo siguiente, pero puedes ignorarlo. Observa:
En el ejemplo sólo pones "varticulos". Voy a pensar que "varticulos" se refiere a la venta de articulos y que tu tabla de articulos se llama simplemente "articulos" (En tu código, pareciera que es la misma tabla).
Como cCode sólo lo tomas una vez, el valor es fijo. En el "Do While" siempre buscas el cCode (con el mismo valor), así que sólo te actualiza ese código. Así que el "Do While" debe estar antes de "cCode=..."
Prueba esto: (Por lo de la suma, creo que tratas de aumentar al existencia).

SELECT varticulos
Do whil !Eof()
cCode = Thisform.Grid1.Column2.Text1.Value
nCantidad = Thisform.Grid1.Column3.Text1.Value
SELECT articulos
LOCATE FOR codigo=cCode
IF FOUND()
REPL cantidad with cantidad+nCantidad
TABLEUPDATE(0,.F.,"articulos")
UNLOCK ALL IN articulos
ENDIF
SELECT varticulos
SKIP
ENDDO
Thisform.refresh
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:CODIGO

Publicado por Roman Suazo (2723 intervenciones) el 19/05/2005 17:17:15
Estoy de acuerdo con Manuel por ahi podria ir tu problema. Tambien te recomiendo usar un GO TOP ante de entrar al loop ya que tal vez ya estas en el ultimo registro y por eso solo te actualiza uno
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

RE:CODIGO

Publicado por A. GUZMAN (20 intervenciones) el 19/05/2005 18:34:08
LO HICE COMO TU DIJISTE Y SE QUEDO EN UN CICLO INDEFINIDO, CREO QUE EL "DO WHILE !EOF()" SE QUEDO ESPERANDO FIN DE ARCHIVO, NO SE ACTUALIZO Y ACUMULO EL PRIMER REGISTRO CON EL CAMPO CANTIDAD HASTA UNA CIFRA DE 65678

SI SE TE OCURRE OTRA IDEA? MIL GRACIAS DE ANTEMANO
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:CODIGO

Publicado por Roman Suazo (2723 intervenciones) el 19/05/2005 18:41:39
No, el GO TOP debe ir afuera del loop y antes de el. Si lo pones adentro no se terminara el ciclo:

Algo asi:

Selec mitabla
go top
DO while !EOF()
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

RE:CODIGO

Publicado por A. GUZMAN (20 intervenciones) el 19/05/2005 19:28:18
AMIGO ROMAN, LO HICE ASI COMO ME DIJISTE Y SIGUE IGUAL, SE QUEDA EN UN CICLO INDEFINIDO.
DAME OTRA IDEA. Y NO IMPORTA YO ESPERO TU AYUDA

GRACIAS MIL
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:CODIGO

Publicado por Roman Suazo (2723 intervenciones) el 19/05/2005 20:07:50
Ok, poco a poco voy entendiendo lo que quieres decir. Podrias explicar mejor que es lo que quieres lograr o hacer, me parece que pueden haber formas mas faciles de lograr lo que quieres. El asunto esta algo confuso...Pareciera que estuvieras ingresando mas articulos al inventario, es decir, te dan la lista de articulos y quieres aumentar su cantidad en la tabla de inventarios, es decir, aumentar la cantidad.
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

RE:CODIGO

Publicado por A. GUZMAN (20 intervenciones) el 20/05/2005 13:16:29
EL ASUNTO ES QUE HAY QUE ACTUALIZAR LA TABLA ARTICULOS.DBF DESDE OTRA TABLA SALIDAS.DBF Y ESTOY USANDO UN FORMULARIO CON UN COMBO Y UN GRID Y UN COMMANDBUTTON DONDE EL COMBO FILTRA LA FACTURA CON TODAS LAS SALIDAS Y ESTAS SE DESPLIEGAN EN EL GRID, EN EL CUAL APARECEN EL NUMERO DE FACTURA, EL CODIGO DEL ARTICULO Y LA CANTIDAD DE ARTICULOS, POR EJEMPLO LA FACTURA No 0001 CON EL ARTICULO M-001 CON 2 SALIDAS, S-001 CON 3 SALIDAS Y C-001 CON 4 SALIDAS Y EL CODIGO DE ACTUALIZAR ARTICULOS LO COLOQUE EN EL COMMANDBUTTON.
MAS GRAFICO:
COMBO: NRO DE FACTURA
------------------------------------------------------------------------------------------------
FACTURA CODIGO ARTICULO SALIDAS
0001 M-001 2
0001 S-001 3
0001 C-001 4

COMMANDBUTTON: ACTUALIZAR COMMANDBUTTON : SALIR
----------------------------------------------------------------------------------------------
CLARO QUE NO HALLO LA FORMA DE ATACHAR EL FORMULARIO POR AQUI POR EL FORO.

GRACIAS DE ANTEMANO NUEVAMENTE
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

CORRECIONES Y PREGUNTAS.

Publicado por DALSOM (612 intervenciones) el 20/05/2005 21:04:59
LE HICE UN PEQUENO ARREGLO A TU CODIGO, PERO AUN TENGO UNA PREGUNTA MAS. DE DONDE ESTAS LEYENDO A CCODE, SEGUN VEO, ES SOLO UN VALOR, Y DENTRO DEL LOOP WHILE, LO BUSCARA TANTAS VECES COMO REGISTROS TENGA TU TABLA.
ESO DEBERIA ESTAR LEYENDOLO DESDE OTRA TABLA, PERO LO HACES DE UN CONTROL TEXTBOX, QUE NO CAMBIARA DE VALOR, HASTA QUE NO TERMINE.

CREO QUE TODABIA TE FALTA ALGO MAS. PERO VERIFICA, ESTE CODIGO DEBE TERMINAR, ES DECIR, NO ES INFINITO.

SELECT varticulos
cCode = Thisform.Grid1.Column2.Text1.Value
nCantidad = Thisform.Grid1.Column3.Text1.Value
nCant = varticulos.cantidad + nCantidad
_REGNO=0
DO WHILE !EOF()
SELECT varticulos
_REGNO=RECNO() && FIJATE QUE HACES UN LOCATE,
&& Y CAMBIA DE POSICION DE REGISTRO.
LOCATE FOR varticulos.codigo =cCode
IF FOUND()
UPDATE varticulos SET cantidad = nCant WHERE varticulos.codigo = cCode
TABLEUPDATE(0,.F.,"varticulos")
UNLOCK ALL IN varticulos
ENDIF
GO _REGNO
SELECT VARTICULOS
IF !EOF()
SKIP && IN varticulos
ENDIF
ENDDO
Thisform.refresh
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

LOGICA

Publicado por DALSOM (612 intervenciones) el 20/05/2005 21:11:28
DIGAMOS QUE COMO TIENES UNA TABLA FACTURA, Y OTRA ARTICULOS, SERIA ALGO ASI :

SCAN FACTURA
IF SEEK(FACTURA.CODIGO_ARTICULO,"ARTICULOS")
REPLACE ARTICULO.CAMPO WITH (ARTICULO.CAMPO+FACTURA.CANTIDAD)
ENDIF
ENDSCAN

SI TUBIESE TU CODIGO FUENTE, PODRIA REPARARLO, YA QUE CREO ES ALGO SENCILLO, Y QUE SOLO ESTAS CONFUNDIDO. EN EL CODIGO ANTERIOR TE ENVIE PARA QUE TERMINE EL CICLO WHILE, PERO SOLO ACTUALIZARA UN VALOR, DEBIDO A QUE CCODE SOLO TIENE UN VALOR, EL VALOR DEL TEXTBOX DEL FORM.
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

RE:CORRECIONES Y PREGUNTAS.

Publicado por A. GUZMAN (20 intervenciones) el 20/05/2005 23:25:19
EL CCODE VIENE DEL Thisform.Grid1.Column2.Text1.Value QUE ES LA GRILLA O GRID DEL FORMULARIO PORQUE RECUERDA QUE LOS DATOS VIENEN DE LA TABLA O VISTA VSALIDA DONDE ESTAN LOS CODIGOS DE ARTICULOS QUE SE ALQUILARON.

TE VOY A ENVIAR EL FORMULARIO Y LAS TABLAS POR TU CORREO PERSONAL Y VERAS CUAL ES EL CASO.

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
sin imagen de perfil

RE:CODIGO

Publicado por A. GUZMAN (20 intervenciones) el 20/05/2005 13:25:54
ROMAN PIENSO ENVIARTE EL FORMULARIO POR TU CORREO PERSONAL......
GRACIAS

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

RE:CODIGO

Publicado por DALSOM (612 intervenciones) el 20/05/2005 16:32:09
SI LO DESEAS, PUEDES ENVIARMELO A MI TAMBIEN. PODRIA AYUDARTE, PERO CREO QUE EL PRIMER CODIGO QUE TE ENVIARON, DEBERIA FUNCIONAR CORRECTAMENTE, POR LO QUE PIENSO QUE DEBE HABER ALGO MAS POR LO QUE NUNCA ENCUENTRA EL FINAL.

SI DESEAS, EN VEZ DE UN DO WHILE !EOF, UTILIZA UN BLOQUE SCAN / ENDSCAN , CON LO QUE TE AHORRAS EL SKIP Y EL EOF().

SALUDOS DALSOM.
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

RE:CODIGO

Publicado por A. GUZMAN (20 intervenciones) el 20/05/2005 18:26:27
LO HE PROBADO CON SCAN CON DO WHILE !EOF() CON TODO HABIDO Y POR HABER AMIGO DALSOM, Y NADA , A PROPOSITO ESAS VISTAS O TABLAS ESTAN EN EL ENTORNO DE DATOS DEL FORMULARIO

CODIGO MIO ORIGINALMENTE:
SELECT varticulos
cCode = Thisform.Grid1.Column2.Text1.Value
nCantidad = Thisform.Grid1.Column3.Text1.Value
nCant = varticulos.cantidad + nCantidad
DO WHILE !EOF()
SELECT varticulos
LOCATE FOR cCode = varticulos.codigo
IF FOUND()
UPDATE varticulos SET cantidad = nCant WHERE varticulos.codigo = cCode
TABLEUPDATE(0,.F.,"varticulos")
UNLOCK ALL IN varticulos
ENDIF
SKIP IN varticulos
ENDDO
Thisform.refresh
******************************
CODIGO QUE ME ENVIARION DE LA WEB DEL PROGRAMADOR O POSIBLE AYUDA:
SELECT varticulos
go top
Do whil !Eof()
cCode = Thisform.Grid1.Column2.Text1.Value
nCantidad = Thisform.Grid1.Column3.Text1.Value
SELECT varticulos
LOCATE FOR varticulos.codigo=cCode
IF FOUND()
REPL varticulos.cantidad with varticulos.cantidad+nCantidad
TABLEUPDATE(0,.F.,"varticulos")
UNLOCK ALL IN varticulos
ENDIF
SKIP
SELECT varticulos
ENDDO
Thisform.refresh

SALUDOS HERMANO, ESPERO QUE ME AYUDES CON ESTO
GRACIAS POR TU COOPERACION
PREGUNTA: PUEDO ENVIARTELO POR TU CORREO PERSONAL?
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

RE:CODIGO

Publicado por A. GUZMAN (20 intervenciones) el 24/05/2005 13:07:40
DALSOM EL ARCHIVO QUE ME ENVIASTE (AGENCIA1.AR) NO PUDE ABRIRLO POR MI CORREO PORQUE ME DICE QUE TIENE UN VIRUS, ENVIAMELO NUEVAMENTE, Y POR FAVOR PASALE EL ANTIVIRUS PORQUE PERDE EL ENLACE

GRACIAS
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

RE:CODIGO

Publicado por Manuel (344 intervenciones) el 24/05/2005 17:39:58
Bueno sólo una observacioncita:
Al parecer, lo que quieres es "recorrer el grid" para actualizar la existencia, y es por eso que capturas los valores en cCode=Thisform.Grid1.Column2.Text1.Value
Lo cierto es que ello te captura sólo un valor y por más que se haga SKIP, la posición del cursor no cambiará con respecto al grid, aunque sí lo hará en la Tabla o vista. Pero de nada sirve que avance en la vista si el valor del grid se mantiene. Repito, el cursor no avanza en el grid.
Por otro lado, la tabla con que arrancas el código es "varticulos", cuando realmente la que debes recorrer es "Vsalidas", es decir repites la misma tabla, por eso puede quedarse infinitamente.
Sugerencia: Tomar para cCode y nCantidad los valores directamente del campo y no del grid. Algo así:
SELECT vsalidas
GO TOP
DO WHIL !EOF()
___cCode = codigo
___nCantidad = cantidad
___SELECT varticulos
___LOCATE FOR cCode = varticulos.codigo
___IF FOUND()
______REPL cantidad WITH cantidad+ncantidad
___ENDIF
___SELECT vsalidas
___SKIP
ENDDO
SELECT varticulos
TABLEUPDATE(.T.)
Thisform.Refresh
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