Hola José Francisco
Te hago algunas observaciones
0) No hagas CrossPost. Fijate que aprovechaste otro hilo con otra consulta para meter la misma consulta que ya habías iniciado por este hilo. Entonces hay que andar revisando todo para saber qué avance tiene el tema.
1) Uso del comando REPLACE
En lugar de una sucesión de comandos replace
conviene utilizar este tipo de sintaxis
Pensá que cada comando REPLACE necesita verificar el estado de bloqueo del registro por lo cual resulta mucho más lento que colocar un solo REPLACE con las instrucciones necesarias.
2) Uso del bucle DO WHILE
Expones una sucesión de comandos un tanto extraña:
DO WHILE !EOF()
SELECT xrec && no se ve el motivo de este select. Tal vez falte una parte del código
SET FILTER TO nrocomb == ThisForm.txtnrocomb.Value IN "art1rec" && dentro del bucle?
* otros comandos
SKIP && mueve el puntero al siguiente registro disponible
LOOP && envia el control al inicio del bucle (para qué?)
EXIT && sale del bucle (cosa que no va a ocurrir aquí porque lo impide el LOOP anterior
ENDDO && cierre del bucle (Ok)
2.1. SET FILTER. En general el uso de SET FILTER debe evitarse, salvo para cursores o tablas locales (no compartidas) y cuando no se pueda encontrar algo mejor. De todos modos, aqui caben dos observaciones:
2.1.1) Podría ser SET FILTER TO nrocomb == ThisForm.txtnrocomb.Value IN art1rec && sin las comillas
2.1.2) El comando no debería estar dentro del bucle porque para el bucle TxtNroComb.Value es una constante, por lo que lo único que logra es que el proceso sea más lento y la lectura del código más confusa.
2.1.3) IF nrocomb=thisform.txtnrocomb.value. Como viene el código, el campo nroComb parece referirse a la tabla XREC. Como del código expuesto no se desprende que XREC tenga movimiento de puntero alguno dentro del bucle, el comando es ocioso, o debería estar fuera del bucle.
2.2. LOOP es un comando que se utiliza cuando se quiere evitar que el programa continúe ejecutando las líneas siguientes. Pero siempre debe responder a una condición (IF ocurreTalCosa THEN LOOP ENDIF) y no como un código que se ejecuta incondicionalmente, porque eso hará que el código siguiente no se ejecute, con el riesgo de crear un bucle infinto.
2.3. EXIT es un comando que se utiliza cuando, debido a cierta ocurrencia, se necesita abandonar el bucle. Al igual que LOOP, siempre debe responder a una condición (IF / ENDIF)
2.4. Miro este código y no estoy convencido de tenga que ser así:
SELECT art1rec
warticulo=art1rec.articulo
wdesc=art1rec.desc
wunid=art1rec.unid
wprec_u=art1rec.prec_u
wprec_u=art1rec.prec_u
wpdesc=art1rec.pdesc
wimporte=art1rec.importe
wimporte=(wprec_u*wunid)
wpdesc=(wimporte*wdesc)/100
wimporte=wimporte-wpdesc
replace articulo WITH warticulo && sería lo mismo que poner REPLACE articulo WITH articulo && ??
replace unid WITH wunid && sería lo mismo que poner REPLACE unid WITH unid
replace prec_u WITH wprec_u
replace desc WITH wdesc
replace pdesc WITH wpdesc
replace importe WITH wimporte
O sea, si los REPLACE deben ocurrir en la tabla art1rec, deberías ahorrarte todas esas variables y trabajar con los campos de la tabla. Y no habiendo ninguna novedad (al menos visible) no vale la pena reemplazar el valor de un campo con el valor del mismo campo en la misma tabla o cursor.
Y si los REPLACE deberían ocurrir en otra tabla o cursor, pues aquí falta el SELECT OtraTabla.
Por otra parte, no se comprende (mirando el código) que papel juega el campo nrocomb en art1rec. Esto debería ser más explícito. Supongo que ese campo está en la tabla art1rec porque se deduce de SET FILTER.
3) Siempre que resulte posible, debe utilizarse el bucle SCAN / ENDSCAN en lugar de DO WHILE / ENDDO
Da la impresión de que todo ese código podría reemplazarse por este otro
En esto falta la parte que determina la ganancia, porque tiras un SUM ALL sobre un campo que no se ve cómo se rellena.
En cuanto al código anterior sobre la determinación de la ganancia, no sé cuál es tu idea, o sea, qué necesitas informar en ese punto. Hablar de "ganancia" en esta etapa es algo estrepitoso, salvo que trabajes con tasa predeterminada de gastos o costo estándar, en cuyo caso podrá tener un valor estadístico más o menos confiable. Lo que se puede determinar es la contribución o margen bruto, siempre que tengas el dato del costo del producto, para lo cual también tendrías que definir un método de inventario (FIFO, LIFO, etc) y un "Kardex" que te permita saber cuáles son los vendidos y su costo de adquisición. De lo contrario, tendrás que resignarte a trabajar "a lo bruto", tal como se acostumbra en Argentina, donde siempre se toma el último valor de costo conocido.
De todos modos, lo que no me parece (según la rutina anterior) es que pueda ser un monto fijo, porque eso excluiría el descuento. O sea, el margen bruto debería determinarse sobre Precio Neto - Costo Neto.