Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 21-03-2007
Avatar de BlackDaemon
BlackDaemon BlackDaemon is offline
Miembro
 
Registrado: dic 2006
Ubicación: Bolivia - Santa Cruz
Posts: 206
Poder: 18
BlackDaemon Va por buen camino
Actualizar datos de un StringGrid desde DB

Buenas a todos.
como verán no suelo postear mucho por que con la info que hay en ClubDelphi creo que no es necesário hacerlo ya que está "casi" todo lo que uno necesita para poder realizar "casi" cualquier cosa, estoy aprendiendo muchísimo gracias a este foro y a sus foreros que siempre me han ayudado hasta el momento ( saludos Caral, Lepe, Roman.. y alguno que se me escapa ) que me resolvieron las dudas hasta el momento.. pero bueno al grano xDD

Resulta que estoy haciendo un sistema de facturación y ahora estoy en la parte de ventas, que es donde mas problemas he tenido y los superé como dije gracias al foro.. pero ahora este problema que tengo ahora me mata!!!
No pude resolverlo es mas. creo que parte de mi por no saber plantearme bién que es lo que necesito o COMO necesito hacerlo.

Bueno lo que quiero hacer es ACTUALIZAR una COLUMNA de un StringGrid con datos de una DB ( MySQL ) que conecto con ZEOS
no tengo problemas para insertar datos.. eliminarlos, etc.

Ahora el problema es que para los que estoy haciendo el programa manejan 6 Precios diferentes de cada producto que se los agrega el momento de agregar el respectivo producto o "Item", bueno ahora cada cliente el momento de darle de alta se le asigna una lista de precio ( cualquiera de los precios )

Ya hasta este punto bién.. ahora lo que pretengo hacer es lo siguiente.

CUando abro el módulo ventas lo primero que me sale es esto
(si, si ya se que está feo pero quiero que sea funcinal xD )

[img=http://img187.imageshack.us/img187/4128/preciosow0.th.jpg]

ahora cuando busco un cliente tiene que cambiar el ComboBox que ven a la derecha el que está encerrado con en un óvalo

Bueno luego de eso comienzo la búqueda del producto por código de producto o código de barras lo encuentro y lo agrego el StringGrid
OJO.- el precio lo toma desde el ComboBox según el número que esté

Bueno y todo lo demás sin problemas.. pero ahora que pasaría si el Cliente quiere que le den con la lista de precio 4 ( precio4 ) por ej y siendo que el tenía la lista de precio 3 ( precio3 ) pues si como se lo imaginaban.. hay que precionar el botón LIMPIAR TODO y comensar a agregar de nuevo con la nueva lista de precios escojida en el ComboBOx perooooooooo como se darán cuenta es una pérdida de tiempo y además el programa no sería efisciente.. daría malos ratos al que lo usa y no me gusta eso, si hago algo lo quiero hacer bién.

Ya ahora lo quiera es que el que usa la app pueda cambiar el item en el COmboBox y automaticamente se ACTUALIZEN TODOS los precios de la respectiva columna

Pero no se como hacer..
Por el momento lo que analicé es hacer con una consulta SQL a la tabla Productos de mi Base de Datos.

TABLA PRODUCTOS.

Código SQL [-]
CREATE TABLE `productos` (
  `ID_producto` int(10) unsigned NOT NULL auto_increment,
  `CodProducto` varchar(10) NOT NULL,
  `CodigoBarra` varchar(15) NOT NULL default '0',
  `Descripcion` varchar(30) NOT NULL default '',
  `Categoria` varchar(20) NOT NULL default '',
  `SubCategoria` varchar(20) NOT NULL default '',
  `Unidad` varchar(5) NOT NULL,
  `Cantidad` int(11) NOT NULL default '0',
  `Proveedor` varchar(20) NOT NULL default '',
  `UnidadPrecio` varchar(5) NOT NULL default '',
  `PrecioCompraBs` float default '0',
  `PrecioCompraSus` float default '0',
  `Costo` float default '0',
  `Precio1` float NOT NULL default '0',
  `Precio2` float default NULL,
  `Precio3` float default NULL,
  `Precio4` float default NULL,
  `Precio5` float default NULL,
  `Precio6` float default NULL,
  `FechaActualizacion` date NOT NULL default '0000-00-00',
  PRIMARY KEY  (`ID_producto`),
  UNIQUE KEY `CodProducto` (`CodProducto`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1


luego de eso pensé primer lugar en buscar el producto ya sea por codProducto o por CodigoBarra que si o si tienen que tenerlo una ves encontrado el producto de la primera columna ( vamos la horizontal, estoy tan confundido que no recuerdo cual es fila y columna en el StringGrid )
una ves buscaod el producto por codproducto o codigobarra y buscar el campo precio pienso que sería una variable que contenga de acuerdo al ComboBox el respectivo precio ( precio1, precio2,.... )
Luego de eso una ves encontrado el producto por su código y su campo precio con la variable precio hacer que ACTUALIZE el precio que tiene insertado en el StringGrid... por ej si estaba un producto:

SIlla de madera precio1

que me lo actualice a :

Silla de madera precio2 ( dependiendo de que items tengan en el ComboBox )

y eso hacer con tooooodos los productos que tenga en el StringGrid


Bueno se que sería con unos 2 bucles pero vamos.. soy pura teoría que no se como hacerlo

ajunto una chapucera que intenté pero se que está mal xDD
por lo menos intenté

Código Delphi [-]
procedure TFrmVentas.CBListaPrecioChange(Sender: TObject);
var
  i : Integer;
  Precio : String;
begin
  DM.ZQAgregarItems.Close;
  DM.ZQAgregarItems.SQL.Text := 'Select * FROM productos';
  DM.ZQAgregarItems.Open;

  case CBListaPrecio.ItemIndex of
    0:Precio := DM.ZQAgregarItems.FieldByName('Precio1').Value;
    1:Precio := DM.ZQAgregarItems.FieldByName('Precio2').Value;
    2:Precio := DM.ZQAgregarItems.FieldByName('Precio3').Value;
    3:Precio := DM.ZQAgregarItems.FieldByName('Precio4').Value;
    4:Precio := DM.ZQAgregarItems.FieldByName('Precio5').Value;
    5:Precio := DM.ZQAgregarItems.FieldByName('Precio6').Value;
  end;

For i:=0 to  SGListaProductos.RowCount-1 Do
Begin
    DM.ZQActualizaListaPrecio.Close;
    DM.ZQActualizaListaPrecio.SQL.Clear;
    DM.ZQActualizaListaPrecio.SQL.Add('SELECT recio FROM productos');
    DM.ZQActualizaListaPrecio.SQL.Add('Where CodProducto = :codigo');
    DM.ZQActualizaListaPrecio.ParamByName('precio').AsString := Precio;
    DM.ZQActualizaListaPrecio.ParamByName('codigo').AsInteger  := StrToInt(SGListaProductos.Cells[3,i]);
    DM.ZQActualizaListaPrecio.Open;
End;

Bueno eso lo puse en el evento OnChange del CBListaPrecio que así se llama el ComboBox que dependen de el las listas de precios,
Bueno que datos mas ??

Pues uso un query para agregar los items ahí que se llama
ZQAgregarItems

el código que uso para agregar los items es el siguiente por si a alguien le sirve..

AGREGAR ITEMS A STRINGGRID DESDE BASE DE DATOS MySQL

Código Delphi [-]
if (CBListaPrecio.Text <> '') then
  begin

  FrmAgregarItems := TFrmAgregarItems.Create(self);

   try
      FrmAgregarItems.ShowModal;
   finally
      If FrmAgregarItems.Cancela = False then
      Begin
         If Cuenta > 1 then SGListaProductos.RowCount := SGListaProductos.RowCount + 1;
          SGListaProductos.Cells[1,cuenta] := FrmAgregarItems.ECantidad.Text;
          SGListaProductos.Cells[2,cuenta] := DM.ZQAgregarItems.FieldByName('unidad').AsString;
          SGListaProductos.Cells[3,cuenta] := DM.ZQAgregarItems.FieldByName('codproducto').AsString;
          SGListaProductos.Cells[4,cuenta] := DM.ZQAgregarItems.FieldByName('codigobarra').AsString;
          SGListaProductos.Cells[5,cuenta] := DM.ZQAgregarItems.FieldByName('descripcion').AsString;
          SGListaProductos.Cells[6,cuenta] := DM.ZQAgregarItems.FieldByName('unidadprecio').AsString;
          case CBListaPrecio.ItemIndex of
            0:Precio := DM.ZQAgregarItems.FieldByName('Precio1').Value;
            1:Precio := DM.ZQAgregarItems.FieldByName('Precio2').Value;
            2:Precio := DM.ZQAgregarItems.FieldByName('Precio3').Value;
            3:Precio := DM.ZQAgregarItems.FieldByName('Precio4').Value;
            4:Precio := DM.ZQAgregarItems.FieldByName('Precio5').Value;
            5:Precio := DM.ZQAgregarItems.FieldByName('Precio6').Value;
          end;
          SGListaProductos.Cells[7,cuenta] := Precio; //DM.ZQAgregarItems.FieldByName('precio1').AsString;
          SGListaProductos.Cells[8,cuenta] := Format('%8.2f',[StrToFloat(Precio) * StrToFloat(SGListaProductos.Cells[1,cuenta])]);
    
          Cuenta := Cuenta +1;
          SortGrid(SGListaProductos,0,0);
          CalculaTotales;
      end;
      FrmAgregarItems.Free;
   end;
end;

Bueno creo que he sido muy claro en mi duda..

saludos y gracias por adelantado foreros.. y disculpen por aumentar el tamaño de su DB del foro xDD

salud!!!

Última edición por BlackDaemon fecha: 21-03-2007 a las 06:20:28.
Responder Con Cita
  #2  
Antiguo 21-03-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Pues si, has sido muy claro y conciso .

Creo que vas bien. La SQL que necesitas para actualizar el precio según la lista elegida sería:
Código Delphi [-]
For i:=0 to  SGListaProductos.RowCount-1 Do
Begin
    DM.ZQActualizaListaPrecio.SQL.Add('UPDATE productos');
    DM.ZQActualizaListaPrecio.SQL.Add(' SET Precio = :precio');
    DM.ZQActualizaListaPrecio.SQL.Add('Where CodProducto = :codigo');
    DM.ZQActualizaListaPrecio.ParamByName('precio').AsCurrency:= strToCur(Precio);
    DM.ZQActualizaListaPrecio.ParamByName('codigo').AsInteger  := StrToInt(SGListaProductos.Cells[3,i]);
DM.ZQActualizaListaPrecio.ExecSql; // ejecutamos la consulta.
end;

Aunque yo, en lugar de guardar los 4 precios en la tabla productos, hubiera creado una nueva tabla llamada tarifas, donde a cada producto le pondría los precios:
tabla tarifas:
Código:
codProducto       Tipo_Tarifa          Precio
     21            Precio_Bajo      10 €
     21            Precio_Medio     15 €
     21            Precio_Alto      30 €
     1             Precio_Bajo      10 €
     1             Precio_Alto      30 €
La clave primaria la conformaría los dos primeros campos, de esa forma no se permitirían inchoherencias (poner 2 precios a un mismo producto con el mismo Tipo_Tarifa).

Después, para presentar la lista en el combo haría algo así:
Código SQL [-]
select * from tarifas where codigo = 1

En el combo podría presentar el campo Tipo_Tarifa, y el usuario elije la que quiere aplicar.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 21-03-2007 a las 12:13:15.
Responder Con Cita
  #3  
Antiguo 21-03-2007
Avatar de BlackDaemon
BlackDaemon BlackDaemon is offline
Miembro
 
Registrado: dic 2006
Ubicación: Bolivia - Santa Cruz
Posts: 206
Poder: 18
BlackDaemon Va por buen camino
Hola lepe... muy interesante y clara tu respuesta y muchas gracias por dármela.
Pero hay un problema. creo que me expliqué un poco mal o entendiste un poco mal.
la cosa va asi.. tu me das este código :

Código Delphi [-]
For i:=0 to  SGListaProductos.RowCount-1 Do
Begin
    DM.ZQActualizaListaPrecio.SQL.Add('UPDATE productos');
    DM.ZQActualizaListaPrecio.SQL.Add(' SET Precio = recio');
    DM.ZQActualizaListaPrecio.SQL.Add('Where CodProducto = :codigo');
    DM.ZQActualizaListaPrecio.ParamByName('precio').AsCurrency:= strToCur(Precio);
    DM.ZQActualizaListaPrecio.ParamByName('codigo').AsInteger  := StrToInt(SGListaProductos.Cells[3,i]);
DM.ZQActualizaListaPrecio.ExecSql; // ejecutamos la consulta.
end;

el cual con el UPDATE lo que haría escribir en mi base de datos y por el momento NO necesito eso.. creo que eso tendría que ir en la parte final cual el usuario precioa un botón, por ej: EJECUTAR o VENDER como sea y que descuente las cantidades ... osea osar ese pedaso de código para UPDATEAR las CANTIDADES no los precios.. por que para podificar los precios está otro Form donde también pueden modificar el nombre, código de barra, descripción, etc.

Bueno y lo que yo necesito solo es ACTUALIZAR la mi STRINGGRID con otros precios de mi TABLA

espero ahora haber podío ser mas claro.

AHora respecto al otro punto.. me parece una exelente idéa de hacer una nueva tabla para los precios.. por que me será mas fácil manejar ya que son 6 precios , ya suponiendo que tengo mi NUeva tabla TARIFAS y podría hacer lo que me dices.
Hacer un SELECT peroooooooo lo que no entiendo es que como hacer para saber el código del producto.. osea buscar el el producto que está en el StringGrid luego hacer el select, escojer el nuevo precio de acuerdo al COmboBox y reemplazar al que está en el StringGrid, eso hacer para toda la lista del StringGrid supongo que es con un bucle pero no me doy idea de como mesclar las 2 consultas.. me refiero a una BUSCA PRODUCTO POR CODIGO , una ves encontrado BUSCA PRECIO DE ACUERDO AL COMBOBOX, una ves que tengo el nuevo precio REEMPLAZARLO AL PRECIO QUE TENGO EN EL STRINGGRID

Bueno por el momento estaré haciendo la nueva tabla con los precios

saludos y gracias Lepe tus respuestas siempre me ayudan

salud!!
Responder Con Cita
  #4  
Antiguo 21-03-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
En el stringGrid tienes la columna 3 con el código del producto. Teniendo la tabla tarifas, te sale más fácil, ya que en esa tabla tienes el código del producto y el tipo de tarifa:

Código Delphi [-]
    DM.ZQActualizaListaPrecio.Close;
    DM.ZQActualizaListaPrecio.SQL.Clear;
    DM.ZQActualizaListaPrecio.SQL.Add('SELECT precio FROM Tarifas');
    DM.ZQActualizaListaPrecio.SQL.Add('Where CodProducto = :codigo');
    DM.ZQActualizaListaPrecio.SQL.Add('and Tipo_Tarifa = :Tarifa');
    DM.ZQActualizaListaPrecio.prepare;

with DM.ZQActualizaListaPrecio DO
For i:=0 to  SGListaProductos.RowCount-1 Do
Begin
  ParamByName('codigo').AsInteger  := StrToInt(SGListaProductos.Cells[3,i]);
  ParamByName('Tarifa').AsString = combobox1.items[combobox1.Itemindex];
  Open; // abrimos la consulta
   if not IsEmpty then

      SGListaProductos.Cells[7,i] := Fieldbyname('Precio').AsString; 
  //solo debería existir un registro para esta tarifa y este producto.
   else
   begin
     ShowMessage('No existe El tipo de tarifa para el producto' + StrToInt(SGListaProductos.Cells[3,i]));
     SGListaProductos.Cells[7,i] := '<< Error >>';
  end;  
  Close; // cerramos la consulta para la próxima iteración del bucle.   
End;

Edito:
Como ahora el usuario es el que creará los "tipos de tarifas", en el combobox1 (el combo de precios) tendrás que cargarlo dinámicamente, por ejemplo al crear la ventana, usando un TZQuery convenientemente preparado:
Código SQL [-]
 select distinct Tipo_Tarifa from Tarifas
y ya en el Oncreate de la ventana:
Código Delphi [-]
qryTiposTarifas.Open;
Combobox1.items.Clear;
qryTiposTarifas.DisableControls; // agilizar las iteraciones por la consulta.
combobox1.items.BeginUpdate;  // agilizar las adiciones al combo.
while not qryTiposTarifas.eof do
begin
  Combobox1.Items.Add(qrytiposTarifas.Fields[0].AsString;
  qryTiposTarifas.Next;
end;

qryTiposTarifas.Close;
qryTiposTarifas.EnableControls; // dejar las cosas como estaban.
combobox1.Items.EndUpdate;

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 21-03-2007 a las 18:02:59.
Responder Con Cita
  #5  
Antiguo 21-03-2007
Avatar de BlackDaemon
BlackDaemon BlackDaemon is offline
Miembro
 
Registrado: dic 2006
Ubicación: Bolivia - Santa Cruz
Posts: 206
Poder: 18
BlackDaemon Va por buen camino
jojojo ahora si creo que esto es lo que necesitaba Lepe

bueno en este mismo momento estoy probando el código
de 10 minutos te digo el resultado.. se que este post no tiene sentido pero te agradesco por tu respuesta

saludos pues !!
Responder Con Cita
  #6  
Antiguo 22-03-2007
Avatar de BlackDaemon
BlackDaemon BlackDaemon is offline
Miembro
 
Registrado: dic 2006
Ubicación: Bolivia - Santa Cruz
Posts: 206
Poder: 18
BlackDaemon Va por buen camino
Bueno pues.. he estado toda la tarde en esto y lo que avancé fue hacer la tabla respectiva para los precios.. ya que manejan 6 precios distintos hice mi tabla de esta manera.. agregué un campo para Código de Barras.. por que con el tiempo creo que se manejarán así todo.

TABLA DE TARIFAS

Código SQL [-]
CREATE TABLE `tarifas` (
  `CodigoBarra` varchar(20) NOT NULL,
  `CodProducto` varchar(20) NOT NULL,
  `TipoTarifa` varchar(20) NOT NULL,
  `Precio` double NOT NULL,
  KEY `CodigoBarra` (`CodigoBarra`),
  KEY `CodProducto` (`CodProducto`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

Bueno una ves creeada la tabla tuve que modificar la parte de AGREGAR PRODUCTOS .. donde antes ahí se ponían los precios y era con una simple tabla de conectar unos DBEdits a cada campo de la tabla PRODUCTOS.. los DBEdits correspondían a cada precio.. osea eran 6.
Ahora.. los precios los agrego de esta forma..
A mi parecer esta una chapucera.. por que soy nuevo en esto pero me andá bién y eso me hace sentir bién.. pero creo que se podría mejorar..
Aquí les dejo el código del botón que agrega los los precios en la nueva TABLA

Código Delphi [-]
procedure TFrmAgregarProductos.SBGuardarClick(Sender: TObject);
begin
with DM.ZQPrecios do
begin
  Close;
  SQL.Clear;

  SQL.Add('INSERT INTO `tarifas` ( `CodigoBarra` , `CodProducto` , `TipoTarifa` , `Precio` )');
  SQL.Add('VALUES (:CB, :CP, :TT1, :P1), ');
  SQL.Add('(:CB, :CP, :TT2, :P2), ');
  SQL.Add('(:CB, :CP, :TT3, :P3), ');
  SQL.Add('(:CB, :CP, :TT4, :P4), ');
  SQL.Add('(:CB, :CP, :TT5, :P5), ');
  SQL.Add('(:CB, :CP, :TT6, :P6)');

  // Si, asignamos los parámetros xDD
  ParamByName('CB').AsString := ECodigoBarra.Text;
  ParamByName('CP').AsString := ECodProducto.Text;
  ParamByName('TT1').AsString := 'Precio1';
  ParamByName('TT2').AsString := 'Precio2';
  ParamByName('TT3').AsString := 'Precio3';
  ParamByName('TT4').AsString := 'Precio4';
  ParamByName('TT5').AsString := 'Precio5';
  ParamByName('TT6').AsString := 'Precio6';

  ParamByName('P1').AsString := EPrecio1.Text;
  ParamByName('P2').AsString := EPrecio2.Text;
  ParamByName('P3').AsString := EPrecio3.Text;
  ParamByName('P4').AsString := EPrecio4.Text;
  ParamByName('P5').AsString := EPrecio5.Text;
  ParamByName('P6').AsString := EPrecio6.Text;
  // Ejecutamos e insertamos todos los valores asignados
  ExecSQL;

end;

  DM.ZTAlmacen.Post; -->  Este agrega las demas descripciones pero a la tabla PRODUCTOS.. lo de arriba a la nueva tabla TARIFAS

end;

Bueno.. esa parte ya la arreglé con eso.. PERO tengo unas dudas ahora.. cuando se realize una búqueda de un producto y quiero que me lo muestre en un DBGrid como lo tendría que hacer ?? por ej

Código SQL [-]
SELECT * FROM productos WHERE codproducto = :codigo

Bueno en primer lugar no tendré para hacer búsquedas por Código de producto ni por Codigo de barras.. por que ya esos datos los guardo en otra tabla.. ahora podría buscar por CATEGORIA o DESCRIPCION del produto.. peroooo ya no me mostraría el codigo de barras, código de producto NI los precios :S por que estarán en otra tabla.
Y si realizo la búsqueda en la tabla TARIFAS, ahí podré buscar por códigos pero tampoco me mostrarán las descripciones ni las cantidades disponibles que eso se guarda en la TABLA productos.. en fin son dudas que tengo y que con eso ya se fregó gran parte de mi programa.. pero si es por el BIEN estoy de acuerdo en solucionar esas partes ... de las búsquedas etc.
o para hacer las búsquedas tendría que llamar a las 2 TABLAS ?? a la PRODUCTOS y TARIFAS ?? como sería eso son SQL ?

Código SQL [-]
SELECT * FROM productos, tarifas

si es así no habrá problemas..

Ahora seguiré probando el código para actualizar toda la fila de PRECIOS

pero hasta el momento como voy ?? está bién lo que hago ??

ahh una cosa mas.. que he estado pensando cuando uno agrega un producto indicas que si es Und, Pza, Doc == Unidad, Pieza, Docena
bueno eso donde cumple su función sería a la hora de agregar los produtos al StringGrid verdad ?? si es Docena pues multiplicar el precio de la Unidad por 12 supongo.. pero creo que mes estoy pasando a otro punto, pero igual quería saber por si puedo hacer algo ahora o eso luego.

bueno saludos

salud!!

Última edición por BlackDaemon fecha: 22-03-2007 a las 01:56:53.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Actualizar Archivos Desde FTP papu24ar Varios 4 21-03-2007 03:50:57
Actualizar una base de datos desde un servidor remoto zvf MySQL 1 22-06-2006 22:21:26
Actualizar una base de datos desde un formulario federiconqn21 Varios 1 14-12-2005 16:43:23
Impresión desde un StringGrid... Lester Impresión 10 26-03-2005 07:14:29
Impresion desde un StringGrid fmonte Varios 3 17-09-2004 05:28:29


La franja horaria es GMT +2. Ahora son las 03:34:51.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi