Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MySQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=21)
-   -   Error al crear una tabla con parametros. (https://www.clubdelphi.com/foros/showthread.php?t=94920)

davidsolo 28-10-2020 14:08:49

Error al crear una tabla con parametros.
 
buenos días a todos¡¡
estoy realizando una prueba con delphi 10.2 componentes zeos y mysql.
en un archivo txt tengo guardado una estructura de un tabla y en tiempo de ejecución vuelco el contenido del txt a una ZQuery y ejecuto dicha Zquery.... ahí no problemas se crea la tabla en la base de datos.

el problema surge cuando quiero cambiar el nombre de esa tabla dependiendo del día que se encuentra.. asi que en el txt ahora
coloco el nombre de la tabla de esta manera " :nombreTabla "
y en código delphi coloco esto:


DM.miSQL.Params[0].Value := edit1.Text;
DM.miSQL.ExecSQL;



y me envía un error de sintaxis de mysql


también carge en tiempo de diseño la estructura de la tabla en el zquery.sql.txt y cuando ejecuto la zquery me envia el error que no encuentra el parametro..


espero comentarios

Casimiro Notevi 28-10-2020 15:05:28

Pues sin ver el script es bien difícil adivinarlo.
De todas formas, para renombrar una tabla tendrá que hacer algo parecido a:
alter table nombre rename to nuevonombre

davidsolo 28-10-2020 15:30:02

gracias por responder..
tengo esto en el txt:
Código SQL [-]
create table if not exists :Parametro
(
    id_local                varchar(1)      not null,                
    id_prod                integer           not null,        
    id_mcodbarra        varchar(20)     not null,
    .
    .
    .

    primary key (id_prod,id_mcodbarra)
)
engine=innodb;


y en delphi


Código Delphi [-]
procedure TForm2.Button1Click(Sender: TObject);
var F: TextFile;
    sLinea: String;
begin
  AssignFile( F, ExtractFilePath( Application.ExeName ) + 'tabla.txt' );
  Reset( F );
  
  DM.miSQL.Close;
  DM.miSQL.SQL.Clear;
  while not Eof( F ) do
  begin
    ReadLn( F, sLinea );
    DM.miSQL.SQL.Add( sLinea );
  end;
  DM.miSQL.Params[0].Value := edit1.Text;
  DM.miSQL.ExecSQL;
  CloseFile( F );
end;


la intención es crear una nueva tabla no renombrar una tabla existente. parece que no me explique bien.. en eso de cambiar el nombre de la tabla..

Neftali [Germán.Estévez] 28-10-2020 16:02:59

No uses parámetros de la query. Aunque son recomentable no sirven para usarlos en todas partes.
Es decir, puedes hacer elto:
Código SQL [-]
SELECT * FROM TABLA1 WHERE CAMPO1=:valor

pero no puedes hacer esto:

Código SQL [-]
:valor * FROM TABLA1 WHERE CAMPO1=33

En este caso sustituye el valor de :Parametro con un AnsiReplaceText.

davidsolo 28-10-2020 16:34:09

y como seria eso?

Casimiro Notevi 28-10-2020 17:10:57

Creando la consulta, sin parámetros.
Código:

cSql := "update "+ cNombreTabla +" set campo1= ......."
QR.selectsq.text := cSql;
...


delphi.com.ar 29-10-2020 00:07:03

Los "bind parameters" no se traducen en strings, a grandes rasgos son "valores + tipo de datos", y como te dijeron anteriormente, no puede usarlos en cualquier contexto.

Pese a lo dicho, MySql te permite ejecutar código dinámico. Por lo que, si bien nunca lo he probado, calculo que puedes utilizar parámetros para definición de nombres en código dinámico.

Por ejemplo, podrías tener un procedure tipo:
Código SQL [-]
CREATE PROCEDURE CREAR_TABLA(IN table_name CHAR(64))
BEGIN
    SET @sql = CONCAT('CREATE TABLE IF NOT EXIST', table_name, '(id_local varchar(1) not null,  id_prod integer not null');
    PREPARE cmd FROM @sql;
    EXECUTE cmd;
    DEALLOCATE PREPARE cmd;
END

PD: ¡Nada de lo que he escrito lo he probado!

Saludos!

davidsolo 29-10-2020 02:19:43

ok....gracias por tu ayuda¡¡¡¡

davidsolo 29-10-2020 03:17:23

al final realice esto "archivo .txt":
Código SQL [-]
(
    id_local        varchar(1)    not null,                
    id_prod            integer        not null,        
    id_mcodbarra        varchar(20)    not null,
    descprod        varchar(60)    not null,
    precio_vta_detalle    integer        not null,
    cantidad_escala1    integer        not null,
    precio_vta_escala1    integer        not null,
    cantidad_escala2    integer        not null,
    precio_vta_escala2    integer        not null,
    cantidad_escala3    integer     not null,
    precio_vta_escala3    integer        not null,    
    p_vta_d_neto        integer        not null,
    p_escala_1_neto        integer        not null,    
    p_escala_2_neto        integer        not null,
    p_escala_3_neto        integer        not null,
    cantidad_escala4    integer        not null,
    precio_vta_escala4    integer        not null,
    cantidad_escala5    integer        not null,
    precio_vta_escala5    integer        not null,    
    capacidad        integer        not null,
    id_lista        integer        not null,
    fecha_cambio        varchar(40)    not null,        
    usuario            varchar(30)    not null,
    equipo            varchar(30)    not null,
    usuario_actualizacion    varchar(30)    not null,
    equipo_actualizacion    varchar(30)    not null,
    flag            varchar(2)    not null,
       primary key (id_prod,id_mcodbarra)
)
engine=innodb;
y en delphi
Código Delphi [-]
procedure TFichaCreaTabla.Button1Click(Sender: TObject);
var F: TextFile;
    sLinea: String;
begin
  AssignFile( F, ExtractFilePath( Application.ExeName ) + 'tabla.txt' );
  Reset( F );
  DM.miSQL.Close;
  DM.miSQL.SQL.Clear;
  DM.miSQL.SQL.Add('create table if not exists ' + edit1.Text + ' ');
  while not Eof( F ) do
  begin
    ReadLn( F, sLinea );
    DM.miSQL.SQL.Add( sLinea );
  end;
  DM.miSQL.ExecSQL;
  CloseFile( F );
end;


y resulto...pero ahora voy por la propuesta de delphi.com.ar...


La franja horaria es GMT +2. Ahora son las 20:03:13.

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