Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Error el actualizar datos en tablas DBF (https://www.clubdelphi.com/foros/showthread.php?t=78848)

river_1 21-05-2012 07:00:13

Error el actualizar datos en tablas DBF
 
Buenas a todos necesito ayuda con un error.
Explico: Estoy con Delphi 7 y me conecto a una BD de FoxPro(*.DBF) por medio de los componentes ADO que trae Delphi, el ADO lo conecto por medio de un ODBC de windows.Ya tengo otros programas que se cuelgan muy bien de esas BD y extraigo informacion para hacer reportes a la medida de mis clientes, en esta ocasion y por primera vez necesito actualizar registros en la BD.
La informacion actualizada la tengo un una BD de Acces y de alli busco el registro en la tabla DBF para actualizar algunos campos.
El codigo que uso para hacerlo es el siguiente:

Código Delphi [-]
  TBLPRODMDB.First;
  WHILE NOT TBLPRODMDB.Eof DO
  BEGIN
    IF TBLPRODDBF.Locate('CCODIGOP01',TblProdMDBCCODIGOP01.Value,[]) THEN
    BEGIN
      TBLPRODDBF.Edit;
      TblProdDBFccontrol01.Value:=1;
      IF TBLUM.Locate('CNOMBREU01',TblProdMDBCIDUNIDA01.Value,[]) THEN
         TblProdDBFcidunida01.value:=tBLumcidunidad.value;
      TBLPRODDBF.Post;
      TBLPRODMDB.NEXT;
    END;
  END;
  SHOWMESSAGE('Proceso Terminado'); 
end;

El error que me sale me dice de manera general: "Statement too long" y es al darle el POST a la tabla.
De hecho no siquiera me deja poner el 1 del campo TblProdDBFccontrol01.
Alguien ha modificado tablas DBF con Delphi?
Gracias...

Ñuño Martínez 23-05-2012 20:05:14

El mensaje de error lo dice claramente: "Statement too long". La única solución (creo) sería recortarla de algún modo, pero para eso habría que ver cómo es la línea en concreto. El problema es que no sé cómo conseguir ver esa línea. Supongo que TBLPRODDBF tendrá alguna propiedad como "text" o "code" o algo así y mostrarla antes del "post" a ver qué va a enviar..

river_1 24-05-2012 09:09:11

Bueno ya aligere un poco el codigo, lo que hice fue mejor importar a una tabla DBF los datos que necesito , pense que estando en el mismo entorno de BD no iba a tener problema y pues si lo tengo , el codigo quedo asi:

Código Delphi [-]
tblact.First;
 while not tblact.Eof do
  begin
   IF TBLPROD.Locate('CCODIGOP01',TblActcodigo_pro.Value,[]) THEN
    BEGIN
     TBLPROD.Edit;
     TblProdcidunida01.Value:=TblActunidad_bas.Value;
     TBLPROD.Post;
    end;
 end;
   SHOWMESSAGE('Proceso Terminado');
end;

Ejecutando el codigo linea por linea simple y sencillamente es reemplazar un 2 por un 11, es decir, son numeros enteros no veo cual puede ser el problema y el mensaje de error es el mismo..

Ñuño Martínez 24-05-2012 20:13:50

No creo que el error esté en tu código, o al menos no de forma directa. El error indica que el problema es la consulta a la tabla FoxPro, que es demasiado larga. Lo que no sé es porqué. A ver si algún otro forista con más experiencia con FoxPro puede ayudar.

Lepe 25-05-2012 09:12:21

El problema es que si el locate no encuentra ese código, no se mueve por el dataset (no hay un tblact.Next) y estás en un bucle que mira si ha llegado al final, es decir, bucle infinito.

Si encuentra el registro, será muy raro que sea el último para que EOF sea True.

En plata, quita el bucle while y deja solo el locate.

Saludos

river_1 25-05-2012 22:07:07

Señores ya pude encontrar el problema , al parecer el locate no funciono y puse un Query pero aun asi me ponia el error , lo que pasa es que el "Selec * from " me regresaba todos los campos de la tabla cuando yo solo quiero actualizar un solo campo y la consulta era bastante grande. La solucion fue la siguiente:

Código Delphi [-]
tblact.First;
 while not tblact.Eof do
  begin
   Consulta:='SELECT ccodigop01,cidunida01 FROM MGW10005 WHERE CCODIGOP01=''';
   Consulta:=Consulta +TRIM(TblActcodigo_pro.Value);
   Consulta:=Consulta +'''';
   qRYPROD.SQL.Clear;
   qRYPROD.SQL.ADD(consulta);
   qRYPROD.Active := TRUE;
   qRYPROD.Open;
   IF qRYPROD.RecordCount<>0 THEN
    BEGIN
     qRYPROD.Edit;
     qRYPRODcidunida01.Value:=TblActunidad_bas.Value;
     qRYPROD.Post;
    END;
     tblact.Next;
    end;
   SHOWMESSAGE('Proceso Terminado');


Si se dan cuenta solo me estoy trayendo los campos que necesito, asi me funciono muy bien el Post.
Gracias por su tiempo...


La franja horaria es GMT +2. Ahora son las 13:58:56.

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