Sunteți pe pagina 1din 14

VISUAL

FOX PRO
Visual FoxPro es un lenguaje de programacin procedural, orientado a objetos que posee un Sistema Gestor de Bases de datos o Database Management System (DBMS) y Sistema administrador de bases de datos relacionales, producido por Microsoft. FoxPro es un potente gestor de base de datos relacionales y un eficaz entorno de programacin que permite desarrollar todo tipo de aplicaciones en diferentes plataformas y ordenadores. FoxPro dispone de diferentes opciones dependiendo de donde se vaya a instalar, y de una multiplataforma que le permite pasar aplicaciones y base de datos de un sistema operativo a otro sin necesidad de modificar las aplicaciones, ni de programas especiales de conversin. El xito de su utilizacin se basa, principalmente, en su rapidez de ejecucin y su enorme flexibilidad, potencia de programacin y la posibilidad de realizar aplicaciones con un SO que se ejecutar en otro sistema distinto. CARACTERISTICAS: Capacidades para el manejar datos nativos y remotos. Flexibilidad para crear soluciones de bases de datos. Lenguaje de Programacin Orientado a objetos. Utilizacin de Sentencias SQL en forma nativa. Manejo de vistas, cursores y control completo de estructuras relacionales. Su propio gestor de base de datos incorporado. Sin embargo, tambin puede conectarse con servidores de base de datos, tales como Oracle, Microsoft SQL Server o MySQL. Cuenta con un motor de generacin de informes renovado y flexible para soluciones ms robustas. Desde la versin 9.0, amplio soporte de XML, tanto como fuente de datos (por ej., servicios Web basados en XML) como por generar reportes en formato XML.

FoxPro comprende: - Un lenguaje de programacin fcil de aprender y utilizar. - Ms de 600 comandos y funciones que le permitir manejar ficheros, crear pantallas, mens, informes y etiquetas. - Un generador automtico de aplicaciones que le permitirn realizar programas sin necesidad de ser programador. - Un programa de documentacin de aplicaciones. - Un compilador que le indicar los errores de programacin. - Una interfaz de ventanas avanzada para sus aplicaciones. - Un programa de ayuda permanente que le permitir resolver cualquier duda que le aparezca. - Un programa tutorial que le mostrar cmo utilizar FoxPro.

DISEO DE LA BASE DE DATOS: Si usa un proceso de diseo de base de datos establecido, puede crear de forma rpida y efectiva una base de datos bien diseada que le proporciona acceso conveniente a la informacin que desea. Con un diseo slido tardar menos tiempo en construir la base de datos y obtendr resultados ms rpidos y precisos. Los trminos "base de datos" y "tabla" no son sinnimos en Visual FoxPro. El trmino base de datos (archivo .dbc) se refiere a una base de datos relacional que almacena informacin sobre una o ms tablas (archivos .dbf) o vistas.

SENTENCIAS DE CREACION, EDICION Y VISUALIZACION DE LA BASE DE DATOS CREACION: Al crear una base de datos, se renen ciertas tablas en un conjunto y se aprovechan las caractersticas del diccionario de datos. Un diccionario de datos proporciona mayor flexibilidad al disear y modificar la base de datos y libera la carga de tener que escribir cdigo para crear validacin a nivel de campos y a nivel de filas o para asegurar la unicidad de valores en campos de clave principal. El diccionario de datos de Visual FoxPro le permite crear o especificar: - Claves principales y candidatas. - Relaciones persistentes entre tablas de bases de datos. - Nombres largos para tablas y campos. - Ttulos de campos que aparecen como encabezados en ventanas Examinar y en columnas de cuadrcula. - Valores predeterminados en campos. - La clase de control predeterminada usada en formularios. - Mscaras de entrada y formatos de presentacin para campos. - Reglas a nivel de campo y reglas a nivel de registro. - Desencadenantes. - Procedimientos almacenados. - Conexiones a orgenes de datos remotos. - Vistas locales y remotas. - Comentarios para cada campo, tabla y base de dato

Al crear una nueva base de datos, sta estar vaca, pues no contendr tablas asociadas ni ningn otro objeto. Al agregar una tabla se crean vnculos entre el archivo de tabla y el contenedor de la base de datos. La informacin de vnculo sobre una tabla almacenada en la base de datos es un vnculo posterior. La informacin de vnculo almacenada en la tabla sobre el contenedor de base de datos es el vnculo anterior Para trabajar con una base de datos y sus objetos mediante programacin, puede utilizar los comandos y funciones siguientes. Eliminar una base de datos Para eliminar del disco una base de datos puede utilizar el comando DELETE DATABASE. Por ejemplo, el cdigo siguiente elimina la base de datos ejemplo: DELETE DATABASE simple Cerrar una base de datos Puede cerrar una base de datos abierta mediante el Administrador de proyectos o mediante el comando CLOSE DATABASE.

SET DATABASE TO Nombre_BaseDatos CLOSE DATABASE

LAS TABLAS - AGREGAR TABLAS A LA BASE DE DATOS

La sintaxis del comando que permite crear una BD y adicionar una tabla en el mismo instante es la siguiente: CREATE DATABASE Nombre_BaseDatos CREATE TABLE Nombre_Tabla (FirstName C(20), LastName C(20)) CLEAR _ Limpia el espacio de memoria utilizado DISPLAY TABLES DISPLAY DATABASES Del examen de la sintaxis de la sentencia Create Table se pueden concluir que necesitamos conocer los distintos tipos de columna y las distintas restricciones que se pueden imponer al contenido de las columnas. ELIMINAR TABLA DE LA BASE DE DATOS

Para quitar una tabla de una base de datos puede utilizar la interfaz o bien el comando REMOVE TABLE. Al quitar la tabla de la base de datos, puede elegir tambin eliminar fsicamente del disco el archivo de la tabla. OPEN DATABASE Nombre_BaseDatos REMOVE TABLE Nombre_Tabla Para eliminar una tabla, de la estructura fsica del disco duro, se debe realizar un DELETE, en la misma lnea de la sentencia REMOVE TABLE, o hacer un DROP TABLE en su defecto. La sentencia para la eliminacin del disco duro de una tabla es la siguiente: REMOVE TABLE Nombre_Tabla DELETE Elimina completamente el espacio asignado en disco. DROP TABLE orditems NORECYCLE Elimin la tabla, y adems se impide la creacin de una copia de respaldo de la misma.

LOS CAMPOS Los campos son la ms mnima expresin de la tabla, en ellos podemos agregar datos, o cadenas de caracteres, de acuerdo a el tipo de formato aceptado. Agregar campos Para agregar un nuevo campo a una tabla puede utilizar el Diseador de tablas o hacerlo a travs del comando ALTER TABLE.

Eliminar campos Puede eliminar un campo existente de una tabla mediante el Diseador de tablas o a travs del comando ALTER TABLE. ALTER TABLE Tabla_BaseDatos DROP COLUMN Columna_Tabla

LOS REGISTROS Un registro es el valor que puede aceptar una tabla con una cantidad de campos definida por el usuario. - Agregar registros a una tabla Los registros pueden aceptar los datos directamente, como en el ejemplo siguiente, en el que el comando INSERT especifica el texto que se va a insertar en campos especficos de una tabla. La sintaxis es la siguiente: INSERT INTO Nombre_Tabla (Campo1, Campo2, Campo3); VALUES ("Valor1", "Valor2", "Valor3") DE VISUALIZACION: Las sentencias SQL pertenecen a dos categoras principales: Lenguaje de Definicin de Datos, DDL y Lenguaje de Manipulacin de Datos, DML. Estos dos lenguajes no son lenguajes en s mismos, sino que es una forma de clasificar las sentencias de lenguaje SQL en funcin de su cometido. La diferencia principal reside en que el DDL crea objetos en la base de datos y sus efectos se pueden ver en el diccionario de la base de datos; mientras que el DML es el que permite consultar, insertar, modificar y eliminar la informacin almacenada en los objetos de la base de datos. Cuando se ejecutan las sentencias DDL de SQL, el Sistema Gestor de Base de Datos confirma la transaccin actual antes y despus de cada una de las sentencias DDL. En cambio, las sentencias DML no llevan implcito el commit y se pueden deshacer. Existe pues un problema al mezclar sentencias DML con DDL, ya que estas ltimas pueden confirmar las primeras de manera involuntaria e implcita, lo que en ocasiones puede ser un problema.

La recuperacin de los datos en el lenguaje SQL se realiza mediante la sentencia SELECT, seleccionar. Esta sentencia permite indicar al Sistema Gestor de Base de Datos la informacin que se quiere recuperar. Esta es la sentencia SQL, con diferencia, ms habitual. La sentencia SELECT consta de cuatro partes bsicas: La clusula SELECT seguida de la descripcin de lo que se desea ver, los nombres de las columnas a seleccionar. Esta parte es obligatoria. La clusula FROM seguida de la especificacin de las tablas de las que se han de obtener los datos. Esta parte es obligatoria. La clusula WHERE seguida por un criterio de seleccin, una condicin. Esta parte es opcional. La clusula ORDER BY seguida por el criterio de ordenacin es opcional y solo especifica el orden de la consulta anteriormente esquematizada.

Seleccin de Columnas de una tabla CLAUSULA SELECT Las columnas a seleccionar se enumeran sin ms en la clusula SELECT. Si se desea seleccionar todas las columnas de una tabla se puede hacer enumerando a todas las columnas o colocando un asterisco, *, en su lugar. Select * from Tabla Cuando se consulta una base de datos, los nombres de las columnas se usan como cabeceras de presentacin. Si ste resulta demasiado largo, corto o crptico, puede cambiarse con la misma sentencia SQL de consulta, creando un alias de columna. Select Campo as NombreCampo from Tabla CLAUSULA FROM

Define las tablas de las que se van a seleccionar las columnas. Se puede aadir al nombre de las tablas el usuario propietario de las mismas de la forma usuario.tabla. De esta manera podemos distinguir entre las tablas de un usuario y otro. Siempre se considera como prefijo el nombre del propietario de las tablas, aunque no se lo indiquemos. De esta forma dos o ms usuarios pueden tener tablas que se llamen igual sin que surjan conflictos. Select * from BDPrueba.Tabla1

CLAUSULA WHERE Hasta ahora vemos como puede utilizarse la sentencia SELECT para recuperar todas las columnas o un subconjunto de ellas de una tabla. Pero este efecto afecta a todas las filas de la tabla, a menos que especifiquemos algo ms en la clusula WHERE. Es aqu donde debemos proponer la condicin que han de cumplir todas las filas para salir en el resultado de la consulta. La complejidad del criterio de bsqueda es prcticamente ilimitada, y en l se pueden conjugar operadores de diversos tipos con funciones de columnas, componiendo expresiones ms o menos complejas. Operadores de comparacin

CLAUSULA ORDER BY Se utiliza para especificar el criterio de ordenacin de la respuesta a la consulta. Por defecto la ordenacin es ascendente, aunque se puede especificar un orden descendente. La ordenacin se puede establecer sobre el contenido de columnas o sobre expresiones con columnas. A continuacin se puede ver un ejemplo de uso de la clusula ORDER BY en la que quiere obtener un listado de los empleados ordenado de manera descendente por su salario y en caso de igualdad de salario, ordenado ascendentemente por su nombre. CLUSULA DISTINCT Cuando se realiza una consulta sobre una tabla en la que se extrae informacin de varias columnas, puede ocurrir que, si no incluimos la/s columna/s que forman la clave principal, obtengamos filas repetidas en la respuesta. Si este comportamiento no nos resulta satisfactorio podemos utilizar la clusula DISTINCT para eliminar las filas duplicadas obtenidas como respuesta a una consulta.

SENTENCIA MODIFY COMAND Abre una ventana de edicin de texto y le permite modificar o crear un archivo de programa. Sintaxis: MODIFY COMMAND [FileName | ?] [NOEDIT] [NOMENU] [NOWAIT] [RANGE nStartCharacter, nEndCharacter] [[WINDOW WindowName1] [IN [WINDOW] WindowName2 | IN SCREEN]] [AS nCodePage] [SAME] [SAVE] Parmetros:

FileName

Especifica el nombre del archivo para el programa que se va a abrir o crear. Si no especifica una extensin para un nuevo archivo de programa, Visual FoxPro asigna automticamente la extensin .prg. MODIFY COMMAND admite una estructura de archivo que contenga los caracteres comodn asterisco (*) e interrogacin (?). Se abrir una ventana de edicin de texto para cada programa cuyo nombre coincida con la estructura de archivos. Si omite el nombre del archivo, aparecer una ventana de edicin de texto para un archivo que inicialmente se llama Prog1.prg. Cuando cierre la ventana de edicin de texto podr guardar el archivo con un nombre diferente Muestra el cuadro de dilogo Abrir. Elija uno de los programas existentes o escriba el nombre de un programa nuevo que desee crear. NOEDIT Especifica que el archivo de programa no podr cambiarse, pero podr visualizarse y copiarse al Portapapeles. NOMENU Elimina el ttulo de men Formato de la barra de mens del sistema de Visual FoxPro, lo que impide cambios de fuente, tamao de fuente, espacio interlineal y sangrado. NOWAIT Contina con la ejecucin del programa despus de que se abra la ventana de edicin de texto. El programa no espera a que se cierre la ventana de edicin, sino que contina la ejecucin en la lnea de programa siguiente a la que contiene MODIFY COMMAND NOWAIT. Si omite NOWAIT al utilizar MODIFY COMMAND en un programa, se abre una ventana de edicin y la ejecucin del programa se interrumpe hasta que se cierra la ventana. NOWAIT slo es efectivo desde dentro de un programa. No ejerce ningn efecto en MODIFY COMMAND cuando se ejecuta desde la ventana Comandos. Se produce un NOWAIT implcito cuando abre ms de una ventana de edicin de texto con un solo comando MODIFY COMMAND. Por ejemplo: MODIFY COMMAND *.PRG.

RANGE nStartCharacter, nEndCharacter Especifica un rango de caracteres seleccionado cuando la ventana de edicin de texto es abierta. Los caracteres se seleccionan comenzando en la posicin especificada con nStartCharacter hasta el carcter que se encuentre en la posicin nEndCharacter. Si nStartCharacter es igual a nEndCharacter, no se seleccionar ningn carcter y el cursor se situar en la posicin especificada con nStartCharacter. WINDOW WindowName1 Especifica una ventana de la cual asumir las caractersticas la ventana de edicin de texto. Por ejemplo, si la ventana est definida con la clusula FLOAT de

DEFINE WINDOW, la ventana de edicin de texto podr moverse. No es necesario que la ventana est activa o sea visible, pero debe estar definida. IN [WINDOW] WindowName2 Especifica una ventana primaria dentro de la cual se abrir una ventana de edicin de texto. La ventana de edicin de texto no asumir las caractersticas de la ventana primaria y no puede moverse fuera de la ventana primaria. Si se mueve la ventana primaria, la ventana de edicin de texto se mover con ella. Para tener acceso a la ventana de edicin de texto, la ventana primaria debe estar definida anteriormente con DEFINE WINDOW y debe estar visible. IN SCREEN Abre explcitamente la ventana de edicin en la ventana principal de Visual FoxPro, despus de haberla situado en una ventana primaria. Se colocar una ventana de edicin en una ventana primaria incluyendo la clusula IN WINDOW. AS nCodePage Convierte automticamente los caracteres acentuados de un programa o archivo de texto creado en otra plataforma de Visual FoxPro. La expresin numrica nCodePage especifica la pgina de cdigos de la plataforma de Visual FoxPro en la que se cre el archivo de programa. El archivo se guarda con esa pgina de cdigos hasta que elija Guardar como... del men Archivo para guardar el archivo con una pgina de cdigos distinta. SAME Evita que la ventana de edicin de texto se ponga delante como ventana activa. Si la ventana de edicin de texto est oculta, se mostrar pero no se convertir en la ventana activa. SAVE Conserva la ventana de edicin de texto abierta despus de que otra ventana se active. Si omite SAVE, la ventana de edicin de texto se cierra cuando otra ventana se activa. El hecho de incluir SAVE no tiene ningn efecto cuando se ejecuta desde la ventana Comandos. SENTENCIA DE ENTRADAS Y SALIDAS DE INFORMACION Las sentencias de entrada y salida, estn referenciadas en la gua de comandos de Visual FoxPro, y son las siguientes: #DEFINE #UNDEF - Este comando se utiliza para crear y borrar constantes durante la compilacin. ! - Abre el Shell del DOS para ejecutar cualquier programa desde el sistema operativo MS-DOS. $ - Determina si una expresin est incluida en otra. ? / ?? - Evala expresiones y muestra el resultado en la pantalla o en la impresora. - La diferencia entre ? / ?? es que la primera antes de escribir ejecuta un retorno de carro, mientras que la segunda escribe directamente desde donde est situado el puntero de la impresora de la pantalla. - Enva cdigos de control a la impresora. ???

* - Indica un comentario del programa. Debe situarse siempre al inicio de la lnea. = - Evala una lista de expresiones. Si se sita antes del nombre de una funcin, sirve para que se ejecute la funcin y muestre su resultado. && - Al igual que * y NOTE, sirve para indicar comentario en la lnea del programa. La diferencia es que && puede situarse en cualquier parte de la lnea y * o NOTE deben ir al principio de la lnea de comentarios. % - Devuelve el resto entero de una divisin. \ - \\ - Muestra lneas de texto. @..BOX - Dibuja ventanas o cuadros entre coordenadas especificadas. @..CLEAR - Borra un rea de la pantalla desde las coordenadas especificadas hasta el final. @..CLEAR TO - Borra un rea de la pantalla o de la ventana. @..EDIT TEXT - Crea una zona de edicin de texto. @..FILL TO - Permite modificar los colores en una zona o ventana de la pantalla. @..GET CHECK BOX - Crea una casilla de control. @..GET INVISIBLE BUTTON

- Crea botones invisibles.

- Crea una lista.

@..GET LIST

SENTENCIAS DE CONTROL Son parte fundamental de cualquier lenguaje. Sin ellas, las instrucciones de un programa solo podrn ejecutarse en el orden en que estn escritas. Las sentencias de control permiten modificar este orden. Hay dos categoras de sentencias de control:

Bifurcaciones o condicionales: permiten que se ejecuten conjuntos distintos de instrucciones, en funcin de que se verifique o no una determinada condicin.

Bucles o repeticiones: permiten que se ejecute repetidamente un conjunto de instrucciones, bien un numero pre-determinado de veces, o bien hasta que se verifique una determinada condicin. En trminos de un lenguaje de programacin, que se verifique una condicin se traduce en que una expresin lgica tome el valor .TRUE.. Estas instrucciones o \bloques de instrucciones" (de ahi la denominacin construccin) sirven para ejecutar distintos conjuntos de instrucciones, en funcin de que se verifiquen o no determinadas condiciones. Los esquemas bsicos, escritos en lenguaje corriente, son los siguientes:

Esquema condicional tipo 1 (IF): Si se verifica la condicin C, ejecutar las instrucciones I. Esquema condicional tipo 2 (IF - ELSE): Si se verifica la condicin C, ejecutar las instrucciones I1. Si no se verifica la condicin C, ejecutar las instrucciones I2. Esquema condicional tipo 3 (bloque IF): Si se verifica la condicin C1, ejecutar las instrucciones I1. Si no se verifica C1, pero si se verifica la condicin C2, ejecutar las instrucciones I2. Si no se verifican C1 ni C2, pero si se verifica la condicin C3, ejecutar las instrucciones I3. Si no se verifica ninguna de las anteriores, ejecutar las instrucciones Ik Esquema condicional tipo 4 (SELECT CASES):
En el caso de que A valga a1, ejecutar las instrucciones I1. En el caso de que A valga a2, ejecutar las instrucciones I2. En el caso de que A valga a3, ejecutar las instrucciones I3. Si no se da ninguno de los casos anteriores, ejecutar las instrucciones Ik. La construccin IF - THEN - END IF Sirve para escribir un esquema condicional de tipo 1 en el que I se compone de mas de una instruccin. Su forma general es: IF ( expresion-logica ) THEN ... instrucciones ... END IF y su funcionamiento es similar al de la sentencia IF, salvo porque las instrucciones a ejecutar pueden ser ms de una. Tras finalizar, la ejecucin del programa continuara por la instruccin siguiente al END IF. El bloque IF mas general Es la versin mas elaborada de la instruccin IF, y permite escribir un esquema condicional de tipo 3. Su forma general es IF ( expresion-logica ) THEN ... instrucciones-1 ... ELSE IF ( expresion-logica-2 ) THEN ... instrucciones-2 ... ELSE IF ( expresion-logica-3 ) THEN ... instrucciones-3 ... ... ELSE

10

... instrucciones-k ... END IF y su funcionamiento es el siguiente: 1. Si expresion-logica-1 toma el valor .TRUE., entonces se ejecuta el conjunto de Instrucciones-1. 2. Si expresion-logica-1 toma el valor .FALSE., y expresion-logica-2 toma el valor .TRUE., entonces se ejecuta el conjunto de instrucciones-2.

11

La construccin SELECT CASE Esta construccin permite escribir un esquema condicional de tipo 4, en el que el lujo del programa se bifurca en varios caminos a partir de un mismo punto, en funcin del valor que tome una determinada expresin. Su forma general es: SELECT CASE ( expresion-de-control ) CASE ( valores-1 ) ... instrucciones-1 ... CASE (valores-2 ) ... instrucciones-2 ... CASE ( valores-3 ) ... instrucciones-3 ... ... CASE DEFAULT ... instrucciones-k ... END SELECT En donde expresin-de-control es una expresin escalar numrica o de caracteres y valores-i puede ser un solo valor, dado por una constante o expresin constante y tambin puede ser un rango de valores, en cuyo caso se escribe valor-i1:valor-i2. Tambin se puede escribir: valor-i, indicndose con ello el caso en que la expresin que hace de indice toma cualquier valor hasta (i.e. menor o igual que) valor-i. Anlogamente, se puede escribir valor-i: para indicar \ mayor que". No puede haber casos que se solapen. El funcionamiento de esta construccin es el siguiente: al \entrar" en ella se evala la expresin-decontrol. Si el valor obtenido encaja en alguno de los casos, se ejecuta el Correspondiente conjunto de instrucciones. Si no encaja en ninguno se ejecuta el conjunto de instrucciones del sub-bloque CASE DEFAULT, si existe. Si no existe se termina la ejecucin del SELECT CASE. En todos los casos, la ejecucin continua por la instruccin siguiente al END SELECT

Sentencias de Bucle Sentencia Scan: Scan sirve para realizar una serie de acciones para cada uno de los registros en una tabla. El comando Scan permite escribir el cdigo una vez y ejecutarlo para cada registro a medida que el puntero de registro se desplaza por la tabla. Sentencia For El bucle For Next es una de las estructuras de bucle ms antiguas dentro de los lenguajes de programacin. A diferencia del bucle Do, el bucle For Next requiere que se conozca el nmero de veces que se van a ejecutar las sentencias del bucle. Este bucle es una variable (llamada el contador del bucle) que incrementa o disminuye su valor durante cada repeticin del bucle. Su sintaxis es: For contador = principio To final[Step incremento] Bloque de Sentencias Next/EndFor[contador]

12

(Las palabras entre corchetes son opcionales). Los argumentos contador, principio, final e incremento son todos numricos. El bucle se ejecuta hasta que el contador llegue (o exceda) el valor final. Cuando ejecuta un bucle For Next, Visual FoxPro hace lo siguiente: 1. Pone contador con el valor de principio. 2. Comprueba si contador es mayor que final. 3. Si lo es, sale del bucle. 4. Si incremento es negativo, FoxPro comprueba si contador es menor que final, en cuyo caso sale de bucle. 5. Ejecuta el bloque de sentencias. 6. Incrementa contador con el valor de incremento. 7. Si no se especific incremento, el contador se incrementa en 1. 8. Repite las sentencias. La parte ms importante a tener en cuenta cuando se trabaja con bucle For ... Next/End For es que el contador del bucle se establece al principio del bucle. Si cambiamos el valor de la variable final mediante una sentencia dentro del bucle, no se detecta el cambio y se ejecuta como si no se hubiera producido.

La construccion DO y la instruccin EXIT Permite escribir un esquema de tipo 1, en el que un determinado conjunto de instrucciones, simplemente, se ejecuta indefinidamente. Su forma general es: DO ... instrucciones ... END DO Lgicamente, en un programa que tenga sentido, el conjunto de instrucciones en cuestin deber contener algn mecanismo que interrumpa en algn momento la repeticin, bien deteniendo el programa (STOP), bien enviando el control de la ejecucin a otro punto del mismo. Una forma de hacerlo es utilizar la instruccin EXIT que analiza la ejecucin del bucle y pasa el control a la instruccin siguiente al END DO.

13

BIBLIOGRAFIA http://personal.us.es/echevarria/documentos/FORTRAN2.pdf http://msdn.microsoft.com/es-es/library/cc466455(v=vs.71).aspx http://es.scribd.com/document_downloads/direct/58355648?extension=pdf&ft=136665 3939&lt=1366657549&user_id=105162528&uahk=JlDVc8hFrUxagPSdhCY0HCby8d0

14

S-ar putea să vă placă și