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

 

 


Tema destacado: Guía actualizada para evitar que un ransomware ataque tu empresa


  Mostrar Mensajes
Páginas: 1 ... 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 [44] 45 46 47 48 49 50 51 52
431  Programación / Ejercicios / Re: vb ejercicio 6 en: 21 Julio 2004, 04:00 am
Hola
Cuando cambie el drive tiene el cambiar el dir por lo que tendrás que programar el evento change de drive.

Cuando cambie el control dir tendrá que cambiar el control file así que tendrás que programar su evento change

Cuando se haga doble click en el file tendrás que mostrar esa imagen así que tendrás que programar su evento dbl click.

Para todos ellos mira la propiedad path.

Por último para mostrar un gráfico mira el evento picture y el image. Este último tiene una propiedad interesante llamada stretch.

Un saludo
432  Programación / Ejercicios / Re: ejercicio Nº1 de Visual basic en: 19 Julio 2004, 03:17 am
Hola

Declaro una variable array tabla con cinco posiciones para cinco números. Al estar fuera de cualquier rutina es una variable global a nivel de formulario y será conocida en todas las rutinas de este formulario
---------- Declaraciones ---------------
Código:
Dim TablaNumeros(5) as integer

Comienzo la rutina principal. En ella declaro las variables que necesito en esta rutina.
Valido valdrá true o false según que el número sea válido o no.
Contador valdrá entre 0 y cuatro y corresponde a cada uno de los cinco números que quiero obtener y meter en sus cinco labels: lblnumero(0), lblnumero(1), lblnumero(2), lblnumero(3), lblnumero(4)
Numero: número aleatorio calculado

Código:
sub Command1_Click()
Dim Contador as integer, Valido as boolean, Numero as integer
   RellenarValores  'Llenar la tabla con valores -1
   for Contador=0 to 4 'una vez para cada número
      Numero=int(rnd*98)+1 'obtener número entre 1 y 99
      Valido=comprobar(Numero)   'saber si es válido
      if valido then
         tabla(Contador)=Numero 'meter número en tabla
      else
         Contador=Contador-1 'volver a calcular número
      endif
   Next Contador
   MostrarTabla 'mostrar los elementos de la tabla
EndSub

Aquí inicialmente relleno la tabla con valores -1 que son imposibles. Los números calculados van desde el 1 al 99 y por tanto no es posible tener un valor -1 calculado.
Código:
Sub RellenarValores()
dim Contador as integer
for Contador=0 to 4 'para cada elemento de la tabla
   tabla[contador]=-1 'poner valor -1
next x
End Sub

Aquí muestro la tabla. Si miras el pantallazo correspondiente a este ejercicio verás que hay cinco label llamados LblNumeros. Son un array de controles. De esta forma el primer número debe ir en lblNumero(0) y el último en lblnumero(4)

Código:
Sub MostrarTabla
dim Contador as integer
for Contador=0 to 4 'para cada elemento de la tabla
   lblnumero(contador)=tabla(contador) 'poner el número en pantalla
next x

Aquí compruebo si el número es válido o no. Para ello recorro la tabla y compruebo cada elemento con el número obtenido. Si ya está ahí es que el número que he calculado está repetido y por tanto debo calcular otro. En este caso la función devuelve false. En otro caso devuelve true
Código:
Function Comprobar(Num as integer)
dim Contador as integer

Comprobar=true 'inicialmente se supone que el número es bueno
For Contador=0 to 4 'para cada elemento de la tabla
   if tabla(Contador)=numero then
      comprobar=false 'el número es malo
      exit function
   endif
next Contador
End Function

Un saludo
433  Programación / Ejercicios / Re: ejercicio Nº1 de Visual basic en: 18 Julio 2004, 20:20 pm
Hola
Para eso estamos je je je

¿Qué cosas necesitas?
1- Generar números aleatorios.
2- Guardar los números que vas a obtener para mostrarlos al final
3. Comprobar cada vez que obtienes un número que ese número no ha salido antes.

Así que en mi opinión deberías crear una tabla donde puedan entrar esos cinco números y la inicializas con el valor -1 (es un valor imposible en la loto).

Luego obtienes un número.

Luego compruebas que ese número no ha salido antes recorriendo la tabla a ver si está. Si está vuelves a generar número y comprobar. Si no está lo metes en la tabla y generas el siguiente.

Cuando tengas todos muestras la tabla y ya está.

Para obtener números aleatorios utilizas la orden RND que devuelve un número aleatorio entre 1 y 0. Si tu quieres que te devuelva valores entre 1 y 25 tendrás que hacer '25 * RND'. Si quieres que te devuelva entre y 0 y 9 pues '98 * RND'. Estos números ademas tienen decimales así que tu debes hacer INT(RND * 98) para que obtenga números entre 0 y 98 enteros. Si quieres que salgan valores entre 1 y 99 tendrás que sumarle uno al resultado '1+int(RND * 98)'

Te pongo el pseudocódigo paso por paso para que lo entiendas bien aunque es mas largo.

Sería algo como esto:

En pseudocódigo sería
Código:
---------- Declaraciones ---------------
Declarar_Tabla (enteros)
Declarar variable VALIDO (booleana)
Declarar Numero (entero)
---------- Asignar valores iniciales ----
Rellenar_tabla_con_valores_-1
VALIDO=FALSE
---------- Rutina Principal --------------
sub Cmd_Obtener_Numeros_Click()
   Iniciar_bucle_para_cada_número
      Numero=Obtener_número
      VALIDO=comprobar(Numero)   
      si valido entonces
         Meter_Elemento_En_Tabla
      si no
         Decrementar contador de bucle en 1
      fin si
   Fin_bucle
   Mostrar_tabla
EndSub

La función de comprobar número sería
Código:
Function Comprobar(int Numero)
------------- Declarar Variable ---------
Contador (entero)

------------- Asignar valores iniciales ---
comprobar=true

------------- código ------------------------
Iniciar_bucle para recorrer la tabla con contador
   si tabla(contador) es igual a numero then
      comprobar=false
      salir de funcion
   endif
End Function

La función de mostrar la tabla obtenida sería
Código:
Function Mostar_Tabla()
------------- Declarar variable --------------
Contador (entero)

Iniciar_bucle con contador
   mostrar tabla(contador)
fin_bucle
End Function

Si no te sale te posteo código

Un saludo
 :D
434  Programación / Ejercicios / Re: soplo pon las soluciones a los ejercicios de VB pliss en: 18 Julio 2004, 06:25 am
Claro, eso es.
Y si no sabes por donde empezar lo dices para que te orienten.

En poco tiempo se pueden hacer.

Un saludo
435  Programación / Ejercicios / Re: Proyecto: Gestión de facturas (visita guiada) en: 17 Julio 2004, 08:15 am
Agregar/Modificar/Ver/Borrar Clientes

Agregar Clientes
Para agregar clientes he pensado en utilizar un formulario al que llamaré 'clientesficha.rm' que saldrá en blanco (naturalmente) que al rellenarlo y pulsar grabar se grabe en la tabla de clientes.

Voy a hacerlo de manera que el mismo formulario me valdrá luego sin apenas cambios para ver el cliente y modificar sus datos.

Fijaos además que inicialmente no hay ninguna conexión del formulario a la tabla. En el momento que se pulsa grabar se abre la conexión (en este caso un recordset dao), se graba y se cierra.

Esto es importante cuando hagais programación en red (no es este caso) porque si añadiera un registro inicialmente y luego al pulsar grabar hiciera el update lo que habría conseguido es tener ocupada la página de este registro hasta que el usuario pulse grabar. Mientras tanto esa página permanece bloqueada (no solo ese registro sino 64k bytes de datos) por lo que podría ocurrir que otro usuario no pueda modificar un cliente porque este no ha pulsado aún grabar.

Y puede ocurrir que deje el cliente a medio meter y se ponga a hablar por teléfono.

Por eso lo que hago es mostrar un formulario simple donde solo se rellenan datos. En el momento que se graba se abre la conexión, se mueven los campos a base de datos y se cierra la conexión.

Este el el código que hay al pulsar la opción de agregar clientes

Código:
Load ClientesFicha
ClientesFicha.Tag = "Agregar"
ClientesFicha.Show vbModal
Unload Me

Borrar Clientes
Para entrar en el menú hicimos doble click sobre un cliente en la pantalla general de clientes (ClientesGeneral.frm). Pues ese cliente es el cliente activo. Si ahora pulso Eliminar cliente elimino a este cliente.

Al hacer doble click sobre ese cliente naturalmente el data que proporciona el recordset en clientesgeneral se posicionó en ese registro. Os recuerdo que cada cliente tiene un código único que se genera automáticamente de forma que para saber que cliente es desde otro formulario solo tengo que preguntar por 'ClientesGeneral.data1.recordset.fields("codigo")'.

Este es el código para borrar clientes

Código:
On error goto fallo
resp% = Msg("¿Desea borrar este cliente con todos sus documentos correspondientes?", "SiNo")
If resp% = vbYes Then
       base.Execute "delete * from clientes where codigo=" & ClientesGeneral.data1.Recordset.Fields("codigo), dbFailOnError
       Msg "El cliente se ha borrado satisfactoriamente.", "Ok"
endif
exit sub
fallo:
msg "No se ha podido borrar al cliente. La causa ha sido el error nº " & err.number & "(" & err.description & "),"Ok"

Este caso solo borra a este cliente y se queda tan ancho, sin embargo tenemos que tener presente que en nuestra aplicación habrá registros de facturas que corresponden a este cliente y no puede ocurrir que haya facturas que no pertenezcan a ningún cliente.

Esto tiene dos soluciones
a) realizo una relación de integridad referencial entre clientes y facturas de forma que al eliminar el cliente se borran todas sus facturas (en este caso vale el código anterior). Ya indiqué al inicio de esta visita que esa opción la descartaba yo. Este es un curso de visual basic.

La otra opción es modificar el código anterior para borrar todos los registros de facturas que sean de este cliente. Dado que aún no hemos tocado el tema de facturas os recuerdo que cada factura tenía un registro (y solo uno) que identificaba de forma inequívoca a cada factura. En esta tabla había un campo llamado CodigoCliente que identifica al cliente de cada factura.

El código en este caso sería así
Código:
With ClientesGeneral.Data1.Recordset.Fields("codigo")
resp% = Msg("¿Desea borrar este cliente con todos sus documentos correspondientes?", "SiNo")
If resp% = vbYes Then
    BeginTrans
    base.Execute "delete * from facturas where codigocliente=" & .Value, dbFailOnError
    base.Execute "delete * from clientes where codigo=" & .Value, dbFailOnError
    CommitTrans
    Msg "El cliente se ha borrado satisfactoriamente.", "Ok"
End If
ClientesGeneral.Data1.Refresh
End With
Exit Sub
fallo:
rollback
Msg "No se ha borrado el cliente. Error número: " & Err.Number & "(" & Err.Description & ")", "Ok"

Como veis en este caso se debe borrar de dos tablas o de ninguna. Por ello creo una transacción (begintrans) y empiezo a borrar.
Si ocurre un error saltará a fallo donde hay una claúsula rollback que devolverá todas las cosas al estado anterior a begintrans.
Si no ocurre un error llegará a committrans que hará los cambios ya permanentes.
Fijaos que las órdenes sql llevan el parámetro dbfailonerror. Esto es porque si no lo llevan aunque ocurra un error no generan error.

Modificar Clienes
Para modificar un cliente haré algo muy parecido a la rutina de agregar clientes nuevos.
Solo que esta vez en vez de aparecer el formulario de antes (clientesficha) vacío esta vez aparecerá lleno con los datos del cliente.

Como en el caso de borrar para llegar aquí hay que pulsar doble click sobre un cliente y como el recordset de allí (clientesgeneral) se habrá posicionado sobre ese registro tengo el cliente que deseo modificar en 'clientesgeneral.data1.recordset.fields("codigo")'

Haré exactamente lo mismo posteriormente para consultar un cliente de forma que enviaré un parámetro que será 'M cuando quiera modificar y 'V' cuando quiera ver. Así en todo momento sabré en las rutinas posteriores que es lo que quiero hacer.

Como decía el caso es muy parecido al caso de agregar. Solo que necesitaré meter los datos en el formulario 'ClientesFicha' antes de mostrarlo. Para ello utilizaré una rutina llamada 'MoverAPantalla' que hará ese trabajo. Posteriormente hablaré de ella.

Ahora el código de este botón
Código:
On Error GoTo fallo
Load ClientesFicha 'cargar el formulario en memoria
ClientesFicha.Tag = "M" 'este es el parámetro que envío.
MoverAPantalla 'mover los campos al formulario
ClientesFicha.Show vbModal 'mostrar el formulario
Unload Me 'descargar el menú
Exit Sub
fallo:

Consultar Cliente
El caso de consultar un cliente es exactamente igual que el de modificar un cliente con solo dos modificaciones:
En el caso de consultas no existe la posibilidad de grabar
Tampoco existe la posibilidad de escribir en los datos que se muestran

El código de mostrar un cliente es el siguiente:

Código:
On Error GoTo fallo
Load ClientesFicha
With ClientesFicha
.Grabar.Visible = False 'que no se vea el botón de grabar
For x% = 0 To ClientesGeneral.text.count-1 'para cada textbox del formulario
    .Text1(x%).Locked = True 'impedir escribir en todos los campos
Next x%
.PideFpago.Locked = True
MoverAPantalla 'mover los campos al formulario
.Show vbModal 'mostrar el formulario
End With
Unload Me 'descargar el menú
Exit Sub
fallo:

Mover campos del recordset a pantalla
Por último me queda hacer la rutina de mover los campos del recordset a pantalla.

La rutina sería así

Código:
Sub MoverAPantalla()
Dim rec As Recordset 'creo un recordset tabla indexado
Set rec = base.OpenRecordset("clientes", dbOpenTable)
rec.Index = "codigo"
rec.Seek "=", ClientesGeneral.Data1.Recordset.Fields 'busco el cliente solicitado
If rec.NoMatch Then 'si no se encuentra
    Exit Sub 'salir
End If
With ClientesFicha
.Text1(0) = rec.Fields("codigo")
'.PideFecha = rec.Fields("fecha")
.Text1(1) = "" & rec.Fields("Nombre")
'.Text1(2) = "" & rec.Fields("Apellidos")
.Text1(2) = "" & rec.Fields("Direccion")
.Text1(3) = "" & rec.Fields("Poblacion")
.Text1(4) = "" & rec.Fields("CodigoPostal")
.Text1(5) = "" & rec.Fields("Telefono")
.Text1(6) = "" & rec.Fields("Dni")
End With
rec.close
End Sub

Fijaos una vez mas. He abierto un recordset de tipo tabla, he buscado lo que necesitaba, lo he movido a los campos del formulario y lo he cerrado.

Fijaos que para meter un dato de tipo string en un textbox he hecho esto:
Código:
.Text1(1) = "" & rec.Fields("Nombre")

La razón es que dentro de un campo de base de datos puede haber el valor null, pero ese valor no se puede meter en un textbox. Por eso concateno "" y el campo 'nombre'. Si está vacío meto en text1 el valor "". Si no está vacío meto el valor "" & "el nombre del sujeto".

El formulario del cliente

Al fin llegamos al formulario del cliente. Este formulario será un formulario sin nada especial. Cuando se muestre puede ocurrir que los textbox estén vacíos (caso de altas de clientes) o que estén llenos. Si están llenos entonces puede ocurrir que tengan puesto locked=true y no exista el botón 'grabar' porque es una simple consulta o bien que no ocurra esto porque es una modificación del cliente.

En la práctica solo hay código en dos botones:
El código del botón salir sin hacer nada. Como hemos llegado aquí limpiamente no hay nada que deshacer ni recordset que cerrar ni nada.
Código:
unload me

El código de grabar. Este botón solo se ve si se trata de agregar o modificar clientes.
El código sería este:

Código:
Private Sub Grabar_Click()
Dim rec As Recordset

Set rec = base.OpenRecordset("clientes", dbOpenTable)
rec.Index = "codigo"
If Me.Tag <> "M Then 'si se ha recibido el parámetro M se trata de una modificación
    rec.AddNew 'como no se ha recibido hay que agregar
Else
    rec.Seek "=", Text1(0) 'como si se ha recibido hay que buscar el cliente a modificar en la tabla
    rec.Edit 'y editarlo
End If
rec.Fields("Nombre") = Text1(1)
rec.Fields("Direccion") = Text1(2)
rec.Fields("Poblacion") = Text1(3)
rec.Fields("CodigoPostal") = Text1(4)
rec.Fields("Telefono") = Text1(5)
rec.Fields("DNI") = Text1(6)
rec.Update
ClientesGeneral.Data1.Refresh 'actualizar el panel general
Unload Me
End Sub

Ya tenemos terminados los clientes
436  Programación / Ejercicios / Re: soplo pon las soluciones a los ejercicios de VB pliss en: 15 Julio 2004, 21:41 pm
Hola
Este sitio está pensado para que tu trabajes en los ejercicios. Según alguien los va haciendo se van guardando soluciones, pero lo que tienes que hacer es intentarlo por tí mismo.

Naturalmente son difíciles (depende el nivel que tengas claro), pero si no sabes lo que tienes que hacer es poner un post que diga 'ejercicio 100: no se ni por donde empezar' porque así yo te ayudo y la respuesta le vale al siguiente.

Si yo pongo las soluciones no te vale. El mundo está lleno de manuales de visual basic, pero aquí lo que vas a obtener es experiencia haciendo ejercicios en los que estas apoyado.

Pero los ejercicios los tienes que hacer tú.

Un saludo
437  Programación / Ejercicios / Re: Proyecto: Gestión de facturas (visita guiada) en: 7 Julio 2004, 08:00 am
Menú de Clientes

El menú de clientes será un formulario modal que saldrá centrado en la pantalla.

Luego explico estas  opciones. Ahora me voy a cenar!!
 ;D
438  Programación / Ejercicios / Re: Proyecto: Gestión de facturas (visita guiada) en: 7 Julio 2004, 07:54 am
Formulario principal de clientes

Será un formulario child del mdi y aparecerá maximizado.

Se llamará ClientesGeneral

Para llamar a este formulario desde el menú principal tendremos que agregar una nueva opción al menú que será la opción de clientes. Al pinchar en aquella opción se ejecuta el siguiente código:

Código:
Private Sub MnuClientes_Click
load ClientesGeneral
ClientesGeneral.data1.databasename=BaseDeDatos
ClientesGeneral.data1.refresh
ClientesGeneral.show
End Sub
Con ello desde el formulario principal llamamos al formulario clientesgeneral. Antes de mostrarlo lo cargamos, le pasamos la información al data de donde se encuentra la base de datos (os recuerdo que hay una variable global llamada BaseDeDatos cuyo contenido precisamente esto) y luego mostramos el formulario.

De esta forma el formulario funcionará en cualquier lugar que esté la base de datos.

El código que hay en este formulario es el siguiente:

El código del control text
Código:
Private Sub Text1_Change()
Data1.Recordset.FindFirst "nombre like '*" & Text1 & "*'"
End Sub
De esta forma al escribir en este control se busca automáticamente al cliente que mas se acerque a lo escrito (pulsación a pulsación)

Botón de buscar siguiente
Código:
Private Sub Command2_Click()
Data1.Recordset.FindNext "nombre like '*" & Text1 & "*'"
End Sub
Si en la búsqueda del text hemos encontrado un cliente, pero buscamos otro cliente posterior con la misma condición este buscará desde donde estamos mientras que desde el text se busca desde el principio.

Los códigos del dbgrid
Código:
Private Sub DBGrid1_DblClick()
ClientesMenu.Show vbModal
End Sub
Al hacer doble click llamamos a otro formulario (que aún no hemos hecho) donde se dará la opción de agregar, eliminar, borrar, ...

Código:
Private Sub DBGrid1_HeadClick(ByVal ColIndex As Integer)
misql$ = Left(Data1.RecordSource, InStr(1, Data1.RecordSource, "order") - 1)
Data1.RecordSource = misql$ & "order by " & DBGrid1.Columns(ColIndex).DataField
Data1.Refresh
End Sub
Al hacer click en un encabezado del grid ordenamos por ahí

Y ya hemos terminado. Fijaos que poco código y que bien funciona.

Para que funcione perfecto os pongo las propiedades que tienen
El dbgrid
Código:
allowaddnew=false
allowupdate=false
allowdelete=false
Recordselector=false
marqueestyle=highlightrow

El data
Código:
visible=false
recordsettype=snapshot
recordsource='select * from clientes order by nombre'
databasename=''

Pues eso. 5 minutos y chachi piruli.
439  Programación / Ejercicios / Re: Proyecto: Gestión de facturas (visita guiada) en: 7 Julio 2004, 07:37 am
Gestión de Clientes

Para la gestión de clientes he pensado utilizar un formulario donde saldrá un dbgrid enlazado a un control data (oculto) que mostrará los clientes.

Estos datos saldrán de un recordset de tipo snapshot por las siguientes razones:
1. Los datos serán de solo lectura lo que agiliza la consulta de datos
2. Se desea que los datos no sean actualizables aquí
3. Se podrá ordenar por donde se quiera y buscar con facilidad.

Al hacer doble click sobre el grid sale un menú que permite agregar, modificar, ver o borrar clientes.
440  Programación / Ejercicios / Re: Proyecto: Gestión de facturas (visita guiada) en: 7 Julio 2004, 07:05 am
Creación del formulario principal de la aplicación

Utilizaré un formulario MDI al que llamaré 'principal'

En el crearé un menú con dos opciones (de momento) tal como se ve en la figura.

El código que tiene es el siguiente:

Al pinchar en la opción 'Parámetros generales'

Código:
Private Sub MnuParametros_Click()
Set parametros = New CfgDatos
CfgDatos.Left = (Screen.Width - CfgDatos.Width) / 2
CfgDatos.Top = (Screen.Height - CfgDatos.Height) / 2
CfgDatos.Show
End Sub

El código de terminar
Código:
Private sub MnuFin_Click()
end
End Sub
Páginas: 1 ... 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 [44] 45 46 47 48 49 50 51 52
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines