FoxPro/Visual FoxPro - Formulario para agregar

   
Vista:

Formulario para agregar

Publicado por Joaquin (1 intervención) el 21/10/2013 21:31:45
Bueno , Necesito ayuda con mi formulario en fox pro 9.0

tengo una base de datas llamada carta con 2 elementos. articulo y precio

lo que quiero es agregar datos a la bas e de datos carta , con un pequeño formulario . en donde quiero verificar que el producto no exista con antes aviso , es decir ver si existe el mismo articulo no subirlo a la tabla nuevamente y si no existe crear abajo de todo el articulo nuevo con el precio adecuado , mi base de datos es articulo Character y precio numeric con 2 decimales . Si pueden guiarme un poco porque me tira un par de problemas . desde ya muchas gracias si necesita algun dato mas avisen necesito recorrer toda mi base de datos tambien para ver si no existe ese articulo ... espero respuestas

Local Var1
Var1 = "0"
USE carta
Set exact on
set order to articulo
SET DECIMALS TO 2
CantidadRegistros = RECCOUNT()
FOR i=1 TO CantidadRegistros
IF Thisform.text1.value = carta.articulo(i) then
messagebox = "Este Producto ya se encuentra en la Lista"
Var1 = "1"
ELSE
ENDIF
endfor
GO bott
IF Var1 = "1" THEN
ELSE
APPEND BLANK
replace carta.articulo with Thisform.text1.value
replace carta.precio with Thisform.text2.value
Thisform.text1.value=""
Thisform.text2.value=""
ENDIF
CLOSE DATABASES
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

Formulario para agregar

Publicado por Fidel (558 intervenciones) el 21/10/2013 23:35:07
USE carta
Set exact on
set order to articulo

Por lo que dice este código, tu tabla "Carta" tiene un índice sobre artículo.
Supongamos que el tal artículo ese se introduce en un textbox del formulario llamado Text1 y el precio en otro TExtbox, llamado Text2.
En el Evento Valid del Text1 (articulo), deberías poner algo así
This.value=alltrim(this.value)
IF !EMPTY(this.value)
if INDEXSEEK(this.value,.F.,"Carta","Articulo")
Messagebox("El Artículo "+this.value+" ya existe")
RETURN 0 && No deja continuar y devuelve el foco al objeto
ENDIF
ENDIF

En el evento LostFocus de text1 no pones nada, o a lo sumo
if !empty(this.Value)
Thisform.text2.SetFocus
endif


En el evento lostFocus de Text2
INSERT INTO CARTA (ARTICULO , PRECIO) VALUES (thisform.text1.Value,thisform.text2.value)

* Limpia
with thisform
.Text1.Value=""
.Text2.Value=0
endwith


Notas:
La alternativa de buscar con For NEXT es complicada y problemática. Las tablas de VFP pueden tener registros marcados para borrar, por lo que deberías usar COUNT() y no RECCOUNT(). Reccount() de dirá la cantidad de registros que tiene la tabla (marcados para borrar o no). Si SET DELETED ON, los marcados para borrar no serán vistos por el for NExt Y fallará.

Para búsqueda secuencial, cuando no hay índices, puedes usar una de las siguientes tres alternativas:

a) Con SCAN ENDSCAN && poco recomendable
lcEncuentra=""
select CARTAS
SCAN FOR ARTICULO==lcValorBuscado
lcEncuentra=trim(articulo)
endscan
if !empty(lcEncuentra)
Messagebox("Ya se encuentra registrado")
else
Messagebox("No está en la tabla")
endif

b) Con LOCATE
SELECT CARTAS
LOCATE FOR ARTICULO==lcValorBuscado
IF FOUND()
Messagebox("Ya se encuentra registrado")
else
Messagebox("No está en la tabla")
endif

c) Con SELECT SQL
SELECT * FROM CARTA WHERE ARTICULO==lcValorBuscado INTO CURSOR GCARTA
IF _TALLY=0
MESSAGEBOX("El artículo no está en la tabla")
else
Messagebox("El artículo está en la tabla")
select gcarta
browse
USE
ENDIF


Para búsqueda con un índice sobre el campo que buscas, puedes utilizar:
SEEK()
INDEXSEEK() && recomendado para tablas
LOCATE
SELECT - SQL

Estudia todas las funciones y comandos comentados. Tendrás tu solución.

Trata de evitar APPEND BLANK, toda vez que puedes reemplazarlo por INSERT INTO Tabla...
Fijate que si Text2 es el precio, no debes colocar Thisform.Text2.Value="". El precio, dices, es un numérico con dos decimales, por lo tanto, Thisform.Text2.Value=0

SET DECIMALS es una orden que tal vez pongas al principio del sistema y ya no la vuelvas a tocar salvo algunos casos muy especiales.

SET EXACT. Ten cuidado con el significado en la comparación de caracteres. Muchas veces no se desea que SET EXACT esté ON, porque obliga a buscar claves completas. Para mí, lo normal es que SET EXACT OFF. Las comparaciones entre cadenas, si necesito que sean exactas, las hago con doble igual. lcCAdena==lcOtraCadena
En los casos de INLIST() y Ascan(), puedes necesitar SET EXACT ON. El procedimiento ordinario es así:
LOCAL lcExact
LcExact=Set("Exact") && toma el valor actual de SET EXACT
SET EXACT ON

nAscan=Ascan(gaMatriz, lcElemento) &&busco una string en el array gaMatriz, exacto.

SET EXACT &lcExact && devuelvo la configuración a como estaba antes de poner ON.
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