elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Como proteger una cartera - billetera de Bitcoin


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP)
| | | |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo)
| | | | |-+  Guardar list2 y leer list1
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 2 3 [4] 5 6 Ir Abajo Respuesta Imprimir
Autor Tema: Guardar list2 y leer list1  (Leído 18,039 veces)
corlo

Desconectado Desconectado

Mensajes: 119


Ver Perfil
Re: Guardar list2 y leer list1
« Respuesta #30 en: 27 Febrero 2022, 22:17 pm »

Hola serapis
como estas
perdona que sea tan pesado

necesito la aplicacion

gracias


En línea

Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.391


Ver Perfil
Re: Guardar list2 y leer list1
« Respuesta #31 en: 28 Febrero 2022, 03:07 am »

Este fin de semana saque el tiempo justo para casi terminarlo.

A ver si entre mañana y pasado (lunes y martes) logro sacar 1-2 horas de tiempo para modificar la vieja ventana de compra de artículos... (integrar lo nuevo con lo viejo) y poder probar esa parte. Es todo lo que queda.

Así se ven, las ventanas de edición de ofertas y de artículos:



En línea

corlo

Desconectado Desconectado

Mensajes: 119


Ver Perfil
Re: Guardar list2 y leer list1
« Respuesta #32 en: 3 Marzo 2022, 19:44 pm »

Hola Serapis

has podido acabar con la aplicacion

gracias
En línea

Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.391


Ver Perfil
Re: Guardar list2 y leer list1
« Respuesta #33 en: 4 Marzo 2022, 01:14 am »

Sí, ya está terminado.

...pero he tenido que cambiar además todo lo previo, así que falta probarlo por encima al menos y corregir los pequeños errores que pueda haber. Cuando mezclas algo nuevo con algo previo, suele haber pequeños desajustes (sobre todo si son muchos cambios como es el caso) por cosas cuyos detalles no recuerdas con precisión... y que ahí acaban emergiendo.

Si tengo un rato mañana despues de comer y otro poco por la tarde, estará funcionando.
En línea

Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.391


Ver Perfil
Re: Guardar list2 y leer list1
« Respuesta #34 en: 6 Marzo 2022, 01:36 am »

Hola Corlo... lo terminé de probar el sábado por la mañana, pero he estaod todo el día fuera de casa...

Aquí la descarga, por si lo quieres ir probando:
https://workupload.com/file/9rRxdbcR2wv 76Kb. aprox. comprimido (incluye los ficheros  de ejemplo).

Mañana me edito y pongo algunas explicaciones con capturas, hoy ya es tarde por aquí.



Te explico por encima...
Al abrir la aplicación, ahora una ventana hace de la principal, desde ella se accede a las principales características de la aplicación. También muestra un resumen de las ofertas activas a modo de recordatorio.
Se puede aprovechar para poner un logo y personalizarlo más.

El menú muestra las 4 principales ventanas a las que acceder: cuando se pulsa se abre la ventana correcpondiente.


La aplicación funcionará correctamente cuando se introduzcan artículo al almacén.
La siguiente imagen muestra el listado de los artículos en el almacén.



La columna 'stock', lleva la cuenta de la cantidad que queda de dicho artículo en el almacén, cuandos e compra, el stock se reduce en la cantidad comprada.
A la cantidad inicial que se establece como stock se le señala un porcentaje (columna umbral), tal que cuando en stock queda igual o menos de esa cantidad (columna pedido) ,  debería avisarse al departamento de compra-fabricación, para reponer el stock del almacén.

El menú precios tiene esa posibilidad que pedías de aumentar/reducir el precio a todos los artículos en una cantidad fija o porcentaje, pero a todos el mismo.

Desde el prpio menú, puede indicarse si se aplicará a todos o solo a los seleccionados.

Desde el menú 'Artículos' del almacén, puede crearse nuevo artículo o editar uno existente (clonar es crear uno nuevo partiendo de los datos del que actualmente tiene el foco).
También puede borrarse un artículo, pero esto solo debeiera usarse es circunstancias remotas, incluso introduciendo un artículo erróneo, puede luego ser editado, por lo que técnicamente no habría necesidad de eliminar ninguno.
Un modo de deshabilitar un artículo, por cualquier razón es poner su stock a 0, no aparecerá en los listados de compra noi oferta.
El almacén cuenta con un 'artículo vacío', que es el primero que se mostrará, para indicar al usuario que debe elegir uno de la lista.

Esta es la ventana de edición de los artículos:

En ella se establece el nombre del artículo, el precio de venta al público, el porcentaje de impuestos aplicados (se desglosa a la derecha), la cantidad en stock en el almacén y el porcentaje del mismo para su aviso (esto solo se establece cuando se crea el artículo pero también puede modificarse pulsando el checkbox), a su derecha señala la cantidad exacta mínima que una vez alcanzada o menor, debería dar aviso para el departamento de adquisiciones (compra, fabricación), también el valor en unidades, en el ejemplo siendo agua de 5 litros 5.000 cl, si es un paquete de yogures, 6, 8, si son huevos 6,12, etc... es decir la cantidad que trae lo que se compra.
Finalmente hay un aviso para señalas si el artículo está actualmente en oferta.

La sección de la derecha, no aparece cuando se crea un 'nuevo' artículo, solo al editar-clonar, por si se prefiere modificar ciertos precios en una cantidad igual a varios artículos, así se evitar la necesidad de calcular e introducir a mano el valor concreto.
Cuando se pulsa uno de los botones verde, se valida y cierra la ventana, tras lo que cual se reflejará en el lstado del almacén y en fichero.

La edición no debería utilizarse para cambiar el nombre del artículo, salvo un error tipográfico (es decir que refiera siempre al mismo artículo), de lo contrario al leer la facturación la próxima vez para el artículo con dicho código, reflejará el nuevo nombre que podría ser distinto a lo originalmente comprado. En cambio si puede modificarse el precio y descuentos, pués ambos valores son guardados a fichero cuando se compra, en tanto que para el artículo, en vez de guardar su nombre (20 caracteres), se guarda el código del artículo (2 bytes), que se rescata al leer la factura de compra.

Así se ve la ventana cuando se elige crear un nuevo artículo:


La siguiente ventana es para las 'promociones'.
Facilita crear ofertas. Establece una fecha y una duración vinculada a un nombre. Así cuando haya que crear ofertas para determinados artículos, bastará elegir la misma promoción para ellos, lo que ahorra por un lado escribir más dats y sobretodo elimina la posibilidad de errores, al poner fecha y/o duración de la oferta.


Nótese que estas se crean automáticamente al iniciar la aplicación (si no existe el fichero 'promociones...'), pero pueden ser editadas (para mantener la fecha y duración deseadas), así como poner el nombre que se considere más acorde, también pueden añadirse más promociones, que será la siguiente ventana a mostrar.

Aquí la ventana para crear una nueva promoción. No requiere más comentarios.


Aquí la ventana cuando se trata de editar la promoción. Como se ve, tampoco requiere más comentarios:


Esta, es la ventana del listado de ofertas. Como se ve, hay dos listados:
- El de ofertas activas (arriba)
- El de foertas inactivas (abajo)



Cuando se crean ofertas nuevas, van al listado de abajo (inactivas), igualmente para editar una oferta debe estar desactivada.
Las ofertas se activan o desactivan seleccionado en el listado las deseadas y yendo al menú elegir 'activar/desactivar', cada opción solo está activa en función del listado que se trate.

El objetivo de tener dos listados, es que no haya que crear nuevas ofertas ...cada vez... si no reutilizar las existentes, ya que lo que cambiará básicamente será la fecha, quizás la duración o tipos de ofertas.

Se ha diseñado 5 tipos de ofertas (aparte la inactiva), que cubre la mayoría de posibilidades. No obstante esto se explica mejor en la ventana de edición de las ofertas.
Algo importante es que no pueden activarse cualquier tipo de oferta, algunas son incompatibles con otras, las compatibles entre sí son los tipos 1,2 y 4, luego la 3 es aparte y  la 5 también aparte, es decir enel listado activo de ofertas solo puede haber ofertas compatibles... el programa se encarga de hacer la revisión y señalar el caso si no es posible.

Esta e sla ventana para crear nuevas ofertas (hay dos capturas, para mostrar el listado de combos, falta un tercero, que deja la imagen demasiado ancha y que se mostrará luego):


Cada oferta se vincula a un artículo, como se ve en el combo a la derecha, debe elegirse un artículo de la lista deesplegable. La lista solo contendrá aquellos artículos cuyo stock no esté a 0.
Además cada oferta se vincula con un tipo de oferta... se han creado por defecto 5 (como son pocas y no hay posibilidad de que ese número aumente notablemente, no requiere fichero se cargan con la ventana por código).
Los tipos explicados someramente son:
0 - Inactiva: La oferta no está activa. Es lo nromal para ofertas que por ejemplo estén destinada a Navidad...
1 - Porcentural: Al artículo elegido se el aplica un porcentaje de descuento (que se indica).
2 - Sin impuestos: Como el anterior, pero el procentaje aplicado es exactamente el valor que tiene el artículo aplicado en impuestos.
3 - Sorteo: Esto no se aplica al artículo en sí, si no a toda la compra. Indica que al vencer las ofertas, se realizará un sorteo entre los que hayan comprado durante la vigencia de la oferta, 1 o más premiados se les devolverá íntegramente el valor de su compra. Se supone que podría haber una cantidad máxima, por ejemplo 500euros, si alguien hizo una compra por valor de 800 euros, solo se le devolverán 500, si el afortunado hizo una compra por valor de 63'87 euros esa es la cantidad que se le devuelve. La resolución de este tipo de oferta, no está implementada, ya que la forma de realizar el sorteo así como quienes participan y otros detalles, son demasiado amplios como para aventurar una solución que al final se vayaa descartar por completo.
4 - Gradual: El descuento aplicado es el típico '3x2', es decir esos donde dicen 'por cada x artículos que compres te regalamos 1', en el ejemplo compras 3 y pgas solo dos, ergo... e descuento es del 33'33%, lógicamente si uno compra 4, el descuento aplica a 3 de ellos luego paga 3, (el 4 no forma parte de ese descuento, precisaría comprar 6, para aplicar nuevamente ese desceunto).
5 - Abosluto: Este descuento, es por el total de la compra. Por ejemplo si se señala un valor de 50 euros, y se pone un descuento del 10%, aquellas compras cuyo valor total iguale o supere 50 euros se el aplica un 10% al total de la compra. Si compra vale menos de 50 euros, nos e aplica descuentos.

En la siguiente ventana termino de explicar el resto de la misma, pués se refiere a la edición de un registor de oferta ya creado (o clonado).


La edición de ofertas, como se ha dicho antes, solo se puede hacer desde el listaod de ofertas inactivas (ofertas que no están en vigor), para evitar trastocar ofertas que estén activas con las consecuencias de 'clientes finales con quejas'. Aún así si fuera preciso  por detectarse un error, puede desactivarse, editarse y volverse a activar.

Según el tipo de oferta elegido, el porcentaje así como el valor pueden estar o no activos.
En esta última ventana se puede ver desplegado el listado de la spromociones, la oferta se vincula con una promoción (el nombre), facilita elegir la asociación para más artículos de una fecha y duración. Ambos datos pueden ser cambiados individualmente para cada oferta, pero si no es deseable puede ser modificado para que muestren su valor como solo lectura. Recuerda que las promociones pueden modificarse desde la ventana del listado de promociones.

Cuando se elige desde el combo, el artículo, se rescata del alamcén sus valores y se señala su precio.
A la derecha d ela oferta, se mantiene el valor de la oferta previa que tenía esta oferta (el tipo de oferta al estar en el listado de inactivas, permanece siempre a 0, por tanto el valor elegido se mantiene en un campo que es copia, como si fuera temporal, cuando la oferta se activa, el tipo de oferta toma el valor que se retiene en este campo de copia.

Por su parte activar o desactivar una oferta, se refleja en el alamcén que mantiene un campo que lo vincula a una oferta. Solo puede ahber una oferta activa por cada artículo, pero puede haber diferentes ofertas inactivas para un mismo artículo siempre y cuando tengan distinta promoción (por ejemplo el vino puede estar en oferta inactiva para una promoción de Navidad y tener otra oferta inactiva para una oferta de verano y tener una oferta activa para la promoción de Semana Santa, en cambio no tiene sentido que ese vino (el artículo), tenga 2 ofertas activas distintas para 'Semana Santa'... el programa también se encarga de hacer tal revisión antes de activarlas...

En la imagen del almacén, puede verse a la derecha del todo que hay 3 artículos con ofertas activas.

Básicamente eso es todo lo nuevo en la aplicación, ahora los cambos a lo que había previamente (pues ha afectado a todo, ha sido finalmente necesario modificar absolutamente todo).

Esta que antes era la ventana principal ahora tiene el nombre de facturación:


En un principio la aplicación suponía ser un ejemplo para ir aprendiendo, luego una aplicación real para mantener la propia compra de uno mismo, por lo que no hacía falta un almacén dada la inabarcable variedad de artículos que uno puede comprar, (libros, CDs, ordenador, teléfono, tablet, gasolina, manzanas, tabaco, etc...), luego en esa suposición lo pertienente era introducir manualmente el nombre del artículo comprado y el precio pagado y no mucho más... al final parece ser la aplicación real para una pequeña tienda de tipo familiar, puesto que ahora hay necesidad de hacer ofertas y tal, se hizo preciso un almacén que detalle cada artículo a la venta en sus valores esenciales (como tal, para mi sigue siendo un ejemplo del que puedas aprender).

Como se ve en la imagen, ahora la ventana de facturación se compone de dos listados... en el superior se muestran las compras únicas, y debajo se detallan los artículos asociados a una compra dada.

Cuando se pulsa en una compra (listado superior), se rescatan los registros de artículos asociados al lote de la compra. Ahora sí, cada compra mantiene el total de la compra, así como el descuento aplicaod a la compra (siempre 0, salvo esos casos de ofertas de tipo 'absoluto' (descuento al total de la compra si superan cierto volumen).

En la última compra se ha puesto exprofeso un ejemplo de ese caso, el valor debia ser superior a 50 euros para aplicar un descuento dle 10%.
A la derecha dle listado, la suma d elos totales de lo facturado.

Por suparte el listado inferior, como se ha indicado desglosa los artículos comprados en ese lote (ticket de compra).

El carrito de la compra, no tiene cambios sustanciales en la interfaz, pero sí internamente, el listado es básicamente lo mismo que el listado inferior, excepto los dos campos de códigos de la izquierda:


Como se ve, el cambio más importante (aunque aquí se muestre vacío), es el campo 'descuento' que que se actualiza (si procede) con cada artículo añadido al carrito.
El mayor cambio en esta ventana (así reseñable), en que justo antes de pagar, se vuelve de nuevo a revisar si el artículo tiene stock suficiente en el almacén para comprarlo en las cantidad requeridas... algo necesario, dado que el carrito d ela compra puede estar bastante tiempo abierto... y alguien podría haber comprado las existencias restantes. En tal caso avisa antes de proceder al pago, permite eliminar ese artículo o anular toda la compra...

Cuando se realiza el pedido (se ha validado que existen en stock las cantidades que se quierne comprar),  se reduce el stock en el almacén en tales cantidades... Se ha añadido a proposito el último artículo con poca cantidad en stock, para probar que cuando se quiera comprar más d elo que hay en stock, avisa y que si llega a 0, ya no se liste (cuando esto ocurre fuerza a recargar los listados que mantienen los artículos). Estas partes no han sido probadas, creo recordar...

El carrito de la compra, se abre tanto desde la ventana de facturación como desde la misma ventana de compra, que se presenta a continuación:


Esa es la ventana de compra, como se ve, la principal diferencia respecto de la previa es que ahora el artículo no se introduce manualmente, si no que es elegible entre el listado de artículos con existencias en el almacén. Y como ya en el alamcén se reflejan sus valore,s ahí simplemente se hace constar sus valores (previo, impuestos aplicados, etc..., tampoco hubiera sobrado indicar el remanente en stock, así sabe si está tratando de comprar mas de lo que puede venderse).

Desde luego la lista se carga con todos los artículos cuya existencia  sea superior a 1, ignorando los artículo cuyo stock sea 0.

Básicamente aunque la interfaz se ha simplificado al extremo (solo hay que elegir el artículo y la cantidad a comprar), el código ha requerido un cambio profundo.

Cuando se pulsa el botón añadir al carrito, verifica si la cantidad existe en stock, si no es el caso avisa para poder cambiar la cantidad... como ya dije esta comprobación se realiza de nuevo cuando se acepta pagar el lote desde el carrito de la compra.

La úlitma venta (la de elegir un fichero de facturación para abrir), a pesar de que solo tiene unas decenas de líneas también tuvo que ser ligeramente modificada, pués antes el programa solo mantenía un unico fichero (el de facturación.dat) y si procedía el caso el de 'carrito.'dat (si se cerraba la aplicación con un carrito sin procesar (comprar)), ahora el de facturación se ha desglosado en dos ficheros, el de los lotes comprados y de cada artículo comprado que se asocian con el lote comprado...
El almacén, ofertas y promociones tambié se mantienen en sus propio ficheros, al final son 6 (más el del carrito que es creado y eliminado, es decir es transitorio), entonces excepto de lote cuya extensión es *.dat', para los demás se ha elegido como extensión 'regdata', así esa ventana de selección del fichero de facturación no tiene posibilidad de elegir un fichero que no contiene los registros esperados y por tanto también evita malograrlos, toda vez que no se realiza ninguna comprbación sobre los ficheros mas que abrir el fichero de nombre elegido.


Sobre los ficheros hay que decir además, que los ficheros son creados y existe una única copia de ellos, excepto para el de facturación (que se crean 2 por cada facturación creada).

Una pequeña tienda familiar o de barrio, suele tener a lo smo unos pocos cientos de artículos a la venta, así una aplicación como esta puede ser perfectamente suficiente, aunque no sea óptima (se ha diseñado e implementado con el objetivo en mente de aprender a solucionar casos típicos), para eficiencia, como mínimo deberían usarse clases y tirar de colecciones basadas en hash, al final hay muchas búsquedas que pueden requerir un recorrido secuencial, que para unos pocos cientos es casi inmediato, peor  que basada en hashes, permitiria multplicar el tamaño de las colecciones por 1000 y ser aún 10-100 veces más rápido aún que esta solución.

La implementación con colecciones basada en hashes requiere conocimientos sólidos de programación y del lenguej usado, si no es el caso, entonces lo preferible es tirar de nases de datos que ya implementan tales colecciones por uno mismo... en ese caso se reqiere un conocimieto más o menos sólido de la base de datos usar... para VB6, las bases de datos Access, son bastante asequibles y su rendimeito adecuado, para algo más profesional recomiendo SQL-Server, Oracle, etc... Estas bases de datos son mucho más complejas y exigen más conocimientos del programador, aunque para aplicaciones de pequeñas empresas, no se requiere tanto.

La ventaja de una aplicación diseñada al 100% con código propio, es que es independiente de cambios a posteirori de versioes que con el tiempo arroja incompatibilidades, la otra ventaja es que contrlas al 100%, lo que quieres hacer, según lo que necesites sin apenas restricciones, si bien VB6, no arroja la adecuada capacidad de creación de tipos como por ejemplo oferce ADA o incluso Pascal... se podrá ver en el código como para poder operar con valores con 2-3 decimales hay que hacer 'tontarías' que con un acertado posiblidades de tipos, sería inecesario.

La otra gran desventaja de escribir todo el código es que es más lento al tener que escribir todo en vez de delgar en librerías quye ya hacen tal o cual cosa.
Por ejemplo, podría delegarse los textbox numéricos en controles de usuario diseñados específicamente para tener cierta funconalidad integrada (por ejemplo, porcentajes, donde muestran 3 textbox, el del valor sin el porcentaje, el del porcentaje y el dle valor una vez aplicado el procentaje y que modificando uno solo de ellos, los otros dos se actualicen en base a ello, u otro contro de usuario para mantener justo esa cantidad de dimales que uno quiere sin estar cada vez haciendoese parsing estúpido... o incluso un control con un calendario para elegir la fecha de las promociones y ofertas, forzando así a que las fechas sean siempre a presente o futuro, en vez de tirar de un simple 'now' o un textbox, donde existe la posibilidad de meter una fecha errónea, ahora bien aunque VB dispone de control de calendario, exige entonces instalar tal librería si el cliente no la tiene, la propia librería es de más tamaño que la propia aplicación... tengo por ahí algún control de usuario que es un calendario, pero igualmente es añadir 70kb. y si tuviera que quitarle funcionalidad para hacerlo más simple y ligero, llevaría bastante tiempo asegurarse que lo eliminado no trastoca la funcionalidad residente. ...igualmente por lo mismo abordar otros controles, no procede dado el tiempo disponible y las prisas que pueda tene rel cliente.

En cualquier caso, tienes ahí lo suficiente para modificar a tus necesidades y crear nueva funcionalidad basada en las soluciones dadas... por ejemplo, imagina que te solicitan que crees categorías de artículos y ahora todas las que son de la categoría de bebidas alcohólicas see les aplique un descuento del 10%, en vez de aplicar ofertas artículo por artículo...

...aunque por experiencia ya te digo que si ofreces la capacidad de hacer ofertas por categorías,  siempre habrá artículos que no quieran incluir (a pesar de estar en la categoría) y artículos que sin ser de esa categoría quieran incluir... ...lo que al final supone ser la capacidad para que cada artículo pueda tener su propia oferta (es la solución al aque finalmente 'por tanteo', con nuevas exisgencias se llega, pero sin dejarlo jamás así de claro descrito).

Así las categorías, podían ser simplemente colección de códigos de artículos, es decir un registro con un nombre de categoría al que se asocian x artículos (x códigos de artículos)... asociar un artículo a  una categoría implicaría eliminarlo de la previa, y en el almacén debería aparecer un codigo de categoría (en los registros se han previsto y dejado campos reservados para permitir cierta flexibilidad de ampliación sin cambiar los propios ficheros). La funcionalidad prevista para las categorías sería pues:
- Añadir-editar-clonar categoría
- Añadir artículos (existentes en el almacén), a dicha cetegoría (exige quitarlo d ela categoría previa si estuieran en otra que no fuera 0 (0=sin categoría definida).
- Ofertar los artículos enla categoría 'x'.
...etc...

Por último, como esto ya pasa de ser un mero ejemplo e incluso de un proyecto personal, cualquier cosa que requieras a futuro, irá solo en explicaciones, le habré dedicado unos 30 o 40 minutos de la mitad de estos días, lo que pueden ser unas 8-10 horas, que es más tiempo del que uno quiere ofrecer como ayuda, aunque 30 ó 40 minutos al día no sea mucho, es más de lo que uno espera cuando requiere varios días...

Saludos.
« Última modificación: 6 Marzo 2022, 18:43 pm por Serapis » En línea

corlo

Desconectado Desconectado

Mensajes: 119


Ver Perfil
Re: Guardar list2 y leer list1
« Respuesta #35 en: 6 Marzo 2022, 20:03 pm »

Hola Serapis

ante todo muchisimas gracias ya lo he mirado por encima en principio funciona bien ya mirare con mas calma los detalles, es genial, para una aplicacion pequeña ya es suficiente no hace falta trabajar con bases de datos, con bases de datos el codigo de programacion es bastante diferente al de los archivos directos secuenciales. y a veces hay fallos de conectar con la base de datos cuando cambias de carpeta y la ruta ya no es la misma. Tiene que canbiar la ruta de la base otra vez, en cambio en los archivos directos secuenciales no pasa.

muchisinas gracias Serapis
En línea

corlo

Desconectado Desconectado

Mensajes: 119


Ver Perfil
Re: Guardar list2 y leer list1
« Respuesta #36 en: 10 Marzo 2022, 19:05 pm »

Hola Serapis

la aplicacion va muy bien solamente faltaria una cosa
en el formulario de facturacion poner una opcion de Guardar Factura con numero de facturacion y la opcion de leer con numero de factura

muchas gracias
En línea

Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.391


Ver Perfil
Re: Guardar list2 y leer list1
« Respuesta #37 en: 11 Marzo 2022, 22:09 pm »

faltaria una cosa en el formulario de facturacion poner una opcion de Guardar Factura con numero de facturacion y la opcion de leer con numero de factura
No entiendo...

1 - Las facturas se pueden ver en el listado superior.
2 - El número de factura aparece en la columna 'Lote' (campo IdPedido de la estructura 'RegLote').
3 - Como las facturas una vez creadas, ni se modifican ni se eliminan, en el listado superior aparecen ordenadas por número de facturación (campo IdPedido de la estructura)-.
4 - Estando ordenadas por dicho valor, es relativamente fácil localizarla en la lista, seleccionarla y acto seguido se leen los artículos comprados con esa factura y en el listado de abajo se detalla.

Tomando la imagen de más arriba y pegándola de nuevo aquí, puedes ver que el número de factura es el 2. se compraron 7 artículos  en ese lote, que s elistan debajo que admeás tienen su propio número de compra (que no de factura), que van del 5 al 11 (columna compra, campo IdCompra de la estructura 'RegCarrito')...



Quizás te refieras a otra cosa y por ello no termine de entenderte.


p.d.: El id de facturación aunque empieza en 1, pero es fácil de modificar...

Para ello, cuando se crea la nueva facturación, si es preciso puedes solicitar el número de facturación inicial, con un imputbox (lo mismo que se solicita el nombre del fichero), adjunto una imagen con el escaso código a añadir... en el ejemplo se supone que la primera factura en el fichero ha de tener el número 133 (en el código se resta 1, porque cuando se hace la compra se suma uno antes de guardarla a fichero).
He emarcado con un punto de pausa en las líneas nuevas o modificadas (al margen de la declaración de la variable arriba y la declaración del parámetrod e la función abajo).


« Última modificación: 11 Marzo 2022, 22:39 pm por Serapis » En línea

corlo

Desconectado Desconectado

Mensajes: 119


Ver Perfil
Re: Guardar list2 y leer list1
« Respuesta #38 en: 11 Marzo 2022, 22:42 pm »

Hola serapis

El listado superior tendria que ir a una pestaña del sub menu por ejemplo listado de compras esto ya estaria bien

la cosa esta en quitar el listado superior

poner numero de factura en pantalla en un textbox numero consecutivo 1,2,3,4,5,6,etc

en conjunto con  el listado de abajo listprods

entraria el numero consecutivo  se guardaria en un boton guardar


y despues con otro boton para leer la factura 1,2,3,4,etc

entraria en el numero textbox y se veria todo el listado de abajo listprods para cada numero de factura

seria guardar y leer.


Gracias


En línea

Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.391


Ver Perfil
Re: Guardar list2 y leer list1
« Respuesta #39 en: 12 Marzo 2022, 16:43 pm »

No termino de entenderte del todo... te respondo tirando de intuición (a veces, un esquema, un croquis de lo que uno espera ayuda a aclarar las cosas).

El listado superior, puedes eliminarlo, o simplemente ocultarlo.
Si se elimina, esos totales  que tiempo atrás querías para diferenciar el volumen de compra con tarjeta de crédito y en efectivo, he de suponer que se sigue requiriendo, luego la función que carga el listado superior (ListarFacturacion), debe seguir existiendo (quizás deba cambiar el nombre para reflejar su funcionalidad actual "TotalizarFacturacion") ...
Si tampoco necesitas esos textbox, la función casi entera se puede eliminar y entonces se debiera llamar "Inicializar", pués todavía debe abrir los ficheros y leer la cantidad de registros y el valor autonumericod e incremento y mostrar la primera compra.

Eliminando ese listado, y poniendo un textbox y un botón para leer una factura, es simple.

Ahora mismo para leer el contenido de una compra, se debe:
- Leerse el registro de compra (por su numero de factura). ahora mismo el número de factura (IdLote se toma del valor almacenado en intemdata(listindex), y se invoca desde el click del listado: "sub LisLotes_Click"
- Una vez leído el registro de compra, sabremos cuantos ítems se compraron, el índice donde localizarlos en el fichero y el valor total de la compra.
- Con el indice y la cantidad a leer (están consecutivos), se leen igual que antes (esta función no cambia nada).

Luego el código es fácilmente modificable, tu estarías remplazando el rescate del numero de factura que en vez de tomarse del itemdata del ítem activo en el listado, lo tomes desde un textbox y en vez de llamarse cuando se pulse en el listado, se llama cuando se pulse en un botón:

Este es el código actual para hacer la llamada que lista los productos de dicha compra:
Código
  1. ' Lee los productos comprados que forman dicho lote y los muestra en el listado de productos.
  2. Private Sub LisLotes_Click()
  3.    If (LisLotes.ListCount > 0) Then
  4.        Call PosicionarRegLote(LisLotes.ListIndex + 1)          ' allí se resta 1.
  5.        Get #CanalLote, , RegX
  6.        IdLote = RegX.IdPedido
  7.        Call ListarCompraDelLote(RegX.Index, RegX.Cantidad)
  8.    End If
  9. End Sub
  10.  

Así el código a cambiar es relativamente sencillo, podría ser algo como:
Código
  1. ' Lee los productos comprados que forman dicho lote y los muestra en el listado de productos.
  2. Private Sub ComBuscar_Click() ' <---- al pulsar el botón
  3.    dim id as integer
  4.  
  5.    if (NumRegsLotes>0) then '  If (LisLotes.ListCount > 0) Then   ' si hay registros en la facturación...
  6.        if (isnumeric(txtNumeroFactura.text)) then    ' si el textbox tiene un número válido
  7.            id = cint(txtNumeorFactura.text)               ' el textbox es quien indica ahora el numero de factura
  8.            if (id <= NumRegsLotes) then
  9.                Call PosicionarRegLote(id +1)  ' Call PosicionarRegLote(LisLotes.ListIndex + 1)          ' allí se resta 1.
  10.                Get #CanalLote, , RegX
  11.                IdLote = RegX.IdPedido
  12.                Call ListarCompraDelLote(RegX.Index, RegX.Cantidad)
  13.                txtFactura.Text = RegCompraToString(Reg)
  14.                exit sub
  15.            end if
  16.        end if
  17.    End If
  18.  
  19.    ' Si el botón está siempre activado... lo ideal es que esté activo solo si el número de factura es válido.  
  20.    txtFactura.Text = ""
  21.    call msgbox ("Número de factura no reconocido. Debe haber facturas y el número de factura ser mayor que 0 y menor que el número de registros actuales")
  22. End Sub
  23.  

...y en el código pocos cambios más necesitas hacer, salvo comentar o eliminar las líneas que cargan dicho listado (el total se supone que todavía querrás hacerlo):
Código
  1. Private Function ListarFacturacion(ByRef Ruta1 As String, ByRef Ruta2 As String) As Boolean
  2.    '...
  3.    ' Remplazar/eliminar las líneas aqui comentadas:
  4.    If (NumRegsLotes > 0) Then
  5.            'With LisLotes
  6.             '   .Clear
  7.  
  8.                Call PosicionarRegLote(1)       ' allí se resta 1
  9.                For k = 0 To NumRegsLotes - 1
  10.                    Get #CanalLote, , RegX
  11.             '       Call .AddItem(RegCompraToString(RegX))
  12.              '      .ItemData(k) = RegX.IdPedido
  13.  
  14.                    If (RegX.MetodoDePago = MetodosDePago.PAGO_AL_CONTADO) Then
  15.                        TotalContado = (TotalContado + RegX.Total)
  16.                    Else
  17.                        TotalCredito = (TotalCredito + RegX.Total)
  18.                    End If
  19.                Next
  20.  
  21.                Call ShowTotales
  22.  
  23.                ' <---- Ahora si se quiere puede leerse de nuevo el primer registro para transferirlo a los textbox...
  24.             '   .ListIndex = 0 ' para ello delegamos en el código que pondremos al listbox...
  25.            'End With
  26.  
  27.    ' Y añadir estas dos en esta posición:  <---- Ahora si se quiere puede leerse de nuevo el primer registro para transferirlo
  28.             txtNumeroFactura.Text = "1"
  29.             call ComBuscar_click
  30.        End If
  31.    '...
  32. end sub
  33.  

Igualmente cuando se añade un registro de compra, que antes se añadía al listado, ahora se pone en el textbox:
Código
  1. Friend Sub GuardarCompra(ByRef Reg As RegLote, ByVal Productos As Integer)
  2.  '...
  3.  ' Remplazar (o comentar) estas líneas:
  4.  ' With LisLotes
  5.  '      Call .AddItem(RegCompraToString(Reg))               ' También lo añade al listado.
  6.  '      .ItemData(.ListCount - 1) = AutoIncLote
  7.  '  End With
  8.  ' ...
  9.  '  LisLotes.ListIndex = (LisLotes.ListCount - 1)           ' Fuerza a listar los productos comprados en este lote.
  10.  
  11.  ' con estas:
  12.     txtNumeroFactura.Text = cstr(reg.IdPedido)
  13.     txtFactura.Text = RegCompraToString(Reg)
  14.     call ComBuscar_Click
  15. end sub
  16.  


La interfaz, por su parte tampoco requiere mucha complicación: Se añaden 2 textbox y un botón y se elimina el listado superior, y se reordena la interfaz reubicando los controles. Hago cambios a la imagen previa, para reflejar como cambiaría la interfaz:
Nota que el listado superior desaparece, ahora es remplazado por un textbox (txtFactura), debajo ... que muestra los valores de dicha factura (en la imagen 'la factura desglosada' no se corresponde con la 'rescatada', es un copy paste, la que le correspondía estaba seleccionada y el textbox debe tener la propiedad locked a true (no es editable solo muestra valores), así esa selección podría inducir a error de interpretación).

Puede verse que se añade un textbox (TxtNumeroFactura) y un botón (ComBuscar) para buscar... los otros controles (de totales) se han colocado a la derecha y debajo del listado (igualmente pueden retirarse en dejarse sobre el menú pues son solo informativos, como ese nuevo textbox.


Ese textbox de la compra a añadir (que remplaza al listbox, lo sigo viendo necesario, porque contiene información importante como fecha, coste total de la factura, descuento aplicado por volumen de compra (los registros de artículos comprados solo incluyen los desceuntos que afectan a ese artículo en particular), tipo de pago efectuado...

También, es absurdo que teniendo ahora ambos ficheros ordenadamente cada uno con sus registros, requerir ahora cada vez totalizar la suma de compra (la provee el propio registro de compra), además el registro de compra incluye aparte el decuento que se aplica de forma individual a cada artículo (si procede).

En definitiva, los cambios a realizar son simples, no hay nueva funcionalidad que se deba añadir, existe , son solo pequeñas modificaciones que debes hacer tú... repasa todo el código de la ventana, en busca de posibles referencias  al listado 'lisLote', por si aparece en más sitios y ver si basta con eliminar dichas líneas o si deben ser remplazadas por otras...
En línea

Páginas: 1 2 3 [4] 5 6 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Leer, Guardar, Cargar .INI
.NET (C#, VB.NET, ASP)
SγиtαxEяяoя 7 5,685 Último mensaje 26 Mayo 2013, 19:39 pm
por Eleкtro
problema leer y guardar datos..
Programación C/C++
adrian123321 2 2,692 Último mensaje 29 Agosto 2013, 08:57 am
por do-while
Leer fichero y guardar en variables
Programación C/C++
Joaqqinn 6 5,073 Último mensaje 13 Enero 2016, 23:43 pm
por Orubatosu
pasar informacion de list1 a list2
Programación Visual Basic
corlo 2 3,299 Último mensaje 27 Febrero 2019, 20:27 pm
por corlo
leer informacion a list1
Programación Visual Basic
corlo 2 458 Último mensaje 23 Agosto 2024, 22:06 pm
por corlo
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines