Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   PHP (https://www.clubdelphi.com/foros/forumdisplay.php?f=15)
-   -   ibase_query() [function.ibase-query]: Dynamic SQL Error SQL error code = -104 Token (https://www.clubdelphi.com/foros/showthread.php?t=88232)

MALBOTO22 04-05-2015 17:34:22

ibase_query() [function.ibase-query]: Dynamic SQL Error SQL error code = -104 Token
 
Buenos dias, muy comedidamente solicito su colaboración para tratar de dar solución a este problema, la verdad es que llevo más de una semana tratando de dar solución, he consultado varias paginas y foros, pero nada que doy con la solución.

El caso es el siguiente: Deseo pasar una información de una tabla en DBF a otra tabla en FIREBIRD, pero no permite hacer la respectiva grabación de los datos. Se pueden visualizar desde la tabla DBF pero no permite la grabación en la tabla FIREBIRD.

Uso: S.O. Windows 7, Appserver 2.5, Firebird 2.5


Código PHP:

 <?php
    
    $Conexion_DB    
ibase_pconnect('C:\FIREBIRD\BASES\IMPPDF.FDB','SYSDBA','masterkey');
    
$Transaccion ibase_trans("IBASE_WRITE"$Conexion_DB);
    
$Comando      'DELETE FROM CUENTAS WHERE CODIGO > 0;';
    
$nResultado   ibase_query($Transaccion$Comando);
    
ibase_commit($Transaccion);
    
ibase_close($Conexion_DB);

    echo 
">>>>> PROCESO DE BORRADO TERMINADO""<br />";
    echo 
">>>>> ESTAMOS REALIZANDO MIGRACION DE DBF A FIREBIRD""<br />";

    
$Conexion_DB    ibase_pconnect('C:\FIREBIRD\BASES\IMPPDF.FDB','SYSDBA','masterkey');
    
$Transaccion ibase_trans("IBASE_WRITE"$Conexion_DB);
   [
color=Red$Comando      ='insert into cuentas (codigo,nombre,cedula,direccion,perifact,barrio) values ('."$cod  _usu".','."$nom_usu".','."$ced_usu".','."$dir_usu".','."$per_fac".','."$bar_usu".');';[/color]
    
    
$db dbase_open('c:\windows\media\lec\factur2.dbf'0);  //PERMITE LA CONEXION CON LA TABLA DESEADA
    
if ($db
    {
      
$numero_registros dbase_numrecords($db);  //DETERMINA EL NUMERO DE REGISTROS DE LA TABLA
      
for ($i 1$i <= $numero_registros$i++) 
        {
        
$temp dbase_get_record($db$i); // procesar cada uno de los registros
        
$cod_usu=$temp[0];   //ALMACENA EL CONTENIDO DE UN CAMPO EN UNA VARIABLE
        
$nom_usu=$temp[1];
        
$ced_usu=$temp[2];
        
$dir_usu=$temp[3];
        
$per_fac=$temp[5];
        
$bar_usu=$temp[18];
        echo 
$cod_usu."\t";
        echo 
$nom_usu."\t";
        echo 
$ced_usu"<br />";

       [
color=Red$nResultado   ibase_query($Transaccion$Comando);[/color]
        echo 
">>>>> PROCESO DE INSERCION EXITOSO <<<<<""<br />" ;
      }
      
ibase_commit($Transaccion);
      
ibase_close($Conexion_DB);
    }

?>

pero me genera el siguiente error (Resalto en rojo las lineas a las que me esta direccionando el error)

Código PHP:

>>>>> PROCESO DE BORRADO TERMINADO
>>>>>  ESTAMOS REALIZANDO MIGRACION DE DBF A FIREBIRD
2 ANGELICA MARIA PORRAS  SALAZAR 1098615598

[b]Warning[/b]: ibase_query() [[url="http://www.clubdelphi.com/foros/function.ibase-query"]function.ibase-query[/url]]: Dynamic SQL Error SQL  error code = -104 Token unknown line 1column 78 in  [b]C:\AppServ\www\sidutec\impresion.php[/bon line  [b]44[/b]
>>>>> 
PROCESO DE INSERCION EXITOSO  <<<<<
3 SANDRA MILENA RIA&#65533;O CELIS  63531217

[b]Warning[/b]: ibase_query() [[url="http://www.clubdelphi.com/foros/function.ibase-query"]function.ibase-query[/url]]: Dynamic SQL Error SQL  error code = -104 Token unknown line 1column 78 in  [b]C:\AppServ\www\sidutec\impresion.php[/bon line  [b]44[/b]
>>>>> 
PROCESO DE INSERCION EXITOSO  <<<<<
4 LEIDY CAROLINA NARANJO SOLANO 63453717 

Doy claridad que el PHP y el FIREBIRD si funcionan adecuadamente, he realizado pruebas con ejemplos y me permite insertar y consultar registros.

Agradezco la colaboración u orientación que me puedan brindar

duilioisola 04-05-2015 18:04:14

Te está diciendo "Token unknown - line 1, column 78".
Esto quiere decir que no entiende algún comando del SQL que generas.

Revisa que por ejemplo los nombres no tengan un apóstrofe o comillas. Esto rompería la sentencia SQL.

Por ejemplo, imagina que insertas : La casa de "Don Juan"
Luego el SQL quedaría
Código SQL [-]
insert into tabla (nombre) values ("La casa de "Don Juan");"
Esto se interpretaría como

Código SQL [-]
OK  - SQL    -> insert into tabla (nombre) values (
OK  - String -> "La casa de "
ERR - SQL    -> Don Juan
??? - string -> ");"

duilioisola 04-05-2015 18:08:22

También he visto que en el código en la columna 78 tienes un error en el código.
La variable $cod _usu está separada y supongo que PHP la interpreta como "string vacío"

Código:

$Comando = 'insert into cuentas (codigo,nombre,cedula,direccion,perifact,barrio) values ('."$cod  _usu".','."$nom_usu".','."$ced_usu".','."$dir_usu".','."$per_fac".','."$bar_usu".');';
PHP no se queja, pero si cuentas caracteres de la sentancia SQL es justo donde te está diciendo que hay un error.

MALBOTO22 05-05-2015 03:05:18

duilioisola, gracias por su respuesta

Con respecto a sus observaciones me permito indicarle que el espacio debio haberse creado cuando hice la copia, en el codigo original no lo tengo.

Ante su observacion revise un codigo que si esta funcionando e hice un ajuste al la linea de insercion dejandola asi:

Código PHP:

$Comando      ="insert into cuentas (codigo,nombre,cedula,direccion,perifact,barrio) values ('" $cod_usu "','" $nom_usu "','" $ced_usu ."','" $dir_usu ."','" $per_fac "','" $bar_usu "');"

y ahora sale el siguiente error

Código PHP:

>>>>> PROCESO DE BORRADO TERMINADO
>>>>>  ESTAMOS REALIZANDO MIGRACION DE DBF A FIREBIRD
1
MARTIN ALONSO BOBADILLA  TORRES 
93376454
CASA 14 ET8 B JUAN 
CENTRO 
ENERO 2015  

[color=Red][b]Warning[/b]: ibase_query() [[url="http://www.clubdelphi.com/foros/function.ibase-query"]function.ibase-query[/url]]: conversion error from  string "" in [b]C:\AppServ\www\sidutec\impresion2.php[/bon line  [b]50[/b][/color]
>>>>> 
PROCESO DE INSERCION EXITOSO  <<<<< 

Los datos visualizados son los que estan en la tabla .dbf, hice cambios a la estructrura de la tabla .fdb dejandola lo más sencilla posible

Código PHP:

CREATE TABLE CUENTAS (
  
CODIGO     INTEGER,
  
NOMBRE     VARCHAR(30),
  
CEDULA     INTEGER,
  
DIRECCION  VARCHAR(40),
  
BARRIO     VARCHAR(30),
  
PERIFACT   VARCHAR(15)
); 

le quite los not null y los indices pero el error persiste.

Que puede ser?

duilioisola 05-05-2015 10:28:37

Te sugiero en estos casos hacer un log de cada sentencia SQL que se ejecuta.
Veo que ya presentas los diferentes datos que se insertarán, pero no sabes exactamente que es lo que se envia a Firebird.
En este caso, parece que en algún lugar en el que se espera un entero se le entrega un string vacío. Esto no sabe como convertirlo, dado que no es un número.
Dicho esto, no es necesario entrecomillar los valores numéricos.

Código PHP:

    $Comando      ="insert into cuentas (codigo,nombre,cedula,direccion,perifact,barrio) values ( " $cod_usu " , '" $nom_usu "' , " $ced_usu ." , '" $dir_usu ."' , '" $per_fac "' , '" $bar_usu "' );"
    
    
$db dbase_open('c:\windows\media\lec\factur2.dbf'0);  //PERMITE LA CONEXION CON LA TABLA DESEADA
    
if ($db
    {
      
$numero_registros dbase_numrecords($db);  //DETERMINA EL NUMERO DE REGISTROS DE LA TABLA
      
for ($i 1$i <= $numero_registros$i++) 
        {
...
        echo 
$cod_usu."\t";
        echo 
$nom_usu."\t";
        echo 
$ced_usu."\t";
****
        echo 
$Comando "<br />";
****
... 

Deberías obtener algo así:
Código SQL [-]
insert into cuentas (codigo,nombre,cedula,direccion,perifact,barrio) values (1 , 'PEPITO' , 123456 , 'calle 1, 23' , 'Perifact' , 'Barrio' );

MALBOTO22 06-05-2015 08:28:47

duilioisola, gracias por su colaboración

Le comento que ya elimine las comillas de los campos numericos y no ha sido posible que los datos se graben en la base de datos de Firebird.

Usted me sugiere hacer un LOG para las transacciones SQL, pero honestamente no se como se hace, me podria orientar o indicar donde encuentro la información al respecto, ya que hice varias consultas pero solo encontre una para el manejo de Procedures Stored y los triggers.

Mil gracias

duilioisola 06-05-2015 10:24:23

Con "Log" me refería solamente a agregar
Código PHP:

echo $Comando 

al procedimiento que hace las inserciones.

De esta manera podrás ver exactamente que es lo que se envía a Firebird.
Luego habrá que ver porqué la sentencia da error y corregir la formación de ese "$Comando".

MALBOTO22 06-05-2015 20:04:49

duilioisola,

le cuento que definitivamente usando la variable $Comando para pasar como parametro a query no me funciono por ningun lado, con el log me mostraba

Código:

>>>>> PROCESO DE BORRADO TERMINADO
>>>>> ESTAMOS REALIZANDO MIGRACION DE DBF A FIREBIRD
1
MARTIN ALONSO BOBADILLA TORRES
93376454
CASA 14 ET8 B JUAN
CENTRO
ENERO 2015
insert into cuentas (codigo,nombre,cedula,direccion,perifact,barrio) values ('','','','','','');
Warning: ibase_query() [function.ibase-query]: conversion error from string "" in C:\AppServ\www\sidutec

\impresion2.php on line 52
insert into cuentas (codigo,nombre,cedula,direccion,perifact,barrio) values ('','','','','','');
>>>>> PROCESO DE

INSERCION EXITOSO <<<<<

la solución la encontre ubicando directamente sobre el ibase_query el comando de inserción

Código:

        $nResultado  = ibase_query($Transaccion, "insert into cuentas (codigo,nombre,cedula,direccion,perifact,barrio)" .
                                                  "values ($cod_usu,'$nom_usu',$ced_usu,'$dir_usu','$per_fac','$bar_usu');");

Nuevamente le agradezco por su colaboración y generosidad al dedicarme tiempo y orientarme

duilioisola 06-05-2015 20:22:39

Si te fijas en la sentencia SQL verás claramente el error:

Código SQL [-]
insert into cuentas (codigo,nombre,cedula,direccion,perifact,barrio) 
values ( '' /* codigo es un integer */,'','' /* cedula es un integer */,'','','');

Es lo que comentaba en uno de los mensajes anteriores.
Deberías quitar las comillas a los valores que sean enteros y en el caso de que alguno de los valores enteros sea nulo forzar un 0 o NULL.


La franja horaria es GMT +2. Ahora son las 12:51:17.

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