Consultas SQL desde VBA Access 2010

Soy Colombiano y requiero la siguiente ayuda. Tengo pocos y desuactualizados conocimientos de vba access.

Tengo una tabla llamada tb_Folios. Con los Campos:
Nom_Folios de tipo texto corto
Folio_Activo de tipo Sí/No
Fact_Inicial de tipo Entero Largo.
Fact_Final de tipo Entero Largo
Fact_Ultima de tipo Entero Largo.

La regla de Validación de registro aplicada es: Fact_Inicial <=Fact_Ultima <=Fact_Final
Hasta este punto no tengo problemas. Ademas, tengo el Modulo: Foliar_Fact con la Siguiente Info:
Option Compare Database
Option Explicit
Public xFolio_Abierto As Boolean
Public xNomFolio As String
Public xFact_Inicial As Long
Public xFact_Final As Long
Public xUlt_Fact_Factudara As Long
Public xFact_En_Proceso As Long

El problema es que no se como realizar una consulta sql desde vba para extraer cual es el folio activo, el valor inicial que almacena Fact_Inicial, Fact_Ultima y los demas campos para pasarlos a las variables del modulo, luego almacenar en Fact_Ultima el valor de Fact_Ultima +1.

1 respuesta

Respuesta
2

Partiendo de la premisa de que no sé para que utilizas los campos que contienen la cadena Fact si tienes un formulario con los campos..., Factura,... para que al ir a un registro nuevo en el cuadro de texto te aumente en 1 la última, basta simplemente conque en algún evento, bien sea Al activar registro, bien sea al recibir el enfoque, después de actualizar de algún control pongas

If isnull([factura]) then

factura=dmax("factura","tb_folios")+1

end if

Suponiendo que el orden sea ascendente

O también

If me.newrecord then

factura=dmax("factura","tb_folios")+1

end if

Si la numeración no fuese correlativa deberías usar

Factura=dlast("factura","tb_folios")+1

Entiendo lo que me dices; pero me queda una duda la cual es:

Esto funciona cuando corres la aplicación en modo exclusivo. pero cuando la corres en modo compartido ¿funciona igual? digo, dado los problemas de concurrencia de access, yo había pensado en no crear un campo autonómico en la tabla factura. si no un campo tipo texto sin duplicado que concatene el nombre del Folio separado por un espacio con el campo Fact_Ultima+1

y que por medio de una consulta de actualización la tabla folio reciba el nuevo valor (es decir si antes era 100 ahora reciba 101) una vez el campo factura de la tabla factura pierde el foco.

con esa forma lo que busco es que yo pueda seguir haciendo mi factura y que si alguien mas en otra terminal necesita hacer una factura, el numero de esa factura sea el que sigue en Fact_Ultima es decir en el ejemplo 102 en vez de 101 otra vez.

si me hice entender, dime si esto es posible y como lo puedo conseguir.

Hasta ahora he conseguido esto:

Option Compare Database
Option Explicit
Public xFolio_Abierto As Boolean
Public xNomFolio As String
Public xFact_Inicial As Long
Public xFact_Final As Long
Public xUlt_Fact_Factudara As Long
Public xFact_En_Proceso As Long
Sub FOLIAR_FACT()
xFolio_Abierto = DLookup("FOLIO_ABIERTO", "TB_FOLIOS", "[FOLIO_ABIERTO]=TRUE")
xNomFolio = DLookup("NOMBRE_FOLIO", "TB_FOLIOS", "[FOLIO_ABIERTO]=TRUE")
xFact_Inicial = DLookup("FACT_INICIAL", "TB_FOLIOS", "[FOLIO_ABIERTO]=TRUE")
xFact_Final = DLookup("FACT_FINAL", "TB_FOLIOS", "[FOLIO_ABIERTO]=TRUE")
xUlt_Fact_Factudara = DLookup("ULT_FACT_FACTURADA", "TB_FOLIOS", "[FOLIO_ABIERTO]=TRUE")
xFact_En_Proceso = xUlt_Fact_Factudara + 1
MsgBox "Factura N° " & xNomFolio & " " & xFact_En_Proceso ' este codigo va en el txt_Factura.
'========

AQUI... Necesito una consulta que me actualice el campo xUlt_Fact_Factudara  de la Tabla "tb_Foliois" con el valor de xFact_En_Proceso 

'========

End Sub

No tengo la posibilidad de probar las conexiones en red, ya que mi ordenador es el único que tengo, pero supongo que si en el evento Al activar el registro le pongo

Private Sub Form_Current()
NumFactura.SetFocus
If Me.NewRecord Then
IdFactura = Nz(DLast("idfactura", "facturas")) + 1
NumFactura = Format([IdFactura], "0000") & "/" & Year(Date)
DoCmd.RunCommand acCmdSaveRecord
End If
End Sub

Cuando abro el formulario

Como en el código le he dicho que una vez que me ponga los valores guarde el registro, anoto el cliente, la fecha, otro operario puede entrar en el registro siguiente sin problemas, ya que ese está guardado y puedes estar trabajando en él.

¡Gracias! Voy a probar lo que me dices.

Por otro lado en el código que te he compartido he adelantado algo, pero me salta un Error 91 en tiempo de ejecución en la línea rs.close... ¿puedes ayudarme?

Option Compare Database
Option Explicit
Public xFolio_Abierto As Boolean
Public xNomFolio As String
Public xFact_Inicial As Long
Public xFact_Final As Long
Public xUlt_Fact_Factudara As Long
Public xFact_En_Proceso As Long
Sub FOLIAR_FACT()
If DLookup("FOLIO_ABIERTO", "TB_FOLIOS", "[FOLIO_ABIERTO]= true") Then
xFolio_Abierto = DLookup("FOLIO_ABIERTO", "TB_FOLIOS", "[FOLIO_ABIERTO]= true")
xNomFolio = DLookup("NOMBRE_FOLIO", "TB_FOLIOS", "[FOLIO_ABIERTO]= true")
xFact_Inicial = DLookup("FACT_INICIAL", "TB_FOLIOS", "[FOLIO_ABIERTO]= true")
xFact_Final = DLookup("FACT_FINAL", "TB_FOLIOS", "[FOLIO_ABIERTO]= true")
xUlt_Fact_Factudara = DLookup("ULT_FACT_FACTURADA", "TB_FOLIOS", "[FOLIO_ABIERTO]= true")
xFact_En_Proceso = xUlt_Fact_Factudara + 1
MsgBox "Factura N° " & xNomFolio & " " & xFact_En_Proceso ' este codigo va en el txt_Factura.
'========
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim strSQL As String
Dim strSQL2 As String
Set db = CurrentDb()
'Si la factura en proceso es mayor al limite maximo a facturar dentro de ese folio, entonces.
If xFact_En_Proceso > xFact_Final Then
MsgBox "No puede seguir generando Facturas bajo este Folio... Contacte a la Administracion. ", vbOKOnly + vbCritical, "FOLIO CERRADO"
'Si no...
Else
'Si la factura en proceso es igual al limite maximo a facturar dentro de ese folio, entonces.
If xFact_En_Proceso = xFact_Final Then
MsgBox "Este Folio ha llegado a su limite... Se cerrara despues de esta Factura. ", vbOKOnly + vbCritical, "FINAL DEL FOLIO"
strSQL = ("UPDATE tb_Folios SET tb_Folios.ULT_FACT_FACTURADA = " & xFact_En_Proceso & " WHERE '[tb_Folios.FOLIO_ABIERTO]=  true'")
CurrentDb.Execute (strSQL)
rs.Close
Set rs = Nothing
db.Close
Set db = Nothing
'========
'Si la factura en proceso es menor al limite maximo a facturar dentro de ese folio, entonces.
Else
strSQL = ("UPDATE tb_Folios SET tb_Folios.ULT_FACT_FACTURADA = " & xFact_En_Proceso & " WHERE '[tb_Folios.FOLIO_ABIERTO]= true'")
CurrentDb.Execute (strSQL)
rs.Close ' esta linea me produce Error 91 en tiempo de ejecucion.
Set rs = Nothing
db.Close
Set db = Nothing
End If
End If
Else
MsgBox "No existe Folio Abierto para seguir Facturando... Comuniquese con Administración. ", vbOKOnly + vbCritical, "NO EXISTE FOLIO"
End If
End Sub

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas