Agrupar los datos de dos filas en un solo campo

Una pregunta que encontre de como Agrupar los datos de dos filas en un solo campo
es sencillo solo con un poco de codigo y 2 tablas se podra realizar esto lo que hara el ejemplo es lo siguiente:


Matrícula 1      Conductor A
Matrícula 2      Conductor B
Matrícula 2      Conductor C
Matrícula 3      Conductor D
....

Matrícula 1      Conductor A
Matrícula 2      Conductor B y Conductor C
Matrícula 3      Conductor D

código:

campos de la tabla Matricula: Matricula,Conductor
Campos de la tabla concatenaciónMatricula,Conductor

Dim TablaMatriculas As ADODB.Recordset
Dim TablaConcatenacion As ADODB.Recordset
'campos
Dim matricula As String
Dim conductor As String

Set TablaMatriculas = New ADODB.Recordset

With TablaMatriculas
.ActiveConnection = CurrentProject.Connection
.CursorType = adOpenKeyset
.LockType = adLockOptimistic
.Open " select Matricula, Conductor from Matriculas"
End With

Set TablaConcatenacion = New ADODB.Recordset

 With TablaConcatenacion
 .ActiveConnection = CurrentProject.Connection
 .CursorType = adOpenKeyset
 .LockType = adLockOptimistic
 .Open "select Matricula,Conductor from Concatenacion"
 End With

Do While Not TablaMatriculas.EOF

matricula = TablaMatriculas.Fields(0)
conductor = ""


Do While Not TablaMatriculas.EOF And matricula = TablaMatriculas.Fields(0)

conductor = conductor & " " & TablaMatriculas.Fields(1)
TablaMatriculas.MoveNext


If TablaMatriculas.EOF Then
Exit Do
End If
Loop


TablaConcatenacion.AddNew
TablaConcatenacion.Fields(0) = matricula
TablaConcatenacion.Fields(1) = conductor
TablaConcatenacion.Update

Loop

MsgBox "Revisa la tabla concatenacion", vbInformation, "Informacion"

End sub

Sumar cadena alfanumerica

Encontré una pregunta abierta en la pagina de www.todoexpertos.com la cual me tome el tiempo de contestar, la pregunta era de como se podía sumar los caracteres numéricos de una cadena de texto, aquí les muestro la forma de hacerlo.


El ejemplo siguiente consiste en suma la cadena "frds0000gts" mas el valor 25 de tal forma que quede de la siguiente manera "frds0025gts".





Sub SumarAlfanumericos()
Dim valor As Integer
Dim Caracter As String
Dim tempCaracter As String
Dim cadenaEjemplo As String
Dim union As String

cadenaEjemplo = "frds0000gts"

valor = 25

Caracter = Mid(cadenaEjemplo, 5, 4)
tempCaracter = Format((valor + Caracter), "0000")

union = Mid(cadenaEjemplo, 1, 4) & tempCaracter & Mid(cadenaEjemplo, 10, 3)

Debug.Print union
End Sub


Dejen sus comentarios y suscribanse

Saludos

Obtener los números de una cadena de texto

Este ejemplo es de una pregunta que me realizaron en http://www.todoexpertos.com/, de como obtener los caracteres numéricos de una cadena de texto.


con el siguiente código se pueden obtener el dato:



Sub RecorrerCadena()
Dim i As Integer
Dim Caracter As String
Dim tempCaracter As String
Dim cadenaEjemplo As String

cadenaEjemplo = "RFERT20FR3"

For i = 1 To Len(cadenaEjemplo)
If IsNumeric(Mid(cadenaEjemplo, i, 1)) Then
Caracter = Mid(cadenaEjemplo, i, 1)
tempCaracter = tempCaracter & Caracter

End If

Next
Debug.Print tempCaracter

End Sub

No olviden Suscribirse. Gracias

Saludos 


Navegación con Hipervínculos


Martes, 14 de Febrero de 2012


Esto es particular mente fácil de hacer, ya que no se tiene que escribir ningún tipo de código solo basta con seguir unos pocos pasos.


Los cuales son:

1.- Al crear el formulario agregamos una etiqueta.

2.- En las propiedades de la etiqueta nos dirigimos a donde dice dirección de hipervínculo, damos clic en los 3 puntitos, al dar clic nos aparecerá una venta ahí en la parte izquierda de la ventana seleccionamos objeto de esta base de datos, seleccionamos ya sea un formulario, damos aceptar y seria todo su etiqueta quedaría así.



Actualizacion de formularios automáticos


Martes, 31 de Enero de 2012


En este ejemplo de actualizacion de formularios lo que haremos cera lo siguiente, en un formulario basado en una tabla introduciremos 1 registro en la tabla y ese a su vez aunque la tabla este abierta por otro usuario o el mismo usuario se mostrara el registro añadido en el formulario

Primero agregamos el registro ala tabla, después de 10segundos se visualiza en el formulario.

'evento al cargar el formulario
Private Sub Form_Load()
Me.TimerInterval = 10000
End Sub


'evento al terminar el intervalo declarado al cargar el formulario
Private Sub Form_Timer()
Dim tiempo As Long

tiempo = Me.Id
DoCmd.Echo False
Me.Requery

Me.Id.SetFocus
DoCmd.FindRecord tiempo
DoCmd.Echo True
End Sub


Utilizando el evento Timer


Martes, 31 de Enero de 2012

El evento Timer configura un evento para que se lance al final de un intervalo. En el procedimiento del evento Timer se puede escribir cualquier cosa que se pueda programar utilizando VBA.

En el siguiente ejemplo utilizaremos el evento Timer en un formulario de bienvenida.

'Evento al cargar le formulario
Private Sub Form_Load()

Me.TimerInterval = 10000

End Sub

'Evento al terminar el tiempo declarado en el evento al cargar el 'formulario
Private Sub Form_Timer()

DoCmd.Close acForm, "Bienvenida", acSaveYes

End Sub



Curso de Access 2003 Basico

Les dejo un curso de Access  2003 en el cual podran entender la funcionalidad de Access en un nivel basico

http://www.4shared.com/get/ZWUVMduP/Curso_de_Access_2003.html

Formularios


miércoles, 25 de enero de 2012

Introducción

Las aplicaciones utilizan los formularios, junto con los informes, para presentar datos. Los formularios presentan un método para aceptar y responder las acciones del usuario. Dado que los usuarios de una aplicación de base de datos interactúan con una aplicación casi completamente a través de formularios, el diseño del formulario y su comportamiento es muy importante. Este capitulo explica como utilizar los formularios Microsoft Access con datos y ofrece una introducción general al trabajo con formularios y sus controles. También aprenderemos las funciones mas generales que realizan los formularios, incluyendo formularios que actúan como temporizadores.

Los primeros ejemplos de este capitulo muestran técnicas de desarrollo y presentación de pantallas de introducción a una aplicación los formularios de control.

Iniciaremos los ejemplos en el siguiente capitulo.

Selección con uniones


miércoles, 25 de enero de 2012

Todas las formas de mezclar orígenes de datos que hemos visto ahora se centran en unir uno o mas orígenes de datos sobre uno o mas campos comunes.
El siguiente ejemplo muestra tres orígenes de datos de la base de datos Northwind las tablas Customers, Suppliers y Employees.

Sub uniones3()
'declaramos las variables
Dim sentencia As String
'establecemos las variables
sentencia = "SELECT CompanyName,ContactName,Phone " & _
"FROM Customers " & _
"Union " & _
"SELECT CompanyName, ContactName, Phone " & _
"FROM Suppliers " & _
"UNION " & _
"SELECT 'Northwind'," & _
"FirstName& ' '&LastName AS ContacName, HomePhone " & _
"FROM EMPLOYEES"
recordss sentencia
End Sub


Sub recordss(sentencia As String)
Dim registros As ADODB.Recordset
Dim campo As Field
Dim entero As Integer

Set registros = New ADODB.Recordset
registros.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & CurrentProject.Path & "\Northwind.mdb"
registros.Open sentencia

entero = 1
Do Until registros.EOF
Debug.Print "Resultado: " & entero
For Each campo In registros.Fields
If Not (campo.Type = adLongVarBinary) Then _
Debug.Print String(5, " ") & _
campo.Name & " = "; campo.Value
Next campo
registros.MoveNext
If entero >= 10 Then
Exit Do
Else
entero = entero + 1
Debug.Print
End If
Loop
'lebera los objetos
registros.Close
Set registros = Nothing
End Sub

Este es el ejemplo final de este Capitulo.

Selección de sub-consultas


martes, 24 de enero de 2012

Una sub consulta es una sentencia SELECT anidada en otra sentencia SELECT. La consulta, en ocasiones  se le conoce como una consulta externa. Existen dos tipos de subconsultas. En primer lugar, se puede expresar la subconsulta de forma que la consulta interna se calcule solo una vez para la consulta externa.

Este ejemplo selecciona los empleado que contiene otro emplead que les informa.

Sub subconsulta()
'declaramos las variables
Dim sentencia As String
'establecemos las variables
sentencia = "SELECT DISTINCT EmployeeID, " & _
"FirstName, LastName " & _
"FROM Employees " & _
"WHERE EmployeeID IN (SELECT ReportsTo FROM Employees)"
recordss sentencia
End Sub

Sub recordss(sentencia As String)
Dim registros As ADODB.Recordset
Dim campo As Field
Dim entero As Integer

Set registros = New ADODB.Recordset
registros.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & CurrentProject.Path & "\Northwind.mdb"
registros.Open sentencia

entero = 1
Do Until registros.EOF
Debug.Print "Resultado: " & entero
For Each campo In registros.Fields
If Not (campo.Type = adLongVarBinary) Then _
Debug.Print String(5, " ") & _
campo.Name & " = "; campo.Value
Next campo
registros.MoveNext
If entero >= 10 Then
Exit Do
Else
entero = entero + 1
Debug.Print
End If
Loop
'lebera los objetos
registros.Close
Set registros = Nothing
End Sub

El siguiente ejemplo demuestra la utilización de una subconsulta correlacionada para encontrar el OrderID con el mayor precio extendido para cada ProductoID.

Sub subconsulta2()
'declaramos las variables
Dim sentencia As String
'establecemos las variables
sentencia = "SELECT od.OrderID, od.ProductID, " & _
"FORMATCURRENCY(od.UnitPrice*od.Quantity*od.Quantity" & _
"*(1-od.Discount),2) AS Price " & _
"FROM [Order Details] od " & _
"WHERE od.UnitPrice*od.Quantity*(1-od.Discount) IN " & _
"(SELECT " & _
"MAX(odsub.UnitPrice*odsub.Quantity*(1-odsub.Discount)) " & _
"FROM [Order Details] odsub " & _
"WHERE od.ProductID = odsub.ProductID)"
recordss sentencia
End Sub


Sub recordss(sentencia As String)
Dim registros As ADODB.Recordset
Dim campo As Field
Dim entero As Integer

Set registros = New ADODB.Recordset
registros.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & CurrentProject.Path & "\Northwind.mdb"
registros.Open sentencia

entero = 1
Do Until registros.EOF
Debug.Print "Resultado: " & entero
For Each campo In registros.Fields
If Not (campo.Type = adLongVarBinary) Then _
Debug.Print String(5, " ") & _
campo.Name & " = "; campo.Value
Next campo
registros.MoveNext
If entero >= 10 Then
Exit Do
Else
entero = entero + 1
Debug.Print
End If
Loop
'lebera los objetos
registros.Close
Set registros = Nothing
End Sub

Uniones reflexivas


martes, 24 de enero de 2012

El ejemplo busca generar una lista de directivos, asi que prefija los campos  EmployeeID, FirstName y LastName de la lista de campos SELECT con eInfo, porque los ID y nombre del directivo se encuentran en la tabla eInfo.

Sub uniones()
'declaramos las variables
Dim sentencia As String
'establecemos las variables
sentencia = "SELECT DISTINCT eInfo.EmployeeID, eInfo.FirstName, " & _
"eInfo.LastName " & _
"FROM Employees as eMgr INNER JOIN Employees AS eInfo " & _
"ON eMgr.ReportsTo = eInfo.EmployeeID"
recordss sentencia
End Sub


Sub recordss(sentencia As String)
Dim registros As ADODB.Recordset
Dim campo As Field
Dim entero As Integer

Set registros = New ADODB.Recordset
registros.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & CurrentProject.Path & "\Northwind.mdb"
registros.Open sentencia

entero = 1
Do Until registros.EOF
Debug.Print "Resultado: " & entero
For Each campo In registros.Fields
If Not (campo.Type = adLongVarBinary) Then _
Debug.Print String(5, " ") & _
campo.Name & " = "; campo.Value
Next campo
registros.MoveNext
If entero >= 10 Then
Exit Do
Else
entero = entero + 1
Debug.Print
End If
Loop
'lebera los objetos
registros.Close
Set registros = Nothing
End Sub

El siguiente ejemplo lista los pedidos realizados durante 1998 que se distribuyeron después de la fecha prevista. La tabla Orders contiene las columnas ShippedDate y RequiredDate, que hacen posible realizar la tarea con una unión reflexiva.

Sub union1998()
'declaramos las variables
Dim sentencia As String
'establecemos las variables
sentencia = "SELECT o1.OrderID, o1.ShippedDate, " & _
"o2.RequiredDate " & _
"FROM Orders AS o1 " & _
"INNER JOIN Orders AS o2 " & _
"ON (o1.OrderID = o2.OrderID) " & _
"AND (o1.ShippedDate > o2.RequiredDate)" & _
"WHERE Year(o1.OrderDate) = 1998"
recordss sentencia

End Sub

Sub recordss(sentencia As String)
Dim registros As ADODB.Recordset
Dim campo As Field
Dim entero As Integer

Set registros = New ADODB.Recordset
registros.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & CurrentProject.Path & "\Northwind.mdb"
registros.Open sentencia

entero = 1
Do Until registros.EOF
Debug.Print "Resultado: " & entero
For Each campo In registros.Fields
If Not (campo.Type = adLongVarBinary) Then _
Debug.Print String(5, " ") & _
campo.Name & " = "; campo.Value
Next campo
registros.MoveNext
If entero >= 10 Then
Exit Do
Else
entero = entero + 1
Debug.Print
End If
Loop
'lebera los objetos
registros.Close
Set registros = Nothing
End Sub

Selección con uniones externas y uniones reflexivas


lunes, 23 de enero de 2012


Las uniones internas mezclan registros de dos tablas cuando los registros satisfacen los criterios de la unión como por ejemplo, que tengan valores iguales para un campo. Access permite otros tipos de uniones. Por ejemplo, se puede forzar que todos los registros de una tabla aparezcan en un conjunto de resultados sin importar si satisfacen la condición, a esto se le llama la unión externa.

Uniones externas por la derecha.

La unión se lleva a cabo entre dos orígenes de datos. SQL declara estos orígenes como orígenes izquierdo y derecho dependiendo del orden de argumentos en la clausula FROM , el primer origen de datos es el izquierdo y el segundo el derecho.

Sub derecha()
'declaramos las variables
Dim sentencia As String
'establecemos las variables
sentencia = "SELECT c.CategoryName, p.ProductName, p.Discontinued " & _
"FROM Categories c RIGHT OUTER JOIN Products p " & _
"ON c.CategoryID = p.CategoryID " & _
"WHERE IsNull(p.CategoryID)"
recordss sentencia
End Sub

Sub recordss(sentencia As String)
Dim registros As ADODB.Recordset
Dim campo As Field
Dim entero As Integer

Set registros = New ADODB.Recordset
registros.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & CurrentProject.Path & "\Northwind.mdb"
registros.Open sentencia

entero = 1
Do Until registros.EOF
Debug.Print "Resultado: " & entero
For Each campo In registros.Fields
If Not (campo.Type = adLongVarBinary) Then _
Debug.Print String(5, " ") & _
campo.Name & " = "; campo.Value
Next campo
registros.MoveNext
If entero >= 10 Then
Exit Do
Else
entero = entero + 1
Debug.Print
End If
Loop
'lebera los objetos
registros.Close
Set registros = Nothing
End Sub

Selección de uniones internas


lunes, 23 de enero de 2012


Una de las características mas eficaces de las consultas de selección es su capacidad de combinar dos o mas tablas en una virtual. Una unión ofrece un modo de lograr esto. Esta técnica solo permite mezclar dos tablas. Pero se pueden mezclar dos tablas con un tener origen de datos y mezcla ese resultado con otro,etc. El conjunto de resultados de la consulta de selección puede incluir los campos de cualquiera de los orígenes de daos que mezcla.

Se pueden unir dos orígenes de datos sobre cualquier campo o campos con el mismo tipo de datos siempre que no seas tipos de datos memo y OLEObject. Las tablas a unir se indican como argumentos de la palabra clave FROM de una consulta de selección. Los nombres de la tabla se separan con palabras clave INNER JOIN.  Después del segundo origen de datos se escribe la palabra clave ON, que indican la siguiente identificación de los campos de cada origen de datos.

Sub innerjoin()
'declaramos las variables
Dim sentencia As String
'establecemos las variables
sentencia = "SELECT Categories.CategoryName, Products.ProductName,Products.Discontinued " & _
"FROM Categories INNER JOIN Products " & _
"ON Categories.CategoryID = Products.CategoryID"
recordss sentencia
End Sub


Sub recordss(sentencia As String)
Dim registros As ADODB.Recordset
Dim campo As Field
Dim entero As Integer

Set registros = New ADODB.Recordset
registros.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & CurrentProject.Path & "\Northwind.mdb"
registros.Open sentencia

entero = 1
Do Until registros.EOF
Debug.Print "Resultado: " & entero
For Each campo In registros.Fields
If Not (campo.Type = adLongVarBinary) Then _
Debug.Print String(5, " ") & _
campo.Name & " = "; campo.Value
Next campo
registros.MoveNext
If entero >= 10 Then
Exit Do
Else
entero = entero + 1
Debug.Print
End If
Loop
'lebera los objetos
registros.Close
Set registros = Nothing
End Sub

La sentencia SQL de este ejemplo final de uniones internas agrupa los registros por el campo CompanyName de la tabla Customers y calcula los ingresos de cada cliente.

Sub innerjoin3()
'declaramos las variables
Dim sentencia As String
'establecemos las variables
sentencia = "SELECT c.CompanyName, " & _
"FORMATCURRENCY(" & _
"SUM(od.[UnitPrice]*od.[Quantity]*(1-od.[Discount])),2) " & _
"AS Ingresos " & _
"FROM (Customers c " & _
"INNER JOIN Orders o ON c.CustomerID = o.CustomerID) " & _
"INNER JOIN [Order Details] od " & _
"ON o.OrderID = od.OrderID " & _
"GROUP BY c.CompanyName " & _
"ORDER BY " & _
"SUM(od.[UnitPrice]*od.[Quantity]*(1-od.[Discount])) DESC"
recordss sentencia
End Sub

Sub recordss(sentencia As String)
Dim registros As ADODB.Recordset
Dim campo As Field
Dim entero As Integer

Set registros = New ADODB.Recordset
registros.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & CurrentProject.Path & "\Northwind.mdb"
registros.Open sentencia

entero = 1
Do Until registros.EOF
Debug.Print "Resultado: " & entero
For Each campo In registros.Fields
If Not (campo.Type = adLongVarBinary) Then _
Debug.Print String(5, " ") & _
campo.Name & " = "; campo.Value
Next campo
registros.MoveNext
If entero >= 10 Then
Exit Do
Else
entero = entero + 1
Debug.Print
End If
Loop
'lebera los objetos
registros.Close
Set registros = Nothing
End Sub

HAVING


miércoles, 18 de enero de 2012

Añadiendo una clausula HAVING a una sentencia SQL con una clausula GROUP BY, se puede filtrar el conjunto de resultados de la sentencia SQL. La clausula HAVING funciona como una clausula WHERE, exceptuado que la clausula HAVING filtra los resultados de una clausula GROUP BY.

Sub having()
'declaramos las variables
Dim sentencia As String
'establecemos las variables
sentencia = "SELECT Discontinued, CategoryID, SUM(UnitsInStock) " & _
"As [Unidades en almacen] " & _
"FROM Products " & _
"GROUP BY Discontinued, CategoryID " & _
"HAVING Discontinued = TRUE AND SUM(UnitsInStock)>0"
recordss sentencia
End Sub

Sub recordss(sentencia As String)
Dim registros As ADODB.Recordset
Dim campo As Field
Dim entero As Integer

Set registros = New ADODB.Recordset
registros.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & CurrentProject.Path & "\Northwind.mdb"
registros.Open sentencia

entero = 1
Do Until registros.EOF
Debug.Print "Resultado: " & entero
For Each campo In registros.Fields
If Not (campo.Type = adLongVarBinary) Then _
Debug.Print String(5, " ") & _
campo.Name & " = "; campo.Value
Next campo
registros.MoveNext
If entero >= 10 Then
Exit Do
Else
entero = entero + 1
Debug.Print
End If
Loop
'lebera los objetos
registros.Close
Set registros = Nothing
End Sub

GROUP BY


miércoles, 18 de enero de 2012

El siguiente ejemplo calculas las unidades en almacén de la tabla productos de la base de datos Northwind para productos agrupados por si se han dejado de vender o no y por su categoría.

Sub groupby()
'declaramos las variables
Dim sentencia As String
'establecemos las variables
sentencia = "SELECT Discontinued, CategoryID, SUM(UnitsInStock) AS [Unidades en almacen]" & _
"From Products " & _
"GROUP BY Discontinued, CategoryID"
recordss sentencia
End Sub

Sub recordss(sentencia As String)
Dim registros As ADODB.Recordset
Dim campo As Field
Dim entero As Integer

Set registros = New ADODB.Recordset
registros.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & CurrentProject.Path & "\Northwind.mdb"
registros.Open sentencia

entero = 1
Do Until registros.EOF
Debug.Print "Resultado: " & entero
For Each campo In registros.Fields
If Not (campo.Type = adLongVarBinary) Then _
Debug.Print String(5, " ") & _
campo.Name & " = "; campo.Value
Next campo
registros.MoveNext
If entero >= 10 Then
Exit Do
Else
entero = entero + 1
Debug.Print
End If
Loop
'lebera los objetos
registros.Close
Set registros = Nothing
End Sub

Utilización con la clausulas GROUP BY y HAVING


miércoles, 18 de enero de 2012

Un campo agregado es campo calculado que calcula el resultado a lo largo de varias filas en lugar de dentro de una fila. Además, un campo agregado utiliza una de las funciones de agregado de SQL.
Las funciones obvias de SQL son SUM, AVG y COUNT. Las otras funciones SQL sobre un  campo agregado pueden incluir las que calculan la desviación estándar y la varianza, buscan los valores mínimo o máximo y devuelven el primer o ultimo valor de un conjunto de resultados.
La clausula GROUO BY agrupa varios registros con los mismos valores en una única fila del conjunto de resultados.

Sub funciones()
'declaramos las variables
Dim sentencia As String
'establecemos las variables
sentencia = "SELECT FORMATCURRENCY(SUM(UnitPrice*Quantity*(1-Discount)),2) AS [Total Ventas]," & _
"COUNT(OrderID) AS [Total lineas de pedido], FORMATCURRENCY(AVG(UnitPrice*Quantity*(1-Discount)),2)" & _
"AS [Media ingresos/elemento] FROM [Order Details]"
recordss sentencia
End Sub

Sub recordss(sentencia As String)
Dim registros As ADODB.Recordset
Dim campo As Field
Dim entero As Integer

Set registros = New ADODB.Recordset
registros.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & CurrentProject.Path & "\Northwind.mdb"
registros.Open sentencia

entero = 1
Do Until registros.EOF
Debug.Print "Resultado: " & entero
For Each campo In registros.Fields
If Not (campo.Type = adLongVarBinary) Then _
Debug.Print String(5, " ") & _
campo.Name & " = "; campo.Value
Next campo
registros.MoveNext
If entero >= 10 Then
Exit Do
Else
entero = entero + 1
Debug.Print
End If
Loop
'lebera los objetos
registros.Close
Set registros = Nothing
End Sub

Selección y ordenación con campos calculados


martes, 17 de enero de 2012

Un campo calculado es un campo que el código SQL calcula por cada fila de un origen de datos. El calculo se puede realizar sobre valores cadena, entero, moneda o punto flotante. Un campo calculado une dos o mas valores de columnas independientes en una nueva columna en la tabla virtual que define una sentencia SELECT.

La clausula ORDER BY se utiliza en una sentencia SELECT para sobrescribir el orden predeterminado de las filas de un conjunto de resultados. La clausula ORDER BY debería ser la ultima clausula en la sentencia SQL de una consulta de selección. Esta clausula define los campos por los que se ordenan las filas del conjunto de resultados.

En el siguiente ejemplo demuestra la sintaxis para combinar dos columnas con cadenas en una columna calculada. Estas columnas las sacaremos de la tabla Employes de la base de datos Northwind.

Sub unircampos()
'declaramos las variables
Dim sentencia As String
'establecemos las variables
sentencia = "SELECT FirstName & ' ' & LastName AS [Nombre Completo], City FROM Employees"
recordss sentencia
End Sub

Sub recordss(sentencia As String)
Dim registros As ADODB.Recordset
Dim campo As Field
Dim entero As Integer

Set registros = New ADODB.Recordset
registros.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & CurrentProject.Path & "\Northwind.mdb"
registros.Open sentencia

entero = 1
Do Until registros.EOF
Debug.Print "Resultado: " & entero
For Each campo In registros.Fields
If Not (campo.Type = adLongVarBinary) Then _
Debug.Print String(5, " ") & _
campo.Name & " = "; campo.Value
Next campo
registros.MoveNext
If entero >= 10 Then
Exit Do
Else
entero = entero + 1
Debug.Print
End If
Loop
'lebera los objetos
registros.Close
Set registros = Nothing
End Sub

Predicados de la palabra clave SELECT de Jet SQL


martes, 17 de enero de 2012

Predicado
Comportamiento
ALL
SELECT devuelve todas las filas de un conjunto de resultados si ningún filtro. Este es el comportamiento predeterminado de la sentencia SELECT.
DISTINCT
Se corresponde con la propiedad valores únicos de una consulta de Access. No muestra duplicados.
DISTINCTROW
Se corresponde con la propiedad registros únicos de una consulta de Access. En la mayoría de los casos el predicado DISTINCT resulta mas adecuado para eliminar duplicados. DISTINCTROW resulta mas útil al unir orígenes de datos donde la lista de campos de la sentencia SELECT no incluya al menos una columna de cada tabla.
TOP n [Percent]
Devuelve los primeros n registros o solo el n por ciento de los registros, donde n es valor entero.

Selección de la palabra DISTINCT


martes, 17 de enero de 2012

Cuando se trabaja con datos importados desde sistemas antiguos, normalmente se encuentran situaciones donde los valores están repetidos. Muchas aplicaciones que trabajan con este tipo de datos requieren una lista de valores únicos en un conjunto de resultados. Por ejemplo cuando trabajamos con un cuadro combinado, no deseamos  que los elementos del cuadro combinado se repitan, incluso aunque estén repetidos en el origen.

El siguiente ejemplo se base en una tabla llamada Order Details de la base de datos Northwind en la cual el campo OrderID se repiten los registros mostraremos con la palabra clave DISTINCT que no se muestren los registros.

Registros duplicados sin DISTINCT

Sub duplicados()
'declaramos las variables
Dim sentencia As String
'establecemos las variables
sentencia = "SELECT OrderID FROM [Order Details]"
recordss sentencia
End Sub

Sub recordss(sentencia As String)
Dim registros As ADODB.Recordset
Dim campo As Field
Dim entero As Integer

Set registros = New ADODB.Recordset
registros.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & CurrentProject.Path & "\Northwind.mdb"
registros.Open sentencia

entero = 1
Do Until registros.EOF
Debug.Print "Resultado: " & entero
For Each campo In registros.Fields
If Not (campo.Type = adLongVarBinary) Then _
Debug.Print String(5, " ") & _
campo.Name & " = "; campo.Value
Next campo
registros.MoveNext
If entero >= 10 Then
Exit Do
Else
entero = entero + 1
Debug.Print
End If
Loop
'lebera los objetos
registros.Close
Set registros = Nothing
End Sub

Registros no duplicados con DISTINCT

Sub noduplicados()
'declaramos las variables
Dim sentencia As String
'establecemos las variables
sentencia = "SELECT DISTINCT OrderID FROM [Order Details]"
recordss sentencia
End Sub

Sub recordss(sentencia As String)
Dim registros As ADODB.Recordset
Dim campo As Field
Dim entero As Integer

Set registros = New ADODB.Recordset
registros.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & CurrentProject.Path & "\Northwind.mdb"
registros.Open sentencia

entero = 1
Do Until registros.EOF
Debug.Print "Resultado: " & entero
For Each campo In registros.Fields
If Not (campo.Type = adLongVarBinary) Then _
Debug.Print String(5, " ") & _
campo.Name & " = "; campo.Value
Next campo
registros.MoveNext
If entero >= 10 Then
Exit Do
Else
entero = entero + 1
Debug.Print
End If
Loop
'lebera los objetos
registros.Close
Set registros = Nothing
End Sub