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

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


  Mostrar Mensajes
Páginas: 1 ... 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 [38] 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 ... 430
371  Foros Generales / Foro Libre / Re: Conflicto Ucrania-Rusia,EEUU, OTAN, Europa. (Todas las noticias relacionadas irán aquí) en: 12 Marzo 2022, 17:54 pm
Rusia aplica una «represión estalinista» sobre sus propios militares
Se estima que los muertos por Stalin son de alrededor de 40 millones (sumando todas las causas)... una cifra de muertos similar a la que se cree que pudo tener Gengis Khan.

Vamos, que el redactor del artículo no tiene necesidad de ponerlo encorchetado como si fuera algo misterioso o incomprensible que se acaba de inventar él mismo, en todo caso un enlace...

Y al hilo de la Guerra de Putin... cuando Stalin, confiscó la producción de cereal de Ucrania, murieron unos 10 millones de hambre (de ellos unos 6 eran ucranianos).  Ucrania ya desde entonces ha servido como el granero de la URSS... de hecho hoy nutre a gran parte del planeta.

No queda claro aún cual es el panorama que Putin tiene en mente al caso (el 'granero'). Desde luego acceso al mar Negro, es algo que siempre ha querido, paso directo hacia el resto de Europa también (así evita pagar las tasas que le estaba pagando a Ucrania por las tuberías que pasan por su territorio), da igual que lo camufle de 'desnazificación', es pura y duramente una operación basada en la economía... la excusa de la entrada en la OTAN es solo eso una excusa perfecta, que al final ha tenido que aderezar con 'desnazificación'... Es prácticamente imposible ser más cretino.

...nos queda el consuelo de ver si un día de estos, alguien da la noticia de que un comando (da igual de dónde sea, como si es su mecánico personal) han encontrado a la rata y la han reventado de un tiro en la cabeza, que la paz vuelva y la reconstrucción de Ucrania empiece.
372  Programación / Programación Visual Basic / Re: Guardar list2 y leer list1 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...
373  Programación / Programación Visual Basic / Re: Guardar list2 y leer list1 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).


374  Foros Generales / Foro Libre / Re: Conflicto Ucrania-Rusia,EEUU, OTAN, Europa. (Todas las noticias relacionadas irán aquí) en: 11 Marzo 2022, 19:03 pm
Se viene haciendo eco, la noticia de que Putin podría tener un cáncer terminal (y sugieren que por eso, quieriendo pasar a la Historia, antes que el tiempo lo sepulte, ha diseñado esta invasión). La notici lleva rulando varios días, pero no parecía tener un origen conocido... hoy he podido ver que un reportero asegura que la noticia se la ha dado un británico de los servicios secretos.

En fin, si fuera cierto, Entonces Putin ha hecho lo que toda la vida se ha referido con el dicho: "Para lo que me queda dentro... me xxxx..."
375  Programación / Scripting / Re: Guardar datos correctamente en un archivo en: 11 Marzo 2022, 18:31 pm
Hay varias opciones:
1 ---La más rápida y simple:
Basta elegir la fuente 8514oem, pués es esa fuente la que corresponde.


Se usan estos 4 caracteres:
- Ä para la raya horizontal (carácter 196)  para hacer la tabulación horizontal de rayas (de ahí que vayan en grupo de 3 o 4).
- ³ para la raya vertical (carácter 179) que ocupa el alto de una línea, para los trazos verticales.
- Ã para la raya vertical con quiebro horizontal (carácter 195).
- À para el codo de la última raya vertical que (carácter 192) p.d.: (Se me olvidó anotar éste).

Eso sí, dado que el bloc de notas, comparte la fuente con todas las instancias abiertas, al cambiar la fuente, cuando vayas a cerrar el fichero, vuelve a dejar la fuente que tenías establecido para el bloc de notas.


 
2 --- Otra opción para solventar esto podría ser usar el worpad/write/word/etc... e incluir todo el texto entre etiquetas de uso con dicha fuente, ...pero wordpad/etc..., no soportan (en general) esta fuente (es una fuente de tipo fijo)...
3 --- Puede remediarse si tomas una fuente que te guste y editas (con un editor de fuentes), justamente esos 3 caracteres). Es una opción relativamente asequible, pués te permite a futuro poder abrir cualquier archivo 'así' con cualquier programa de texto que permita establecer una fuente específica para una sección o todo el texto, wordpad, word, etc...

4 --- Una última alternativa es que tú mismo crees tu propia aplicación para abrir estos ficheros que tengan seleccionada esta fuente por defecto (claro que si no es algo muy necesario va a ser mucho trabajo).

p.d.: Tal vez exista alguna otra fuente que ya incluya esos 3 caracteres (mira la imagen adjunta, los 3 están juntos formando un ángulo), y que la fuente sea TrueType (ttf), Open Type (otf), etc... en vez de una fuente fija (fon), en cuyo caso podría abrirse sin problemas en cualquier programa entre etiquetas para esa fuente... Esta solución se usaría para el caso 2. Es decir en vez de editar una fuente (como sugiero en 3), ver si ya existe una que los contenga.
376  Foros Generales / Foro Libre / Re: Conflicto Ucrania-Rusia,EEUU, OTAN, Europa. (Todas las noticias relacionadas irán aquí) en: 10 Marzo 2022, 15:43 pm
Como ha cambiado la cosa...

Allá por los 90, tras la caída del comunismo y la URSS, Ucrania era el tercer país del mundo con más armas nucleares, ubicadas en silos repartidos por todo el territorio de Ucrania, era un auténtico polvorín. Tras los acuerdos de desnuclearización, Rusia pidió a Ucrania que le entrregara todas las armas nucleares, Ucrania aceptó a condición de que Rusia les defendiera en caso de ataque...

... a día de hoy, quienes esperaba Ucrania que fuera a atacarles, son quienes están a su lado y tímidamente les están ayudando, y quien se supone que debería defenderles (básicamente sus hermanos), son los que les están atacando como lobos hambrientos.

Ya nadie puede dudar que Putin es el siguiente Hitler. Fuck Putin.

Me preocupa esto  >:( como harán los rusos para acceder a Internet?  :( tampoco es que el gobierno se vaya a ver muy afectado. De todas maneras supongo que se trate de una medida de presión social para generar descontento en la sociedad.
Yo también opino que no es buena idea.
Ahora Putin tiene la excusa perfecta para imponer 'RuNET' y tener el control total de lo que entra y sale, vamos la policía vigilando cada paquete que viaja por la red, básicamente igual que China.

Otra cosa por la que veo que es una idea equivocada, es que ahora  los rusos, solo tiene acceso a una voz: La de Putin y sus secuaces... no podrán informarse libremente sobre la auténtica verdad. En esa tesitura, la única palabra será la versión que el gobierno ruso redacte.

...a buen seguro que en Rusia existen más nazis que de los que pudieran exitir en Ucrania... (aunque solo sea estadisticamente, pues Ucrania tiene 42 millones de habitantes, en tanto que Rusia tiene 100 millones más)... Ah, no... que Puitin llama NAZI, a todo el que le lleva la contraria, es solo una excusa bananera, dice nazis, como podía haber dicho aliens. ...el caso es que el nazi supremo resulta ser él.

Quizás la única cosa buena del bloqueo de internet a Rusia, sea que los ataques de ramsonware, seguramente van a disminuir sensiblemente.
377  Foros Generales / Foro Libre / Re: Conflicto Ucrania-Rusia,EEUU, OTAN, Europa. (Todas las noticias relacionadas irán aquí) en: 7 Marzo 2022, 15:40 pm
Hoy la factura de la luz bate records... aprox, 550€ por Mwh, unas 12 veces más caro que hace un año.

Dada la gran dependencia de Europa (en general), de las energías procedentes de Rusia, puede afirmarse que Europa (indirectamente) está financiando la Guerra de Putin.


Te lo compraría, si la cifra final '24' se sumara como el resto de las veces: '2' + '4' ...para llegar a 32. No siendo el caso, es lo que se dice "meter con calzador".

Por otro lado las fechas de inicio de una guerra, raramente son claramente definidas.
Por ejemplo, aunque se da por buena el inicio de la I Guerra mundial el 28 de julio, en realidad, puede tomarse como el 28 junio (justo un mes antes, que es cuando se asesinó al archiduque de Austria, que fue el motivo de la guerra.

mmm.. y por otro lado el inicio de la II Guerra mundial, fue el 1 de sptiembre no el 9 de enero, como parece indicar la fecha que consta en la imagen. En este caso se asocia con la invasión de Polonia por parte de Alemania.
378  Informática / Hardware / Re: Que memòria RAM poner a un Pentium Dual-Core E5300? ...los discos SDD son compatibles para este Pentium? en: 7 Marzo 2022, 15:35 pm
Y ahora tienes 2x2GB, 4GB en total, con dos ranuras llenas y 2 ranuras vacías que no sirven para nada.
Las memorias dual channel, se sacan cuando la tecnología saca un nuevo modelo de memoria y el fabricante tiene complicado redirigir su placa base a 2 públicos diferentes (lejos de decidrise por uno, opta por los dos, porque así tienen 'el doble' de público, a un costo irrisorio en cuanto al diseño y fabricación de la placa):
- Uno que necesita una nueva placa base, pero que sea compatible con todo el hardware que ya posee (caso típico de alguien que le falla su placa base y debe cambiarla, espera comprar solamente una nueva placa base, no tambien la memoria).
- Uno que necesita una nueva placa base, pero que también comprará todo o casi todo nuevo.

El primer cliente puede usar el canal con las dos ranuras de memoria, con los módulos que ya tenía y el otro cliente puede poner módulos de memoria más actuales y veloces. Por su parte el primero, siempre tendrá la opción de seguir usando esa placa base si un día se ve obligado a cambiar su memoria por una más veloz, sea poe que se le dañaron, sea porque decide hacer un gasto extra para mejorar el rendimiento del equipo...

Sin dual channel, el primer cliente, las opciones que tendría, sería o bien comprar una placa base vieja (si la encuentra), o bien tener que comprar además de la placa base, también módulos nuevos de memoria.

En fin, es una ventaja para determinados compradores que casualmente se ven obligados a comprar una placa base en un momento en que dos memorias son dominantes, pero incompatibles para usar los mismos zócalos.

Cuando solo tiene la memoria mínima que admite el equipo, es fácil decantarse por comprar nuevos módulos de memoria, pero cuando tienes el máximo que admitía la placa base, adquirir la misma cantidad de memoria nueva, puede suponer un costo excesivo, si encuentra un fabricante que le permita segir usando la memoria que tiene y que además a futuro le permita actualizarla, elegirá esa placa base... 
379  Informática / Hardware / Re: Mi laptop funciona con Linux y no con Windos en: 6 Marzo 2022, 19:36 pm
Se me olvidaba, una curiosidad. ... con el disco de arranque de w98 no me dejaba cambiar el directorio, no se porqué. Ponía cd b:\  o cd b: pero siempre se quedaba en A:\.
En el BIOS, de esas viejas máquinas, hay una opción Swap Floppy Drive, que precisamente permite intercambiar la asignación de las letras de las unidades de disquete.
380  Programación / Programación Visual Basic / Re: Guardar list2 y leer list1 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.
Páginas: 1 ... 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 [38] 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 ... 430
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines