Bueno para todos aquellos que esten interesados en aprender y no en criticar algo que nisiquiera comprenden les voy a explicar como yo resolvi esto: tenemos una tabla cabecera de factura y otra detalles y otras relacionadas, uno no puede obtener el nro de comprobante en el momento de cargar un formulario y/o antes de apretar el boton grabar, porque digo esto pues si el usuario1 carga el formulario y obtiene el nro 10 y simultanemente el usuario2 obtendria el nro 11 (suponiendo que se autoincremente correctamente los nros) ¿y que pasa si el usuario1 no desea grabar su factura y el usuario2 si?, pues simple te saltaria la numeracion de la factura 9 saltaria al 11 (en el caso de que la numeracion sea automatica estarias ante un error de numeracion).
Como yo imprimo la factura en un comprobante contable este debe concidir con el nro preimpreso, por tanto yo lo hice asi
DFAC &&DETALLE DE FACTURA NO TIENE IMPORTANCIA PARA ESTA EXPLICACION
CFAC &&CABECERA DE FACTURA
NCOMPR CODCLI FECHA ... OTROS CAMPOS
000001 101030101001 30/12/2008
000002 101030101002 30/12/2008
....
000100 101030101025 30/12/2008
Yo obtengo el nro asi: bloqueando el fichero CFAC con FLOCK() y enviando el puntero al final GO BOTTOM entonces capturo el ultimo nro y lo sumo 1 en este caso es mediante _ncompr=STR( VAL(NCOMPR)+1, 6, 0 ) y este numero yo se que es seguro porque al hacer FLOCK ningun otro proceso y/o usuario puede modificar ni agregar registros a CFAC en cambio si lo hago con RLOCK() este no impide que se sigan agregando registros/numeros al final ya que este solo impide que escribas en el registro bloqueado, una vez obtenido el sgte nro posible lo muestro al usuario y pido su confirmacion este puede aceptar o cambiar por otro en el caso de que la hoja preimpresa fuera dañada y/o usado para otros menesteres dicho comprobante y/o haya hecho a mano la factura y deba ingresarlo luego (hay muchos casos de estos), si el usuario acepta se da de alta el registro con el nuevo nro y se libera el FLOCK, si el usuario cambio el nro obtenido por uno siguiente o anterior reviso la tabla para certificar que no existe el comprobante para no duplicarlo y lo grabo, en caso que exista ya el comprobante vuelvo a pedirle al usuario el nro de comprobante, recien alli cuando se haya grabado el segundo usuario puede tratar de obtener el sgte nro posible, funciona perfectamente.
Como referencia dejo sentado que solo un usuario y/o proceso puede bloquear una tabla con FLOCK de modo que esto asegura que en la grabacion simultanea de facturas no exista conflicto de nros de comprobantes.
Luego de obtener el nro de comprobante procedo a hacer los registros en la ficha de movimiento, grabado en detalle de factura, descuento de stock y registros de asientos contables entre otras actualizaciones.
y para el amigo malamigo que esta muy preocupado por los cortes de luz, ningun sistema esta exento de fallo sobre todo los que utilizan motor de base de datos en el servidor, peeeero los capos en electronica proveen algo llamado UPS que esta al alcance de cualquier micro empresa ya sea para el servidor, switcher y las terminales, si no te gusta esa solucion pues informate sobre campos en la cabecera de las DBF'S para aprender como repararla, yo te cuento hace tiempo estoy en esto y a lo sumo se dañan los CDX pero poquisimas veces y generalmente cuando tienen problemas en superficie del disco