<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [
<!ENTITY legal SYSTEM "legal.xml">
<!ENTITY appversion "1.6">
<!ENTITY manrevision "0.2">
<!ENTITY date "20 June 2004">
<!ENTITY app "Glom">
<!-- Information about the entities
       The legal.xml file contains legal information, there is no need to edit the file. 
       Use the appversion entity to specify the version of the application.
       Use the manrevision entity to specify the revision number of this manual.
       Use the date entity to specify the release date of this manual.
       Use the app entity to specify the name of the application. -->]>
<!-- 
      (Do not remove this comment block.)
  Maintained by the GNOME Documentation Project
  http://developer.gnome.org/projects/gdp
  Template version: 2.0 beta
  Template last modified Apr 11, 2002
-->
<!-- =============Document Header ============================= -->
<article id="index" lang="es">
<!-- please do not change the id; for translations, change lang to -->
<!-- appropriate code -->
  <articleinfo> 
    <title>Glom User Guide V0.2</title>       
    <subtitle>for Glom v1.6</subtitle>

    <copyright> 
      <year>2004</year> 
      <holder>Murray Cumming</holder> 
    </copyright><copyright><year>2007</year><holder>Jorge González (jorgegonz@svn.gnome.org)</holder></copyright> 
<!-- translators: uncomment this:

  <copyright>
   <year>2002</year>
   <holder>ME-THE-TRANSLATOR (Latin translation)</holder>
  </copyright>

   -->
<!-- An address can be added to the publisher information.  If a role is 
     not specified, the publisher/author is the same for all versions of the 
     document.  -->
    <publisher> 
      <publishername>Equipo de desarrollo de Glom</publishername> 
    </publisher> 

      <legalnotice id="legalnotice">
         <para>Se otorga permiso para copiar, distribuir y/o modificar este documento bajo los términos de la Licencia de Documentación Libre de GNU, Versión 1.1 o cualquier otra versión posterior publicada por la Free Software Foundation; sin Secciones Invariantes ni Textos de Cubierta Delantera ni Textos de Cubierta Trasera. Puede encontrar una copia de la licencia GFDL en este <ulink type="help" url="ghelp:fdl">enlace</ulink> o en el archivo COPYING-DOCS distribuido con este manual.</para>
          <para>Este manual es parte de una colección de manuales de GNOME distribuido bajo la GFDL. Si quiere distribuir este manual por separado de la colección, puede hacerlo añadiendo una copia de la licencia al manual, tal como se describe en la sección 6 de la licencia.</para>
 
         <para>Muchos de los nombres usados por compañías para distinguir sus productos y servicios son mencionados como marcas comerciales. Donde esos nombres aparezcan en cualquier documentación de GNOME, y los miembros del Proyecto de Documentación de GNOME están al corriente de esas marcas comerciales, entonces los nombres se pondrán en mayúsculas o con la inicial en mayúsculas.</para>
 
         <para>ESTE DOCUMENTO Y LAS VERSIONES MODIFICADAS DEL MISMO SE PROPORCIONAN SEGÚN LAS CONDICIONES ESTABLECIDAS EN LA LICENCIA DE DOCUMENTACIÓN LIBRE DE GNU (GFDL) Y TENIENDO EN CUENTA QUE: <orderedlist>
                 <listitem>
                   <para>EL DOCUMENTO SE PROPORCIONA "TAL CUAL", SIN GARANTÍA DE NINGÚN TIPO, NI EXPLÍCITA NI IMPLÍCITA INCLUYENDO, SIN LIMITACIÓN, GARANTÍA DE QUE EL DOCUMENTO O VERSIÓN MODIFICADA DE ÉSTE CAREZCA DE DEFECTOS COMERCIALES, SEA ADECUADO A UN FIN CONCRETO O INCUMPLA ALGUNA NORMATIVA. TODO EL RIESGO RELATIVO A LA CALIDAD, PRECISIÓN Y UTILIDAD DEL DOCUMENTO O SU VERSIÓN MODIFICADA RECAE EN USTED. SI CUALQUIER DOCUMENTO O VERSIÓN MODIFICADA DE AQUÉL RESULTARA DEFECTUOSO EN CUALQUIER ASPECTO, USTED (Y NO EL REDACTOR INICIAL, AUTOR O CONTRIBUYENTE) ASUMIRÁ LOS COSTES DE TODA REPARACIÓN, MANTENIMIENTO O CORRECCIÓN NECESARIOS. ESTA RENUNCIA DE GARANTÍA ES UNA PARTE ESENCIAL DE ESTA LICENCIA. NO SE AUTORIZA EL USO DE NINGÚN DOCUMENTO NI VERSIÓN MODIFICADA DE ÉSTE POR EL PRESENTE, SALVO DENTRO DEL CUMPLIMIENTO DE LA RENUNCIA;Y</para>
                 </listitem>
                 <listitem>
                   <para>BAJO NINGUNA CIRCUNSTANCIA NI BAJO NINGUNA TEORÍA LEGAL, SEA POR ERROR (INCLUYENDO NEGLIGENCIA), CONTRATO O DE ALGÚN OTRO MODO, EL AUTOR, EL ESCRITOR INICIAL, CUALQUIER CONTRIBUIDOR, O CUALQUIER DISTRIBUIDOR DEL DOCUMENTO O VERSIÓN MODIFICADA DEL DOCUMENTO, O CUALQUIER PROVEEDOR DE CUALQUIERA DE ESAS PARTES, SERÁ RESPONSABLE ANTE NINGUNA PERSONA POR NINGÚN DAÑO DIRECTO, INDIRECTO, ESPECIAL, INCIDENTAL O DERIVADO DE NINGÚN TIPO, INCLUYENDO, SIN LIMITACIÓN DAÑOS POR PÉRDIDA DE MERCANCÍAS, PARO TÉCNICO, FALLO INFORMÁTICO O MAL FUNCIONAMIENTO O CUALQUIER OTRO POSIBLE DAÑO O PÉRDIDAS DERIVADAS O RELACIONADAS CON EL USO DEL DOCUMENTO O SUS VERSIONES MODIFICADAS, AUNQUE DICHA PARTE HAYA SIDO INFORMADA DE LA POSIBILIDAD DE QUE SE PRODUJESEN DICHOS DAÑOS.</para>
                 </listitem>
           </orderedlist></para>
   </legalnotice>
 
   <!-- This file  contains link to license for the documentation (GNU FDL), and 
        other legal stuff such as "NO WARRANTY" statement. Please do not change 
	any of this. -->

    <authorgroup> 
      <author role="maintainer"> 
		<firstname>Murrayc</firstname> 
		<surname>Cumming</surname> 
		<affiliation> 
	  		<orgname>Equipo de desarrollo de Glom</orgname> 
	  		<address> <email>murrayc@murrayc.com</email> </address> 
		</affiliation> 
      </author> 
      
<!-- This is appropriate place for other contributors: translators,
     maintainers,  etc. Commented out by default.
     
      <othercredit role="translator">
		<firstname>Latin</firstname> 
		<surname>Translator 1</surname> 
		<affiliation> 
	  		<orgname>Latin Translation Team</orgname> 
	  		<address> <email>translator@gnome.org</email> </address> 
		</affiliation>
		<contrib>Latin translation</contrib>
      </othercredit>
-->
    </authorgroup>


<!-- According to GNU FDL, revision history is mandatory if you are -->
<!-- modifying/reusing someone else's document.  If not, you can omit it. -->
<!-- Remember to remove the &manrevision; entity from the revision entries other
-->
<!-- than the current revision. -->
<!-- The revision numbering system for GNOME manuals is as follows: -->
<!-- * the revision number consists of two components -->
<!-- * the first component of the revision number reflects the release version of the GNOME desktop. -->
<!-- * the second component of the revision number is a decimal unit that is incremented with each revision of the manual. -->
<!-- For example, if the GNOME desktop release is V2.x, the first version of the manual that -->
<!-- is written in that desktop timeframe is V2.0, the second version of the manual is V2.1, etc. -->
<!-- When the desktop release version changes to V3.x, the revision number of the manual changes -->
<!-- to V3.0, and so on. -->  
    <revhistory>
      <revision> 
		  <revnumber>Glom 1.6</revnumber> 
		  <date>20 de junio de 2004</date> 
		  <revdescription> 
			 <para role="author">Murray Cumming</para> 
			 <para role="publisher">Murray Cumming</para> 
		  </revdescription> 
		</revision>
    </revhistory> 

    <releaseinfo>This manual describes version 1.6 of Glom
    </releaseinfo> 
    <legalnotice> 
      <title>Comentarios</title> 
      <para>Para informar sobre un error o hacer sugerencias sobre Glom o sobre éste manual, puede enviarlas en la página <ulink url="http://bugzilla.gnome.org" type="http">Gnome Bugzilla</ulink>, seleccionando el producto Glom. Para asegurarse de que otros no han informado antes del mismo fallo, busque en Bugzilla antes de enviar su error.</para>
<!-- Translators may also add here feedback address for translations -->
    </legalnotice> 

    <abstract role="description">
      <para>Manual del usuario de Glom.</para>
    </abstract>
  </articleinfo> 

  <indexterm zone="index"> 
    <primary>MY-GNOME-APP</primary> 
  </indexterm> 
  <indexterm zone="index"> 
    <primary>mygnomeapp</primary> 
  </indexterm>

<!-- ============= Document Body ============================= -->
<!-- ============= Introduction ============================== -->
<!-- Use the Introduction section to give a brief overview of what
     the application is and what it does. -->
  <sect1 id="mrp-introduction"> 
    <title>Introducción</title> 
    <para>Glom le permite diseñar y usar sistemas de bases de datos.</para>
    <!-- TODO: Take text from the website. -->
  </sect1>

<!-- =========== Getting Started ============================== -->
<!-- Use the Getting Started section to describe the steps required
     to start the application and to describe the user interface components
     of the application. If there is other information that it is important
     for readers to know before they start using the application, you should
     also include this information here. 
     If the information about how to get started is very short, you can 
     include it in the Introduction and omit this section. -->

  <sect1 id="glom-getting-started"> 
    <title>Inicio</title> 

    <sect2 id="glom-start">
    <title>Iniciar Glom</title>
    <para>Puede iniciar <application>Glom</application> de las siguientes maneras:</para> 
    <variablelist>
    	<varlistentry>
    		<term>Menú de <guimenu>Aplicaciones</guimenu></term>
    		<listitem>
    		<para>Elija <menuchoice><guisubmenu>Oficina</guisubmenu><guimenuitem>Glom</guimenuitem></menuchoice>.</para>
    		</listitem>
    	</varlistentry>
    </variablelist>
    </sect2>

    <sect2 id="glom-when-start">
    <title>Al iniciar Glom</title>
    <para>Se mostrará la siguiente ventana al iniciar <application>Glom</application>.</para>

    <!-- ==== Figure ==== -->
      <figure id="newproject"> 
	<title>Ventana de inicio de Glom</title> 
	<screenshot> 
	  <mediaobject> 
	    <imageobject><imagedata fileref="figures/start.png" format="PNG"/> 
	    </imageobject>
	    <textobject> 
	      <phrase>Muestra la ventana principal de Glom.</phrase> 
	    </textobject> 
	  </mediaobject> 
	</screenshot> 
      </figure>
    <!-- ==== End of Figure ==== -->
  </sect2>
  </sect1>
<!-- ================ Usage ================================ -->
<!-- Use this section to describe how to use the application to perform the tasks for 
  which the application is designed. -->


    <sect1 id="glom-operator-usage">
    <title>Uso de Glom como un operador</title>
    <para>To open an existing Glom document, either open that document from the File Manager, or choose Glom from the Applications menu, and then choose the document when asked. Glom will ask you for a user name and password to access the database. Your administrator will provide your user name and password.</para>

    <para>Cuando abra un documento existente, Glom estará ejecutándose a <literal>nivel de usuario</literal><literal>Operador</literal>. Éste nivel le permite buscar y editar registros pero no le permite cambiar la estructura fundamental de la base de datos.</para>

    <sect2 id="navigation">
    <title>Navegación</title>
    <para>Each database has several tables. To look at a different table, choose <literal>Tables</literal> from the <literal>Navigate</literal> menu. Then double-click on the table, or select it and click the <literal>Open</literal> button.</para>

    <figure id="operator-navigation-tables"> 
	<title>Navigating to a Table</title> 
	<screenshot> 
	  <mediaobject> 
	    <imageobject><imagedata fileref="figures/glom_tables.png" format="PNG"/> 
	    </imageobject>
	    <textobject> 
	      <phrase>Navigating to a Table.</phrase> 
	    </textobject> 
	  </mediaobject> 
	</screenshot> 
     </figure>

    </sect2>

    <sect2 id="viewing-and-entering-data">
    <title>Viewing and Entering Data</title>
    <para>When in <literal>Data Mode</literal>, you can view or enter information in either the <literal>List</literal> or <literal>Details</literal> view.</para>

      <sect3 id="the-list-view">
      <title>The List View</title>
      <para>The List view shows many records at once and usually shows only the most important fields.</para>
      <para>Cuando introduzca datos en un campo se guardarán en la base de datos inmediatamente después de que termine de editarlo. Si es un campo de fecha u hora el formato se comprobará automáticamente.</para> 
      <para>To create a new record just click the <literal>New</literal> button, or start typing into a field in the last empty row. A new record row will be created with blank fields for you to fill in.</para>

      <figure id="operator-data-list"> 
	<title>The List View</title> 
	<screenshot> 
	  <mediaobject> 
	    <imageobject><imagedata fileref="figures/glom_data_list.png" format="PNG"/> 
	    </imageobject>
	    <textobject> 
	      <phrase>The List View.</phrase> 
	    </textobject> 
	  </mediaobject> 
	</screenshot> 
      </figure>

      <para>To sort the records just click on a column header. For instance, you could might click on a date column to list invoices in order of their date, and click again to list them in reverse order.</para>
      </sect3>

      <sect3 id="the-details-view">
      <title>The Details View</title>
      <para>The details view shows only one record and usually shows all the fields arranged suitably.</para>
      <para>Cuando introduzca datos en un campo se guardarán en la base de datos inmediatamente después de que termine de editarlo. Si es un campo de fecha u hora el formato se comprobará automáticamente.</para>
      <para>Para crear un nuevo registro pulse el botón <literal>Nuevo</literal>. Se creará un nuevo registro con los campos vacíos para que los pueda rellenar.</para>

  <figure id="operator-data-details"> 
	<title>The Details View</title> 
	<screenshot> 
	  <mediaobject> 
	    <imageobject><imagedata fileref="figures/glom_data_details.png" format="PNG"/> 
	    </imageobject>
	    <textobject> 
	      <phrase>The Details View.</phrase> 
	    </textobject> 
	  </mediaobject> 
	</screenshot> 
      </figure>

      </sect3>

    </sect2>

    <sect2 id="finding-data">
    <title>Buscar datos</title>
    <para>Elija <literal>Modo de búsqueda</literal> del menú. Los campos en la lista y vista detallada estarán vacíos y un botón de búsqueda aparecerá en la parte inferior de la ventana.</para>
    <para>Introduzca la información, o parte de la información, en el campo para buscar registros que contengan esa información en ese campo. Por ejemplo, introduzca Javi en un campo de nombre para buscar registros con «Javi» o «Javier» en el campo «Nombre».</para> 
    <para>When you press the <literal>Find</literal> button, Glom will search for records and then display them. If only one record is found then it will show you that record in the Details view. If several records are found then it will show you those records in the List view.</para>
    <!-- TODO: screenshot -->
    </sect2>

    <sect2 id="glom-operator-printing-reports">
    <title>Printing Reports</title>
    <para>If your database developer has defined some reports for a table then you will seem them listed in the <literal>Reports</literal> menu. Just choose the report from the menu to create the report. If you have previously performed a search then the report will contain only the currently-found data. Otherwise it will contain all data in the current report. Remember that each table has its own reports so you may need to switch to the relevant table to use a particular report.</para>

     <figure id="operator-report-result"> 
	<title>A report</title> 
	<screenshot> 
	  <mediaobject> 
	    <imageobject><imagedata fileref="figures/glom_report_result.png" format="PNG"/> 
	    </imageobject>
	    <textobject> 
	      <phrase>A report.</phrase> 
	    </textobject> 
	  </mediaobject> 
	</screenshot> 
      </figure>

    </sect2>


    </sect1>

    <sect1 id="glom-developer-usage">
    <title>Uso de Glom como desarrollador</title>
    <para>Cuando cree un nuevo documento, Glom estará ejecutándose a <literal>nivel de usuario</literal><literal>Desarrollador</literal>. También puede cambiar al nivel de usuario «Desarrollador» después de abrir un documento existente, desde el menú <literal>Nivel de usuario</literal>. Glom permitirá este cambio sólo si el administrador también lo permite.</para>

    <sect2 id="adding-tables">
    <title>Añadir tablas</title>
    <para>You can see the list of existing tables by choosing <literal>Tables</literal> from the <literal>Navigate</literal> menu. You will also see this window after connecting to a database server, after creating a new document. To create a new table, click the <literal>Add</literal> button and enter the name for the new table. Glom will suggest a human-readable title for this table. <literal>Operators</literal> will see this title instead of the actual table name. You can also mark a tables as <literal>hidden</literal> from Operators. For instance, Operators should see "Invoice Lines" as related records from the "Invoices" table, but they should never be able to navigate directly to the "Invoice Lines" table.</para>
    <!-- TODO: screenshot -->
    <para>Puede especificar una tabla como la <literal>tabla predeterminada</literal>. Esta tabla e mostrará siempre que un operador abra un documento existente, sin preguntarle que seleccione una tabla de la lista.</para>
    <para>También puede usar esta ventana para renombrar una tabla existente.</para>
    <para>Pulse el botón de <literal>Abrir</literal> para ver las tablas seleccionadas.</para>
    </sect2>

    <sect2 id="editing-fields">
    <title>Editar campos</title>
    <para>Elija <literal>Campos</literal> del menú de <literal>Desarrollador</literal>. Esto mostrará la lista de campos en la tabla. Las tablas nuevas tienen un campo de clave primaria automáticamente, pero puede cambiar el campo si es necesario.</para>
    <para>Click the <literal>Add</literal> button to add a new field, then enter the name of the new field. Glom will guess an appropriate human-readable title for this field, but you can edit this. <literal>Operators</literal> will see this title instead of the actual field name.</para> 
    <para>Para especificar más detalles de un campo, seleccione el campo y pulse en el botón de <literal>Detalles</literal>.</para>

    <figure id="developer-editing-fields"> 
	<title>Editar campos</title> 
	<screenshot> 
	  <mediaobject> 
	    <imageobject><imagedata fileref="figures/glom_design_fields.png" format="PNG"/> 
	    </imageobject>
	    <textobject> 
	      <phrase>Editar los campos de tabla.</phrase> 
	    </textobject> 
	  </mediaobject> 
	</screenshot> 
     </figure>


    <sect3 id="primary-keys">
    <title>Claves primarias</title>
    <para>Cada tabla debe tener una, y solamente una, <literal>Clave primaria</literal>. El valor en este campo debe ser único, lo que quiere decir que cada valor en este campo sólo aparecerá en un sólo registro de la tabla. Por ejemplo, cada registro de la tabla «Clientes» tendrá también un campo «ID del cliente». Este valor se usará para referirse a este cliente en otras tablas, tales como los registros «Proyectos» y «Facturas». Lea la sección <link linkend="sec-developer-relationships">Creando relaciones</link> para obtener más información acerca de cómo relacionar tablas entre si.</para>
    </sect3> 

    <sect3 id="field-types">
    <title>Tipos de campos</title>
    <para>Glom ofrece algunos tipos simples de campos: <orderedlist>
<listitem><simpara>Número</simpara></listitem>
<listitem><simpara>Texto</simpara></listitem>
<listitem><simpara>Fecha</simpara></listitem>
<listitem><simpara>Hora</simpara></listitem>
<listitem><simpara>Booleano - tanto cierto como falso</simpara></listitem>
<listitem><simpara>Imagen</simpara></listitem>
</orderedlist></para>
    </sect3>
  
    <sect3 id="calculated-fields">
    <title>Campos calculados</title>
    <para>El valor de los campos se puede calcular con términos de otros campos, usando el lenguaje de programación Python. Éste cálculo debería ser la implementación de una función en Python y debería devolver un valor. El valor devuelto se usará como el valor del campo. Este valor se volverá a calcular cada vez que cambie alguno de los campos de los que obtiene sus datos. Por desarrollar: Por ahora ésto sólo funciona para valores predeterminados, y tampoco se pueden usar los valores de los campos en el cálculo.</para>
    <para>También puede hacer cálculos para especificar el valor predeterminado de los campos, seleccionado la solapa <literal>Valor predeterminado</literal> de la ventana <literal>Detalles del campo</literal>, pulsando sobre la casilla <literal>Calcular valor</literal> e introduciendo un cálculo en Python. Puede comprobar este cálculo en la ventana <literal>Editar</literal>.</para>  
    </sect3>

    </sect2>

    <sect2 id="arranging-layouts">
    <title>Ordenando las distribuciones</title>
    <para>Cada tabla tiene una vista de <literal>Lista</literal> y de <literal>Detalles</literal>, por omisión ambas muestran todos los campos de la tabla por fecha de creación. Puede editar la distribución escogiendo <literal>Distribución</literal> del menú de <literal>Desarrollador</literal>.</para>

    <sect3 id="arranging-the-list-view">
    <title>Arranging the List View</title>
    <para>Para la vista de <literal>Lista</literal>, puede especificar la secuencia de los campos columna, y también si hay algún campo oculto.</para>

    <figure id="developer-layout-list"> 
	<title>Editing the List Layout</title> 
	<screenshot> 
	  <mediaobject> 
	    <imageobject><imagedata fileref="figures/glom_design_layout_list.png" format="PNG"/> 
	    </imageobject>
	    <textobject> 
	      <phrase>Editing the list layout.</phrase> 
	    </textobject>
	  </mediaobject> 
	</screenshot> 
     </figure>
    </sect3>

    <sect3 id="arranging-the-details-view">
    <title>Arranging the Details View</title>
    <para>Para la vista de <literal>Detalles</literal>, puede crear grupos o campos y darlos títulos. Después puede colocar campos en esos grupos y especificar la secuencia de los campos en los grupos. También puede especificar la secuencia de los grupos. Por ejemplo, en una tabla de «Contactos» puede crear un grupo llamado «Nombre», y colocar los campos «Título», «Nombre» y «Apellido» en ese grupo. Puede tener otros grupos para los campos «Direcciones».</para>

    <figure id="developer-layout-details"> 
	<title>Editing the details Layout</title> 
	<screenshot> 
	  <mediaobject> 
	    <imageobject><imagedata fileref="figures/glom_design_layout_details.png" format="PNG"/> 
	    </imageobject>
	    <textobject> 
	      <phrase>Editing the Details Layout.</phrase> 
	    </textobject>
	  </mediaobject> 
	</screenshot> 
     </figure>
    </sect3>

    </sect2>

    <sect2 id="sec-developer-relationships">
    <title>Crear relaciones</title>
    <para>Muchas veces las tablas de una base de datos están relacionadas entre sí. Por ejemplo, una tabla de «Facturas» podrá tener un campo «ID del cliente». El valor de ese campo especifica un registro en la tabla «Clientes» el cual tiene el mismo valor. Glom puede mostrar información adicional, como el nombre del cliente, de ese registro relacionado. O puede mostrar una lista de varios registros relacionados - por ejemplo, algún registro de la «Lista de facturas» que está relacionado con otro registro de «Facturas».</para>
    <para>Para crear relaciones, escoja <literal>Relaciones</literal> del menú de <literal>Desarrollador. Esto le mostrarA e introduzca un nombre para ella. Debe elegir un campo de la tabla actual y un campo de otra tabla con el que se crear</literal></para>
    <!-- TODO: screenshot -->
   <para>Puede usar las relaciones en los siguientes lugares. <orderedlist>
<listitem><simpara>Para mostrar un campo relacionado en la lista o en la vista detallada.</simpara></listitem>
<listitem><simpara>Para mostrar una lista de registros relacionados en la vista detallada.</simpara></listitem>
<listitem><simpara>Para buscar un valor de un campo en un registro relacionado. Por ejemplo, copie el precio de un «Producto» en el campo «Precio» de un registro de «Facturas».</simpara></listitem>
<listitem><simpara>Para calcular el valor de un campo.</simpara></listitem>
</orderedlist></para>
   </sect2> 

   <sect2 id="users-administration">
   <title>Administración de usuarios</title>
   <para>To define the <literal>Operators</literal> who can use your database, and to specify what access they have to the various tables, choose <literal>Users</literal> from the <literal>Developer</literal> menu.</para>
    <!-- TODO: screenshot -->
   </sect2>

   <sect2 id="translations">
   <title>Translations</title>
   <para>Glom's user interface (and this document) is translated into several languages, as you should see already if you are using your computer with a non-English user interface. In addition, Glom automatically shows and understands numbers and dates according to the current user's local conventions. For instance, a user in the USA might enter a price as 1.99 and a date as 1/13/2008, but a German user of the same database will later see that as 1,99 and 13.1.2008.</para>
   <para>However, the Glom system that you create also contains text that must be translated if it will be used by people who speak different languages. For instance, you must provide translations for the titles of your tables, fields, and reports. All of these text items can be seen in a list when you choose <literal>Translations</literal> from the <literal>Developer</literal> menu. In this window you can specify the language that you used for the original text, and enter translations for each text item for additional languages. When the Glom system is opened by a user of that language then these 
text items will be shown in the user interface.</para>

   <!-- TODO: Update this screenshot -->
   <figure id="developer-translations"> 
	<title>Translations</title> 
	<screenshot> 
	  <mediaobject> 
	    <imageobject><imagedata fileref="figures/glom_design_translations.png" format="PNG"/> 
	    </imageobject>
	    <textobject> 
	      <phrase>Translations.</phrase> 
	    </textobject>
	  </mediaobject> 
	</screenshot> 
     </figure>

    <para>Experienced translators may be more familiar with the .po file format, or you might wish to use the many tools that work with the .po file format. By using the <literal>Export</literal> button you can create a .po file to use in a separate tool or to send to a translator. You can then import the resulting translation by using the <literal>Import</literal> button.</para>  

   </sect2>

   <sect2 id="defining-reports">
   <title>Defining Reports</title>

   <sect3 id="adding-or-editing-reports">
   <title>Adding or Editing Reports</title>

   <para>Glom can produce reports to show specific fields for sets of records, sorted and grouped. 
For instance, a shop might need a report listing all products sold in one month, grouped by product type, and sorted by price inside each group. Each table has its own reports, which are available to the operator from the <literal>Reports</literal> menu.</para>
   <para>To define a report, or to change the definition of an existing report, choose <literal>Reports</literal> from the <literal>Developer</literal> menu.</para>
   <figure id="developer-editing-reports"> 
	<title>Creating or Editing Reports</title> 
	<screenshot> 
	  <mediaobject> 
	    <imageobject><imagedata fileref="figures/glom_design_reports.png" format="PNG"/> 
	    </imageobject>
	    <textobject> 
	      <phrase>Creating or editing reports.</phrase> 
	    </textobject>
	  </mediaobject> 
	</screenshot> 
     </figure>

    <para>Notice that each report has an ID as well as a human-readable name. This allows your report to have a translated title when used on a computer that uses a different language.</para>

    </sect3>

    <sect3 id="editing-a-report">
    <title>Editing a Report</title>

    <para>A Glom report has three areas:
    <orderedlist>
      <listitem><simpara>The Header, which appears at the start of the report</simpara></listitem>
      <listitem><simpara>The Main area, in which the records and summary lines are shown, with the actual data from the database.</simpara></listitem>
      <listitem><simpara>The Footer, which appears at the end of the report.</simpara></listitem>
    </orderedlist>
    </para>

    <para>Inside an area, such as the Main part, you may add report <literal>Parts</literal>, such as fields, text, or images. These will usually appear in a row on the printed report, with one row for each record. In the simple case, this will look much like Glom's list view. You can add parts to your report by selecting them from the <literal>Available Parts</literal> list and then clicking the <literal>Add</literal> button. The part will then be added to the <literal>Parts</literal> list, in the selected area.</para>
    <para>To specify details for the parts, such as the text or image to display, or to choose the field to display, select the part in the <literal>Parts</literal> list and click the <literal>Edit</literal> button. You may also specify field formatting by clicking the <literal>Formatting</literal> button, just as you would when defining a details or list layout.</para>

    <figure id="developer-editing-reports-details"> 
	<title>Editing a Report</title> 
	<screenshot> 
	  <mediaobject> 
	    <imageobject><imagedata fileref="figures/glom_design_reports_details.png" format="PNG"/> 
	    </imageobject>
	    <textobject> 
	      <phrase>Editing a report.</phrase> 
	    </textobject> 
	  </mediaobject> 
	</screenshot> 
     </figure>

    <para>Some parts may contain other parts and have extra properties to control how they present their child parts. For instance, the <literal>Group By</literal> part groups records together by a field. For instance, a products report might group a list of products by product type. You can even add a second sub-grouping inside the main <literal>Group By</literal> part, by selecting your top-level <literal>Group By</literal> part in the <literal>Parts</literal> list while adding a new <literal>Group By</literal> part from the <literal>Available Parts</literal> list. For instance, you might group your products by manufacturer, inside each product type group.</para>
    <para>To specify the field by which the records should be grouped, select your <literal>Group By</literal> part in the <literal>Parts</literal> list and click the <literal>Edit</literal> button. You can then choose the field by which the records should be grouped, and select the fields by which these records should be sorted within the group. You may also specify some additional fields to be displayed in the group's title row. For instance, you might want to group products by a manufacturer ID, but also show the manufacturer name.</para>

    <figure id="developer-editing-reports-group_by"> 
	<title>Editing a Group By Part</title> 
	<screenshot> 
	  <mediaobject> 
	    <imageobject><imagedata fileref="figures/glom_design_reports_group_by.png" format="PNG"/> 
	    </imageobject>
	    <textobject> 
	      <phrase>Editing a report.</phrase> 
	    </textobject> 
	  </mediaobject> 
	</screenshot> 
     </figure>

   <para>The <literal>Vertical Group</literal> part may contain other items. For instance, it allows you to arrange fields below each other instead of just one after the other in the horizontal row. This is useful for grouping related fields such as address lines, or just to squeeze more information into the records's row on the report.</para>
   
   <figure id="developer-editing-reports-vertical_group"> 
	<title>A Report with Vertical Groups</title> 
	<screenshot> 
	  <mediaobject> 
	    <imageobject><imagedata fileref="figures/glom_design_reports_vertical_group.png" format="PNG"/> 
	    </imageobject>
	    <textobject> 
	      <phrase>A Report with Vertical Groups.</phrase> 
	    </textobject> 
	  </mediaobject> 
	</screenshot> 
     </figure> 

   <para>When you have finished, click the <literal>Close</literal> button to save the report's definition. Your report can then be chosen from the <literal>Reports</literal> menu. See the <link linkend="glom-operator-printing-reports">Printing Reports</link> section for more details.</para>



   </sect3>

   </sect2>
  
  </sect1>

<!-- =============Dialogs ================================= -->
<!-- This section contains the help to all dialogs that contain help button -->

<sect1 id="dialogs">
<title>Diálogos</title>

<sect2 id="dialog_existing_or_new">
<title>Dialog: Initial dialog</title>
<para>This dialog allows the user to choose an existing document or create a new document. Existing documents may be selecting from the list of recently opened documents or by select a file with the file chooser dialog. Documents can also be opened via the network if other users are running Glom on the local network. Finally, a new document can be created either by opening a template file which already contains some initial tables and records, or by creating an empty document.</para>
</sect2>

<sect2 id="dialog_new_database">
<title>Dialog: New database</title>
<para/>
</sect2>

<sect2 id="dialog_error_create_database">
<title>Dialog: Create database</title>
<para/>
</sect2>

<sect2 id="dialog_connection">
<title>Dialog: Connection</title>
<para>This dialog requests a user name and password for connection to a database server. This is usually not the same username and password combination with which you log in to your system. All Glom systems require a database server on which the actual data will be stored. If the database server is not running on your local computer ("localhost"), then you must also provide its network hostname, such as "glomserver.openismus.com", though your hostname will be different.</para>
<para>Your system administrator can provide these database login details.</para>
<para>If you are the system administrator, see Glom's <ulink url="http://www.glom.org/wiki/index.php?title=Initial_Postgres_Configuration" type="http">Postgres Configuration</ulink> web page for help with installing and configuring a database server.</para>
</sect2>

<sect2 id="dialog_error_connection">
<title>Dialog: Connection Error</title>
<para>This dialog is shown when Glom could not connect to the specified database server. Either the database server is not running at the specified hostname, or the user name and password were not accepted by the database server. See the <link linkend="dialog_connection">Connection Dialog</link> section for more details.</para>

<para/>
</sect2>

<sect2 id="dialog_database_preferences">
<title>Dialog: Database preferences</title>
<para/>
</sect2>

<sect2 id="dialog_change_language">
<title>Dialog: Change language</title>
<para/>
</sect2>

<sect2 id="window_textobject">
<title>Window: Textobject</title>
<para/>
</sect2>

<sect2 id="window_imageobject">
<title>Window: Imageobject</title>
<para/>
</sect2>

<sect2 id="dialog_notebook">
<title>Dialog: Notebook</title>
<para/>
</sect2>

<sect2 id="dialog_data_invalid_format">
<title>Dialog: Data invalid format</title>
<para/>
</sect2>

<sect2 id="dialog_relationship_overview">
<title>Dialog: Relationship overview</title>
<para/>
</sect2>

<sect2 id="window_groups">
<title>Window: Groups</title>
<para/>
</sect2>

<sect2 id="dialog_groupby_sort_fields">
<title>Dialog: Group by sort fields</title>
<para/>
</sect2>

<sect2 id="dialog_groupby_secondary_fields">
<title>Dialog: Group by secondary fields</title>
<para/>
</sect2>

<sect2 id="window_button_script">
<title>Window: Button script</title>
<para/>
</sect2>

<sect2 id="window_field_calculation">
<title>Window: Field calculation</title>
<para/>
</sect2>

<sect2 id="dialog_new_group">
<title>Dialog: New group</title>
<para/>
</sect2>

<sect2 id="dialog_choose_user">
<title>Dialog: Choose user</title>
<para/>
</sect2>

<sect2 id="dialog_user">
<title>Dialog: User</title>
<para/>
</sect2>

<sect2 id="dialog_translation_identify_original">
<title>Dialog: Translation identify original</title>
<para/>
</sect2>

<sect2 id="dialog_translation_copy">
<title>Dialog: Translation copy</title>
<para/>
</sect2>

<sect2 id="dialog_choose_date">
<title>Dialog: Choose Date</title>
<para/>
</sect2>

</sect1>

<!-- ============= Bugs ================================== -->
<!-- This section is optional and is commented out by default. 
     You can use it to describe known bugs and limitations of the 
	  program if there are any - please be frank and list all
     problems you know of. 
  
  <sect1 id="mayapp-bugs">
  <title>Known Bugs and Limitations</title>
  <para> </para>
 </sect1>
-->
<!-- ============= About ================================== -->
<!-- This section contains info about the program (not docs), such as
      author's name(s), web page, license, feedback address. This
      section is optional: primary place for this info is "About.." box of
      the program. However, if you do wish to include this info in the
      manual, this is the place to put it. Alternatively, you can put this information in the title page.-->
 <sect1 id="Glom-about"> 
    <title>Acerca de Glom</title> 
    <para>Glom y la comunidad de voluntarios de Glom se encargan de mantener Glom. Para obtener más información acerca de Glom, visite la <ulink url="http://www.glom.org/" type="http">página web de Glom</ulink>.</para>
    <para>Para informar sobre un error o hacer sugerencias sobre esta aplicación o sobre éste manual, puede enviarlas usando <ulink url="http://bugzilla.gnome.org" type="http">Bugzilla</ulink>.</para>

    <para>Otra excelente fuente de información son las <ulink url="http://www.glom.org" type="http">listas de correo</ulink> de Glom.</para>

    <para>Este programa se distribuye bajo los términos de la Licencia Pública General GNU (GPL) tal y como fue publicada por la Free Software Foundation, en la versión 2 ó (a su elección) cualquier versión posterior. Una copia de esta licencia puede encontrarse en <ulink url="ghelp:gpl" type="help">este enlace</ulink>, o en el archivo COPYING incluido con el código fuente de este programa.</para>
  </sect1>

  <appendix id="sec-concepts">
  <title>Conceptos</title>
  <para>Glom es fácil de usar, pero debe entender los siguientes conceptos básicos. <orderedlist>
<listitem><simpara><literal>Database</literal>: Each Glom document allows access to one database.</simpara></listitem>
<listitem><simpara><literal>Tabla</literal>: Cada base de datos contiene varias tablas, tales como, por ejemplo, las tablas «Clientes» y «Facturas».</simpara></listitem>
<listitem><simpara><literal>Campo</literal>: Cada tabla tiene varios campos, tales como «ID del cliente», «Nombre» y «Fecha de nacimiento», en otros documentos y aplicaciones, se suele denominar a estos campos «columnas».</simpara></listitem>
<listitem><simpara><literal>Registros</literal>: Cada tabla tiene varios registros, cada uno de los cuales contiene valores para cada uno de los campos. Por ejemplo la tabla de «Clientes» tendrá un registro para cada cliente. En otros documentos y aplicaciones, a los registros se los suele denominar <literal>filas</literal>.</simpara></listitem>
<listitem><simpara><literal>Relaciones</literal>: Cada tabla puede estar relacionada con otras tablas, por medio de los campos de ambas tablas. Por ejemplo, la tabla «Clientes» puede tener relación con la tabla «Facturas», de tal manera que se pueden ver todas las facturas de ése cliente. Sólo los desarrolladores necesitan entender éste concepto. En otros documentos y aplicaciones, a las relaciones se las suele denominar «uniones» o «joins».</simpara></listitem> 
</orderedlist></para>
  </appendix>

  <appendix id="sec-calculated-fields">
  <title>Calculated fields and button scripts</title>
  <para>Calculated fields and button scripts use the Python programming language. The calculation or script is the implementation of a function whose signature is provided for you.</para>

     <figure id="developer-editing-fields-calculated"> 
	<title>Editing the definition of a calculated field</title> 
	<screenshot> 
	  <mediaobject> 
	    <imageobject><imagedata fileref="figures/glom_design_fields_dialog_calculated.png" format="PNG"/> 
	    </imageobject>
	    <textobject> 
	      <phrase>Editing the definition of a calculated field.</phrase> 
	    </textobject> 
	  </mediaobject> 
	</screenshot> 
     </figure>

  <sect1 id="field-values">
  <title>Field values</title>
  <para>For instance, <programlisting>record["name_first"]</programlisting> is the value of the name_first field in the current record.</para>
  </sect1>

  <sect1 id="related-records">
  <title>Related Records</title>
  <para>For instance, <programlisting>record.related["location"]</programlisting> provides the related records for the current record.</para>

  <sect2 id="single-related-records">
  <title>Single related records</title>
  <para>For relationships that specify a single record, you can get the value of a field in that record. For instance, <programlisting>record.related["location"]["name"]</programlisting> is the value of the name field in the table indicated by the location relationship (often called location::name).</para>
  </sect2>

  <sect2 id="multiple-related-records">
  <title>Multiple related records</title>
  <para>For relationships that specify multiple records, you can use the aggregate functions (sum, count, average) to get overall values. For instance, <programlisting>record.related["invoice_lines"].sum("total_price")</programlisting>.</para>
  </sect2>

  </sect1>

  <sect1 id="testing-for-empty-values">
  <title>Testing for empty values</title>
  <para>
  How you test for empty values depends on the type of field:
  </para>

  <sect2 id="non-text-fields">
  <title>Non-text fields</title>
  <para>Non-text fields may be empty, indicating that the user has not entered any value in the field. For instance, Glom does not assume that an empty value in a numeric field should mean 0.</para>
  <para>You can test whether a field is empty by using Python's None. For instance:</para>
  <para>
  <programlisting>
  if(record["contact_id"] == None):
    return "No Contact"
  else:
    return record.related["contacts"]["name_full"]
  </programlisting>
  </para>
  <para>You might also test whether there are any related records. For instance:</para>
  <para>
  <programlisting>
  if(record.related["contacts"] == None):
    return "No Contact"
  else:
    return record.related["contacts"]["name_full"]
  </programlisting>
  </para>
  </sect2>

  <sect2 id="text-fields">
  <title>Text fields</title>
  <para>For text fields, you should check for zero-length strings. It is not possible in Glom to distinguish between zero-length strings and the absence of any string, because there is no advantage to doing so. For instance:</para>
  <para>
  <programlisting>
  if(record["name_full"] == ""):
    return "No Name"
  else:
    return record["name_full"]
  </programlisting>
  </para>
  </sect2>
</sect1>


<sect1 id="using-the-full-pygda-api">
  <title>Using the full pygda API</title>
  <para>pygda is a python API for the libgda API. The record's <literal>connection</literal> attribute provides a gda.connection that can be used to access the current database directly. This allows you to run any SQL query, for instance to read data from the database with a SELECT, or to change values in the database with an UPDATE. Note that the connection is already open so you can avoid the difficult work of specifying the connection details.</para>
  <para>The record's <literal>table_name</literal> attribute also provides the name of the current table.</para>
  <para>(Note that the <literal>record.connection</literal> and <literal>record.table_name</literal> attributes are only available since Glom 1.1.6.)</para>
  <para>This example reads all data from the current table and prints the values to the terminal: </para>
  <para>
  <programlisting>
# Use the current database's connection 
# to get all the data for the current table.
#
# record.connection is an already-open gda.connection object,
# saving us the bother of opening the connection,
# or even knowing the name of the database.

query = "SELECT * FROM %s" % record.table_name
command = gda.Command(query)
data_model = record.connection.execute_single_command(command)

rows = data_model.get_n_rows()
columns = data_model.get_n_columns()
print "    Number of columns: ", columns

for i in range(columns):
    print "      column ", i;
    print "        name=", data_model.get_column_title(i)

    # Find out whether it's the primary key:
    field = data_model.describe_column(i)
    if field.get_primary_key():
        print "        (primary key)"

    print "\n";
     
print "    Number of rows: ", rows

for row_index in range(rows):
    print "      row ", row_index;

    for col_index in range(columns):
        print "        value=", data_model.get_value_at(col_index, row_index).get()

    print "\n";
  </programlisting>
  </para>
  </sect1>

  </appendix>

 
</article>
