Autor Tema: INSERTAR COMBOBOX --> FALLA :S  (Leído 4710 veces)

0 Usuarios y 1 Visitante están viendo este tema.

omarinho23

  • Megabyte
  • ***
  • Mensajes: 105
  • Reputación: +0/-1
    • Ver Perfil
INSERTAR COMBOBOX --> FALLA :S
« en: Enero 27, 2010, 02:54:30 pm »
JELOW De nuevo! trate de cambiar un textbox para hacerlo mas simple con un combobox pero uno , me sale un error cuando trato de editarlo ok.

" el elemento "7" de la matriz de controles no existe "

y me señala todo este error :S 

             .Text1(i).Text = LV.SelectedItem.ListSubItems(i).Text


siendo todo el form de ese error este

Citar

Option Explicit

' Botones de opción
''''''''''''''''''''''''''''''''''''''''''''''''''
Private Sub cmdOpciones_Click(Index As Integer)
    Select Case Index
        Case 0: Call Agregar
        Case 1: Call Editar
        Case 2: Call Eliminar
        Case 3: Unload Me
        Case 4: frmFilter.Show , Me
        Case 5: Call mnuImprimir_Click
    End Select
End Sub


'Abre el formulario para Editar el registro seleccionado en el ListView
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Private Sub Editar()

    Dim i As Integer
    Dim FechaActual As Date
   
    ' verifica que hay datos en el ListView y que hay uno seleccionado
    If (LV.ListItems.Count = 0) Then
       MsgBox "No hay ningún regisro para editar", vbInformation
       Exit Sub
    End If
    If (LV.SelectedItem Is Nothing) Then
       MsgBox "Debe seleccionar previamente un registro para poder editarlo", vbInformation
       Exit Sub
    End If
   
    With FrmEditCarmen
        ' obtiene el elemento seleccionado
        .lblID = LV.SelectedItem.Text
        For i = 1 To 23
             .Text1(i).Text = LV.SelectedItem.ListSubItems(i).Text
        Next
       
        .CmbInspector = LV.SelectedItem.ListSubItems(7).Text
        .lblFecha = LV.SelectedItem.ListSubItems(2).Text
        .IdRegistro = LV.SelectedItem.Text
        .ACCION = EDITAR_REGISTRO
       
        .Show vbModal
    End With
FechaActual = Date
End Sub

' Elimina el registro actual seleccionado
'''''''''''''''''''''''''''''''''''''''''''''

Private Sub Eliminar()

   
   
    If (LV.ListItems.Count = 0) Then
        MsgBox "No hay ningún registro para eliminar", vbInformation
        Exit Sub
    End If
   
    ' verifica que hay datos en el ListView y que hay uno seleccionado
    If (LV.SelectedItem Is Nothing) Then
        MsgBox "No hay registro seleccionado para eliminar", vbInformation
        Exit Sub
    End If
   
   
    With LV.SelectedItem
        ' pregunta
        If MsgBox("Se va a eliminar el registro : " & vbNewLine & _
                 String(50, "-") & vbNewLine & _
                 "cod: " & .Text & vbNewLine & _
                 "voucher " & .ListSubItems(1).Text & vbNewLine & _
                 "mes: " & .ListSubItems(2).Text, _
                 vbExclamation + vbYesNo, "Eliminar") = vbYes Then
            ' Elimina
            cnn.Execute "delete from Clientes where cod = " & .Text & ""
            ' refresca el recordset
            rs.Requery 1
            ' vuelve a cargar los datos en el ListView
            Call CargarListView(LV, rs)
        End If
    End With
End Sub


Sub Agregar()
   
    ' Acción
    FrmEditCarmen.ACCION = AGREGAR_REGISTRO
   
    FrmEditCarmen.lblFecha = Format(Date, "dd/mm/yyyy")
    ' Abre el Form
    FrmEditCarmen.Show 1
End Sub

Sub Salir()
    Call Desconectar
    Unload Me
    End
End Sub


Private Sub Form_Load()
    ' Abre la conexión
    Call IniciarConexion
    ' carga el Recorset con todos los datos
    rs.Open "select * from Clientes", cnn, adOpenStatic, adLockOptimistic
    ' llena el ListView
    Call CargarListView(LV, rs)

End Sub


Private Sub LV_DblClick()
    Call Editar
End Sub



Private Sub LV_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
    Dim Item As ListItem
   
    Set Item = LV.HitTest(x, y)
   
    If Not Item Is Nothing And Button = vbRightButton Then
       Item.Selected = True
       Me.PopupMenu mnuEdicion
    End If
End Sub

' menues
'''''''''''''''''''''''''''''

Private Sub mnuAgregar_Click()
    Call Agregar
End Sub

Private Sub mnuEditarRegistro_Click()
    Call Editar
End Sub

Private Sub mnuEliminarReg_Click()
    Call Eliminar
End Sub

Private Sub mnuImprimir_Click()
    Set DataReport1.DataSource = rs
    DataReport1.Show 1
End Sub

' salir

''''''''''''''''''''''''
Private Sub mnuSalir_Click()
    Call Salir
End Sub
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    Dim ret As VbMsgBoxResult
   
    ret = MsgBox("¿ Salir ?", vbInformation + vbYesNo)
    If ret = vbNo Then
        Cancel = True
    Else
        Call Salir
    End If
End Sub


y cuando creo no me sale ningun error pero cuando graba :S me sale el dato de CmdInspectores como un numero osea " 1 " en vez q diga " ING. PEREZ "

no entiendo el porque :S

siendo mi codigo del otro form asi

Código: [Seleccionar]
Option Explicit

Enum EACCION
    AGREGAR_REGISTRO = 0
    EDITAR_REGISTRO = 1
End Enum

Public IdRegistro
Public ACCION As EACCION



Private Sub cmdGuardar_Click()
Text1(11).Text = ((Val(Text1(9).Text) * Val(Text1(10).Text)))
Text1(22).Text = ((Val(Text1(11).Text * 0.3) / 1.19))
Dim sqlDate As String
sqlDate = Format(Date, "YYYY/MM/DD")

    'Agrega el registro
    '''''''''''''''''''''''''''''''
   
    Select Case ACCION
    Case EDITAR_REGISTRO
        cnn.Execute "UPDATE Clientes set voucher = '" & Text1(1) & _
                                         "', dia = '" & Text1(2) & _
                                         "', contacto = '" & Text1(3) & _
                                         "', razonsocial = '" & Text1(4) & _
                                         "', nºderuc = '" & Text1(5) & _
                                         "', direccion = '" & Text1(6) & _
                                         "', inspector = '" & CmbInspector.ListIndex & _
                                         "', tipodecertificado = '" & Text1(8) & _
                                         "', cantidad = '" & Text1(9) & _
                                         "', precio = '" & Text1(10) & _
                                         "', total= '" & Text1(11) & _
                                         "', codigodebarra = '" & Text1(12) & _
                                         "', cit = '" & Text1(13) & _
                                         "', nºdeplaca = '" & Text1(14) & _
                                         "', nºdemotor = '" & Text1(15) & _
                                         "', nºdeserieochasis = '" & Text1(16) & _
                                         "', nºdecertificado = '" & Text1(17) & _
                                         "', totalvoucher = '" & Text1(18) & _
                                         "', boletaofactura = '" & Text1(19) & _
                                         "', mes = '" & Text1(20) & _
                                         "', lista = '" & Text1(21) & _
                                         "', asignacion = '" & Text1(22) & _
                                         "', observacion = '" & Text1(23) & _
                                         "' where Cod = " & IdRegistro & ""
    Case AGREGAR_REGISTRO
       
cnn.Execute "INSERT INTO Clientes (voucher, dia, contacto, razonsocial, nºderuc, direccion, inspector, tipodecertificado, cantidad, precio, total, codigodebarra, cit, nºdeplaca, nºdemotor, nºdeserieochasis, nºdecertificado, totalvoucher, boletaofactura, mes, lista, asignacion, observacion) VALUES('" & Text1(1) & "','" & sqlDate & "','" & Text1(3) & "','" & Text1(4) & "','" & Text1(5) & "','" & Text1(6) & "','" & CmbInspector.ListIndex & "','" & Text1(8) & "','" & Text1(9) & "','" & Text1(10) & "','" & Text1(11) & "','" & Text1(12) & "','" & Text1(13) & "','" & Text1(14) & "','" & Text1(15) & "','" & Text1(16) & "','" & Text1(17) & "','" & Text1(18) & "','" & Text1(19) & "','" & Text1(20) & "','" & Text1(21) & "','" & Text1(22) & "','" & Text1(23) & "')"
                                 
    End Select
   
    rs.Requery 1
   
    Call CargarListView(FrmPrincipalCarmen.LV, rs)

    DoEvents
    Unload Me
    Set FrmEditCarmen = Nothing
Exit Sub
ErrorSub:
MsgBox Err.Description

End Sub

Private Sub cmdCancelar_Click()
    Unload Me
End Sub

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
    If KeyCode = vbKeyEscape Then
       Unload Me
    End If
End Sub



Private Sub Text1_Change(Index As Integer)
Text1(22) = Format(Text1(22), "#0.00")
Text1(11) = Format(Text1(11), "#0.00")
Text1(18) = Format(Text1(18), "#0.00")
End Sub

seba123neo

  • Terabyte
  • *****
  • Mensajes: 763
  • Reputación: +88/-5
    • Ver Perfil
Re:INSERTAR COMBOBOX --> FALLA :S
« Respuesta #1 en: Enero 27, 2010, 08:59:15 pm »
pues porque no existe el Text1 con numero de indice 7....porque haces un for de 23 ??

omarinho23

  • Megabyte
  • ***
  • Mensajes: 105
  • Reputación: +0/-1
    • Ver Perfil
Re:INSERTAR COMBOBOX --> FALLA :S
« Respuesta #2 en: Enero 28, 2010, 12:00:26 pm »
se q no existe el text1(7) pero no se como quitar para q no aparesca ... lo pongo 1 to 23 porq si lo pongo de menos no lee los 23 campos :S pòr eso

seba123neo

  • Terabyte
  • *****
  • Mensajes: 763
  • Reputación: +88/-5
    • Ver Perfil
Re:INSERTAR COMBOBOX --> FALLA :S
« Respuesta #3 en: Enero 28, 2010, 12:34:36 pm »
bueno haber, sabes lo que pasa, ese ejemplo que usas de recursosvisualbasic, esta bien, pero no deberia ser asi.
no se deberia pasar por varialbes publicas los datos...porque te imaginas si tenes un alta de cliente, este puede tener hasta 50 campos.y seria muy feo crear 50 variables publicas.

lo unico que debes hacer es lo siguiente:

1 - sacar eso de que llena las variables y que quede solo esto:

Código: [Seleccionar]
With FrmEditCarmen
        .IdRegistro = LV.SelectedItem.Text
        .ACCION = EDITAR_REGISTRO
       
        .Show vbModal
    End With

que el formulario frmEditCarmen tenga solo la variable publica IdRegistro, este ID es unico para cada registro.

2 - una vez que mostras el formulario del otro lado tenes que hacer el "trabajo pesado", cuando cargas el Load del formulario frmEditCarmen, ahi tenes que preguntar si se va a agregar un registro o se va a editar.

3 - si se agrega un registro haces una cosa y si se edita haces otra.

4 - si se agrega no haces nada, dejas todos los campos en blanco cuando cargas...lo unico que al guardar el registro ahi debes preguntar si estas agregando...porque se usa el mismo boton para guardar que para editar...entonces debes preguntar ahi para saber si hacer un INSERT INTO o hacer un UPDATE.

5 - si estas editando entonces haces un SELECT a la base WHERE idRegistro = ...al id registro de la variable publica ¿te acordas?.entocnes te trae todos los datos del registro en un recordset(que sea un recordset declarado en ese formulario), entonces lo unico que debes hacer es pasar los datos del recordset a los textbox o combos, y listo.

por ejemplo:

Text1.Text = Recordset("NombreCliente")
Text2.Text = Recordset("ApellidoCliente")
Text3.Text = Recordset("TelefonoCliente")

y despues cerras el recordset.

pero cambiale los nombres a los controles, los controles deben tener un nombre que sea identificado rapido para que sirve, sino es dificil programar asi.

algun dia si me da el tiempo tengo que hacer un ejemplo de estos de ABM basicos para que sepan como se hace realmente.y tambien mostrar como hacer una clase para cada entidad, por ejemplo si tenes clientes haces una clase que contenga todo lo de los clientes, si tenes proveedores, una clase para todos los proveedores, y con eso la programacion se te hace muy facil, y en los formularios queda re-poco codigo, ya que todas las funciones estan dentro de las clases.

saludos.

omarinho23

  • Megabyte
  • ***
  • Mensajes: 105
  • Reputación: +0/-1
    • Ver Perfil
Re:INSERTAR COMBOBOX --> FALLA :S
« Respuesta #4 en: Enero 28, 2010, 02:46:13 pm »
OLA SEBA asi sta bien??

Citar
Option Explicit

Enum EACCION
    AGREGAR_REGISTRO = 0
    EDITAR_REGISTRO = 1
End Enum

Public IdRegistro
Public ACCION As EACCION



Private Sub cmdGuardar_Click()
Text1(11).Text = ((Val(Text1(9).Text) * Val(Text1(10).Text)))
Text1(22).Text = ((Val(Text1(11).Text * 0.3) / 1.19))
Dim sqlDate As String
sqlDate = Format(Date, "YYYY/MM/DD")

    'Agrega el registro
    '''''''''''''''''''''''''''''''
   
    Select Case ACCION
    Case EDITAR_REGISTRO
        cnn.Execute "UPDATE Clientes set voucher = '" & Text1(1) & _
                                         "', dia = '" & Text1(2) & _
                                         "', contacto = '" & Text1(3) & _
                                         "', razonsocial = '" & Text1(4) & _
                                         "', nºderuc = '" & Text1(5) & _
                                         "', direccion = '" & Text1(6) & _
                                         "', inspector = '" & CmbInspector.ListIndex & _
                                         "', tipodecertificado = '" & Text1(8) & _
                                         "', cantidad = '" & Text1(9) & _
                                         "', precio = '" & Text1(10) & _
                                         "', total= '" & Text1(11) & _
                                         "', codigodebarra = '" & Text1(12) & _
                                         "', cit = '" & Text1(13) & _
                                         "', nºdeplaca = '" & Text1(14) & _
                                         "', nºdemotor = '" & Text1(15) & _
                                         "', nºdeserieochasis = '" & Text1(16) & _
                                         "', nºdecertificado = '" & Text1(17) & _
                                         "', totalvoucher = '" & Text1(18) & _
                                         "', boletaofactura = '" & Text1(19) & _
                                         "', mes = '" & Text1(20) & _
                                         "', lista = '" & Text1(21) & _
                                         "', asignacion = '" & Text1(22) & _
                                         "', observacion = '" & Text1(23) & _
                                         "' where Cod = " & IdRegistro & ""
    Case AGREGAR_REGISTRO
       
cnn.Execute "INSERT INTO Clientes (voucher, dia, contacto, razonsocial, nºderuc, direccion, inspector, tipodecertificado, cantidad, precio, total, codigodebarra, cit, nºdeplaca, nºdemotor, nºdeserieochasis, nºdecertificado, totalvoucher, boletaofactura, mes, lista, asignacion, observacion) VALUES('" & Text1(1) & "','" & sqlDate & "','" & Text1(3) & "','" & Text1(4) & "','" & Text1(5) & "','" & Text1(6) & "','" & CmbInspector.ListIndex & "','" & Text1(8) & "','" & Text1(9) & "','" & Text1(10) & "','" & Text1(11) & "','" & Text1(12) & "','" & Text1(13) & "','" & Text1(14) & "','" & Text1(15) & "','" & Text1(16) & "','" & Text1(17) & "','" & Text1(18) & "','" & Text1(19) & "','" & Text1(20) & "','" & Text1(21) & "','" & Text1(22) & "','" & Text1(23) & "')"
                                 
    End Select
   
    rs.Requery 1
   
    Call CargarListView(FrmPrincipalCarmen.LV, rs)

    DoEvents
    Unload Me
    Set FrmEditCarmen = Nothing
Exit Sub
ErrorSub:
MsgBox Err.Description

End Sub

Private Sub cmdCancelar_Click()
    Unload Me
End Sub

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
    If KeyCode = vbKeyEscape Then
       Unload Me
    End If
End Sub



Private Sub Text1_Change(Index As Integer)
Text1(22) = Format(Text1(22), "#0.00")
Text1(11) = Format(Text1(11), "#0.00")
Text1(18) = Format(Text1(18), "#0.00")
End Sub

seba123neo

  • Terabyte
  • *****
  • Mensajes: 763
  • Reputación: +88/-5
    • Ver Perfil
Re:INSERTAR COMBOBOX --> FALLA :S
« Respuesta #5 en: Enero 28, 2010, 03:02:23 pm »
si algo asi, pero el INSERT INTO no le veo en ningun lado que le pongas el ID del cliente...en el UPDATE si

en el agregar deberias sacar el utlimo ID + 1, para eso podes hacer un SELECT MAX(campo)+1, peor ni idea como es el campo de codigo tuyo.

el Call CargarListView(FrmPrincipalCarmen.LV, rs) yo lo podria en el otro formulario, despues que termina el With, porque ahi lo estas haciendo solo cuando agregar, pero debes hacerlo en los 2 casos, sino cuando edite no se van a ver los cambios.

igual en ese formulario te falta hacer el tema de que cuado carge, si esta editando carge los datos del cliente.

saludos.