Con su copia de MultiBase/WIN se entrega el mismo juego de manuales que se incluye en las versiones para UNIX y MS-DOS. El manual de Aplicaciones de Ofimática se incluye dado que en él se explica el funcionamiento del EasySQL y del Tprocess, comandos incluidos en MultiBase/WIN. El resto de accesorios y aplicaciones de ofimática explicadas en dicho manual no se incluyen en esta versión del producto.
Por problemas de portabilidad del código fuente de las aplicaciones desarrolladas con MultiBase/WIN, se incluye un editor de textos, de nombre «WEDIT.EXE».
El problema de la portabilidad consiste en que los juegos de caracteres utilizados por el Windows y el MS-DOS son diferentes; mientras que el primero utiliza el código ANSI, el segundo emplea el GCS#2. Por tanto, si se editan con editores de Windows programas editados previamente en MS-DOS, se pueden perder los caracteres especiales que no se correspondan en ambos juegos.
El «WEDIT.EXE» resuelve este problema utilizando el GCS#2 en Windows.
Desde un programa escrito en CTL es posible lanzar cualquier comando del sistema operativo por medio de la instrucción RUN del lenguaje. Existen sin embargo algunos comandos que no es necesario lanzar por medio de dicha instrucción. Éstos son: cp, mv, rm, mkdir y test, cuyos nombres están incluidos en la gramática del CTL.
En el caso del UNIX, la ejecución de cualquiera de estas instrucciones provoca una llamada al correspondiente comando UNIX. Sin embargo, en el caso del Windows, el CTL no sólo tiene incluida la gramática del comando, sino también su código, con lo cual no se realiza una llamada al sistema operativo y el tiempo de ejecución es menor.
La gramática de estos comandos embebidos es similar a la del UNIX, y su utilidad es la siguiente:
test -permiso fichero {-o fichero | -a fichero}
Donde «permiso» podrá ser uno de los siguientes:
-r: Permiso de lectura.
-w: Permiso de escritura.
-x: Permiso de ejecución.
-f: Fichero.
-d: Directorio.
«-o» y «-a» son operadores lógicos que equivalen a OR y AND, respectivamente.
CTL dispone de una variable interna (STATUS) que devuelve el «estado» de la ejecución de un comando del sistema operativo. Esto es así en el caso del UNIX. En MS-DOS, y dado que CTL realiza esta lla ada por medio de la función «system()», el estado que se devuelve es siempre el del «COMMAND.COM», independientemente del comando que se haya mandado ejecutar, por lo que el valor de la variable STATUS no es significativo.
En los comandos citados anteriormente, el valor de la variable STATUS sí es significativo, dado que es el propio CTL quien simula el comportamiento del comando incluyendo el valor de vuelta del estado del mismo.
Dado que en Windows no existe un mecanismo de comunicación entre procesos equivalentes al «PIPE» del UNIX, la cláusula «THROUGH», aunque compilará correctamente por compatibilidad con el UNIX, no ejecutará correctamente, sólo se simulará por compatibilidad en las instrucciones del tipo «START OUTPUT STREAM_ THROUGH PRINTER».
La cláusula «THROUGH» sin embargo funcionará correctamente cuando el STREAM esté en comunicación con un proceso en una máquina UNIX remota (ver notas a la versión 2.0 05).
El manejador de impresión de Windows («Print Manager») es una aplicación que permite instalar y configurar impresoras, conectarlas a la red y controlar la impresión de archivos.
A partir de la versión 2.0 de MultiBase, los listados lanzados desde un programa CTL (usando la cláusula «START OUTPUT_ THROUGH PRINTER») podrán realizarse a través del manejador de impresión de Windows. Para ello, la variable de entorno DBPRINT —que indica la salida del listado— deberá estar definida con el valor PRINTMAN. Por ejemplo:
set DBPRINT=PRINTMAN
Si la variable DBPRINT está definida con otro valor, se entenderá que éste es un nombre de fichero o dispositivo y por tanto no se utilizará el manejador de impresion de Windows, siendo entonces válido todo lo referente al proceso de impresión explicado en el Manual de Referencia de MultiBase. Por ejemplo:
set DBPRINT=c:\tmp\listado
o
set DBPRINT=lpt1
Si no se define DBPRINT se entenderá que su valor es «lpt1».
Si se opta por imprimir los listados directamente al puerto (p.e.: «lpt1»), es conveniente no tener asociado ese mismo puerto al manejador de impresión de Windows.
Para comprender mejor el funcionamiento del manejador de impresión vamos a definir en primer lugar algunos conceptos usados en este apartado.
Font: Un «font» (fuente) es una colección de caracteres que tienen una única combinación de altura, anchura, diseño, «set» de caracteres y otros atributos. Una aplicación utiliza «fonts» para imprimir textos con diferentes aspectos y tamaños. Los «fonts» se agrupan en familias según su diseño. Estas familias son: Decorative, Modern, Roman, Script y Swiss.
Asimismo, cada «font» tiene un diferente «set» de caracteres, que puede ser: OEM (GCS#2 de IBM), ANSI o SYMBOL. Las diferencias entre los dos primeros aparecen en los caracteres con valor mayor de 17 (básicamente eñes, vocales acentuadas y caracteres semigráficos).
Por último, los «fonts» se pueden agrupar como FIXED_PITCH («fonts» de tamaño fijo) y VARIABLE_PITCH («fonts» de tamaño proporcional), es decir, que todos los caracteres ocupan el mismo espacio o bien cada carácter tiene un determinado tamaño, respectivamente.
Cada uno de estos «fonts» podrá presentarse (si su diseño lo permite) con distintos atributos (negrita, cursiva, subrayado, tachado).
Dado que MultiBase utiliza internamente el «GCS#2» de IBM (OEM), la traducción de un «set» a otro se realiza automáticamente si se detecta que el «font» es ANSI. Esto no se puede detectar si no se usa el manejador de impresión, para lo cual se deberá definir la variable de entorno «PRTSET=ANSI» si se sabe que la impresora utiliza un «set ANSI».
Interlineado: El interlineado es el espacio vacío que se deja entre dos líneas consecutivas de texto para su mejor legibilidad. El tamaño de una línea se calcula sumando este espacio más la altura del «font».
Número de columnas de una línea: El número de columnas de una línea se calcula dividiendo el tamaño de ésta por el tamaño medio de un carácter del «font». Sólo en el caso de «fonts» de tamaño fijo se puede asegurar que el número de caracteres que caben en una línea es igual al número de columnas de una línea. MultiBase calcula estos dos últimos valores referidos al «font» que la impresora tiene por defecto.
Los distintos tipos de letra que podrán ser usados en los listados dependerán de la cantidad de «fonts» que se tengan instalados.
Los diferentes «fonts» que pueden ser usados en un listado deberán estar definidos en una entrada del fichero «TPRINTER». En su copia de MultiBase se proporciona un ejemplo en dicho fichero de lo qu podría contener esta entrada:
Windows Print Manager|PRINTMAN|PM|WIN
Para que ésta sea la entrada de listados activa, la variable de entorno RPRINTER deberá ser definida con alguno de estos equivalentes. Por ejemplo:
set RPRINTER=PM
Los controles definidos en el fichero «TPRINTER» ya no son secuencias que hayan de ser enviadas directamente a la impresora para modificar el tipo de letra, sino una descripción de los «fonts» que se van a usar. Se pueden utilizar los siguientes formatos:
nombredecontrol =nombrefont|atributos|tamaño
nombredecontrol =+atributos|tamaño
nombredecontrol =-atributos|tamaño
Donde:
nombredecontrol: El nombre que deseamos emplear para referirnos a este tipo para utilizar con la cláusula «control» de la sentencia PUT STREAM del CTL.
nombrefont: El nombre de un «font» soportado por su impresora. Si el nombre contiene varias palabras, éstas deberán unirse mediante el símbolo de subrayado. Por ejemplo: Times_New_Roman.
atributos: Opcional. Cualquier combinación de los caracteres que se indican a continuación:
—De presentación:
b: Bold (negrita).
i: Italic (cursiva).
u: Underline (subrayado).
s: Strikeout (tachado).
—De set de caracteres:
O: OEM (GCS#2 de IBM).
Y: SYMBOL («font» de símbolos).
V: VARIABLE PITCH («font» de tamaño
proporcional).
F: FIXED PITCH («font» de tamaño
fijo).
—De familia:
D: DECORATIVE.
M: MODERN.
R: ROMAN.
S: SCRIPT.
W: SWISS.
tamaño: Opcional. Tamaño de la letra.
El manejador de impresión de Windows buscará el «font» que más se aproxime a esta descripción entre los que estén disponibles.
Si se utiliza el segundo o tercer formato en «TPRINTER» indicará que se quiere usar el tipo de letra en curso modificándolo, añadiendo o eliminando los atributos, respectivamente. En estos casos sólo tienen sentido los atributos «bold», «italic», «underline» y «strikeout», y el tamaño si se especifica.
Se podrá especificar un «font» para que éste sea utilizado por defecto. Dicho «font» deberá definirse en la sección «.CONFIGURATION» del fichero «MB.INI». Por ejemplo:
PRINTMANFONT =Times_New_Roman
Al usar el manejador de impresión de Windows cada página del listado está definida como una matriz de «l x c» (líneas x columnas), tal y como se ha explicado anteriormente, siendo «l» el número de líneas y «c» el número de columnas que pueden ser escritas usando el «font» por defecto de la impresora. El número de líneas y el de columnas están calculados dependiendo de la altura y anchura media del «font». Si no se especifica nada, CTL usará estos parámetros para calcular la separación entre líneas.
Por lo que respecta a listados encolumnados (por ejemplo un listado de albaranes), la técnica seguida hasta ahora consistía en rellenar con espacios en blanco hasta alcanzar la siguiente columna. Esta técnica carece ahora de sentido si en el listado de emplea algún «font» de tamaño proporcional, en el que los caracteres no tienen todos la misma anchura (el carácter «m» es distinto de «l», éste su vez es distinto de «espacio en blanco», etc.).
Para solucionar este problema es preciso que el posicionamiento en una columna no se haga rellenando con espacios en blanco, sino que es necesario que este posicionamiento sea fijo e independiente del tamaño de una letra.
Como ya se ha comentado, la página del listado está dividida en columnas. Para posicionarse en una columna determinada existen dos caminos:
Usando la función «setpmattr» -ver más adelante las funciones asociadas al manejo de impresión-. Ejemplo:
call setpmattr(«curcol», numerodecolumna)
Especificando que la cláusula «COLUMN» de la instrucción PUT STREAM se refiera a columnas fijas (en caso contrario rellena con blancos). Ejemplo:
call setpmattr("fixprtcolum",
true)
...
...
put stream standard column 23 ...
IMPORTANTE: Si lo que se quiere encolumnar son caracteres numéricos, lo normal es que éstos se alineen a la derecha. En este caso deberemos especificar el parámetro «rightalign» en la función «setpmattr»: «setpmattr («rightalign», número_columna)», o bien la cláusula «COLUMN» con valor negativo. Hay que tener en cuenta que esta columna debe indicar la posición donde acaba el texto.
Por ejemplo:
put stream standard column -23, numero ...
indicará que el «numero» acabará en la columna 23 de la línea.
El número de líneas y columnas en las que se divide el listado puede modificarse igualmente —ver función «setpmattr» más adelante— con el siguiente significado:
Si se modifica el número de líneas por página, CTL modificará el interlineado para que las líneas especificadas puedan caber en una página.
Si se modifica el número de columnas, se recalculará el tamaño de cada una de ellas para que puedan caber todas. Esto sólo afecta al posicionamiento absoluto referido en el párrafo anterior.
Por último, es posible definir unos márgenes «superior», «inferior» e «izquierdo» a la hora de recalcular el interlineado y el posicionamiento de columnas (ver función «setpmattr»). Con esto se pretende que puedan ser eliminadas estas zonas a la hora de imprimir. Una vez eliminados estos márgenes, se recalcula el tamaño de una columna y el interlineado para que se sigan respetando el número de líneas y de columnas ya definidas.
NOTA: La definición de estos márgenes no tiene nada que ver con la definición de márgenes de un STREAM en CTL, pero sí es importante que el número de líneas definido con la función «setpmattr()» coincida con el de la cláusula «FORMAT» del CTL.