19
Clave primaria Saltar a: navegación , búsqueda En el diseño de bases de datos relacionales , se llama clave primaria a un campo o a una combinación de campos que identifica de forma única a cada fila de una tabla . Una clave primaria comprende de esta manera una columna o conjunto de columnas. No puede haber dos filas en una tabla que tengan la misma clave primaria. Una clave primaria debe identificar unívocamente a todas las posibles filas de una tabla y no solo a las filas que se encuentran en un momento determinado. Ejemplos de claves primarias son DNI (asociado a una persona ) o ISBN (asociado a un libro ). Las guías telefónicas y diccionarios no pueden usar nombres o palabras o números del sistema decimal de Dewey como claves candidatas, porque no identifican unívocamente números de teléfono o palabras. El modelo relacional, según se lo expresa mediante cálculo relacional y álgebra relacional, no distingue entre clave primaria y otros tipos de claves. Las claves primarias fueron agregadas al estándar SQL principalmente para conveniencia del programador. En una arquitectura entidad-relación , la clave primaria permite las relaciones de la tabla que tiene la clave primaria con otras tablas que van a utilizar la información de esta tabla. Tanto claves únicas como claves primarias pueden referenciarse con claves foráneas . Definiendo claves primarias Las claves primarias están definidas el estándar ANSI SQL, mediante la directiva PRIMARY KEY. La sintaxis para aplicar tal directiva a una tabla existente está definida en SQL:2003 de esta manera:

Clave Primariajgkgk

Embed Size (px)

Citation preview

Page 1: Clave Primariajgkgk

Clave primariaSaltar a: navegación, búsqueda

En el diseño de bases de datos relacionales, se llama clave primaria a un campo o a una combinación de campos que identifica de forma única a cada fila de una tabla. Una clave primaria comprende de esta manera una columna o conjunto de columnas. No puede haber dos filas en una tabla que tengan la misma clave primaria.

Una clave primaria debe identificar unívocamente a todas las posibles filas de una tabla y no solo a las filas que se encuentran en un momento determinado. Ejemplos de claves primarias son DNI (asociado a una persona) o ISBN (asociado a un libro). Las guías telefónicas y diccionarios no pueden usar nombres o palabras o números del sistema decimal de Dewey como claves candidatas, porque no identifican unívocamente números de teléfono o palabras.

El modelo relacional, según se lo expresa mediante cálculo relacional y álgebra relacional, no distingue entre clave primaria y otros tipos de claves. Las claves primarias fueron agregadas al estándar SQL principalmente para conveniencia del programador. En una arquitectura entidad-relación, la clave primaria permite las relaciones de la tabla que tiene la clave primaria con otras tablas que van a utilizar la información de esta tabla.

Tanto claves únicas como claves primarias pueden referenciarse con claves foráneas.

Definiendo claves primarias

Las claves primarias están definidas el estándar ANSI SQL, mediante la directiva PRIMARY KEY. La sintaxis para aplicar tal directiva a una tabla existente está definida en SQL:2003 de esta manera:

ALTER TABLE <identificador_de_la_tabla> ADD [ CONSTRAINT <identificador_de_la_directiva> ] PRIMARY KEY ( <nombre_de_columna> {, <nombre_de_columna>}... )

La clave primaria puede especificarse directamente o de forma inmediata en el momento de la creación de la tabla también. En el estándar SQL, las claves primarias pueden estar compuestas por una o más columnas. Cada columna que forme parte de la clave primaria queda implícitamente definida como NOT NULL. Nótese que algunos sistemas de bases de datos requieren que se marque explícitamente a las columnas de clave primaria como NOT NULL.

CREATE TABLE nombre_de_la_tabla ( id_col INT, col2 CHARACTER VARYING(20), ... CONSTRAINT clapri_tabla PRIMARY KEY(id_col), ...

Page 2: Clave Primariajgkgk

)

En el caso en que la clave primaria sea una sola columna, ésta puede marcarse como tal por medio de la siguiente sintaxis:

CREATE TABLE nombre_de_la_tabla ( id_col INT PRIMARY KEY, col2 CHARACTER VARYING(20), ... )

Definiendo claves únicas

La definición de claves únicas es sintácticamente muy similar a la de clave primaria.

ALTER TABLE <identificador_de_la_tabla> ADD [ CONSTRAINT <identificador_de_la_directiva> ] UNIQUE ( <nombre_de_columna> {, <nombre_de_columna>}... )

De la misma manera, las claves únicas pueden definirse como parte de la sentencia de SQL CREATE TABLE.

CREATE TABLE nombre_de_la_tabla ( id_col INT, col2 CHARACTER VARYING(20), cla_col SMALLINT, ... CONSTRAINT clave_única UNIQUE(cla_col), ... )

CREATE TABLE nombre_de_la_tabla ( id_col INT PRIMARY KEY, col2 CHARACTER VARYING(20), ... cla_col SMALLINT UNIQUE, ... )

Ver las calificaciones de la páginaEvalúa este artículo¿Qué es esto?ConfiableObjetivoCompletoBien escrito

Estoy muy bien informado sobre este tema (opcional) Categoría:

Page 3: Clave Primariajgkgk

Bases de datos

Menú de navegación

Crear una cuenta Ingresar

Artículo Discusión

Leer Editar Ver historial

Portada Portal de la comunidad Actualidad Cambios recientes Páginas nuevas Página aleatoria Ayuda Donaciones Notificar un error

Imprimir/exportar

Crear un libro Descargar como PDF Versión para imprimir

Herramientas

En otros idiomas

Česky Deutsch English Français עברית Bahasa Indonesia 日本語 Қазақша 한국어 Latviešu

Page 4: Clave Primariajgkgk

Nederlands Norsk bokmål Polski Português Русский Slovenčina Српски / srpski Svenska Українська 中文 Editar los enlaces

Esta página fue modificada por última vez el 2 abr 2013, a las 07:21. El texto está disponible bajo la Licencia Creative Commons Atribución Compartir

Igual   3.0 ; podrían ser aplicables cláusulas adicionales. Léanse los términos de uso para más información.Wikipedia® es una marca registrada de la Fundación Wikimedia, Inc., una organización sin ánimo de lucro.

Contacto

11 - Clave primaria. Una clave primaria es un campo (o varios) que identifica 1 solo registro (fila) en

una tabla. Para un valor del campo clave existe solamente 1 registro. Los valores no se repiten

ni pueden ser nulos. Veamos un ejemplo, si tenemos una tabla con datos de personas, el número de

documento puede establecerse como clave primaria, es un valor que no se repite; puede haber personas con igual apellido y nombre, incluso el mismo domicilio (padre e hijo por ejemplo), pero su documento será siempre distinto.

Si tenemos la tabla "usuarios", el nombre de cada usuario puede establecerse como clave primaria, es un valor que no se repite; puede haber usuarios con igual clave, pero su nombre de usuario será siempre distinto.

Establecemos que un campo sea clave primaria al momento de creación de la tabla: create table usuarios ( nombre varchar(20), clave varchar(10), primary key(nombre) );

Para definir un campo como clave primaria agregamos "primary key" luego de la definición de todos los campos y entre paréntesis colocamos el nombre del campo que queremos como clave.

Si visualizamos la estructura de la tabla con "describe" vemos que el campo "nombre" es clave primaria y no acepta valores nulos(más adelante explicaremos esto detalladamente).

Ingresamos algunos registros:

Page 5: Clave Primariajgkgk

insert into usuarios (nombre, clave) values ('Leonardo','payaso'); insert into usuarios (nombre, clave) values ('MarioPerez','Marito'); insert into usuarios (nombre, clave) values ('Marcelo','River'); insert into usuarios (nombre, clave) values ('Gustavo','River');

Si intentamos ingresar un valor para el campo clave que ya existe, aparece un mensaje de error indicando que el registro no se cargó pues el dato clave existe. Esto sucede porque los campos definidos como clave primaria no pueden repetirse.

Ingresamos un registro con un nombre de usuario repetido, por ejemplo: insert into usuarios (nombre, clave) values ('Gustavo','Boca');

Una tabla sólo puede tener una clave primaria. Cualquier campo (de cualquier tipo) puede ser clave primaria, debe cumplir como requisito, que sus valores no se repitan.

Al establecer una clave primaria estamos indexando la tabla, es decir, creando un índice para dicha tabla; a este tema lo veremos más adelante.

Claves primarias, claves foráneas, índicesEn la teoría de bases de datos, se llama clave primaria a un campo, o a una combinación de campos, que identifica en forma única a cada registro, y una clave foránea es una referencia, en una tabla, a la clave primaria de otra tabla. Por ejemplo, en una factura necesitamos identificar para qué cliente se ha hecho la factura.

Por ejemplo, para una tabla de clientes se podría usar, como clave primaria, una de las siguientes opciones:

La cédula de identidad del cliente. La combinación de nombre y apellido. Esto es dudoso, ya que un dos clientes

pueden tener el mismo nombre y el mismo apellido. Un código de cliente, asignado por la empresa.

Sin embargo, lo más recomendable es utilizar un número que nunca verá el usuario final. Para este fin, se necesita un número secuencial. Esto nos trae numerosas ventajas, entre otras:

Se simplifican las claves foráneas y las relaciones entre las tablas. Por ejemplo, si para identificar a un cliente utilizamos la combinación de nombre y apellido, también necesitamos el nombre y el apellido del cliente en la factura, para identificar al cliente.

Se ahorra espacio, ya que un campo de tipo Integer (entero) sólo utiliza 4 bytes (sin embargo, permite números hasta 2 mil millones). Se puede argumentar que se

Page 6: Clave Primariajgkgk

necesita un campo más para la clave primaria; pero se ahorra espacio en las claves foráneas en otras tablas.

El acceso a los datos es más rápido. Esto está directamente relacionado con el hecho de que los campos de tipo Integer (y sus índices correspondientes) son más pequeños.

El usuario puede cambiar los códigos, sin que se tengan que "propagar" los cambios a otras tablas.

También hay algunas desventajas; sobre todo, la programación se hace más complicada en algunos casos. Pero he visto en la práctica que es un sacrificio que vale la pena.

Ahora, explicaré los detalles de cómo implementar estas claves "internas". Desafortunadamente, en Visual FoxPro no se puede simplemente marcar un campo como "auto-incrementado" (como se lo haría en Access), pero no es muy complicado lograr lo mismo en Visual FoxPro.

Para guardar los números secuenciales (y así saber cuál es el siguiente número que se debe asignar a cada nuevo registro), se crea una tabla que se llama "serialnumber", con dos campos: "sequence", tipo Character(30), y "nextnum", tipo Integer. Es conveniente (pero no urgente) que la tabla sea parte de una base de datos (sólo así puede participar en transacciones, lo cual permite anular cambios).

Para la clave primaria, se utiliza un campo de tipo Integer (ver Nuevos tipos de datos). Por ejemplo, en la tabla "cliente", se puede tener un campo que también se llama "cliente", de tipo Integer.

En ese campo de clave primaria, se entra a "Default", y se escribe la siguiente expresión: serialnumber("cliente").

Esto invocará una función "serialnumber". Yo prefiero almacenar la función en los procedimientos almacenados de la base de datos. La función es:

**********************************************************************FUNCTION SERIALNUMBER(tnSequence)* Conseguir número secuencial. Usado para generar claves primarias.local lnSelectlnSelect = select()if used("serialnumber") select serialnumberelse select 0use serialnumberendifset order to "sequence"seek padr(tnSequence, len(sequence))if not found() append blank replace sequence with tnSequence, nextnum with 1endiflocal lnReturnValueif lock() lnReturnValue = nextnum replace nextnum with nextnum + 1

Page 7: Clave Primariajgkgk

else lnReturnValue = -1endifunlockselect (lnSelect)return lnReturnValue

Para definir una clave primaria en una tabla, se tiene que crear un índice con una expresión que tiene que ser única. Luego, se define el índice como clave primaria ("Primary"). Esto se lo hace directamente en la definición de la tabla (modify structure). Por ejemplo, en la tabla cliente, se crea un índice por el campo cliente. La forma más rápida de hacer ésto es indicar, en la misma lista de campos, que se quiere tener un índice sobre ese campo (siempre debe ser "ascending"). Luego, en la página de índices se lo marca como "Primary".

Se puede asegurar que otras combinaciones de campos sean únicas. Sólo puede haber una clave primaria en una tabla, pero se pueden marcar otros índices como "Candidate". En otros sistemas de base de datos, esto se llamaría "Unique"; desafortunadamente, en FoxPro esta palabra ya ha sido reservado para algo distinto. Recomiendo no utilizar nunca índices del tipo "Unique" en Visual FoxPro; lo que estos índices logran, mejor se puede lograr con otros métodos. Digamos que Visual FoxPro incluye índices de tipo "Unique" por mantener la compatibilidad con FoxPro.

Si se quiere garantizar unicidad, puede haber un problema con registros borrados: el usuario borra un cliente, digamos que tiene el código (campo cod_cliente) "X1", luego agrega otro registro e intenta poner el mismo código. Visual FoxPro dirá que el registro ya existe. Se puede solucionar esto eliminando permanente el registro borrado (con la orden PACK), pero esto no es muy práctico. Es mejor crear el índice filtrado, con la condición: NOT DELETED().

 

Volver a: Visual FoxPro | Página Principal de Hilmar Zonneveld

En bases de datos que es una clave secundaria?

hace 6 años Reportar abusos

Alejandr...

Mejor respuesta - elegida por los votantes

Page 8: Clave Primariajgkgk

Todo conjunto de campos de una tabla que sirva para identificar univocamente 1 fila de otra, se llama Clave Candidata.La menor de las Claves Candidatas, se le llama Clave Primaria.Una Clave Secundaria es un orden que no necesariamente identifica una fila de otra (puede haber repeticiones), pero sirve para procesar la informacion en un orden adecuado, para algun proceso en particular. Por ejemplo, la Fecha de una factura es importante para listar los Libros de IVA o para filtrar facturas entre fechas, por ello se la establece como Clave Secundaria. Tambien los campos que hacen referencia a otras tablas son Claves Secundarias, aunque se les suele llamar, en ese caso, Claves Foraneas.

hace 6 años

claves primarias y secundarias Escrito por Rodrigo Barboni el 30/04/2007

Hola lucy , cada tabla de una base de datos tiene que tener una clave primaria , que es un tipo de clave unica e irrepetible en cada registro de la misma tabla. Esto te permite darle a cada elemento de una tabla un valor unico. Ej el codigo de cliente en la tabla de clientes.

Una clave secundaria es aquel campo que esta en una tabla pero que a su vez hace referencia a otra tabla. Ej en la tabla de facturas tenes el codigo de cliente. Este campo es clave primaria en la tabla clientes y es clave secundaria en la tabla facturas

Hacer las claves primarias de todas las tablas y hacer las relaciones te permite llevar la integridad referencial de la base

Ej si quiero hacer una factura a un cliente que no existe , si tengo hecha la relacion de la tabla clientes con facturas no me va a dejar cargar ese cliente

Fuente terciariaSaltar a: navegación, búsqueda

Una fuente terciaria es una selección y compilación de fuentes primarias (material de primera mano relativo a un fenómeno) y secundarias (comentarios, análisis y crítica basadas en fuentes primarias). Mientras la distinción entre fuente primaria y fuente secundaria es esencial en historiografía, la distinción entre estas fuentes de evidencia y las fuentes terciarias es más superficial.

Page 9: Clave Primariajgkgk

Ejemplos típicos de fuentes terciarias son las bibliografías, catálogos de biblioteca, directorios, listas de lecturas y artículos sobre encuestas. Las enciclopedias y los libros de texto son ejemplos de piezas que recogen tanto fuentes secundarias y terciarias, presentando por un lado comentario y análisis, y en el otro tratando de proporcionar una visión resumida del material disponible sobre la materia. Por ejemplo, los largos artículos de la Encyclopædia Britannica constituyen la clase de material analítico de las fuentes secundarias, mientras que también tratan de proporcionar una cobertura completa asociada a las fuentes terciarias.

Véase también

Historiografía Fuente primaria Fuente secundaria Fuente documental

Referencias

Operador ternarioSaltar a: navegación, búsqueda

No debe confundirse con Operación ternaria.

En informática un operador ternario (a veces incorrectamente llamado operador terciario) es un operador que toma tres argumentos. Los argumentos y el resultado puede ser de diferentes tipos. Originalmente proviene de BCPL, cuyo sintaxis equivalente para e1 ? e2: e3 era e1 -> e2, e3.1 Idiomas derivado de BCPL tienden a aparecer con este operador.

Muchos lenguajes de programación que utilizan la sintaxis del lenguage C utilizan un operador ternario,?:, que define una sentencia condicional. Dado que este operador es a menudo el único operador ternario existente en el lenguage de programación, a veces es referido simplemente como "el operador ternario".

La mayoría de los lenguages de programación que se enfatizan en la programación funcional no necesitan dicho operador como su expresión regular condicional (s) es una expresión en primer lugar, por ejemplo, la expresión sistema (si (ab>) ab) es equivalente en la semántica de la expresión C (a> b)? a: b.

Este es también el caso en muchos lenguajes imperativos, empezando con ALGOL en el que sería posible escribir resultado := if a > b then a else b, también Smalltalk (resultado := (a > b) ifTrue: [ a ] ifFalse: [ b ]) o Ruby (resultado = if a > b: a else b end).

Page 10: Clave Primariajgkgk

Índice

1 Asignación condicional 2 Uso

o 2.1 C++ o 2.2 CFML (Railo)

2.2.1 EJEMPLO 1 2.2.2 EJEMPLO 2

o 2.3 Java, JSP o 2.4 Perl, PHP o 2.5 Python o 2.6 Visual Basic .NET

3 Referencias 4 Enlaces externos

Asignación condicional

La sintaxis del operador ternario (?:) se utiliza como sigue:2

expresión boleana ? valor si cierto : valor si falso

La condición es evaluada verdadera o falsa como una expresión booleana. Sobre la base de la evaluación de la condición de Booleana, la expresión entera devuelve valor si cierto si la condición es verdadera, pero valor si falso en caso de lo contrario. Por lo general, las dos sub-expresiones valor si cierto y valor si falso deben tener el mismo tipo, lo cual determina el tipo de toda la expresión. La importancia de este tipo de control se encuentra en el uso más común del operador --en declaraciones de asignación condicional. En este uso aparece como una expresión en el lado derecho de una sentencia de asignación, de la siguiente manera:

variable = condición ? valor si cierto : valor si falso

El operador ?: es similar a la manera como funcionan las expresiones condicionales (if-then-else) en lenguajes de programación funcional, como Scheme, ML y Haskell, puesto que if-then-else forma una expresión en lugar de una declaración en esos idiomas.

Uso

El uso más común de este operador ternario es hacer una breve sentencia condicional. Por ejemplo, si queremos desarrollar código en C para cambiar las horas de apertura de una tienda a 12:00 del medio dia los fines de semana y 9 en punto entre semana, podemos usar:

int tiempo_de_apertura = (día == FIN_DE_SEMANA) ? 12 : 9;

Page 11: Clave Primariajgkgk

en lugar del codigo más detallado

int tiempo_de_apertura; if (día == FIN_DE_SEMANA) tiempo_de_apertura = 12;else tiempo_de_apertura = 9;

Las dos formas son casi equivalentes. Tenga en cuenta que el ?: es una expresión y if-then-else una declaración. Tambien hay que tomar en cuenta que ni el valor si es verdadero ni valor si falso pueden ser omitidos en el operador ternario, lo cual resultaría en un error por el compilador. Esto contrasta con sentencias de if..else, donde se puede omitir la cláusula else.

C++

En C++, hay situaciones donde el uso de asignación condicional de if-else no es posible, ya que esta lengua distingue explícitamente entre inicialización y asignación. En tal caso, siempre es posible utilizar una llamada a la función, pero esto puede ser incómodo y poco elegante. Por ejemplo, si desea pasar valores con condiciones diferentes como un argumento para un constructor de un campo o una clase base, no es posible utilizar un simple if-else, en este caso podemos usar una expresión de asignación condicional, o una llamada a la función. Hay que tomar en cuenta también que algunos tipos permiten la inicialización, pero no permiten la asignación, o incluso el operador de asignación hace cosas totalmente diferente a la del constructor. Esto último es válido para los tipos de referencia, por ejemplo:

#include <iostream>#include <fstream>#include <string> using namespace std; int main(int argc, char *argv[]){ string name; ofstream fout; if (argc > 1 && argv[1]) { name = argv[1]; fout.open(name.c_str(), ios::out | ios::app); } ostream &sout = name.empty() ? cout : fout;}

En este caso no hay posibilidad de sustituir el uso del operador ?: con un if-else. (Aunque se puede sustituir el uso de ?: con una llamada a la función, dentro del cual puede ser un if-else.) Además, el operador ternario puede dar un Ivalue, es decir, un valor al cual otro valor se le puede asignar. Consideremos el siguiente ejemplo:

Page 12: Clave Primariajgkgk

#include <iostream> int main () { int a=0, b=0; const bool cond = ...; (cond ? a : b) = 1; std::cout << "a=" << a << ',' << "b=" << b << '\n'; }

CFML (Railo)

EJEMPLO 1<cfscript>arg = "T";vehicle = ( ( arg == 'B' ) ? 'bus' : ( arg == 'A' ) ? 'airplane' : ( arg == 'T' ) ? 'train' : ( arg == 'C' ) ? 'car' : ( arg == 'H' ) ? 'horse' : 'feet' );</cfscript><cfoutput>#vehicle#</cfoutput>

EJEMPLO 2<cfscript>price = ( product.hasPrice() ) ? product.getPrice() : "-";writeOutput( "Precio del producto: " & price );</cfscript>

Java, JSP

En Java el operador ternario es también referido como el operador condiconal y utiliza la misma sintaxis que los demás lenguajes basados en el lenguage C. Por ejemplo, para verifcar que una persona es mayor de edad, utilizariamos lo siguiente:

boolean mayor_de_edad = edad > 18 ? true: false;

Remplazaria el siguiente código detallado:

boolean mayor_de_edad; if(edad > 18){ mayor_de_edad = true; }else{ mayor_de_edad = false; }

Para utilizar el operador ternario en JavaServer Pages, se puede incrustrar codigo de Java usando scriptlets. Esta manera no es recomendada, lo cual se sugiere usar bibliotecas de JSTL para obtener codigo mas limpio y estructurado. Por ejemplo, para alternar el color de las filas en una tabla de HTML usando CSS, pudieramos utilizar lo siguiente:

Page 13: Clave Primariajgkgk

<c:forEach list="${requestScope.miLista}" varStatus="contador"> <tr class="${contador % 0 ? 'even' : 'odd'}"> <td>Hola Mundo!!!/td> </tr> </c:forEach>

Perl, PHP

Un constructor tradicional de if-else en Perl o PHP se escribiría así:

if ($a > $b) { $result = $a;} else { $result = $b;}

Re-escrito con el operador ternario, se vería así:

$result = ($a > $b) ? $a : $b;

Desde la versión 5.3, PHP soporta una sintaxis del operador ternario. En esta forma, la condición es regresada a menos que la condición se evalúa como falsa:

$variable = condicion ?: if false

Python

Aunque se había demorado durante varios años por los desacuerdos sobre la sintaxis, un operador ternario para Python se aprobó como Python Enhancement Proposal 308 y se añadió a la versión 2.5 en septiembre de 2006. El operador ternario de Python difiere del común ?: en el orden de sus operandos. La forma general es:

valor_si_cierto if condición else valor_si_falso

Visual Basic .NET

A pesar de que .NET no utiliza los operandos ?: se puede usar una implementación muy similar a la sentencia if...else.

Dim tiempo_de_apertura As Integer = IIf((dia = FIN_DE_SEMANA), 12, 9) 'sintaxis general es IIf(condicion, valor_si_cierto, valor_si_falso)

En el ejemplo anterior, IIF es una función, y no un operador ternario real. Como función, los valores de las tres partes se evalúan antes de que se produzca llamada de la función. Esto impuso limitaciones y en Visual Basic. NET 9.0, lanzado como Visual Studio 2008, un operador ternario real fue introducido usando como clave IF en vez de IIF. Esto permite que el siguiente código funcione:

Page 14: Clave Primariajgkgk

Dim nombre As String = If(persona Is Nothing, "", persona.Nombre)

Usando IIF, persona.Nombre se evaluaría incluso si el valor de persona es null (nulo), causando una excepción. Con un verdadero operador ternario de cortocircuito, persona.Nombre no se evalúa si el valor de persona no es nulo (not null).

Referencias

1. ↑ «BCPL Ternary operator (page 15)». BCPL Reference Manual.2. ↑ «Ternary Operators». Kwista, LLC.. Consultado el 19-04-2010.

Enlaces externos

Descripción del operador ternario en C# Descripción del operador ternario en Visual Basic Descripción del operador ternario en Python (PEP 308) Alternativas para expresiones del operador ternario Descripción del operador ternario en Java Descripción del lenguage PHP Especificación del lenguaje Visual Basic 9.0