Hola experto: Quiero imprimir un informe basado en la consulta C_referencias4 desde un formulario. Pero antes de imprimir necesito comprobar que los registros del campo REFERENCIA de dicha consulta tienen todos ellos una longitud de 30 caracteres. Lo estoy haciendo con un campo adicional que me pone 1 si la longitud de REFERENCIA es distinta a 30 y 0 si es igual a 30. Luego tengo una consulta adicional C_referencias4_suma que me suma ese campo. Si el resultado es distinto a 0, abre un Msgbox advirtiendo del error .
Creo que podría hacerse mejor mediante un recordset, pero no se como hacerlo. ¿Podrías ayudarme? . Gracias.
Respuesta de Neckkito Nck
1
1
Neckkito Nck, Access... ser o no ser. Esa es la cuestión
Te explico el proceso entero asignándolo a un botón de un formulario, por si acaso. Así tendrás una visión "global". Como no sé tu "nivel" te lo explico paso a paso, por si acaso (sin haberlo deseado me ha salido un pareado... je, je...). Vamos allá: 1.- De ese botón de formulario sacas sus propiedades y te vas a la pestaña Eventos->Al hacer click. Verás que hay un pequeño botón de puntos suspensivos a la derecha. Haces click sobre él y, en la ventana que te sale, le dices que quieres generar código. 2.- Se te abrirá el editor de VB, con dos líneas por defecto (Private Sub... y End Sub). No debes tocarlas. En medio de ellas escribes el siguiente código (te lo pongo comentado para que sepas lo que hace). ... Private Sub... 'Declaramos las variables Dim rst as recordset 'Si trabajas con Access 2003 mejor pon: Dim rst as Object Dim vRef as variant 'Nos cogerá el valor del campo REFERENCIA Dim longRef as integer 'Nos calculará la longitud del campo REFERENCIA 'Creamos el recordset Set rst=currentdb.openrecordset("C_Referencias4") 'Esta línea es por si la consulta no contiene ningún registro If rst.recordcount=0 then msgbox "La consulta no ha devuelto ningún valor",vbInformation,"SIN VALORES" Goto Salida 'En vez de salir del proceso a través de un Exit Sub (que sería lo 'habitual), salto a la etiqueta Salida: para poder cerrar el recordset y liberar memoria End If 'Nos movemos al primer registro rst.movefirst 'Iniciamos el proceso de recorrido de registros Do until rst.EOF 'Cogemos el valor del campo REFERENCIA vRef=rst.Fields("REFERENCIA").value 'Si por casualidad el campo estuviera vacío sale del proceso con un mensaje de aviso If isnull(vRef) then msgbox "Existe una referencia sin valor",vbExclamation,"SIN VALOR" Goto Salida End If 'Calculamos la longitud del valor en REFERENCIA longRef=len(vRef) 'Comprobamos que su longitud sea 30. Si no lo es lanza un mensaje de aviso y sale del proceso If longRef<>30 then msgbox "Hay una referencia que no tiene 30 caracteres",vbExclamation,"REFERENCIA ERRÓNEA" Goto Salida End if 'Si hemos llegado hasta aquí es que todo es correcto. Pasamos a examinar el siguiente registro rst. MoveNext Loop 'Si hemos llegado hasta aquí es que todo es correcto. Imprimimos el informe DoCmd. OpenReport "NombreInforme", acViewNormal 'Si cambias acViewNormal por acViewPreview tendrás una vista previa Salida: Rst. Close Set rst=nothing End Sub ... Te he marcado en negrita el valor "NombreInforme" en el código porque tú debes cambiarlo por el nombre del informe en cuestión. Te he escrito el código de cabeza. Si tienes algún problema me lo comentas e intentamos arreglarlo.