Visual Basic Foro
Programación => Bases de Datos => Mensaje iniciado por: E N T E R en Septiembre 19, 2011, 03:16:41 pm
-
Bueno en vista de querer mejorar cree este pequeño ejemplo para ir depurando algunas cosas que estaba mal a según mis compañero.
Link del proyecto: http://www.megaupload.com/?d=3F1A3WET (http://www.megaupload.com/?d=3F1A3WET)
Esta bien este método ?
Modulo -1
Option Explicit
Public mc As ADODB.Connection 'Conexion Principal
Public rs As ADODB.Recordset 'Recordset Principal
'Public mCmd As ADODB.Command 'Para Ejecutar Comandos
Public ComandoSQL As String
Public SQL As String
Sub Main()
On Error GoTo ErrorHandler
Set mc = New ADODB.Connection
Set rs = New ADODB.Recordset
'Set mCmd = New ADODB.Command
mc.ConnectionString = "Driver={MySQL ODBC 5.1 Driver};Server=localhost;Database=control_hotel; User=root;Password=;Option=3;"
mc.Open
Form1.Show ' Aca mostras tu Formulario de inicio
ErrorHandler:
If Err <> 0 Then
MsgBox "Error Nº: " & Err.Number & vbCrLf & vbCrLf & Err.Source & vbCrLf & vbCrLf & Err.Description, vbCritical, "Error"
End If
End Sub
EN el Form.
Dim xNFactura As Integer
Private Sub Form_Load()
Call cmdLeerRegistros_Click
End Sub
Private Sub cmdLeerRegistros_Click()
ListView1.ListItems.Clear
If rs.State = adStateOpen Then rs.Close
SQL = "SELECT * FROM proveedor"
rs.Open SQL, mc, adOpenDynamic, adLockBatchOptimistic
Do Until rs.EOF
Set lv = ListView1.ListItems.Add()
With rs
lv.Text = .Fields("codigo")
lv.SubItems(1) = .Fields("cedula") & ""
lv.SubItems(2) = .Fields("nombre") & ""
lv.SubItems(3) = .Fields("telefono1") & ""
rs.MoveNext
End With
Loop
End Sub
Sub TRAER_NFACTURA()
xNFactura = 0
SQL = "SELECT numero FROM nfactura"
If rs.State = adStateOpen Then rs.Close
rs.Open SQL, mc, adOpenDynamic, adLockBatchOptimistic, adCmdText
Do Until rs.EOF
xNFactura = rs.Fields("numero") + 1
rs.MoveNext
Loop
End Sub
Private Sub cmdGuardar_Click()
Call TRAER_NFACTURA
V01 = "'" & xNFactura & "'"
V02 = "'CIBER'"
mc.BeginTrans
For i = 1 To 5
ComandoSQL = "INSERT INTO proveedor (cedula,nombre) VALUES (" & V01 & "," & V02 & ")"
mc.Execute ComandoSQL
Next i
ComandoSQL = "UPDATE nfactura SET numero = " & V01
mc.Execute ComandoSQL
mc.CommitTrans
End Sub
-
Esta bien, lo unico que yo te recomiendo es que uses Recordset diferentes...
Por ejemplo para tus proveedores rsProveedor as RecordSet, facturas rsFacturas as RecordSet, en fin..
De manera que tengas todo ordenado...! Ya que si realizas varias busquedas anidadas, se vuelve un problemon...!
Saludos
-
Concuerdo con Miguel N.
-
En que sentido es problemon algún ejemplo para salir de la duda, este método no me va a crear problema si uso en red, por que unos de mi cliente vive en otra ciudad y con el método que yo usaba no tengo problema. El podía hacer su consulta desde otra ciudad sin problema.
-
En que sentido es problemon algún ejemplo para salir de la duda, este método no me va a crear problema si uso en red, por que unos de mi cliente vive en otra ciudad y con el método que yo usaba no tengo problema. El podía hacer su consulta desde otra ciudad sin problema.
haber, algo que debes saber es que no importa si te funciona "bien", a veces que "funcione" no quiere decir que este bien.
hay veces que las cosas se pueden solucionar de varias maneras, pero una siempre es la mejor, y si usas la "peor" forma te va a dar el mismo resultado que la mejor y por eso te va a parecer que la foma que usabas "era suficiente".
el modulo es el que puse yo en el foro de VB MUNDO no ? esta bien.
el recordset publico llamado "rs" se usa para consultas rapidas, o sea funciones que necesite recuperar un valor y lo cerras, por ejemplo saber el ultimo ID de una tabla, abris el recordset, sacas el valor y cerras, asi de simple.
pero para hacer otras cosas que necesites hacer mas operaciones, ya vas a necesitar declarar los recordset que vos quieras como local en el formulario.
lo que esta mal es esto:
If rs.State = adStateOpen Then rs.Close
no es necesaro para cargar el listview, despues de Loop lo cerras con rs.Close
y la funcion que trae el numero de factura deberia ser una funcion que retorne un valor, asi te ahorras la variable.
y no abras los recordset con adOpenDynamic, el adOpenFordwardOnly es el mas rapido de todos, y mas si solo necesitas recorrerlo para adelante solamente.
saludos.