FoxPro/Visual FoxPro - Recorrido de filas de una tabla

 
Vista:
sin imagen de perfil

Recorrido de filas de una tabla

Publicado por Jose (49 intervenciones) el 21/06/2013 05:10:40
Buenas noches, estoy creando un pequeño sistema de ventas, donde cree una tabla llamada TablaC, en la cual hay varios registros de productos, cada uno de ellos con su propio codigo.
Y necesito recorrer cada una de las filas de esa tabla para comparar dicho codigo con el codigo de los registros de productos de otra tabla llamada "Productos".
Para luego restarle los valores del campo "cantidad" de la tabla "TablaC" a el valor del campo "cantidad de la tabla "Productos.
He intentado con el siguiente codigo pero obviamente no me funciona:
SELECT TablaC
GO TOP
CantidadRegistros = RECCOUNT()
FOR nCnt = 1 TO CantidadRegistros
IF tablaC.codigo = productos.codigo_producto THEN
UPDATE productos SET cantidad = (productos.cantidad-tablaC.cantidad) WHERE (codigo_producto=tablaC.codigo)
ENDIF
ENDFOR

Desde ya, gracias por su ayuda.!
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: 1.011
Oro
Ha mantenido su posición en FoxPro/Visual FoxPro (en relación al último mes)
Gráfica de FoxPro/Visual FoxPro

Recorrido de filas de una tabla

Publicado por Fidel (558 intervenciones) el 21/06/2013 15:11:36
Con Update Sql
UPDATE PRODUCTOS SET Productos.Cantidad=Productos.Cantidad-tablac.Cantidad from TABLAC WHERE productos.codigo=tablac.codigo

Nota: no debes utilizar ese ciclo For NEXT. Tal como está redactado, como ninguna de las tablas tiene movimiento, si coincide el primer registro se ejecutará (mal) una vez el Update y si no, no se ejecutará nunca. O sea, va solamente la sentencia de UPDATE - SQL.

Alternativa con SCAN / ENDSCAN
1
2
3
4
5
6
7
8
9
10
11
12
13
14
select codigo,cantidad from tablac into cursor Cur_TBC READWRITE
select Cur_TBC
index on codigo tag iCur_TBC
 
select productos
Scan
	if indexseek(Codigo,.f.,"Cur_TBC","iCur_TBC")
		indexseek(Codigo,.T.,"Cur_TBC","iCur_TBC")
		REPLACE CANTIDAD WITH cantidad - Cur_TBC.cantidad
	ENDIF
 
endscan
SELECT Cur_TBC
USE
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
3
Comentar
sin imagen de perfil
Val: 1.011
Oro
Ha mantenido su posición en FoxPro/Visual FoxPro (en relación al último mes)
Gráfica de FoxPro/Visual FoxPro

Recorrido de filas de una tabla

Publicado por Fidel (558 intervenciones) el 22/06/2013 13:46:23
Fíjate que READWRITE es parte del comando SELECT-SQL

SELECT * FROM MITABLA INTO CURSOR PEPE READWRITE

select PEPE && ESTO SELECCIONA EL AREA DEL CUSOR "PEPE"

También puede ser (continuidad de lineas con ;)
SELECT * ;
FROM MITABLA ;
INTO CURSOR PEPE ;
READWRITE

SELECT PEPE
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Recorrido de filas de una tabla

Publicado por Jose (49 intervenciones) el 26/06/2013 22:01:30
Amigo gracias por el codigo, me funciono perfectamente. Pero ahora me encuentro con una duda en el codigo y es la siguiente; ademas de remplazar "CANTIDAD por cantidad - Cur_TBC.cantidad", tambien quisiera ingresar los valores de la tabla TABLAC a una tabla llamada VENTAS. Y claro, que esto se haga segun la misma condicion del codigo!. Quisiera saber como seria la sintaxis.

Nota: los valores de TABLAC que quisiera ingresar en la tabla VENTAS son:
TABLAC -------------- VENTAS
Nombre = Nombre
Descripcion = Descripcion
cantidad = cantidad
precio = precio
cod_emp = cod_emp
codigo = codigo

Desde ya, Graias Por su 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: 1.011
Oro
Ha mantenido su posición en FoxPro/Visual FoxPro (en relación al último mes)
Gráfica de FoxPro/Visual FoxPro

Recorrido de filas de una tabla

Publicado por Fidel (558 intervenciones) el 27/06/2013 01:39:01
Mira José, que no entiendo bien cual es el tema.

Por la imagen que enviaste parece ser que estás haciendo facturas de venta ó ticket.
De acuerdo con la teoría más usada, en esto interviene, por lo menos, lo siguiente:
1) Tabla de Clientes
2) Tabla de Productos
3) Tabla de cabecera de Facturas (o ventas)
4) Tabla de Detalle de Productos Vendidos
5) Tabla de Control de Inventarios. (algunos utilizan el mismo archivo de productos, pero para mí eso es una mala práctica, ya que pueden existir varios inventarios [sucursales, salones de ventas, etc]).
6) Tabla de Pendientes de Cuenta Corriente (opcional)
En la cabecera de facturas, tendrás como mínimo:
Fecha, Número de Factura, Número de Impuestos del comprador, Total gravado, exento, nogravado, importe de IVA, percepciones y total facturado. Si trabajas con un código de cliente que no es el número de impuestos (CUIT o como se llame), también vá el código de cliente (id). Es bueno informar también si la venta es al contado ó a crédito (condición de Venta).

Ahora bien, todos estos datos de la cabecera se pescan en el momento en que se genera el ticket o factura. Los items que ingresas van a la tabla de detalle y de la suma de los campos de la tabla de detalle y las consideraciones fiscales, surgen los números que actualizan la tabla de cabecera.
Incluso si la venta es a Consumidor Final (no identificado), debes tener un código para eso. En Argentina es bueno poner el código de comprobante Afip.

En la tabla de detalle tendrás como mínimo:
Fecha, Id de cliente, número de comprobante, código de producto, cantidad , importe de impuestos internos por unidad , total gravado, no gravado, exento, iva y total del renglón, identificador de rubro, código de cuenta contable a la que se imputa, tasa de IVA.

De esto resulta que:
En la tabla de cabecera de facturas tendrás un solo registro por cada factura que se emita.
En la tabla de detalles, tendrás tantos registros como productos se vendieron.
En la tabla de inventarios se actualizarán tantos productos como figuran en el detalle
En la tabla de pendiente de cuentas corrientes se agregará uno o más registros (cuotas) si es que hay venta en cuenta corriente.

Disculpa esta aburrida cháchara pero no quiero enviarte una opinión desenfocada que luego te meta en un brete.
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

Recorrido de filas de una tabla

Publicado por Jose (49 intervenciones) el 27/06/2013 03:25:08
Buenas noches Fidel, no amigo no es un sistema de facturas avanzado para su comercializacion ni nada eso, es solo un sencillo sistemas de ventas de X productos ya que soy estudiante de sistemas y debo llevar algo asi para la universidad, donde existan 4 tablas: empleados, productos, ventas, y tablaC; (esta tabla es similar a un carrito de compras. Es decir, se ingresan los productos a comprar para hacer una suma de sus precios y luego esos valores ser enviados a la tabla ventas)...
Es por eso, que al precionar el boton VENDER quisiera que al recorrer cada una de las filas de TablaC ademas de restar de la tabla Productos (inventario) la cantidad de cada producto a vender, tambien que ingresara los valores de la tabla TABLAC a una tabla llamada VENTAS. Y claro, que esto se haga segun la misma condicion del codigo!
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: 1.011
Oro
Ha mantenido su posición en FoxPro/Visual FoxPro (en relación al último mes)
Gráfica de FoxPro/Visual FoxPro

Recorrido de filas de una tabla

Publicado por Fidel (558 intervenciones) el 27/06/2013 15:46:43
Con lo que dices me da la impresión de que no está claro el diagrama de flujo.

En un sistema de datos relacionales (como FoxPro), en los archivos de transacciones no estás repitiendo características que están en las tablas relacionadas. Por ejemplo, en la tabla de cabecera de facturas, no pones el nombre del cliente, porque ese dato se busca, cuando se necesita, en la tabla de clientes. Por lo tanto irá el identificador solamente. En la tabla de detalle de productos vendidos, se coloca el identificador de cliente para poder obtener información de qué clientes compraron qué cosa. En ambas tablas va la fecha de operación porque te permite determinar rápidamente facturas entre fechas (cabecera) o productos vendidos entre fechas (detalle). Si te interesa saber qué empleado vendió qué cosa, también irá el identificador de empleado en la tabla de detalle. En la tabla de cabecera te será útil incluir el identificador de empleado si tienes que liquidar comisiones por totales de factura. En ninguna de las dos va el nombre del empleado.

Independientemente de la finalidad de la aplicación, cualquier módulo que pretenda registrar ventas, tendrá dos tablas de corrida: cabecera de facturas y detalle de productos vendidos. Y las tablas de base (clientes, empleados, rubros, productos, marcas, etc) que sirven de apoyo.
Si utilizas una sola tabla en la que tienes todos los datos, te resultará un pandemonio sacar un libro de ventas o cualquier tipo de información que no se refiera a productos vendidos.
El planteo es más o menos así:
Supongamos que
la tabla de cabecera se llama "Facturas"
la tabla de detalle de productos vendidos se llama "Produven".
la tabla de productos se llama PRODUCTOS y tiene un índice sobre el campo "Codigo" llamado "CODPROD" (INDEX ON CODIGO TAG CODPROD)
Un método que puede utilizarse, es crear dos cursores basados en estas tablas y luego actualizar las tablas. Esto para no complicarte con Buffering.
IF !USED("CABECERA")
SELECT * FROM FACTURAS WHERE .F. INTO CURSOR CABECERA
ENDIF
IF !USED("DETALLE")
SELECT * FROM PRODUVEN WHERE .F. INTO CURSOR DETALLE
ENDIF
Con esto generaste dos cursores con la estructura de las tablas y sin registros.

Ahora bien, la interfase tiene que rellenar los cursores. El cursor DETALLE va asociado al control grid y en él ingresas los productos vendidos (codigo, descripción, cantidad, precio, importe, etc)
En la interfase tienes que estar tomando: Fecha de operación, comprador, condición de venta, número de comprobante, ETC.
Cuando terminas de rellenar el formulario con los datos de productos vendidos (o sea, agregas datos al cursor DETALLE), comprador, empleado vendedor, condición de venta, etc, , se puede Grabar o Cancelar.
Si cancelas la operación, saltas al punto 7 y limpias la interfase.

Si grabas la operación, seguirás la secuencia :
Antes de grabar, tendrás que tener algún elemento de validación:
* Que no falte el código de cliente, la fecha, número de comprobante, código de empleado vendedor, si la factura suma más que cero (o si es nota de crédito), etc.
* EJEMPLO
SELECT DETALLE
GO TOP
IF EOF()
MESSAGEBOX("No ha vendido nada")
RETURN
ENDIF
select CABECERA
if Empty(CODIGO_CLIENTE)
Messagebox("No indicó el comprador")
Thisfrom.Command1.setfocus
RETURN
ENDIF

1) Obtienes el número de comprobante (siempre justo antes de grabar).
2) Rellenas el cursor DETALLE con fecha, número de comprobante, código de cliente, Código Empleado, etc.
3) Sumas los campos de importe (pueden ser gravado, no gravado, exento, iva, etc.)
4) rellenas el cusor CABECERA (1 solo registro) con código de cliente, fecha, número de comprobante, condición de venta, etc, y los totales obtenidos del cursor DETALLE.

5) grabar en FACTURAS (CABECERA)
SELECT CABECERA
SCATTER MEMVAR
INSERT INTO FACTURAS FROM MEMVAR

6) grabar en PRODUVEN (DETALLE) [detalle de productos vendidos] y actualizar inventario
SELECT DETALLE
SCAN
SCATTER MEMVAR
if indexseek(detalle.codigo,.f.,"PRODUCTOS","CODPROD")
SELECT PRODUCTOS
INDEXSEEK(detalle.codigo,.T.,"PRODUCTOS","CODPROD")
IF RLOCK()
REPLACE CANTIDAD WITH CANTIDAD - DETALLE.CANTIDAD
UNLOCK
ENDIF
ENDIF
INSERT INTO PRODUVEN FROM MEMVAR
ENDSCAN
UNLOCK IN FACTURAS
UNLOCK IN PRODUVEN
FLUSH


7) LIMPIO CURSORES
SELECT DETALLE
ZAP
SELECT CABECERA
ZAP

Tómate un tiempo para hacer un buen diseño de datos y luego un diagrama de flujo. Te simplificará mucho el desarrollo. Lo esencial es plantear adecuadamente el problema. Para ello debes tener en cuenta, como mínimo, lo siguiente:
a) datos que deben conservarse obligatoriamente (motivos legales, reglamentarios, etc.)
b) información requerida por los usuarios (estadísticas de ventas de diversos tipos)
Teniendo un detalle completo de estos aspectos, podrás diseñar las tablas como para poder recuperar la información que se necesita suministrar.
Resuelto el diseño y el flujo de datos, será la hora de diseñar la interfase para que responda a todas las necesidades planteadas.
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

Manejo de stock

Publicado por Alba (1 intervención) el 10/09/2014 18:19:30
Buenas! Quisiera me ayudaran con un codigo.. tengo un sistema de facturacion por lo que preciso que al vender un producto al agregar la cantidad me salga un error si éste es mayor a la cantidad existente en el stock.. vale destacar que tengo cómo campos ambos items tanto cómo cantidad_producto y fact_cantidad.. podrían ayudarme? 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