Moisés no dices qué versión de Eagle1 usas, pero aún así creo que estás
abriendo la tabla dos veces:
una aquí....
// Obtengo Total Registros---
-------------------------------
// Seleccionamos la TABLA LIBROS---------------------------
oTb := TMSTable():New( oMySql, AllTrim(cTablaCliente) )
if !oTb:Open() // si no se abre
MsgStop( "No se puede abrir la tabla: " + cTablacliente,
"Operación Cancelada" )
RETURN Nil
else
// Contamos total de Registros
nTotal := oTb:RecCount()
msgalert(ntotal)
endif
y otro aqui:
// Control de Tabla-------------------------------------------
//oTb:Blank()
if !oTb:Open() // si no se abre
MsgStop( "No se puede abrir la tabla: " + cTablacliente, "Operación
Cancelada" )
DbCloseAll()
QUIT
endif
Porqué lo haces?
Eso por un lado y por otro deberías comprobar que hay datos en la tabla.
Yo haría:
if oTb:RecCount() > 0
oTb:GoTop()
while !oTb:Eof()
REPLACE CLIENTES->CAMPO01 WITH oTb:FieldGet( 1 )
REPLACE CLIENTES->CAMPO02 WITH oTb:FieldGet( 2 )
REPLACE CLIENTES->NOMBRE WITH oTb:FieldGet( 9
)+space(1)+oTb:FieldGet( 10 )+space(1)+oTb:FieldGet( 8 )
REPLACE CLIENTES->NIF WITH oTb:FieldGet( 11 )
REPLACE CLIENTES->DIRECCION WITH oTb:FieldGet( 17 )
REPLACE CLIENTES->POBLACION WITH oTb:FieldGet( 19 )
REPLACE CLIENTES->TELEFONO WITH oTb:FieldGet( 21 )
REPLACE CLIENTES->BANCO WITH oTb:FieldGet( 37 )
REPLACE CLIENTES->OFICINA WITH oTb:FieldGet( 38 )
REPLACE CLIENTES->SUCURSAL WITH oTb:FieldGet( 39 )
REPLACE CLIENTES->DC WITH oTb:FieldGet( 40 )
REPLACE CLIENTES->CUENTA WITH oTb:FieldGet( 41 )
REPLACE CLIENTES->DIR_BANCO WITH oTb:FieldGet( 42 )
REPLACE CLIENTES->POB_BANCO WITH oTb:FieldGet( 43 )
if oTb:FieldGet( 45 ) = 1 // Caja
REPLACE CLIENTES->FPAGO WITH "Caja"
else
REPLACE CLIENTES->FPAGO WITH "Domiciliación"
endif
// Avanzamos registro
oTb:Skip( 1 )
oMeter:SetPos( cActual )
cActual++
Sysrefresh()
end //while
Por cierto no puedes incrementar n dentro de un bucle FOR NEX cuyo
inicio es el propio n
Mírate el ejemplo mstodbf.prg que hay en BIN que te transcribo aquí por
que es cortito:
//---------------------------------------------------------------------------//
// AUTOR.....: Manuel Expósito Suárez Soft4U
2002-2006 //
// eMail.....:
manuexposito@... //
// CLASE.....:
MsToDBF //
// FECHA MOD.:
11/12/2006 //
// VERSION...:
5.02 //
// PROPOSITO.: Pasa una tabla de MySQL a una
DBF //
//---------------------------------------------------------------------------//
#include "util.ch"
#include "inKey.ch"
//----------------------------------------------------------------------------//
function main( cIP, cUser, cPwd )
local oCon, oDb, oTb
local GetList, n, nFldCount, aDB, aTb
local cDb := space( 30 )
local cTb := space( 30 )
local i := 0
cls
DEFAULT cIP := "127.0.0.1"
DEFAULT cUser := "root"
DEFAULT cPwd := "root"
// Creamos el objeto conexion:
oCon := TMSConnect():New()
// Nos conectamos y comprobamos si se ha establecido la conexion:
if !oCon:Connect( cIP, cUser, cPwd )
Alert( "No se ha establecido la conexion" )
// Liberamos memoria
oCon:Close()
return( nil )
endif
oCon:SetAutoError( .f. )
DispBox( 3, 9, 21, 71 )
@ 2, 9 SAY "Bases de Datos de la conexion " + oCon:cHost + ":"
aDB := oCon:ListDataBases()
cDb := aDB[ AChoice( 4, 10, 20, 70, aDB ) ]
oDb := oCon:DataBaseByName( cDb, .t. ) // Creamos y seleccionamos
el objeto DB
cls
@ 2, 9 SAY "Tablas de la Base de Datos " + upper( cDb ) + ":"
DispBox( 3, 9, 21, 71 )
aTb := oDb:ListTables()
cTb := aTb[ AChoice( 4, 10, 20, 70, aTb ) ]
oTb := TMSTable():New( oCon, cTb )
cls
@ 10, 10 SAY "Cargando informacion desde el servidor"
@ 12, 10 SAY "Espere hasta completar el proceso... "
oTb:Open()
oTb:SetReadMemoAll( .t. )
if oTb:RecCount() > 0
DbCreate( oTb:cName, oTb:Struct() )
DbUseArea( .t.,, oTb:cName )
cls
@ 10, 10 SAY "Cargando a la DBF desde el cliente"
@ 12, 10 SAY "Espere hasta completar el proceso... "
nFldCount := oTb:FieldCount()
@ 10, 10 SAY "Ejecutando..."
oTb:GoTop()
@ 10, 10 SAY "Tratando registro: " + StrNum( ++i )
DbAppend()
FOR n := 1 TO nFldCount
FieldPut( n, oTb:FieldGet( n ) )
NEXT
while oTb:Fetch()
@ 10, 10 SAY "Tratando registro: " + StrNum( ++i )
DbAppend()
FOR n := 1 TO nFldCount
FieldPut( n, oTb:FieldGet( n ) )
NEXT
end
DbCommit()
DbGoTop()
if Alert( "Se han pasado " + AllTrim( str( i ) ) + ;
" registros;Quieres ver la tabla?", { "Si", "No" } ) == 1
Browse()
endif
cls
@ 23, 00 SAY "Se termino... "
DbCloseArea()
endif
Inkey( 100 )
oTb:Free()
oCon:Free()
return( nil )
//----------------------------------------------------------------------------//
Saludos
Moisés Barrio escribió:
> Hola a todos:
>
> Uso FW 8.09, Harbour 1.0 y el siguiente código genera el error adjunto
> al hacer FieldGet( 1). No se qué hago mal. Muchas gracias por la ayuda.
>
> Un saludo,
>
> Moisés
>
>
>
> // Conexión SQL-----------------------------------------------
> oMySql := TMSConnect():New()
> IF oMySql:lInit
> MsgInfo( "Sistema SQL inicializado correctamente", " Motor SQL " )
> ENDIF
> Sysrefresh()
>
> IF !oMySql:Connect( cServidor, cLogin, cPass, cBaseCliente ) //
> servidor MYSQL
> MsgStop( "ERROR: No hay conexión con la Base de Datos
> "+AllTrim(cTablaCliente)+"."+CRLF+"La operación no ha sido realizada.
> Posiblemente, no hay acceso a Internet.", " ERROR Motor SQL " )
> DbCloseALL()
> quit
> ENDIF
> // -----------------------------------------------------------
>
>
> // Obtengo Total Registros----------------------------------
> // Seleccionamos la TABLA LIBROS---------------------------
> oTb := TMSTable():New( oMySql, AllTrim(cTablaCliente) )
> if !oTb:Open() // si no se abre
> MsgStop( "No se puede abrir la tabla: " + cTablacliente,
> "Operación Cancelada" )
> RETURN Nil
> else
> // Contamos total de Registros
> nTotal := oTb:RecCount()
> msgalert(ntotal)
> endif
>
>
> // Pinto dialogo con barra----------------------------------
> DEFINE DIALOG oDlg RESOURCE "ESPERAR" TITLE OemToAnsi("Importando
> Datos. Por favor, espere...")
> REDEFINE PROGRESS oMeter ID 150 OF oDlg
>
> ACTIVATE DIALOG oDlg CENTERED;
> ON INIT ( oMeter:SetRange( 0, nTotal ), ;
> oMeter:SetPos( nActual ), ;
> oDlg:Hide(), ImportarDATOS( oMySql, cTablaCliente,
> oTb, oMeter, nTotal, oDlg ) )
>
> // Cierre de SQL
> oMySql:Close()
> oMySql:Free()
>
> RETURN NIL
>
//----------------------------------------------------------------------------//
>
>
>
//----------------------------------------------------------------------------//
> // IMPORTAR DATOS
> //
>
//----------------------------------------------------------------------------//
> FUNCTION ImportarDATOS( oMySql, cTablaCliente, oTb, oMeter, nTotal, oDlg )
> LOCAL cLast, lBloqueado := .F.
> LOCAL cActual := 1
> LOCAL n
>
> // Control de Tabla-------------------------------------------
> //oTb:Blank()
> if !oTb:Open() // si no se abre
> MsgStop( "No se puede abrir la tabla: " + cTablacliente,
> "Operación Cancelada" )
> DbCloseAll()
> QUIT
> endif
>
>
> // Seleccionamos Base de Datos--------------------------------
> SELECT("CLIENTES")
>
> // Controles de la BARRA--------------------------------------
> oDlg:Show()
> oDlg:SetFocus()
>
>
> // Ejecutamos la importacion----------------------------------
> FOR n := 1 TO nTotal
> APPEND BLANK
>
> MSGALERT(OTB:FIELDGET(1))
> * // aquí da el error, o en el primer REPLACE CLIENTES-> si lo quito*
>
>
> REPLACE CLIENTES->CAMPO01 WITH oTb:FieldGet( 1 )
> REPLACE CLIENTES->CAMPO02 WITH oTb:FieldGet( 2 )
> REPLACE CLIENTES->NOMBRE WITH oTb:FieldGet( 9
> )+space(1)+oTb:FieldGet( 10 )+space(1)+oTb:FieldGet( 8 )
> REPLACE CLIENTES->NIF WITH oTb:FieldGet( 11 )
> REPLACE CLIENTES->DIRECCION WITH oTb:FieldGet( 17 )
> REPLACE CLIENTES->POBLACION WITH oTb:FieldGet( 19 )
> REPLACE CLIENTES->TELEFONO WITH oTb:FieldGet( 21 )
> REPLACE CLIENTES->BANCO WITH oTb:FieldGet( 37 )
> REPLACE CLIENTES->OFICINA WITH oTb:FieldGet( 38 )
> REPLACE CLIENTES->SUCURSAL WITH oTb:FieldGet( 39 )
> REPLACE CLIENTES->DC WITH oTb:FieldGet( 40 )
> REPLACE CLIENTES->CUENTA WITH oTb:FieldGet( 41 )
> REPLACE CLIENTES->DIR_BANCO WITH oTb:FieldGet( 42 )
> REPLACE CLIENTES->POB_BANCO WITH oTb:FieldGet( 43 )
> if oTb:FieldGet( 45 ) = 1 // Caja
> REPLACE CLIENTES->FPAGO WITH "Caja"
> else
> REPLACE CLIENTES->FPAGO WITH "Domiciliación"
> endif
>
> // Avanzamos registro
> oTb:Skip( 1 )
> oMeter:SetPos( cActual )
> cActual++
> Sysrefresh()
> n++
>
> NEXT
>
> // Ejecutamos la importacion----------------------------------
> oTb:Close() // Cerramos la TABLA
>
>
>