|
Por Roberto Corrochano
NOTA: Las fotos con recuadro en azul pueden ser ampliadas para ver detalles. Situando el ratón encima de la foto durante unos instantes, podrás ver una pequeña descripción y lo que ocupa la ampliación.
En ocasiones ciertas utilidades y paquetes de programas muy buenos pasan desapercibidos al usuario, ya sea por falta de información o porque, simplemente, busca otro tipo de software. No es este el caso de Superbase, base de datos ampliamente conocida. Sin embargo, las posibilidades de esta aplicación no lo son tanto y desde estas páginas vamos a intentar mostrar toda su potencia.
Pantalla de definición de ficheros. |
El usuario de Amiga no espera encontrar una base de datos capaz de competir con otras famosas bases de otros sistemas, y por ello, ésta se ha dejado muy de lado, relegándose su uso al manejo de ficheros simples, limitándose a utilizar el interfaz de usuario de la misma.
En este tutorial se van a intentar demostrar, dentro de un orden, las posibilidades de un programa de este tipo, y ayudar al usuario con gran cantidad de explicaciones sobre la aplicación que se va a desarrollar.
CONSTRUCCIÓN DE LA BASE DE DATOS
Para este propósito se ha elegido construir una base de datos de diskettes, con el objetivo de tenerlos todos clasificados por un código numérico, pudiendo acceder a los mismos por orden alfabético y por tipo, y con la posibilidad de sacar listados y etiquetas por impresora. El equipo necesario es un Amiga de cualquier modelo, con al menos, 1Mb de RAM; es indistinto que funcione desde floppy o desde disco duro, pero se recomienda este último por razones de velocidad de acceso; y, por supuesto, Superbase 4 Professional. La aplicación va a constar de dos ficheros con los datos de los floppies, un fichero con el formato de pantalla, otros dos con los tipos de listados de impresora, otro con el de las etiquetas, otro con las teclas programables y otro fichero con el programa en sí, que deberá ser tecleado desde el editor de programas de SB4.
PRIMEROS PASOS
En esta captura de pantalla se muestra la solicitud de tipo de texto. |
Para empezar, elegiremos y crearemos, si no existe uno adecuado al caso, el directorio donde van a estar los ficheros, preferentemente el mismo para ambos y para el programa. Esto es importante, ya que, una vez creados, no pueden ser movidos desde el sistema operativo. Por ello, el directorio de creación será definitivo.
Planteándonos las necesidades de la base de datos. El primario será de cabecera, y contendrá todos los datos del programa, mientras que el secundario contendrá los datos de todos los floppies que pertenezcan a ese programa. Podremos crearlos a partir de programa adjunto a este artículo o "a mano", con la opción Project -> New -> File de Sb4. Recomendamos esta última, ya que es útil e importante familiarizarse con el modo de edición de ficheros de SB4, ya sea para esta aplicación o para otras futuras o de propia creación. Tras seleccionarla, seleccionaremos el directorio donde queremos tener la aplicación y le daremos, como nombre, CABECERA. Tras esto, pedirá passwords para proteger nuestro fichero, pero no son necesarios a menos que quiera proteger los ficheros, por lo que contestaremos a todos con ENTER o seleccionaremos ok directamente. En la pantalla de definición de ficheros, que aparece en la figura 1, introduciremos los siguientes campos, que son los necesarios según nuestro criterio, teniendo cuidado de no poner ninguna tilde ortográfica, pues corrompería el campo:
PROGRAMA: campo alfanumérico en mayúsculas de 35 caracteres. Contendrá el nombre y versión del programa. Para introducirlo, escribiremos el nombre del campo en el recuadro "Field". Tras esto, seleccionaremos con el ratón la opción "Text", hasta que aparezca la pantalla de selección, cuyo aspecto y formato es como el de la figura 2, es la que indicaremos 35 en el recuadro "Text format" y seleccionaremos "Upper case" para definirlo como mayúsculas. Finalizaremos la selección con "Ok2 y pulsaremos "Add" en la pantalla de definición de ficheros para añadir el campo a nuestro fichero.
TOTAL: campo numérico entero positivo de dos posiciones. Contendrá el total de floppies que pertenecen al programa. En esta aplicación, el número máximo será de 12, pues son las líneas de transacción que vamos a definir en el formato de pantalla. La manera de crearlo es similar a la del campo anterior, excepto que se seleccionará "Numeric" en lugar de "Text". Tras esto, en la pantalla de selección de tipo numérico que aparecerá, similar a la figura 3, seleccionaremos, en la primera fila de botones, 9.0; en la segunda, 99, con lo que únicamente aceptará valores absolutos; en la tercera, también 99, ya que no necesitamos símbolos de porcentaje o moneda; nada en la cuarta; e "Integer" en la quinta, para que el número sea entero. Tras ello, con las flechas a la izquierda del recuadro "Number format" dejaremos 99, en el mismo.
En esta captura de pantalla se muestra la definición de los campos numéricos. |
TIPO: campo alfanumérico en mayúsculas de 8 caracteres. Va a contener el tipo de programa. En este caso, debemos validar este campo, limitándolo a que contenga sólo tipos como juego, utilidad o demo, por razones de simplicidad a la hora de sacar listados por tipos o aplicar filtros de exclusión. Para añadirlo, se debe proceder como en el campo PROGRAMA, salvo que la longitud será de 8 y que, tras pulsar "Add", debemos pulsar volver a seleccionarlo y pulsar "Validate" para validarlo. En la pantalla de validación, que aparece en la figura 4, seleccionaremos con el ratón los campos, los operandos y sus valores en el recuadro "Value" según la siguiente fórmula:
TIPO.CABECERA = "UTILIDAD" OR
TIPO.CABECERA = "JUEGO" OR
TIPO.CABECERA = "DEMO"
TIPO.CABECERA aparecerá al pulsar con el ratón "TIPO" en la ventana de la izquierda. Después, deberá pulsar "=", y escribir UTILIDAD en el recuadro "Value". Acto seguido, pulsará "OR" y repetirá la operación con los dos valores restantes hasta completar la fórmula anterior. Si se equivoca, editela directamente en el recuadro en el que va apareciendo pulsando en él con el ratón.
Tras esto, seleccione "Ok" y, en la pantalla de definición de ficheros, pulse con el ratón en la ventana de los campos un renglón por debajo de TIPO para seleccionar un campo vacío. Esto es importante por que, si no, cualquier intento de definir un nuevo campo se tomará como intento de modificación del campo TIPO, incluido el nombre.
CLASE: campo alfanumérico en mayúsculas de 25 posiciones. Este campo es un complemento del campo tipo, y va a servir para concretar el mismo. P.e., un juego puede ser un mata-marcianos, una videoaventura... y una utilidad puede ser un procesador de textos, un sequencer, etc. Esto es lo que debe contener el campo. Debería estar validado, de tal forma que sólo se puedan introducir unos valores concretos para facilitar las tareas de filtrado y listado, pero como hay una gran variedad de posibles valores a introducir, esto es una labor imposible desde SB4. Se podría hacer por medio del programa, pero es preferible dejarlo tal cual por razones de compatibilidad con futuros tipos de programas, programas que no responden a una sola clasificación, etc. Para crearlo, proceda como en el campo PROGRAMA, salvo que el nombre será CLASE, y la longitud, 25.
En esta captura de pantalla se muestra el requester para definir la validación (los filtros) que acotarán un campo. |
COMENTARIO: campo alfanumérico en mayúsculas de 50 posiciones. El campo en cuestión va a contener comentarios a los programas, como claves, valoración, etc. Para definirlo, proceda como en el campo PROGRAMA pero con 50 posiciones.
FECHA: campo tipo fecha. Va a contener la fecha de la última actualización que se hizo al programa contenido en el registro. Para crearlo, escriba FECHA en el "Field" y seleccione "Date/Time". En esta pantalla definiremos el formato de la fecha. Se puede definir el que más convenga. Para esta aplicación hemos seleccionado dd-mm-yyyy, es decir, dos dígitos para el día, dos para el mes, y dos para el año con separación por guiones. Esto se puede definir con los botones "Day Month Year", "MM", "YYYY" y "-". Como el programa rellenará la fecha automáticamente cuando se necesite, el formato de la misma es secundario. Solamente se tendrá en cuenta a la hora de definir el formato de pantalla.
Una vez definido el fichero, pulsaremos "Ok" en la pantalla de definición, y SB4 nos preguntará qué índice escogemos para el fichero. Pulsaremos "PROGRAMA" teniendo ya seleccionado "Unique index", después "Ok" y otra vez "Ok" para finalizar la selección. Con esto habremos definido el fichero primario CABECERA.
Para crear el fichero secundario, DATOS, procederemos de la misma manera, con Project -> New -> File, salvo que los campos que necesitaremos van a ser otros. Vamos a necesitar el campo con el nombre del programa, como enlace con el fichero primario; un campo código, con el código numérico de nuestra ordenación de diskettes; un campo número, que contendrá el número ordenal de los diskettes dentro el paquete; un campo tipo, con las posibles tipos de diskettes que tenga el paquete: fonts, pantallas, programa, soporte, etc.; un campo formato, con datos de interés sobre el formato en que esté: DOS/0, DOS/3, HD, DMS, LHA, y demás; y un campo que contenga el nombre o referencia de quien tenga el diskete, si lo hemos prestado.
LA TAREA
DE COMPRAR
UN DIGITALIZADOR
PUEDE SER DIFICIL.
NO ESTA
DE MAS AFIRMAR
QUE CUANTO
MAS RECIENTE SEA
EL DIGITALIZADOR,
MEJORES
SERAN LAS
CARACTERÍSTICAS. |
PROGRAMA: Es exactamente el mismo campo que el fichero anterior, por lo que debe seguir con los mismos pasos.
CÓDIGO: campo numérico de 4 posiciones enteras. Contiene la posición real del diskete en nuestros archivadores, usando un sitemas de numeración del 1 al 9999 con un número por diskette, no por programa. Para introducirlo, actúe como en el campo TOTAL de la base anterior, pero el parámetro que debe quedar ha de ser 9999.
NÚMERO: campo numérico de 2 posiciones enteras. Va a ser manejado por programa, y contendrá el número de orden de los distintos diskettes que pertenezcan a un programa dentro del mismo. La manera de crearlo es la misma que en anteriores campos numéricos, excepto que el parámetro debe ser 99.
CONTENIDO: campo de texto en mayúsculas de 10 caracteres. Este campo va a recibir el tipo de contenido de cada uno de los diskettes que pertenezcan a un programa o paquete. El modo de definir este campo es exactamente el mismo que en los anteriores campos de texto, salvo que la longitud será 10.
FORMATO: campo de texto en mayúsculas de 5 caracteres. Este campo recibirá información sobre el formato en el que está el disco. esto es útil como información para el usuario, pues un disco formateado en modo internacional no es legible bajo sistema operativo inferior al 2.0, así como los diskettes formateados en alta densidad han de ser leídos por una disquetera adecuada que sólo pueden manejar los nuevos Amiga (1.200 y 4.000). El modo de crearlo es el que hemos visto hasta ahora con campos de tipo texto, pero la longitud ha de ser 5.
POSESIÓN: Campo tipo texto de 15 caracteres mayúsculos. Este campo va a contener el nombre o la referencia de la persona que tenga los diskettes, en caso de que los hayamos prestado. Este campo ha de ser introducido a la manera ya usual para campos de tipo texto, con longitud 15.
LOS ÍNDICES
Con esto finalizaremos la creación de campos y pulsaremos "Ok" en la pantalla de definición. Los índices de este fichero van a ser dos: por PROGRAMA y por CODIGO. El primero es necesario para encadenar y relacionar ambos ficheros, y el segundo, útil para los listados de diskettes y control interno del programa, pues éste buscará un hueco en la ordenación que sea mayor o igual que el número de diskettes que tiene el paquete para aprovechar mejor el espacio y no tener que separarlos espacialmente, y esta rutina se guía secuencialmente por el los códigos de los diskettes presentes en el archivo, por lo que es necesario crear un índice para facilitar la tarea. Pero crearlos, en la pantalla de requerimiento o requester de índices, seleccionaremos "Normal index", después pulsaremos en PROGRAMA y en "Ok". Con ello estará definido el primer índice, que ha de ser el tipo normal porque habrá más de un registro con el mismo contenido en el campo PROGRAMA. Para el segundo, tras volver a aparecer el requester, seleccionaremos "Unique index", pulsaremos en CODIGO y, si todo es correcto, en "Ok". Con esto habremos definido el segundo índice, que ha de ser único, pues cada disco ha de tener solamente una referencia. Para finalizar la selección, pulsaremos "Ok" de nuevo cuando aparezca otra vez el requester vacío.
EL LENGUAJE DE
PROGRAMACIÓN
DML
ES MUY
SIMILAR
AL BASIC
Y MUY FÁCIL
DE UTILIZAR,
ADEMÁS
DE SER
UN LENGUAJE
DE ALTO NIVEL |
Si ha seguido correctamente los pasos anteriores, tendrá creados los dos ficheros que van a servir de soporte a la aplicación, DATOS y CABECERA. Estos ficheros, por separado, pueden ser rellenados manualmente desde el mismo editor de SB4, pero no tendrán utilidad real si no están relacionados, lo cual debe hacerse en el formato de pantalla que deberá crear usted mismo con el programa SBFDPro de SB4 y del que daremos amplias instrucciones posteriormente, y éste, a su vez, deberá ser manejado desde programa. Si le es de utilidad puede rellenar estos ficheros, pero cuando hayan de ser manejados desde el formato de pantalla y el programa deberá borrar los contenidos para evitar confusiones al sistema.
EL PROGRAMA DE GESTIÓN DE LA BASE DE DATOS
El programa que acompaña al artículo crea, por sí mismo, los ficheros. En caso de querer teclearlo, la vía para hacerlo es desde SB4, en el editor de programas al cual podrá acceder con el ratón desde la opción del menú DML -> New. Una vez dentro del editor, introduzca el programa respetando la sintaxis y cuidando de que cada línea del programa, excepto las etiquetas (p.e. añadir:), comience al menos en la segunda columna. SBase hará esto por usted, a no ser que utilice alguna opción del menú Edit, como Cut o Paste, ya que no actualizará la línea cortada o añadida. En este caso, deberá hacerse a mano. Las etiquetas, por el contrario, deben ir obligatoriamente en la primera columna para que SBase las reconozca como tales. Una vez haya terminado de introducirlo, selecciones la opción Project -> Run para ejecutarlo, o pulse la combinación de teclas AmigaDerecha+g. Si existe algún error de sintaxis, el programa no funcionará y Sbase llevará el cursor a la línea donde se halla el error. Repase la sintaxis de la misma y vuelva a ejecutarlo. Las instrucciones REM son comentarios. Si no quiere, no tiene por qué teclearlos. Otra manera de ejecutarlo es saliendo del editor con Project -> Exit y seleccionando en los menús de SBase DML -> Run. Si desea grabarlo, seleccione Save As en cualquiera de los dos menús mencionados, y asígnele un nombre. Para recuperarlo más tarde pulse la opción Open existente en ambos menús.
El uso del programa es muy sencillo. Al comenzar, preguntará por el directorio donde se va a guardar la aplicación, a lo que deberá responder con el camino completo donde se va a guardar, por ejemplo, "DF0:Clasificador" o "DH1:SBase/archivos/Clasificador". Sino encuentra el directorio, dará la opción de volver a introducirlo o abandonar. El siguiente paso es comprobar si los ficheros ya existen, y si es el caso, dará la opción de borrarlos para poder crear los nuevos o dejarlos intactos. Aconsejamos que, para mayor compatibilidad con la aplicación, los borre si existían previamente. Finalizada la creación de los ficheros, terminará la ejecución del programa y usted tendrá los ficheros creados en el directorio seleccionado.
El lenguaje de programación DML es muy similar al BASIC y muy fácil de utilizar, además de ser un lenguaje de alto nivel que, incluso, permite verdaderas burradas estructurales, como dar múltiples salidas a subrutinas o salir de bucles sin terminar las condiciones del mismo, etc. En el programa se incluye, junto a los comandos utilizados, una corta explicación de los mismo, así como datos precisos sobre la manera en que el programa actúa; pero si quiere comprender a la perfección el funcionamiento del mismo, consulte el manual de DML para comprender la función exacta de cada comando, y en cuanto al programa, deberá ejecutarlo con la opción de depuración activada, lo cual se ahce seleccionando Command en cualquiera de los menús, DML o Project; y en el requester (solicitador) que aparece, deberá teclear DEBUG ON. Con este paso se consigue que cada instrucción del programa aparezca en la ventana SB CLI Output de su Workbench según se ejecuta y en el orden preciso.
CREADOR.sbp 13 Mar 1994 18:28
REM ---Creador de los ficheros de la
REM ---aplicaci�n clasificador de diskettes
REM
REM ---Por Roberto Corrochano
REM ---Desarrollado para Amiga World
ON ERROR GOTO trampa :REM Direccionamiento a la rutina de
REM manejo de errores. Es imprescindible
REM a la hora de comprobar si se est�
REM intentando reescribir un fichero
CLOSE ALL :REM Cierra todos os ficheros abiertos para
REM evitar confusiones.
REM Definiciones de mensajes de sistema y de error.
m1$ = "Introduzca el camino completo de acceso al directorio donde"
m2$ = " quiere situar los ficheros"
m3$ = "Operaci�n de creacci�n finalizada. Podr� encontrar los fichero en"
m4$ = "el directorio "
m5$ = "El programa finaliz� sin crear o encontrar los ficheros."
me1$ = "Camino de acceso err�neo."
me2$ = "Introd�zcalo correctamente."
me3$ = " Error creando el fichero "
me4$ = "ya que existe previamente. �Desea borrarlo?."
me5$ = "Acceso al disco imposible o fichero corrupto."
me6$ = " Elija otro y ejecute el programa de nuevo."
F1$ = "CABECERA"
F2$ = "DATOS"
REM Bucle principal
bcprin:
REQUEST m1$,m2$,4,op%,dire$,60:REM Solicita el nombre del directorio
REM con long. m�xima de 60 caras.
REM Si no se introduce nada, se
REM almacena 0 en op%
IF op% = 1 THEN GOSUB a�adir
REM Si op%=0, sale del programa.
salir:
CLOSE ALL
IF dire$ <> "" THEN
REQUEST m3$,m4$, + dire$,0:REM Si el directorio (dire$) que se
REN introdujo era nulo, el
REM programa saldr� sin crear
REM los ficheros. Este primer
REM requester es el que confirma
REM que la operaci�n ha tenido
REM �xito.
ELSE
REQUEST m5$,"",0
END IF
END
a�adir:
DIRECTORY dire$:REM cambie el directorio actual de la base a dire$
REM Las siguientes variables son par�metros de la rutina de
REM creacci�n de ficheros, que es la misma para ambos.
fichero$ = f1$
paso% = 1
RESTORE primdatos:REM Lleva el puntero de DATA a la etiqueta
REM necesaria.
GOSUB crea :REM crea es la rutina de creacci�n.
IF salto% = 1 THEN RETURN
REM esta intrucci�n es necesaria, pues
REM corrige un error de la rutina de
REM tratamiento de errores que hace que,
REM si no se crea el primer fichero, el
REM segundo se crea dos veces. Esto es
REM por culpa del nivel de procedimiento,
REM ya que, aunque se resuleva el error,
REM el puntero de la subrutina sigue
REM apuntando a la l�nea anterior, y
REM cuando hace el segundo RETURN
REM salta aqu�.
segundo:
REM M�s par�metros para la rutina de creacci�n.
fichero$ = f2$
paso% = 0
RESTORE segdatos
GOSUB crea
RETURN
crea:
CREATE fichero$:REM Si intenta crear un fichero ya existente
REM producir� un error, que en la rutina de
REM depuraci�n de errores se traducir� en
REM la detecci�n del fichero antiguo y su
REM borrado, si procede.
READ t%:REM Este primer READ lee el n�mero de campos que va a
REM tener el fichero.
FOR f% = 1 TO t%:REM el bucle de esta l�nea lee y a�ade el
REM n�mero determinado de campos al fichero.
READ a$:REM Lee el dato.
IF a$ = "!" THEN
REM "!" es un car�cter de control, necesario
REM para crear campos validados, pues el formato
REM de ADD, en este caso, necesita no una sino
REM dos variables, una con la definici�n del
REM campo y otra con la f�rmula de validaci�n.
REM As� pues, "!" le indica a esta rutina que va
REM a tener que leer m�s de un dato.
REM Las siguientes instrucciones leen y componen
REM la f�rmula, la cual hay que dividir porque
REM en un articulo no cabe una l�nea de 120 cars.
READ a$
READ b$
READ c$
b$ = b$ + c$
ADD a$,b$:REM A�ade el campo validado.
ELSE
ADD a$:REM Si el dato que se ley� no era "!",
REM a�ade un campo sin validar.
END IF
next f%:REM Cierra el bucle.
MAKE fichero$:REM Aplica la definici�n del fichero y lo crea.
RETURN
primdato: REM Primer juego de datos.
DATA 6,"PROGRAMA;TXT IXU;35 U","TOTAL;NMI;99.","!"
DATA "TIPO;TXT VAL;20 U","TIPO.CABECERA = -UTILIDAD- OR TIPO.CABECERA"
DATA " = -JUEGO- OR TIPO.CABECERA = -DEMO-"
DATA "CLASE;TXT;25 U","COMENTARIO;TXT;50 U"
DATA "FECHA;DAT;dd-mm-yy"
segdatos: REM Segundo juego de datos.
DATA 7,"PROGRAMA;TXT IXD;35 U","CODIGO;NMI IXU;9999."
DATA "NUMERO;NMI;99.","NOMBRE;TXT;32","CONTENIDO;TXT;10 U"
DATA "FORMATO;TXT;5 U","POSESION;TXT;15 U"
trampa:
num% = ERRNO :REM Carga el n�mero de error en una variable.
REM La siguiente instrucci�n seleccionada entre los
REM posibles valores de num%.
SELECT CASE num%
case 12:REM Se ejecuta lo siguiente si el path no existe.
REQUEST me1$,me2$,1,op%:REM pregunta si se reintenta
REM o se finaliza el programa.
IF op$ = 1 THEN
RESUME bcprin
REM Si se selecciona Ok en el anterior
REM requester, se reejecuta el bucle principal.
REM Si no, se sale del programa por la v�a
REM de proceso incorrecto.
ELSE
dire$ = ""
RESUME salir
END IF
CASE 43:REM Corresponde al error de fichero existente.
REM La siguiente instrucci�n pregunta si se borra
REM el fichero existente o no.
REQUEST me3$ + fichero$,me4$,1,op%
IF op% = 1 THEN
REM Borrado.
OPEN FILE fichero$:REM Se ha de abrir el fichero
REM para poder borrarlo.
REMOVE FILE fichero$:REM Borrado del fichero.
RESUME :REM Esta instrucci�n devuelve el control
REM al programa en el punto en que se
REM interrumpi�.
ELSE
REM La variable paso% es un switch que indica si se
REM est� procesando el primer fichero o el segundo.
IF paso% = 1 THEN
REM Es el primer fichero.
salto% = 1:REM Switch que permite corregir
REM el error anteriormente
REM comentado.
RESUME segundo:REM Reanuda la ejecuci�n en
REM el 2� fichero.
ELSE
REM Si no, es el segundo, por lo cual solo
REM queda salir del programa.
salto% = 0
RESUME salir
END IF
END IF
CASE 52:REM Cuando no hay acceso al disco.
REQUEST me5$,me6$,0
END
END SELECT
REM Si el programa se ejecuta a partir de este punto, significa
REM que se ha producido un error no previsto, cuya probable
REM causa sea un error de Entrada/Salida o fallo del sistema.
REM Con las siguientes instrucciones, se advierte del mismo
REQUEST ERR$ (num%),"",0
CLOSE ALL
END
|
|