Visual Basic Foro
Programación => Visual Basic 6 => Mensaje iniciado por: omarinho23 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
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
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
-
pues porque no existe el Text1 con numero de indice 7....porque haces un for de 23 ??
-
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
-
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:
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.
-
OLA SEBA asi sta bien??
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
-
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.