|
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 Superbased, 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 compertir 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 apliación que se va a desarrollar.
CONSTRUCCION 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 flippies, 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 secuendario
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 directmanete. 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 apareiendo
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
CARACTERISTICAS.
|
PROGRAMA:
Es extactamente el mismo campo que el fichero anterior, por lo
que debe seguir con los mismos pasos.
CODIGO:
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.
NUMERO:
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 catacteres. 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.
POSESION:
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 INDICES
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 lsitados 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 unr egistro con el mismo contenido
en el campo PROGRAMA. Para el segundo, tras volver a aparecer el requester,
selecionaremos "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.
|
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
confuciones al sistema.
|
EL
LENGUAJE DE
PROGRAMACION
DML
ES MUY
SIMILAR
AL BASIC
Y MUY FACIL
DE UTILIZAR,
ADEMAS
DE SER
UN LENGUAJE
DE ALTO NIVEL
|
EL PROGRAMA DE GESTION 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 contario, deben ir oblugatoriamente
en la primera columna para que SBase las reconozca como tales. Una vez
haya terminado de introducirlo, selecciones la opcioó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 vyelva a ejecutarlo. Las instrucciones
REM son comentarios. Si no quiere, no tiene por qué teclearlos.
Otra manera de ejcutarlo 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 opcioó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 programay 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 termianr las condiciones
del mismo, etc. En el programa se incluye, junto a los comandos utilizados,
una corta explicacion 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á ejeuctarlo 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 aparecem 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
|
|