Extraer

Hola, quisiera tu ayuda.
Tengo una TB(Access) con 10 campos, el 1ero es el registro llave los otros 9 tienen información relacionado con el 1ero. Yo quiero contar cuantas veces se repite la información en los 9 campos restantes, es decir si el campo 2 y el 4 tienen información igual, quiero guardar en una variable un 2, si el campo 3, 5, 8 la información de estos es la misma dejar en otra variable un 3 y así seguidamente hasta que llegue al final del registro para después pasar la información de las variables a una TB que ya tengo hecha. La información de los campos son números enteros, esto lo programare en VB6.
Gracias
2

2 respuestas

Respuesta
1
Por lo que usted describe pareciera que su tabla no está muy normalizada ya
que tiene múltiples campos que contienen el mismo tipo de información.
Eliminar grupos cíclicos (así se llama este tipo de configuración) es
necesario para alcanzar la primera forma normal. Si su base de datos
estuviera en 1NF bastaría con hacer un simple:
SELECT COUNT(*) FROM Tabla2 WHERE Tabla2.Campo1 = Tabla1.Campo1 GROUP BY
Tabla2. Campo2
Pero no se preocupe, todos cometemos este pecado cuando diseñamos tablas de
"Persona" con los campos "Teléfono_1" y "Teléfono_2" y tiene una solución
fácil en Visual Basic:
Dim Cuenta(2 to 10) As Int
Dim i As int, j As int
For i=2 to 10
Cuenta(i) = 0
for j=i to 10
if RS.Fields(i-1) = RS.Fields(j-1) Then Cuenta(i)=Cuenta(i)+1
Next j
Next
En este ejemplo se asume que los campos están creados en la tabla
físicamente en el mismo orden lógico, es decir, al campo 1 le corresponde la
posición 0 en la colección "Fields" (por eso se hace referencia a
Fields(i-1) y Fields(j-1) )
El problema no es de mala normalización no lo creo, la información que se guardara, Ej. El 1er registro es la llave, este será un numero que se le asignara aun expediente POR, luego este expediente pasara a otra área de trabajo, las áreas de trabajo tienen asignado un numero Ej.: Contabilidad es el 200, finanzas es el 201 etc. Cuando el expediente llegue a cualquier área por medio de la aplicación lo recibirán y en un campo de la TB se guardara la fecha que lo esta recibiendo así como el numero del área que lo recibe, cuando esta termine de trabajar el expedienté, se lo traspasara a otra área, esta de igual forma lo recibirá y en otro campo se guardara la fecha de recibido y el numero del área, de igual forma este expedienté puede regresar a un área por la que ya ha pasado ya sea por que este incompleto de igual manera tendrá que recibirlo y guardar le fecha y el numero del área, es por eso que lo que yo quiero contar cuantas veces estuvo el expedienté en cada una de las áreas de trabajo.
Gracias
Así que la estructura de tu registro es :
CodExp, A1, F1, A2, F2,..., A10, F10
Donde el CodExp es el campo código clave de expediente, i A1 es el numero de Área (200) i F1, es la fecha en la que se recibió, i los registros que tienes pueden repetir en una área o departamento varias veces con fechas distintas. Si lo tienes montado así la única forma de contar las veces que se repite el Área en cada expediente es haciendo el recorrido por todos los campos de cada registro i comparando valores, tal i como te indique en la respuesta anterior.
A lo que me refería con lo de la normalización es que si hubieras montado la tabla normalizada del tipo
CodExp, Área, Fecha (como clave los 3 campos o sino insertas un autonumérico interno)
1000 200 10/10/2001
1000 201 11/10/2001
1000 200 12/10/2001
Si lo montas de esta forma con un simple count SQL agrupado por área tienes las veces que se repite cada área por un mismo expediente.
Respuesta
1
Lo primero es saber que tipo de información vas a guardar en la otra TB, pero podríamos realizarlo como sigue (dando los ejemplos tuyos):
valor repeticion C1 C2 C3 C4 C5 C6 C7 C8 C9 C0
----------------------------------------------------------------------
8 2 F V F V F F F F F F
7 3 F F V F V F F V F F
Ahora para leer los datos de el registro, hay que realizarlo de esta manera:
Dim db as database
Dim rs as recordset
Dim i,j as integer
Dim check(10) as boolean
Set db = OpenDatabase(" c:\archivo.mdb")
Set rs =Openrecordset("archivo")
While Not rs.EOF
'Para desactivar el chequeo de campos
For i=1 to 10
check(i)=false
next
For i=1 to 10
For j=1 to 10
If (rs.fields(i)=rs.fields(j)) And check(j)=false then
valor=valor+1
check(j)=true
endif
next
'Guardar el valor del conteo a una variable
variable=conteo1
Next
rs.movenext
WEnd
Ahora es solo cuestión de guardar las variables que se tiene inclusive se puede usar un arreglo.
Espero haberte ayudado
Suerte
Luis

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas