He estado mirando el código para hacerme una idea de los cambios que has realizado y deducir que intentas hacer.
Lo que veo, es que has clonado los formularios: Facturación (ahora pasan a llamarse FacturacionCompra y FacturacionVenta), el de compra y el carrito.
Según parece quieres que además de ofrecer una ventana para la facturación de las ventas de los productos, otro igual para la compra de los productos que luego se han de vender.
Para esto has creado sendos duplicados de la ventana de compras y el carrito... bien.
Sin embargo para que esto funciones bien, el almacén o bien debe modificarse o bien debe crearse otro almacén. Y me dirás por qué?.
Por que el almacén retirene los productos en stock a la venta, pero los datos que se reflejan en él son básicamente de cara a la venta, por ejemplo el precio de venta y el IVA, o si está en oferta. No obstante ya dejé ibniciado en el mismo registro la posibilidad de consignar otros detalles, como un umbral de aviso para reponer (comprar) cuando las unidades se vayan quedando sin existencias. Sin embargo no incluye el precio que se pagó por ello al comprarlo, ni si se aplicaron descuentos al comprar tal o cual producto.
Si creas un duplicado del almacén, esto es no tocas nada del actual, tendrías que crear otro registro para la compra de los artículos que iría asociado al formulario FacturacionCompras, que usaría la ventana compraStock (actualmente compras1) y al carritoStock (actualmente carrito1). Lógicamente los campos de los registros usados para ese almacén, deberán constar en el de facturación, compra y carrito propios.
Otra opción es que el almacén actual integre todos los campos precisos... el almacén actual, facturacionVentas, compra y carrito, no necesitan ser tocados básicamente, aunque hay que ver como afecta en lagunos casos (al leer registros puesto que el tamaño del registro cambiará).
Lo ideal es que los campos adicionales vayan al final de los campos actuales... debes decidir que campos serían esos, por ejemplo actualmente este es el registro del almacén:
Public Type RegArticulosAlmacen ' 52 bytes por registro de artículo en el almacén.
IdArticulo As Integer ' 01 Identificador único autoincremental del artículo en el almacén.
Reservado1 As Integer ' 03 (Reservado: Por si se debe cambiar el Id a tipo long, sin alterar los ficheros).
IdOferta As Integer ' 05 Identificador d ela oferta. Cada artículo SOLO puede tener asociada UNA oferta (el precio aquí no se toca).
Reservado2 As Integer ' 07 (Reservado: Por si se debe cambiar el Id a tipo long, sin alterar los ficheros).
ItemsEnStock As Integer ' 09 Cantidad del artículo actualmente en stock en el almacén.
UnidadesPorCaja As Integer ' 11 Cantidades que trae cada caja (cuando no precede se debe poner 1).
UmbralRelativoAvisoReponer As Integer ' 13 Alcanzada esta cantidad (porcentaje) o menos, se debe enviar un aviso al departamento de compras.
UmbralAbsolutoAvisoReponer As Integer ' 15 Cantidad mínima (absoluta) que alcanzada da aviso...
Reservado3 As Long ' 17 Para futurible ampliación 8 bytes disponibles (una vez ocupados añadir más campos supondrá modificar el fichero).
Reservado4 As Long ' 21 " " "
ImpuestoIVA As Single ' 25 Porcentaje del precio unitario que supone el impuesto.
PrecioUnitario As Single ' 29 Precio actual del artículo (sin descuentos, lleva el valor del impuesto incluído).
Nombre As String * FIXED_CHARS_ARTICULO ' 33
End Type
Ahora se podrían añadir al menos 3 campos (al final se ven)... tú debes valorar si se requiere alguno más.
Public Type RegArticulosAlmacen ' 64 (52+12) bytes por registro de artículo en el almacén.
IdArticulo As Integer ' 01 Identificador único autoincremental del artículo en el almacén.
Reservado1 As Integer ' 03 (Reservado: Por si se debe cambiar el Id a tipo long, sin alterar los ficheros).
IdOferta As Integer ' 05 Identificador d ela oferta. Cada artículo SOLO puede tener asociada UNA oferta (el precio aquí no se toca).
Reservado2 As Integer ' 07 (Reservado: Por si se debe cambiar el Id a tipo long, sin alterar los ficheros).
ItemsEnStock As Integer ' 09 Cantidad del artículo actualmente en stock en el almacén.
UnidadesPorCaja As Integer ' 11 Cantidades que trae cada caja (cuando no precede se debe poner 1).
UmbralRelativoAvisoReponer As Integer ' 13 Alcanzada esta cantidad (porcentaje) o menos, se debe enviar un aviso al departamento de compras.
UmbralAbsolutoAvisoReponer As Integer ' 15 Cantidad mínima (absoluta) que alcanzada da aviso...
Reservado3 As Long ' 17 Para futurible ampliación 8 bytes disponibles (una vez ocupados añadir más campos supondrá modificar el fichero).
Reservado4 As Long ' 21 " " "
ImpuestoIVA As Single ' 25 Porcentaje del precio unitario que supone el impuesto.
PrecioUnitario As Single ' 29 Precio actual del artículo (sin descuentos, lleva el valor del impuesto incluído).
Nombre As String * FIXED_CHARS_ARTICULO ' 33
'--- campos nuevos para la compra ---
PrecioCompra As Single ' 53 Precio unitario que costó su compra.
ImpuestoIVACompra As Single ' 57 Porcentaje del precio unitario que supone el impuesto al comprarlo.
DescuentoCompra As Single ' 61 Cantidad descontada por las sumas de cualquier conceptos.
End Type ' 65 (64 bytes por registro)
De igual modo cuando leas este registro para la ventana FacturacionCompra, hay que crear una función que tome del registro solo los campos deseados.... a imitación de la función 'RegArticuloToString'.
Esta función (RegArticuloToString), ahora procedería llamarse 'RegArticuloVentaToString'. Ésta función tal cual está ahora no precisa cambios para la ventana de de FacturacionVentas.
Claro que cuando se realice una compra, no solo se debe actualizar un nuevo fichero 'FacturacionCompra', también se debe actualizar convenientemente el almacén.
Si el artículo no existe se crea un id nuevo para él, si ya existe hay varias consideraciones a tener en cuenta:
1 - La cantidad en stock se incrementa en la cantidad comprada (es decir se suma al valor de itemsEnStock).
2 - Si el precio de compra es ahora distinto del precio de compra de la vez anterior, tal vez sea preciso actuaizar también el precio de venta unitario.
3 - Algo similar con el porcentaje de impuesto si cambia...
4,5,6... etc...
Claro que en los casos 2 y 3, puede optarse por crear un artículo nuevo con nuevo precio y nuevo valor del impuesto (respectivamente según el caso), y seguir manteniendo el artículo previo hasta fin de existencias, con su precio e impuesto acorde al que tenían cuando se compró.
Esas son decisiones que se deben tomar conforme al cliente o a las leyes existentes en el país, si son de obligado cumplimiento.
Nota, que cuando se compran artículos, se puede mantener el mismo fichero de facturación (para compras y ventas) a condición de que el valor de costo se ponga en negativo. Así cuando se revisa la facturación puede cargarse en una sola ventana de facturación o puedes tenerlo dividido en 2, FacturacionCompra y FacturacionVenta, en este caso al leer un registro se comprueba si su valor es mayor o menos que 0...
En la ventana de FacturacionVentas irán todos los registros cuyo valor es mayor de 0 (se vendió, se embolsa dinero), y en la ventana de FacturacionCompras irán todos los registros cuyo valor es menor que 0 (se compró, aflojamos el bolsillo)...
Yo usaría una sola ventana de facturación y un solo fichero de facturación. Pero si quieres mantener dos formularios por separado, quizás interesare también mantener asociado a cada formulario su propio fichero de facturación. Sea lo que sea lo que decidas, tienes que ser coherente y ver como afecta al resto de formularios, para actualizarlos según convenga.
Por último puesto que cambia el registro del almacén, también habrá que editar el formulario 'FrmEditarArticulo', para que recoja los nuevos campos que se añadan en el mismo (yo he propuesto 3 campos, quizás quieras modificarlos, eliminar o añadir alguno más).
Y creo que he resuelto las dudas que puedas tener...
Un error que si me ha parecido ver, es que has declarado en una de esas ventanas clones los canales de ficheros privados a la función que abre el fichero... eso es un error, porque fuera de esa función (salvo que se devuelva por referencia el canal), no habrá modo de acceder a él después de abierto... Esa puede ser la razón por la que tienes algún problema de los que describes.
Las variables que mantienen el número de canal abierto con los ficheros, deben ser públicos en un módulo si más de una ventana tiene necesidad de usarlos. Si solo usas x ficheros en un formulario, entonces basta que dichos canales estén declarados privados en ese formulario, así estarán disponibe para las diferentes funciones que lo usen.
Todavía si lo usa un formulario masivamente y en una o dos más solo una función, puedes declararlo privado en ese formulario y pasarlo como parámetro a las funciones de los otros formularios que lo precisaren...
Si hubieras creado clases (que es lo que debieras haber hecho transformando el proyecto), habrías podido organizar mejor la privacidad (encapsuación), para los ficheros. Creando una clase para manejar los ficheros, y que cada ventana que lo precise creara una instancia de ella (la clase clsFile)... Pero como no parece que vayas a hacer nada de todo esto, olvídalo.