Lenguaje y Normas de Desarrollo: Difference between revisions

Jump to navigation Jump to search
Line 75: Line 75:


= Normas SQL =
= Normas SQL =
= Tabla structura =
* Todas las tablas tienen prefijo para evitar conflictos de nombres. A día de hoy, el prefijo está determinado y no se puede cambiar. Su valor es <tt>llx_</tt>. Sin embargo, está pendiente de considerar, en una futura versión, el poder cambiarlo en el momento de la instalación.
* En la práctica, con la finalidad de set compatible con todas las precisiones de los paises, utilizaremos los siguientes tipos:
- double(24,8) para cualquier importe
- double(6,3) para las tasas de IVA
- real para una cantidad
- varchar para una cadena (incluidos los de longitud 1, el tipo char se está depreciando)
- timestamp para fecha+hora que deba ser actualizado automáticamente
- datetime para fecha+hora
- date para fecha
= Clave primaria =
La clave primaria de una tbla se llama <tt>rowid</tt>.
Hay unas pocas tablas que incumplen la norma ahora (ej [[Table llx_c_actioncomm]]), por razones históricas. Podrá ser estudiada una evolución para una próxima versión.
= Clave secundaria =
El nombre de una clave secundaria empieza con el prefijo <tt>fk_</tt> seguido por el nombre de la tabla vinculada (necesario para evitar duplicaciones globales en la base de datos, problemáticas en algunos RDBMS como postgresql), seguido del campo vinculado (para permitir diferentes claves secundarias en la misma tabla).
Ejemplo:
fk_facture_fourn_fk_soc
= Clave alternativa =
A veces no sólamente la clave primaria debe ser única. Por lo tanto, podemos añadir un índice de clave única alternativa. Este índice es llamado por un nombre que comienza con el prefijo <tt>uk_</tt> seguido por el nombre de la tabla  (necesario para evitar la duplicación de índeces globales en la base de datos, problemáticos en algunos DBMS como postgresql) y de un sufijo que caracterice a la clave (para permitir múltiples índices en una sola tabla).
Ejemplo:
uk_societe_code_client
= Indices de rendimiento =
Algunos campos se utilizan a menudo como un criterio para la búsqueda, clasificación o afiliación. Conviene en este caso, poner un índice de rendimiento. Tales índices se llamarán con un prefijo <tt>idx_</tt> seguidos del nombre de la tabla y el nombre del campo en el que el índice trabaja.
Ejemplo:
idx_societe_user_creat
'''Formato de fichero DDL'''
Los ficheros que contienen la definición de la estructura de la base de datos (DDL) deben de estar repartidos en dos tablas:
* Cada tabla se define en su propio archivo cuyo nombre es <tt>llx_''mitabla''.sql</tt>
Donde habrá un comentario junto a cada campo para explicar su significado.
* Claves de relacionales y el índice de rendimiento o otras constraints de carácter único se definen en un archivo cuyo nombre es <tt>llx_''mitable''.key.sql</tt>
Estos ficheros se guardan el la carpeta '''install/mysql/tables''' para los ficheros standards ó '''mimodulo/tables''' para las tablas llevadas por un módulo.
Ejemplos '''Fichero tabla llx_matable.sql''':
<source lang="sql">
-- ===========================================================================
-- Copyright (C) 2008 Author <email@author.com>
--
-- This program is free software; you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation; either version 2 of the License, or
-- (at your option) any later version.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with this program. If not, see <http://www.gnu.org/licenses/>.
-- ===========================================================================
create table llx_matable
(
  rowid      integer AUTO_INCREMENT PRIMARY KEY,
  field_one  integer,
  field_two  integer NOT NULL,
  fk_field    integer,
  field_date  datetime,
  tms        timestamp
)type=innodb;
</source>
Ejemplos '''Fichero de claves/índices llx_matable.key.sql'''
<source lang="sql">
-- ===========================================================================
-- Copyright (C) 2008 Author <email@author.com>
--
-- This program is free software; you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation; either version 2 of the License, or
-- (at your option) any later version.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with this program. If not, see <http://www.gnu.org/licenses/>.
-- ===========================================================================
ALTER TABLE llx_matable ADD UNIQUE uk_matable_field(field_one, field_two);
ALTER TABLE llx_matable ADD CONSTRAINT fk_matable_fk_field FOREIGN KEY (fk_field) REFERENCES llx_matablepere (rowid);
</source>
= SQL Coding rules =
* Uso de alias / nombres de los campos
Dentro de los selects pueden utilizar alias para simplificar la redacción de las consultas:
<source lang="sql">
select chp1, chpxxx2 as chp2 from table2 as t1, table2 as t2 where t1.chpx = t2.chpy
</source>
Sin embargo, no debemos utilizar este alias en las consultas de actualización porque no es compatible con mysql 3.1.


* ¡Los SELECT * están prohibidos! Cada Select deberá especificar la lista completa de los campos para recuperar. Esto permitirá evitar confusiones. Ejemplo:
* ¡Los SELECT * están prohibidos! Cada Select deberá especificar la lista completa de los campos para recuperar. Esto permitirá evitar confusiones. Ejemplo:
Line 92: Line 200:
'MU', 'MT' ó 'MS' según sea necesario. Consulte el capítulo "Los números reales, importes y cálculos" más abajo.
'MU', 'MT' ó 'MS' según sea necesario. Consulte el capítulo "Los números reales, importes y cálculos" más abajo.


En la práctica, con la finalidad de set compatible con todas las precisiones de los paises, utilizaremos los siguientes tipos:
* las funciones NOW, SYSDATE ó IFNULL están prohibidas en las órdenes de SQL. Si se necesita indicar la fecha del momento en un campo, el valor debe provenir de PHP y no del motor de la base de datos. Esto además de ofrecer una mejor portabilidad del código, también permite una gestión correcta de la zona horaria.
- double(24,8) para cualquier importe
 
- double(6,3) para las tasas de IVA
= Particularidades de MySQL =
- real para una cantidad
 
- varchar para una cadena (incluidos los de longitud 1, el tipo char se está depreciando)
* Las tablas deben de estar en formato InnoDB.
- timestamp para fecha+hora que deba ser actualizado automáticamente
En efecto, este formato soporta claves secundarias, las eventuales restricciones que se adjuntan y la noción de integridad de transacciones requeridas para obteter datos coherentes entre tablas en la base de datos.
- datetime para fecha+hora
- date para fecha


* Dolibarr debe trabajar incluso con la opción '''strict''' de Mysql activa.
* Dolibarr debe trabajar incluso con la opción '''strict''' de Mysql activa.
Line 107: Line 213:
</source>
</source>


* las funciones NOW ó SYSDATE están prohibidas en las órdenes de SQL. Si se necesita indicar la fecha del momento en un campo, el valor debe provenir de PHP y no del motor de la base de datos. Esto además de ofrecer una mejor portabilidad del código, también permite una gestión correcta de la zona horaria.
= Particularidades de PostgreSQL =
Sólo los archivos de MySQL deben mantenerse.
Los archivos para otras bases de datos se convierten "al vuelo" por el gestor de la base de datos.


= Normas HTML =
= Normas HTML =

Navigation menu